3
0
Fork 0
mirror of https://github.com/Z3Prover/z3 synced 2025-08-22 02:57:50 +00:00

align translation cache with scopes and variable elimination

This commit is contained in:
Nikolaj Bjorner 2021-03-03 11:22:17 -08:00
parent 11efe33aa0
commit 69070a7486
7 changed files with 65 additions and 19 deletions

View file

@ -128,6 +128,7 @@ namespace euf {
s().set_external(v);
s().set_eliminated(v, false);
if (lit.sign()) {
v = si.add_bool_var(e);
s().set_external(v);
@ -265,17 +266,18 @@ namespace euf {
sat::status st = sat::status::th(m_is_redundant, m.get_basic_family_id());
expr* c = nullptr, * th = nullptr, * el = nullptr;
if (!m.is_bool(e) && m.is_ite(e, c, th, el)) {
app* a = to_app(e);
expr_ref eq_th = mk_eq(a, th);
expr_ref eq_th = mk_eq(e, th);
sat::literal lit_th = mk_literal(eq_th);
if (th == el) {
s().add_clause(1, &lit_th, st);
}
else {
sat::bool_var v = si.to_bool_var(c);
VERIFY(v != sat::null_bool_var);
VERIFY(s().is_external(v));
SASSERT(v != sat::null_bool_var);
expr_ref eq_el = mk_eq(a, el);
VERIFY(!s().was_eliminated(v));
expr_ref eq_el = mk_eq(e, el);
sat::literal lit_el = mk_literal(eq_el);
literal lits1[2] = { literal(v, true), lit_th };

View file

@ -279,6 +279,11 @@ namespace euf {
}
}
void solver::set_eliminated(bool_var v) {
si.uncache(literal(v, false));
si.uncache(literal(v, true));
}
void solver::asserted(literal l) {
expr* e = m_bool_var2expr.get(l.var(), nullptr);
if (!e) {

View file

@ -293,6 +293,7 @@ namespace euf {
void get_antecedents(literal l, th_explain& jst, literal_vector& r, bool probing);
void add_antecedent(enode* a, enode* b);
void add_diseq_antecedent(enode* a, enode* b);
void set_eliminated(bool_var v) override;
void asserted(literal l) override;
sat::check_result check() override;
void push() override;

View file

@ -36,6 +36,7 @@ namespace sat {
virtual bool_var to_bool_var(expr* e) = 0;
virtual bool_var add_bool_var(expr* e) = 0;
virtual void cache(app* t, literal l) = 0;
virtual void uncache(literal l) = 0;
virtual void push() = 0;
virtual void pop(unsigned n) = 0;
virtual void set_expr2var_replay(obj_map<expr, sat::bool_var>* r) = 0;