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:
parent
8018e27643
commit
a80f6ad3a2
1 changed files with 20 additions and 9 deletions
|
@ -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) {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue