mirror of
https://github.com/Z3Prover/z3
synced 2025-08-20 18:20:22 +00:00
fixes to consequence generation and cancellation
Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
This commit is contained in:
parent
0e9758a211
commit
c5dd441947
9 changed files with 58 additions and 56 deletions
|
@ -174,6 +174,9 @@ namespace smt {
|
|||
else if (e_internalized(k) && m.are_distinct(v, get_enode(k)->get_root()->get_owner())) {
|
||||
to_delete.push_back(k);
|
||||
}
|
||||
else if (get_assignment(mk_diseq(k, v)) == l_true) {
|
||||
to_delete.push_back(k);
|
||||
}
|
||||
}
|
||||
for (unsigned i = 0; i < to_delete.size(); ++i) {
|
||||
var2val.remove(to_delete[i]);
|
||||
|
@ -215,9 +218,7 @@ namespace smt {
|
|||
for (unsigned i = 0; i < literals.size(); ++i) {
|
||||
literals[i].neg();
|
||||
}
|
||||
eq = mk_eq_atom(k, v);
|
||||
internalize_formula(eq, false);
|
||||
literal lit(get_bool_var(eq), false);
|
||||
literal lit = mk_diseq(k, v);
|
||||
literals.push_back(lit);
|
||||
mk_clause(literals.size(), literals.c_ptr(), 0);
|
||||
TRACE("context", display_literals_verbose(tout, literals.size(), literals.c_ptr()););
|
||||
|
@ -229,6 +230,18 @@ namespace smt {
|
|||
return to_delete.size();
|
||||
}
|
||||
|
||||
literal context::mk_diseq(expr* e, expr* val) {
|
||||
ast_manager& m = m_manager;
|
||||
if (m.is_bool(e)) {
|
||||
return literal(get_bool_var(e), m.is_true(val));
|
||||
}
|
||||
else {
|
||||
expr_ref eq(mk_eq_atom(e, val), m);
|
||||
internalize_formula(eq, false);
|
||||
return literal(get_bool_var(eq), true);
|
||||
}
|
||||
}
|
||||
|
||||
lbool context::get_consequences(expr_ref_vector const& assumptions,
|
||||
expr_ref_vector const& vars,
|
||||
expr_ref_vector& conseq,
|
||||
|
@ -288,18 +301,7 @@ namespace smt {
|
|||
// the opposite value of the current reference model.
|
||||
// If the variable is a non-Boolean, it means adding a disequality.
|
||||
//
|
||||
literal lit;
|
||||
if (m.is_bool(e)) {
|
||||
lit = literal(get_bool_var(e), m.is_true(val));
|
||||
}
|
||||
else {
|
||||
eq = mk_eq_atom(e, val);
|
||||
internalize_formula(eq, false);
|
||||
lit = literal(get_bool_var(eq), true);
|
||||
TRACE("context", tout << mk_pp(e, m) << " " << mk_pp(val, m) << "\n";
|
||||
display_literal_verbose(tout, lit); tout << "\n";
|
||||
tout << "Equal: " << are_equal(e, val) << "\n";);
|
||||
}
|
||||
literal lit = mk_diseq(e, val);
|
||||
mark_as_relevant(lit);
|
||||
push_scope();
|
||||
assign(lit, b_justification::mk_axiom(), true);
|
||||
|
@ -434,6 +436,7 @@ namespace smt {
|
|||
pop_to_base_lvl();
|
||||
lbool is_sat = check(assumptions.size(), assumptions.c_ptr());
|
||||
if (is_sat != l_true) {
|
||||
TRACE("context", tout << is_sat << "\n";);
|
||||
return is_sat;
|
||||
}
|
||||
obj_map<expr, expr*> var2val;
|
||||
|
@ -475,20 +478,12 @@ namespace smt {
|
|||
obj_map<expr,expr*>::iterator it = var2val.begin(), end = var2val.end();
|
||||
unsigned num_vars = 0;
|
||||
for (; it != end && num_vars < chunk_size; ++it) {
|
||||
if (get_cancel_flag()) {
|
||||
return l_undef;
|
||||
}
|
||||
expr* e = it->m_key;
|
||||
expr* val = it->m_value;
|
||||
literal lit;
|
||||
if (m.is_bool(e)) {
|
||||
lit = literal(get_bool_var(e), m.is_true(val));
|
||||
}
|
||||
else {
|
||||
eq = mk_eq_atom(e, val);
|
||||
internalize_formula(eq, false);
|
||||
lit = literal(get_bool_var(eq), true);
|
||||
TRACE("context", tout << mk_pp(e, m) << " " << mk_pp(val, m) << "\n";
|
||||
display_literal_verbose(tout, lit); tout << "\n";
|
||||
tout << "Equal: " << are_equal(e, val) << "\n";);
|
||||
}
|
||||
literal lit = mk_diseq(e, val);
|
||||
mark_as_relevant(lit);
|
||||
if (get_assignment(lit) != l_undef) {
|
||||
continue;
|
||||
|
@ -504,9 +499,6 @@ namespace smt {
|
|||
m_not_l = null_literal;
|
||||
SASSERT(m_search_lvl == get_search_level());
|
||||
}
|
||||
if (get_cancel_flag()) {
|
||||
return l_undef;
|
||||
}
|
||||
}
|
||||
}
|
||||
SASSERT(!inconsistent());
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue