Skip to content

Commit b9b3e0d

Browse files
Update euf_completion.cpp
try out restricting scope of equalities added by instantation
1 parent d8fafd8 commit b9b3e0d

File tree

1 file changed

+26
-18
lines changed

1 file changed

+26
-18
lines changed

src/ast/simplifiers/euf_completion.cpp

Lines changed: 26 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -268,7 +268,6 @@ namespace euf {
268268
expr_ref r(f, m);
269269
m_rewriter(r);
270270
f = r.get();
271-
// verbose_stream() << r << "\n";
272271
auto cons = m.mk_app(symbol("consequence"), 1, &f, m.mk_bool_sort());
273272
m_fmls.add(dependent_expr(m, cons, nullptr, nullptr));
274273
}
@@ -317,35 +316,43 @@ namespace euf {
317316
expr_ref y1(y, m);
318317
m_rewriter(x1);
319318
m_rewriter(y1);
320-
319+
321320
add_quantifiers(x1);
322321
add_quantifiers(y1);
323322
enode* a = mk_enode(x1);
324323
enode* b = mk_enode(y1);
324+
325325
if (a->get_root() == b->get_root())
326-
return;
327-
m_egraph.merge(a, b, to_ptr(push_pr_dep(pr, d)));
328-
m_egraph.propagate();
326+
return;
327+
328+
TRACE(euf, tout << "merge and propagate\n");
329329
add_children(a);
330330
add_children(b);
331+
m_egraph.merge(a, b, to_ptr(push_pr_dep(pr, d)));
332+
m_egraph.propagate();
333+
m_should_propagate = true;
334+
335+
#if 0
331336
auto a1 = mk_enode(x);
332-
if (a1->get_root() != a->get_root()) {
337+
auto b1 = mk_enode(y);
338+
339+
if (a->get_root() != a1->get_root()) {
340+
add_children(a1);;
333341
m_egraph.merge(a, a1, nullptr);
334342
m_egraph.propagate();
335-
add_children(a1);
336343
}
337-
auto b1 = mk_enode(y);
338-
if (b1->get_root() != b->get_root()) {
339-
TRACE(euf, tout << "merge and propagate\n");
344+
345+
if (b->get_root() != b1->get_root()) {
346+
add_children(b1);
340347
m_egraph.merge(b, b1, nullptr);
341348
m_egraph.propagate();
342-
add_children(b1);
343349
}
344-
345-
m_should_propagate = true;
346-
if (m_side_condition_solver)
350+
#endif
351+
352+
if (m_side_condition_solver && a->get_root() != b->get_root())
347353
m_side_condition_solver->add_constraint(f, pr, d);
348-
IF_VERBOSE(1, verbose_stream() << "eq: " << mk_pp(x1, m) << " == " << mk_pp(y1, m) << "\n");
354+
IF_VERBOSE(1, verbose_stream() << "eq: " << a->get_root_id() << " " << b->get_root_id() << " "
355+
<< x1 << " == " << y1 << "\n");
349356
}
350357
else if (m.is_not(f, f)) {
351358
enode* n = mk_enode(f);
@@ -689,7 +696,7 @@ namespace euf {
689696
b = new (mem) binding(q, pat, max_generation, min_top, max_top);
690697
b->init(b);
691698
for (unsigned i = 0; i < n; ++i)
692-
b->m_nodes[i] = _binding[i];
699+
b->m_nodes[i] = _binding[i]->get_root();
693700

694701
m_bindings.insert(b);
695702
get_trail().push(insert_map<bindings, binding*>(m_bindings, b));
@@ -748,12 +755,13 @@ namespace euf {
748755

749756
void completion::apply_binding(binding& b, quantifier* q, expr_ref_vector const& s) {
750757
var_subst subst(m);
751-
expr_ref r = subst(q->get_expr(), s);
758+
expr_ref r = subst(q->get_expr(), s);
752759
scoped_generation sg(*this, b.m_max_top_generation + 1);
753760
auto [pr, d] = get_dependency(q);
754761
if (pr)
755762
pr = m.mk_quant_inst(m.mk_or(m.mk_not(q), r), s.size(), s.data());
756763
m_consequences.push_back(r);
764+
TRACE(euf_completion, tout << "new instantiation: " << r << " q: " << mk_pp(q, m) << "\n");
757765
add_constraint(r, pr, d);
758766
propagate_rules();
759767
m_egraph.propagate();
@@ -1022,7 +1030,7 @@ namespace euf {
10221030

10231031
}
10241032
enode* n = m_egraph.find(f);
1025-
1033+
if (!n) n = mk_enode(f);
10261034
enode* r = n->get_root();
10271035
d = m.mk_join(d, explain_eq(n, r));
10281036
d = m.mk_join(d, m_deps.get(r->get_id(), nullptr));

0 commit comments

Comments
 (0)