3
0
Fork 0
mirror of https://github.com/Z3Prover/z3 synced 2025-04-08 18:31:49 +00:00

add goal context for simplifier, disable equality creation

Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
This commit is contained in:
Nikolaj Bjorner 2016-02-20 10:13:24 -08:00
parent 7d3af70a63
commit d4f41c0420
2 changed files with 43 additions and 14 deletions

View file

@ -262,7 +262,7 @@ public:
result = m.mk_true();
} else if (!b.intersect(ctx, intr)) {
result = m.mk_false();
} else if (intr.l == intr.h) {
} else if (false && intr.l == intr.h) {
result = m.mk_eq(t1, m_bv.mk_numeral(intr.l, m.get_sort(t1)));
}
} else if (b.is_full() && b.tight) {

View file

@ -529,6 +529,37 @@ struct ctx_simplify_tactic::imp {
return sz;
}
void process_goal(goal & g) {
SASSERT(scope_level() == 0);
// go forwards
unsigned old_lvl = scope_level();
unsigned sz = g.size();
expr_ref r(m);
for (unsigned i = 0; !g.inconsistent() && i < sz; ++i) {
m_depth = 0;
simplify(g.form(i), r);
if (i < sz - 1 && !m.is_true(r) && !m.is_false(r) && !g.dep(i) && !assert_expr(r, false)) {
r = m.mk_false();
}
g.update(i, r, 0, g.dep(i));
}
pop(scope_level() - old_lvl);
// go backwards
sz = g.size();
for (unsigned i = sz; !g.inconsistent() && i > 0; ) {
m_depth = 0;
--i;
simplify(g.form(i), r);
if (i > 0 && !m.is_true(r) && !m.is_false(r) && !g.dep(i) && !assert_expr(r, false)) {
r = m.mk_false();
}
g.update(i, r, 0, g.dep(i));
}
pop(scope_level() - old_lvl);
SASSERT(scope_level() == 0);
}
void process(expr * s, expr_ref & r) {
TRACE("ctx_simplify_tactic", tout << "simplifying:\n" << mk_ismt2_pp(s, m) << "\n";);
SASSERT(scope_level() == 0);
@ -546,24 +577,22 @@ struct ctx_simplify_tactic::imp {
void operator()(goal & g) {
SASSERT(g.is_well_sorted());
bool proofs_enabled = g.proofs_enabled();
m_occs.reset();
m_occs(g);
m_num_steps = 0;
expr_ref r(m);
proof * new_pr = 0;
tactic_report report("ctx-simplify", g);
unsigned sz = g.size();
for (unsigned i = 0; i < sz; i++) {
if (g.inconsistent())
return;
expr * t = g.form(i);
process(t, r);
if (proofs_enabled) {
proof * pr = g.pr(i);
new_pr = m.mk_modus_ponens(pr, m.mk_rewrite_star(t, r, 0, 0)); // TODO :-)
if (g.proofs_enabled()) {
expr_ref r(m);
unsigned sz = g.size();
for (unsigned i = 0; !g.inconsistent() && i < sz; ++i) {
expr * t = g.form(i);
process(t, r);
proof* new_pr = m.mk_modus_ponens(g.pr(i), m.mk_rewrite_star(t, r, 0, 0)); // TODO :-)
g.update(i, r, new_pr, g.dep(i));
}
g.update(i, r, new_pr, g.dep(i));
}
else {
process_goal(g);
}
IF_VERBOSE(TACTIC_VERBOSITY_LVL, verbose_stream() << "(ctx-simplify :num-steps " << m_num_steps << ")\n";);
SASSERT(g.is_well_sorted());