3
0
Fork 0
mirror of https://github.com/Z3Prover/z3 synced 2025-06-06 14:13:23 +00:00

fix scope accounting for dom simplifier

Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
This commit is contained in:
Nikolaj Bjorner 2017-10-17 10:14:26 -07:00
parent 4e92caa553
commit 448cf8c31d
4 changed files with 26 additions and 7 deletions

View file

@ -80,6 +80,7 @@ public:
m_trail_lim.resize(new_sz); m_trail_lim.resize(new_sz);
} }
} }
unsigned scope_level() const { return m_trail_lim.size(); }
bool empty() const { return m_subst.empty(); } bool empty() const { return m_subst.empty(); }
expr* find(expr * e) { proof* pr; expr* d = 0; if (find(e, d, pr)) return d; else return e; } expr* find(expr * e) { proof* pr; expr* d = 0; if (find(e, d, pr)) return d; else return e; }
bool find(expr * s, expr * & def, proof * & def_pr) { return m_subst.find(s, def, def_pr); } bool find(expr * s, expr * & def, proof * & def_pr) { return m_subst.find(s, def, def_pr); }

View file

@ -11,7 +11,9 @@ Abstract:
Author: Author:
Nikolaj Bjorner (nbjorner) 2016-2-12 Nuno Lopes (nlopes) 2016-2-12
Nikolaj Bjorner (nbjorner)
--*/ --*/
@ -650,11 +652,11 @@ namespace {
return false; return false;
if (old == intr) if (old == intr)
return true; return true;
m_scopes.insert(undo_bound(t1, old, false)); m_scopes.push_back(undo_bound(t1, old, false));
old = intr; old = intr;
} else { } else {
m_bound.insert(t1, b); m_bound.insert(t1, b);
m_scopes.insert(undo_bound(t1, interval(), true)); m_scopes.push_back(undo_bound(t1, interval(), true));
} }
} }
return true; return true;
@ -801,6 +803,10 @@ namespace {
return alloc(dom_bv_bounds_simplifier, m, m_params); return alloc(dom_bv_bounds_simplifier, m, m_params);
} }
virtual unsigned scope_level() const {
return m_scopes.size();
}
}; };
} }

View file

@ -11,7 +11,8 @@ Abstract:
Author: Author:
Nikolaj Bjorner (nbjorner) 2016-2-12 Nuno Lopes (nlopes) 2016-2-12
Nikolaj Bjorner (nbjorner)
--*/ --*/
@ -21,8 +22,15 @@ Author:
tactic * mk_bv_bounds_tactic(ast_manager & m, params_ref const & p = params_ref()); tactic * mk_bv_bounds_tactic(ast_manager & m, params_ref const & p = params_ref());
tactic * mk_dom_bv_bounds_tactic(ast_manager & m, params_ref const & p = params_ref());
/* /*
ADD_TACTIC("propagate-bv-bounds", "propagate bit-vector bounds by simplifying implied or contradictory bounds.", "mk_bv_bounds_tactic(m, p)") ADD_TACTIC("propagate-bv-bounds", "propagate bit-vector bounds by simplifying implied or contradictory bounds.", "mk_bv_bounds_tactic(m, p)")
ADD_TACTIC("propagate-bv-bounds-new", "propagate bit-vector bounds by simplifying implied or contradictory bounds.", "mk_dom_bv_bounds_tactic(m, p)")
*/ */
#endif #endif

View file

@ -83,6 +83,8 @@ class dom_simplifier {
virtual void pop(unsigned num_scopes) = 0; virtual void pop(unsigned num_scopes) = 0;
virtual dom_simplifier * translate(ast_manager & m) = 0; virtual dom_simplifier * translate(ast_manager & m) = 0;
virtual unsigned scope_level() const = 0;
}; };
@ -116,9 +118,9 @@ class dom_simplify_tactic : public tactic {
ptr_vector<expr> const & tree(expr * e); ptr_vector<expr> const & tree(expr * e);
expr* idom(expr *e) const { return m_dominators.idom(e); } expr* idom(expr *e) const { return m_dominators.idom(e); }
unsigned scope_level() { return m_scope_level; } unsigned scope_level() { return m_simplifier->scope_level(); }
void pop(unsigned n) { SASSERT(n <= m_scope_level); m_scope_level -= n; m_simplifier->pop(n); } void pop(unsigned n) { SASSERT(n <= m_simplifier->scope_level()); m_simplifier->pop(n); }
bool assert_expr(expr* f, bool sign) { m_scope_level++; return m_simplifier->assert_expr(f, sign); } bool assert_expr(expr* f, bool sign) { return m_simplifier->assert_expr(f, sign); }
bool init(goal& g); bool init(goal& g);
@ -169,6 +171,8 @@ public:
virtual void pop(unsigned num_scopes) { m_scoped_substitution.pop(num_scopes); } virtual void pop(unsigned num_scopes) { m_scoped_substitution.pop(num_scopes); }
virtual unsigned scope_level() const { return m_scoped_substitution.scope_level(); }
virtual dom_simplifier * translate(ast_manager & m) { virtual dom_simplifier * translate(ast_manager & m) {
SASSERT(m_subst.empty()); SASSERT(m_subst.empty());
return alloc(expr_substitution_simplifier, m); return alloc(expr_substitution_simplifier, m);