mirror of
https://github.com/Z3Prover/z3
synced 2025-06-23 14:23:40 +00:00
adding backwards pass
Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
This commit is contained in:
parent
755ca46df6
commit
2634be01aa
2 changed files with 26 additions and 12 deletions
|
@ -281,17 +281,28 @@ expr_ref dom_simplify_tactic::simplify_and_or(bool is_and, app * e) {
|
||||||
};
|
};
|
||||||
|
|
||||||
expr_ref_vector args(m);
|
expr_ref_vector args(m);
|
||||||
for (expr * arg : *e) {
|
if (m_forward) {
|
||||||
for (expr * child : tree(arg)) {
|
for (expr * arg : *e) {
|
||||||
if (is_subexpr_arg(child, arg)) {
|
#define _SIMP_ARG(arg) \
|
||||||
simplify(child);
|
for (expr * child : tree(arg)) { \
|
||||||
|
if (is_subexpr_arg(child, arg)) { \
|
||||||
|
simplify(child); \
|
||||||
|
} \
|
||||||
|
} \
|
||||||
|
r = simplify(arg); \
|
||||||
|
args.push_back(r); \
|
||||||
|
if (!assert_expr(simplify(arg), !is_and)) { \
|
||||||
|
r = is_and ? m.mk_false() : m.mk_true(); \
|
||||||
|
return r; \
|
||||||
}
|
}
|
||||||
|
_SIMP_ARG(arg);
|
||||||
}
|
}
|
||||||
r = simplify(arg);
|
}
|
||||||
args.push_back(r);
|
else {
|
||||||
if (!assert_expr(simplify(arg), !is_and)) {
|
for (unsigned i = e->get_num_args(); i > 0; ) {
|
||||||
r = is_and ? m.mk_false() : m.mk_true();
|
--i;
|
||||||
return r;
|
expr* arg = e->get_arg(i);
|
||||||
|
_SIMP_ARG(arg);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
pop(scope_level() - old_lvl);
|
pop(scope_level() - old_lvl);
|
||||||
|
@ -319,6 +330,7 @@ void dom_simplify_tactic::simplify_goal(goal& g) {
|
||||||
change = false;
|
change = false;
|
||||||
|
|
||||||
// go forwards
|
// go forwards
|
||||||
|
m_forward = true;
|
||||||
if (!init(g)) return;
|
if (!init(g)) return;
|
||||||
unsigned sz = g.size();
|
unsigned sz = g.size();
|
||||||
for (unsigned i = 0; !g.inconsistent() && i < sz; ++i) {
|
for (unsigned i = 0; !g.inconsistent() && i < sz; ++i) {
|
||||||
|
@ -336,6 +348,7 @@ void dom_simplify_tactic::simplify_goal(goal& g) {
|
||||||
pop(scope_level());
|
pop(scope_level());
|
||||||
|
|
||||||
// go backwards
|
// go backwards
|
||||||
|
m_forward = false;
|
||||||
if (!init(g)) return;
|
if (!init(g)) return;
|
||||||
sz = g.size();
|
sz = g.size();
|
||||||
for (unsigned i = sz; !g.inconsistent() && i > 0; ) {
|
for (unsigned i = sz; !g.inconsistent() && i > 0; ) {
|
||||||
|
|
|
@ -96,6 +96,7 @@ private:
|
||||||
unsigned m_max_depth;
|
unsigned m_max_depth;
|
||||||
ptr_vector<expr> m_empty;
|
ptr_vector<expr> m_empty;
|
||||||
obj_pair_map<expr, expr, bool> m_subexpr_cache;
|
obj_pair_map<expr, expr, bool> m_subexpr_cache;
|
||||||
|
bool m_forward;
|
||||||
|
|
||||||
expr_ref simplify(expr* t);
|
expr_ref simplify(expr* t);
|
||||||
expr_ref simplify_ite(app * ite);
|
expr_ref simplify_ite(app * ite);
|
||||||
|
@ -122,7 +123,7 @@ public:
|
||||||
m(m), m_simplifier(s), m_params(p),
|
m(m), m_simplifier(s), m_params(p),
|
||||||
m_trail(m), m_args(m),
|
m_trail(m), m_args(m),
|
||||||
m_dominators(m),
|
m_dominators(m),
|
||||||
m_scope_level(0), m_depth(0), m_max_depth(1024) {}
|
m_scope_level(0), m_depth(0), m_max_depth(1024), m_forward(true) {}
|
||||||
|
|
||||||
|
|
||||||
virtual ~dom_simplify_tactic() {}
|
virtual ~dom_simplify_tactic() {}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue