@@ -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