3
0
Fork 0
mirror of https://github.com/Z3Prover/z3 synced 2025-06-29 09:28:45 +00:00

generate fixed zero lemmas

Signed-off-by: Lev Nachmanson <levnach@hotmail.com>
This commit is contained in:
Lev Nachmanson 2019-02-25 16:48:54 +14:00
parent 8018e27643
commit a80f6ad3a2

View file

@ -717,10 +717,9 @@ struct solver::imp {
// either m or n has to be equal zero, but it is not the case // either m or n has to be equal zero, but it is not the case
SASSERT(!vvr(m).is_zero() || !vvr(n).is_zero()); SASSERT(!vvr(m).is_zero() || !vvr(n).is_zero());
if (!vvr(m).is_zero()) if (!vvr(m).is_zero())
generate_zero_lemma(m); generate_zero_lemmas(m);
if (!vvr(n).is_zero()) if (!vvr(n).is_zero())
generate_zero_lemma(n); generate_zero_lemmas(n);
TRACE("nla_solver", print_lemma(tout););
return; return;
} }
unsigned_vector mvars(m.vars()); unsigned_vector mvars(m.vars());
@ -830,13 +829,15 @@ struct solver::imp {
// try to find a variable j such that vvr(j) = 0 // try to find a variable j such that vvr(j) = 0
// and the bounds on j contain 0 as an inner point // and the bounds on j contain 0 as an inner point
lpvar find_best_zero(const monomial& m) const { lpvar find_best_zero(const monomial& m, unsigned_vector & fixed_zeros) const {
lpvar zero_j = -1; lpvar zero_j = -1;
for (unsigned j : m){ for (unsigned j : m){
if (vvr(j).is_zero()){ if (vvr(j).is_zero()){
zero_j = j; if (var_is_fixed_to_zero(j))
if (zero_is_an_inner_point_of_bounds(j)) fixed_zeros.push_back(j);
return j;
if (!is_set(zero_j) || zero_is_an_inner_point_of_bounds(j))
zero_j = j;
} }
} }
return zero_j; return zero_j;
@ -871,10 +872,11 @@ struct solver::imp {
return (k >> 1) << 1 == k; return (k >> 1) << 1 == k;
} }
void generate_zero_lemma(const monomial& m) { void generate_zero_lemmas(const monomial& m) {
SASSERT(!vvr(m).is_zero()); SASSERT(!vvr(m).is_zero());
int sign = rat_sign(vvr(m)); int sign = rat_sign(vvr(m));
unsigned zero_j = find_best_zero(m); unsigned_vector fixed_zeros;
unsigned zero_j = find_best_zero(m, fixed_zeros);
SASSERT(is_set(zero_j)); SASSERT(is_set(zero_j));
unsigned zero_power = 0; unsigned zero_power = 0;
for (unsigned j : m){ for (unsigned j : m){
@ -895,8 +897,17 @@ struct solver::imp {
} else { } else {
generate_strict_case_zero_lemma(m, zero_j, sign); generate_strict_case_zero_lemma(m, zero_j, sign);
} }
TRACE("nla_solver", print_lemma(tout););
for (lpvar j : fixed_zeros)
add_fixed_zero_lemma(m, j);
} }
void add_fixed_zero_lemma(const monomial& m, lpvar j) {
add_empty_lemma();
explain_fixed_var(j);
mk_ineq(m.var(), llc::EQ, current_lemma());
}
rational rat_sign(const monomial& m) const { rational rat_sign(const monomial& m) const {
int sign = 1; int sign = 1;
for (lpvar j : m) { for (lpvar j : m) {