@@ -15,6 +15,7 @@ Module Name:
1515
1616--*/
1717
18+ #include " ast/rewriter/expr_safe_replace.h"
1819#include " tactic/tactic.h"
1920#include " tactic/portfolio/euf_completion_tactic.h"
2021#include " solver/solver.h"
@@ -25,7 +26,7 @@ class euf_side_condition_solver : public euf::side_condition_solver {
2526 params_ref m_params;
2627 scoped_ptr<solver> m_solver;
2728 expr_ref_vector m_deps;
28- obj_map<expr, expr_dependency*> m_e2d;
29+ obj_map<expr, std::pair<proof*, expr_dependency*> > m_e2d;
2930 expr_ref_vector m_fmls;
3031 obj_hashtable<expr> m_seen;
3132 trail_stack m_trail;
@@ -55,7 +56,7 @@ class euf_side_condition_solver : public euf::side_condition_solver {
5556 m_solver->pop (n);
5657 }
5758
58- void add_constraint (expr* f, expr_dependency* d) override {
59+ void add_constraint (expr* f, proof* pr, expr_dependency* d) override {
5960 if (m_seen.contains (f))
6061 return ;
6162 m_seen.insert (f);
@@ -68,15 +69,15 @@ class euf_side_condition_solver : public euf::side_condition_solver {
6869 if (d) {
6970 expr* e_dep = m.mk_fresh_const (" dep" , m.mk_bool_sort ());
7071 m_deps.push_back (e_dep);
71- m_e2d.insert (e_dep, d );
72+ m_e2d.insert (e_dep, { pr, d } );
7273 m_trail.push (insert_obj_map (m_e2d, e_dep));
7374 m_solver->assert_expr (f, e_dep);
7475 }
7576 else
7677 m_solver->assert_expr (f);
7778 }
7879
79- bool is_true (expr* f, expr_dependency*& d) override {
80+ bool is_true (expr* f, proof_ref& pr, expr_dependency*& d) override {
8081 d = nullptr ;
8182 solver::scoped_push _sp (*m_solver);
8283 m_fmls.reset ();
@@ -86,9 +87,24 @@ class euf_side_condition_solver : public euf::side_condition_solver {
8687 if (r == l_false) {
8788 expr_ref_vector core (m);
8889 m_solver->get_unsat_core (core);
89- for (auto c : core)
90- d = m.mk_join (d, m_e2d[c]);
90+ for (auto c : core) {
91+ auto [pr, dep] = m_e2d[c];
92+ d = m.mk_join (d, dep);
93+ }
94+ if (m.proofs_enabled ()) {
95+ pr = m_solver->get_proof ();
96+ SASSERT (pr);
97+ expr_safe_replace rep (m);
98+ for (auto c : core) {
99+ auto [p, dep] = m_e2d[c];
100+ rep.insert (m.mk_asserted (c), p);
101+ }
102+ expr_ref ppr (pr, m);
103+ rep (ppr);
104+ pr = to_app (ppr.get ());
105+ }
91106 }
107+
92108 return r == l_false;
93109 }
94110
0 commit comments