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

update add-term to avoid duplicating fresh aux-expr

This commit is contained in:
Nikolaj Bjorner 2025-05-20 14:22:03 -07:00
parent c2098b41d6
commit 85e7243108
2 changed files with 7 additions and 3 deletions

View file

@ -51,14 +51,18 @@ void theory_user_propagator::add_expr(expr* term, bool ensure_enode) {
expr* e = term; expr* e = term;
ctx.get_rewriter()(e, r); ctx.get_rewriter()(e, r);
TRACE("user_propagate", tout << "add " << mk_bounded_pp(e, m) << "\n"); TRACE("user_propagate", tout << "add " << mk_bounded_pp(e, m) << "\n");
if (r != e) { if (!is_ground(r)) {
if (m_add_expr_fresh.contains(term))
return;
m_add_expr_fresh.insert(term);
ctx.push_trail(insert_obj_trail(m_add_expr_fresh, term));
r = m.mk_fresh_const("aux-expr", e->get_sort()); r = m.mk_fresh_const("aux-expr", e->get_sort());
expr_ref eq(m.mk_eq(r, e), m); expr_ref eq(m.mk_eq(r, e), m);
ctx.assert_expr(eq); ctx.assert_expr(eq);
ctx.internalize_assertions(); ctx.internalize_assertions();
e = r;
ctx.mark_as_relevant(eq.get()); ctx.mark_as_relevant(eq.get());
} }
e = r;
enode* n = ensure_enode ? this->ensure_enode(e) : ctx.get_enode(e); enode* n = ensure_enode ? this->ensure_enode(e) : ctx.get_enode(e);
if (is_attached_to_var(n)) if (is_attached_to_var(n))
return; return;

View file

@ -88,6 +88,7 @@ namespace smt {
lbool m_next_split_phase = l_undef; lbool m_next_split_phase = l_undef;
vector<expr_ref_vector> m_clauses_to_replay; vector<expr_ref_vector> m_clauses_to_replay;
unsigned m_replay_qhead = 0; unsigned m_replay_qhead = 0;
obj_hashtable<expr> m_add_expr_fresh;
expr* var2expr(theory_var v) { return m_var2expr.get(v); } expr* var2expr(theory_var v) { return m_var2expr.get(v); }
theory_var expr2var(expr* e) { check_defined(e); return m_expr2var[e->get_id()]; } theory_var expr2var(expr* e) { check_defined(e); return m_expr2var[e->get_id()]; }
@ -107,7 +108,6 @@ namespace smt {
public: public:
theory_user_propagator(context& ctx); theory_user_propagator(context& ctx);
~theory_user_propagator() override; ~theory_user_propagator() override;
/* /*