diff --git a/src/model/model_core.cpp b/src/model/model_core.cpp index 0f811034a5d..08c57f4373c 100644 --- a/src/model/model_core.cpp +++ b/src/model/model_core.cpp @@ -17,6 +17,7 @@ Revision History: --*/ #include "model/model_core.h" +#include "ast/ast_pp.h" model_core::~model_core() { for (auto & kv : m_interp) { @@ -47,7 +48,9 @@ bool model_core::eval(func_decl* f, expr_ref & r) const { void model_core::register_decl(func_decl * d, expr * v) { SASSERT(d->get_arity() == 0); - TRACE("model", tout << "register " << d->get_name() << "\n";); + TRACE("model", tout << "register " << d->get_name() << "\n"; + if (v) tout << mk_pp(v, m) << "\n"; + ); decl2expr::obj_map_entry * entry = m_interp.insert_if_not_there2(d, nullptr); if (entry->get_data().m_value == nullptr) { // new entry diff --git a/src/smt/asserted_formulas.cpp b/src/smt/asserted_formulas.cpp index 2a162c1f681..3125287bd4d 100644 --- a/src/smt/asserted_formulas.cpp +++ b/src/smt/asserted_formulas.cpp @@ -184,6 +184,7 @@ void asserted_formulas::push_scope() { SASSERT(inconsistent() || s.m_formulas_lim == m_qhead || m.canceled()); s.m_inconsistent_old = m_inconsistent; m_defined_names.push(); + m_elim_term_ite.push(); m_bv_sharing.push_scope(); m_macro_manager.push_scope(); commit(); @@ -198,6 +199,7 @@ void asserted_formulas::pop_scope(unsigned num_scopes) { scope & s = m_scopes[new_lvl]; m_inconsistent = s.m_inconsistent_old; m_defined_names.pop(num_scopes); + m_elim_term_ite.pop(num_scopes); m_scoped_substitution.pop(num_scopes); m_formulas.shrink(s.m_formulas_lim); m_qhead = s.m_formulas_lim; diff --git a/src/smt/asserted_formulas.h b/src/smt/asserted_formulas.h index 1d2f3f998fa..69b6bb26ab5 100644 --- a/src/smt/asserted_formulas.h +++ b/src/smt/asserted_formulas.h @@ -156,6 +156,8 @@ class asserted_formulas { void simplify(justified_expr const& j, expr_ref& n, proof_ref& p) override { m_elim(j.get_fml(), n, p); } bool should_apply() const override { return af.m_smt_params.m_eliminate_term_ite && af.m_smt_params.m_lift_ite != LI_FULL; } void post_op() override { af.m_formulas.append(m_elim.new_defs()); af.reduce_and_solve(); m_elim.reset(); } + void push() { m_elim.push(); } + void pop(unsigned n) { m_elim.pop(n); } }; #define MK_SIMPLIFIERA(NAME, FUNCTOR, MSG, APP, ARG, REDUCE) \ diff --git a/src/smt/elim_term_ite.h b/src/smt/elim_term_ite.h index 8e8340dc0df..53c7aca1f7d 100644 --- a/src/smt/elim_term_ite.h +++ b/src/smt/elim_term_ite.h @@ -27,14 +27,16 @@ class elim_term_ite_cfg : public default_rewriter_cfg { ast_manager& m; defined_names & m_defined_names; vector m_new_defs; + unsigned_vector m_lim; public: elim_term_ite_cfg(ast_manager & m, defined_names & d): m(m), m_defined_names(d) { // TBD enable_ac_support(false); } virtual ~elim_term_ite_cfg() {} vector const& new_defs() const { return m_new_defs; } - void reset() { m_new_defs.reset(); } br_status reduce_app(func_decl* f, unsigned n, expr *const* args, expr_ref& result, proof_ref& result_pr); + void push() { m_lim.push_back(m_new_defs.size()); } + void pop(unsigned n) {if (n > 0) { m_new_defs.shrink(m_lim[m_lim.size() - n]); m_lim.shrink(m_lim.size() - n); } } }; class elim_term_ite_rw : public rewriter_tpl { @@ -45,7 +47,8 @@ class elim_term_ite_rw : public rewriter_tpl { m_cfg(m, dn) {} vector const& new_defs() const { return m_cfg.new_defs(); } - void reset() { m_cfg.reset(); } + void push() { m_cfg.push(); } + void pop(unsigned n) { m_cfg.pop(n); } };