3
0
Fork 0
mirror of https://github.com/Z3Prover/z3 synced 2025-08-26 04:56:03 +00:00

fix #2450 - track assumptions across lazy explanations and variable equalities

Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
This commit is contained in:
Nikolaj Bjorner 2019-08-03 07:57:16 -07:00
parent db5af3088b
commit 4431a534b3
7 changed files with 86 additions and 55 deletions

View file

@ -488,7 +488,7 @@ namespace nlsat {
return sign;
}
interval_set_ref infeasible_intervals(ineq_atom * a, bool neg) {
interval_set_ref infeasible_intervals(ineq_atom * a, bool neg, clause const* cls) {
sign_table & table = m_sign_table_tmp;
table.reset();
unsigned num_ps = a->size();
@ -543,7 +543,7 @@ namespace nlsat {
curr_root_id = table.get_root_id(c-1);
}
set = m_ism.mk(prev_open, prev_inf, table.get_root(prev_root_id),
curr_open, false, table.get_root(curr_root_id), jst);
curr_open, false, table.get_root(curr_root_id), jst, cls);
result = m_ism.mk_union(result, set);
prev_sat = true;
}
@ -554,7 +554,7 @@ namespace nlsat {
if (c == 0) {
if (num_cells == 1) {
// (-oo, oo)
result = m_ism.mk(true, true, dummy, true, true, dummy, jst);
result = m_ism.mk(true, true, dummy, true, true, dummy, jst, cls);
}
else {
// save -oo as beginning of infeasible interval
@ -583,7 +583,7 @@ namespace nlsat {
if (c == num_cells - 1) {
// last cell add interval with (prev, oo)
set = m_ism.mk(prev_open, prev_inf, table.get_root(prev_root_id),
true, true, dummy, jst);
true, true, dummy, jst, cls);
result = m_ism.mk_union(result, set);
}
}
@ -592,7 +592,7 @@ namespace nlsat {
return result;
}
interval_set_ref infeasible_intervals(root_atom * a, bool neg) {
interval_set_ref infeasible_intervals(root_atom * a, bool neg, clause const* cls) {
atom::kind k = a->get_kind();
unsigned i = a->i();
SASSERT(i > 0);
@ -613,7 +613,7 @@ namespace nlsat {
result = m_ism.mk_empty();
}
else {
result = m_ism.mk(true, true, dummy, true, true, dummy, jst); // (-oo, oo)
result = m_ism.mk(true, true, dummy, true, true, dummy, jst, cls); // (-oo, oo)
}
}
else {
@ -621,38 +621,38 @@ namespace nlsat {
switch (k) {
case atom::ROOT_EQ:
if (neg) {
result = m_ism.mk(false, false, r_i, false, false, r_i, jst); // [r_i, r_i]
result = m_ism.mk(false, false, r_i, false, false, r_i, jst, cls); // [r_i, r_i]
}
else {
interval_set_ref s1(m_ism), s2(m_ism);
s1 = m_ism.mk(true, true, dummy, true, false, r_i, jst); // (-oo, r_i)
s2 = m_ism.mk(true, false, r_i, true, true, dummy, jst); // (r_i, oo)
s1 = m_ism.mk(true, true, dummy, true, false, r_i, jst, cls); // (-oo, r_i)
s2 = m_ism.mk(true, false, r_i, true, true, dummy, jst, cls); // (r_i, oo)
result = m_ism.mk_union(s1, s2);
}
break;
case atom::ROOT_LT:
if (neg)
result = m_ism.mk(true, true, dummy, true, false, r_i, jst); // (-oo, r_i)
result = m_ism.mk(true, true, dummy, true, false, r_i, jst, cls); // (-oo, r_i)
else
result = m_ism.mk(false, false, r_i, true, true, dummy, jst); // [r_i, oo)
result = m_ism.mk(false, false, r_i, true, true, dummy, jst, cls); // [r_i, oo)
break;
case atom::ROOT_GT:
if (neg)
result = m_ism.mk(true, false, r_i, true, true, dummy, jst); // (r_i, oo)
result = m_ism.mk(true, false, r_i, true, true, dummy, jst, cls); // (r_i, oo)
else
result = m_ism.mk(true, true, dummy, false, false, r_i, jst); // (-oo, r_i]
result = m_ism.mk(true, true, dummy, false, false, r_i, jst, cls); // (-oo, r_i]
break;
case atom::ROOT_LE:
if (neg)
result = m_ism.mk(true, true, dummy, false, false, r_i, jst); // (-oo, r_i]
result = m_ism.mk(true, true, dummy, false, false, r_i, jst, cls); // (-oo, r_i]
else
result = m_ism.mk(true, false, r_i, true, true, dummy, jst); // (r_i, oo)
result = m_ism.mk(true, false, r_i, true, true, dummy, jst, cls); // (r_i, oo)
break;
case atom::ROOT_GE:
if (neg)
result = m_ism.mk(false, false, r_i, true, true, dummy, jst); // [r_i, oo)
result = m_ism.mk(false, false, r_i, true, true, dummy, jst, cls); // [r_i, oo)
else
result = m_ism.mk(true, true, dummy, true, false, r_i, jst); // (-oo, r_i)
result = m_ism.mk(true, true, dummy, true, false, r_i, jst, cls); // (-oo, r_i)
break;
default:
UNREACHABLE();
@ -663,8 +663,8 @@ namespace nlsat {
return result;
}
interval_set_ref infeasible_intervals(atom * a, bool neg) {
return a->is_ineq_atom() ? infeasible_intervals(to_ineq_atom(a), neg) : infeasible_intervals(to_root_atom(a), neg);
interval_set_ref infeasible_intervals(atom * a, bool neg, clause const* cls) {
return a->is_ineq_atom() ? infeasible_intervals(to_ineq_atom(a), neg, cls) : infeasible_intervals(to_root_atom(a), neg, cls);
}
};
@ -684,8 +684,8 @@ namespace nlsat {
return m_imp->eval(a, neg);
}
interval_set_ref evaluator::infeasible_intervals(atom * a, bool neg) {
return m_imp->infeasible_intervals(a, neg);
interval_set_ref evaluator::infeasible_intervals(atom * a, bool neg, clause const* cls) {
return m_imp->infeasible_intervals(a, neg, cls);
}
void evaluator::push() {