From 74621e0b7d366bd83c1b88ea3aba64a5f17d57b4 Mon Sep 17 00:00:00 2001
From: Nikolaj Bjorner <nbjorner@microsoft.com>
Date: Mon, 11 Jun 2018 23:28:50 -0700
Subject: [PATCH] first eufi example running

Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
---
 src/api/api_solver.cpp                        | 22 +++++++-------
 src/cmd_context/basic_cmds.cpp                |  2 +-
 src/muz/spacer/spacer_iuc_solver.cpp          | 12 ++------
 src/muz/spacer/spacer_iuc_solver.h            |  9 ++++--
 src/muz/spacer/spacer_prop_solver.cpp         |  2 +-
 src/opt/maxres.cpp                            | 13 ++++----
 src/opt/opt_context.cpp                       |  2 +-
 src/opt/opt_context.h                         |  2 +-
 src/opt/opt_solver.cpp                        |  3 +-
 src/opt/opt_solver.h                          |  2 +-
 src/qe/qe_mbi.cpp                             | 13 ++------
 src/qe/qe_term_graph.cpp                      |  6 ++--
 src/sat/sat_solver/inc_sat_solver.cpp         |  2 +-
 src/smt/smt_context.cpp                       | 14 ++++-----
 src/smt/smt_solver.cpp                        | 14 ++++-----
 src/solver/check_sat_result.cpp               |  6 ++--
 src/solver/check_sat_result.h                 |  9 ++----
 src/solver/combined_solver.cpp                |  2 +-
 src/solver/mus.cpp                            | 30 ++++++-------------
 src/solver/mus.h                              |  2 --
 src/solver/solver2tactic.cpp                  |  2 +-
 src/solver/solver_pool.cpp                    |  6 ++--
 src/solver/tactic2solver.cpp                  |  4 +--
 .../portfolio/bounded_int2bv_solver.cpp       |  2 +-
 src/tactic/portfolio/enum2bv_solver.cpp       |  2 +-
 src/tactic/portfolio/pb2bv_solver.cpp         |  2 +-
 26 files changed, 80 insertions(+), 105 deletions(-)

diff --git a/src/api/api_solver.cpp b/src/api/api_solver.cpp
index 657ff025c..ad5e7731d 100644
--- a/src/api/api_solver.cpp
+++ b/src/api/api_solver.cpp
@@ -460,12 +460,12 @@ extern "C" {
         LOG_Z3_solver_get_unsat_core(c, s);
         RESET_ERROR_CODE();
         init_solver(c, s);
-        ptr_vector<expr> core;
+        expr_ref_vector core(mk_c(c)->m());
         to_solver_ref(s)->get_unsat_core(core);
         Z3_ast_vector_ref * v = alloc(Z3_ast_vector_ref, *mk_c(c), mk_c(c)->m());
         mk_c(c)->save_object(v);
-        for (unsigned i = 0; i < core.size(); i++) {
-            v->m_ast_vector.push_back(core[i]);
+        for (expr* e : core) {
+            v->m_ast_vector.push_back(e);
         }
         RETURN_Z3(of_ast_vector(v));
         Z3_CATCH_RETURN(nullptr);
@@ -537,23 +537,23 @@ extern "C" {
         expr_ref_vector _assumptions(m), _consequences(m), _variables(m);
         ast_ref_vector const& __assumptions = to_ast_vector_ref(assumptions);
         unsigned sz = __assumptions.size();
-        for (unsigned i = 0; i < sz; ++i) {
-            if (!is_expr(__assumptions[i])) {
+        for (ast* e : __assumptions) {
+            if (!is_expr(e)) {
                 _assumptions.finalize(); _consequences.finalize(); _variables.finalize();
                 SET_ERROR_CODE(Z3_INVALID_USAGE);
                 return Z3_L_UNDEF;
             }
-            _assumptions.push_back(to_expr(__assumptions[i]));
+            _assumptions.push_back(to_expr(e));
         }
         ast_ref_vector const& __variables = to_ast_vector_ref(variables);
         sz = __variables.size();
-        for (unsigned i = 0; i < sz; ++i) {
-            if (!is_expr(__variables[i])) {
+        for (ast* a : __variables) {
+            if (!is_expr(a)) {
                 _assumptions.finalize(); _consequences.finalize(); _variables.finalize();
                 SET_ERROR_CODE(Z3_INVALID_USAGE);
                 return Z3_L_UNDEF;
             }
-            _variables.push_back(to_expr(__variables[i]));
+            _variables.push_back(to_expr(a));
         }
         lbool result = l_undef;
         unsigned timeout     = to_solver(s)->m_params.get_uint("timeout", mk_c(c)->get_timeout());
@@ -578,8 +578,8 @@ extern "C" {
         if (result == l_undef) {
             to_solver_ref(s)->set_reason_unknown(eh);
         }
-        for (unsigned i = 0; i < _consequences.size(); ++i) {
-            to_ast_vector_ref(consequences).push_back(_consequences[i].get());
+        for (expr* e : _consequences) {
+            to_ast_vector_ref(consequences).push_back(e);
         }
         return static_cast<Z3_lbool>(result); 
         Z3_CATCH_RETURN(Z3_L_UNDEF);        
diff --git a/src/cmd_context/basic_cmds.cpp b/src/cmd_context/basic_cmds.cpp
index 1d8fdb3de..4e5202fd8 100644
--- a/src/cmd_context/basic_cmds.cpp
+++ b/src/cmd_context/basic_cmds.cpp
@@ -223,7 +223,7 @@ ATOMIC_CMD(get_proof_graph_cmd, "get-proof-graph", "retrieve proof and print it
 });
 
 static void print_core(cmd_context& ctx) {
-    ptr_vector<expr> core;
+    expr_ref_vector core(ctx.m());
     ctx.get_check_sat_result()->get_unsat_core(core);
     ctx.regular_stream() << "(";
     bool first = true;
diff --git a/src/muz/spacer/spacer_iuc_solver.cpp b/src/muz/spacer/spacer_iuc_solver.cpp
index a0bc2a627..6d824a1f2 100644
--- a/src/muz/spacer/spacer_iuc_solver.cpp
+++ b/src/muz/spacer/spacer_iuc_solver.cpp
@@ -215,10 +215,11 @@ void iuc_solver::reset_statistics ()
     m_learn_core_sw.reset();
 }
 
-void iuc_solver::get_unsat_core (ptr_vector<expr> &core)
+void iuc_solver::get_unsat_core (expr_ref_vector &core)
 {
     m_solver.get_unsat_core (core);
-    undo_proxies_in_core (core);
+    ptr_vector<expr> _core(core.size(), core.c_ptr());
+    undo_proxies_in_core (_core);
 }
 void iuc_solver::undo_proxies_in_core (ptr_vector<expr> &r)
 {
@@ -258,13 +259,6 @@ void iuc_solver::undo_proxies (expr_ref_vector &r)
         }
 }
 
-void iuc_solver::get_unsat_core (expr_ref_vector &_core)
-{
-    ptr_vector<expr> core;
-    get_unsat_core (core);
-    _core.append (core.size (), core.c_ptr ());
-}
-
 void iuc_solver::elim_proxies (expr_ref_vector &v)
 {
     expr_ref f = mk_and (v);
diff --git a/src/muz/spacer/spacer_iuc_solver.h b/src/muz/spacer/spacer_iuc_solver.h
index 0195ea134..3c6251be0 100644
--- a/src/muz/spacer/spacer_iuc_solver.h
+++ b/src/muz/spacer/spacer_iuc_solver.h
@@ -92,7 +92,6 @@ public:
     ~iuc_solver() override {}
 
     /* iuc solver specific */
-    void get_unsat_core(expr_ref_vector &core) override;
     virtual void get_iuc(expr_ref_vector &core);
     void set_split_literals(bool v) { m_split_literals = v; }
     bool mk_proxies(expr_ref_vector &v, unsigned from = 0);
@@ -102,7 +101,11 @@ public:
     void pop_bg(unsigned n);
     unsigned get_num_bg();
 
-    void get_full_unsat_core(ptr_vector<expr> &core) { m_solver.get_unsat_core(core); }
+    void get_full_unsat_core(ptr_vector<expr> &core) { 
+        expr_ref_vector _core(m);
+        m_solver.get_unsat_core(_core); 
+        core.append(_core.size(), _core.c_ptr());
+    }
 
     /* solver interface */
 
@@ -142,7 +145,7 @@ public:
     void collect_statistics(statistics &st) const override ;
     virtual void reset_statistics();
 
-    void get_unsat_core(ptr_vector<expr> &r) override;
+    void get_unsat_core(expr_ref_vector &r) override;
     void get_model_core(model_ref &m) override {m_solver.get_model(m);}
     proof *get_proof() override {return m_solver.get_proof();}
     std::string reason_unknown() const override { return m_solver.reason_unknown(); }
diff --git a/src/muz/spacer/spacer_prop_solver.cpp b/src/muz/spacer/spacer_prop_solver.cpp
index 64f1bfc9a..435f0af3a 100644
--- a/src/muz/spacer/spacer_prop_solver.cpp
+++ b/src/muz/spacer/spacer_prop_solver.cpp
@@ -245,7 +245,7 @@ lbool prop_solver::maxsmt(expr_ref_vector &hard, expr_ref_vector &soft,
     soft.reset();
 
     expr_ref saved(m);
-    ptr_vector<expr> core;
+    expr_ref_vector core(m);
     m_ctx->get_unsat_core(core);
 
     // while there are soft constraints
diff --git a/src/opt/maxres.cpp b/src/opt/maxres.cpp
index d49044d8d..e86b20820 100644
--- a/src/opt/maxres.cpp
+++ b/src/opt/maxres.cpp
@@ -88,7 +88,7 @@ private:
     expr_ref_vector  m_asms;    
     expr_ref_vector  m_defs;
     obj_map<expr, rational> m_asm2weight;
-    ptr_vector<expr> m_new_core;
+    expr_ref_vector  m_new_core;
     mus              m_mus;
     expr_ref_vector  m_trail;
     strategy_t       m_st;
@@ -119,6 +119,7 @@ public:
         maxsmt_solver_base(c, ws, soft),
         m_index(index), 
         m_B(m), m_asms(m), m_defs(m),
+        m_new_core(m),
         m_mus(c.get_solver()),
         m_trail(m),
         m_st(st),
@@ -351,11 +352,13 @@ public:
         exprs core;
         while (is_sat == l_false) {
             core.reset();
-            s().get_unsat_core(core);
-            // verify_core(core);
+            expr_ref_vector _core(m);
+            s().get_unsat_core(_core);
             model_ref mdl;
             get_mus_model(mdl);
-            is_sat = minimize_core(core);
+            is_sat = minimize_core(_core);
+            core.append(_core.size(), _core.c_ptr());
+            // verify_core(core);
             ++m_stats.m_num_cores;
             if (is_sat != l_true) {
                 IF_VERBOSE(100, verbose_stream() << "(opt.maxres minimization failed)\n";);
@@ -538,7 +541,7 @@ public:
         return nullptr != mdl.get();
     }
 
-    lbool minimize_core(exprs& core) {
+    lbool minimize_core(expr_ref_vector& core) {
         if (core.empty()) {
             return l_true;
         }
diff --git a/src/opt/opt_context.cpp b/src/opt/opt_context.cpp
index 2850dd59c..37dbd0817 100644
--- a/src/opt/opt_context.cpp
+++ b/src/opt/opt_context.cpp
@@ -172,7 +172,7 @@ namespace opt {
         r.append(m_labels);
     }
 
-    void context::get_unsat_core(ptr_vector<expr> & r) { 
+    void context::get_unsat_core(expr_ref_vector & r) { 
         throw default_exception("Unsat cores are not supported with optimization"); 
     }
 
diff --git a/src/opt/opt_context.h b/src/opt/opt_context.h
index 29b327855..1172e68b6 100644
--- a/src/opt/opt_context.h
+++ b/src/opt/opt_context.h
@@ -195,7 +195,7 @@ namespace opt {
         void collect_statistics(statistics& stats) const override;
         proof* get_proof() override { return nullptr; }
         void get_labels(svector<symbol> & r) override;
-        void get_unsat_core(ptr_vector<expr> & r) override;
+        void get_unsat_core(expr_ref_vector & r) override;
         std::string reason_unknown() const override;
         void set_reason_unknown(char const* msg) override { m_unknown = msg; }
 
diff --git a/src/opt/opt_solver.cpp b/src/opt/opt_solver.cpp
index 1a6587585..ca0474314 100644
--- a/src/opt/opt_solver.cpp
+++ b/src/opt/opt_solver.cpp
@@ -294,7 +294,8 @@ namespace opt {
         return r;
     }
     
-    void opt_solver::get_unsat_core(ptr_vector<expr> & r) {
+    void opt_solver::get_unsat_core(expr_ref_vector & r) {
+        r.reset();
         unsigned sz = m_context.get_unsat_core_size();
         for (unsigned i = 0; i < sz; i++) {
             r.push_back(m_context.get_unsat_core_expr(i));
diff --git a/src/opt/opt_solver.h b/src/opt/opt_solver.h
index 7ffb531be..39562ec54 100644
--- a/src/opt/opt_solver.h
+++ b/src/opt/opt_solver.h
@@ -96,7 +96,7 @@ namespace opt {
         void push_core() override;
         void pop_core(unsigned n) override;
         lbool check_sat_core(unsigned num_assumptions, expr * const * assumptions) override;
-        void get_unsat_core(ptr_vector<expr> & r) override;
+        void get_unsat_core(expr_ref_vector & r) override;
         void get_model_core(model_ref & _m) override;
         proof * get_proof() override;
         std::string reason_unknown() const override;
diff --git a/src/qe/qe_mbi.cpp b/src/qe/qe_mbi.cpp
index 298a1da99..31b6001ea 100644
--- a/src/qe/qe_mbi.cpp
+++ b/src/qe/qe_mbi.cpp
@@ -30,19 +30,12 @@ Revision History:
 namespace qe {
 
     lbool mbi_plugin::check(func_decl_ref_vector const& vars, expr_ref_vector& lits, model_ref& mdl) {
-        ast_manager& m = lits.get_manager();
-        expr_ref_vector lits0(lits);
         while (true) {
-            lits.reset();
-            lits.append(lits0);
             switch ((*this)(vars, lits, mdl)) {
             case mbi_sat:
                 return l_true;
             case mbi_unsat:
-                if (lits.empty()) return l_false;
-                TRACE("qe", tout << "block: " << lits << "\n";);
-                block(lits);
-                break;
+                return l_false;
             case mbi_undef:
                 return l_undef;
             case mbi_augment:
@@ -113,8 +106,7 @@ namespace qe {
         m(s->get_manager()), 
         m_atoms(m),
         m_solver(s),
-        m_dual_solver(sNot)
-    {
+        m_dual_solver(sNot) {
         params_ref p;
         p.set_bool("core.minimize", true);
         m_solver->updt_params(p);
@@ -256,6 +248,7 @@ namespace qe {
                 case l_true:
                     return l_true;
                 case l_false:
+					std::cout << lits << "\n";
                     a.block(lits);
                     itps.push_back(mk_not(mk_and(lits)));
                     break;
diff --git a/src/qe/qe_term_graph.cpp b/src/qe/qe_term_graph.cpp
index 084391368..2fa652828 100644
--- a/src/qe/qe_term_graph.cpp
+++ b/src/qe/qe_term_graph.cpp
@@ -701,7 +701,7 @@ namespace qe {
             }
 
             void solve() {
-                ptr_vector<term> worklist;
+               ptr_vector<term> worklist;
                 for (term * t : m_tg.m_terms) {
                     // skip pure terms
                     if (m_term2app.contains(t->get_id())) continue;
@@ -785,8 +785,7 @@ namespace qe {
                 do {
                     expr* member = mk_pure(*r);
                     SASSERT(member);
-                    if (!members.contains(member) &&
-                        (!is_projected(*r) || !is_solved_eq(rep, member))) {
+                    if (!members.contains(member) && (!is_projected(*r) || !is_solved_eq(rep, member))) {
                         res.push_back(m.mk_eq(rep, member));
                         members.insert(member);
                     }
@@ -814,6 +813,7 @@ namespace qe {
                 return mk_equalities(false, res);
             }
 
+            // TBD: generalize for also the case of a (:var n)
             bool is_solved_eq(expr *_lhs, expr* _rhs) {
                 if (!is_app(_lhs) || !is_app(_rhs)) return false;
                 app *lhs, *rhs;
diff --git a/src/sat/sat_solver/inc_sat_solver.cpp b/src/sat/sat_solver/inc_sat_solver.cpp
index e1e0e0b0a..8b7e2e63c 100644
--- a/src/sat/sat_solver/inc_sat_solver.cpp
+++ b/src/sat/sat_solver/inc_sat_solver.cpp
@@ -299,7 +299,7 @@ public:
         if (m_preprocess) m_preprocess->collect_statistics(st);
         m_solver.collect_statistics(st);
     }
-    void get_unsat_core(ptr_vector<expr> & r) override {
+    void get_unsat_core(expr_ref_vector & r) override {
         r.reset();
         r.append(m_core.size(), m_core.c_ptr());
     }
diff --git a/src/smt/smt_context.cpp b/src/smt/smt_context.cpp
index bc5814186..0bc21d627 100644
--- a/src/smt/smt_context.cpp
+++ b/src/smt/smt_context.cpp
@@ -3258,7 +3258,7 @@ namespace smt {
         m_assumptions.reset();
     }
 
-    lbool context::mk_unsat_core(lbool r) {
+    lbool context::mk_unsat_core(lbool r) {        
         if (r != l_false) return r;
         SASSERT(inconsistent());
         if (!tracking_assumptions()) {
@@ -3276,18 +3276,16 @@ namespace smt {
             SASSERT(m_literal2assumption.contains(l.index()));
             if (!already_found_assumptions.contains(l.index())) {
                 already_found_assumptions.insert(l.index());
-                m_unsat_core.push_back(m_literal2assumption[l.index()]);
+                expr* orig_assumption = m_literal2assumption[l.index()];
+                m_unsat_core.push_back(orig_assumption);
+                TRACE("assumptions", tout << l << ": " << mk_pp(orig_assumption, m_manager) << "\n";);
             }
         }
         reset_assumptions();
         pop_to_base_lvl(); // undo the push_scope() performed by init_assumptions
         m_search_lvl = m_base_lvl;
         std::sort(m_unsat_core.c_ptr(), m_unsat_core.c_ptr() + m_unsat_core.size(), ast_lt_proc());
-        TRACE("unsat_core_bug", tout << "unsat core:\n";
-              unsigned sz = m_unsat_core.size();
-              for (unsigned i = 0; i < sz; i++) {
-                  tout << mk_pp(m_unsat_core.get(i), m_manager) << "\n";
-              });
+        TRACE("unsat_core_bug", tout << "unsat core:\n" << m_unsat_core << "\n";);
         validate_unsat_core();
         // theory validation of unsat core
         for (theory* th : m_theory_set) {
@@ -3403,7 +3401,6 @@ namespace smt {
 
     lbool context::check(unsigned num_assumptions, expr * const * assumptions, bool reset_cancel, bool already_did_theory_assumptions) {
         if (!check_preamble(reset_cancel)) return l_undef;
-        TRACE("before_search", display(tout););
         SASSERT(at_base_level());
         setup_context(false);
         expr_ref_vector asms(m_manager, num_assumptions, assumptions);
@@ -3412,6 +3409,7 @@ namespace smt {
         TRACE("unsat_core_bug", tout << asms << "\n";);        
         internalize_assertions();
         init_assumptions(asms);
+        TRACE("before_search", display(tout););
         lbool r = search();
         r = mk_unsat_core(r);        
         r = check_finalize(r);
diff --git a/src/smt/smt_solver.cpp b/src/smt/smt_solver.cpp
index b0a8153a5..48f6053fc 100644
--- a/src/smt/smt_solver.cpp
+++ b/src/smt/smt_solver.cpp
@@ -209,7 +209,7 @@ namespace smt {
             }
         };
 
-        void get_unsat_core(ptr_vector<expr> & r) override {
+        void get_unsat_core(expr_ref_vector & r) override {
             unsigned sz = m_context.get_unsat_core_size();
             for (unsigned i = 0; i < sz; i++) {
                 r.push_back(m_context.get_unsat_core_expr(i));
@@ -219,7 +219,7 @@ namespace smt {
                 scoped_minimize_core scm(*this);
                 mus mus(*this);
                 mus.add_soft(r.size(), r.c_ptr());
-                ptr_vector<expr> r2;
+                expr_ref_vector r2(m);
                 if (l_true == mus.get_mus(r2)) {
                     r.reset();
                     r.append(r2);
@@ -333,7 +333,7 @@ namespace smt {
             for_each_expr(p, visited, e);
         }
 
-        void compute_assrtn_fds(ptr_vector<expr> & core, vector<func_decl_set> & assrtn_fds) {
+        void compute_assrtn_fds(expr_ref_vector & core, vector<func_decl_set> & assrtn_fds) {
             assrtn_fds.resize(m_name2assertion.size());            
             unsigned i = 0;
             for (auto & kv : m_name2assertion) {
@@ -354,7 +354,7 @@ namespace smt {
             return false;
         }
 
-        void add_pattern_literals_to_core(ptr_vector<expr> & core) {
+        void add_pattern_literals_to_core(expr_ref_vector & core) {
             ast_manager & m = get_manager();
             expr_ref_vector new_core_literals(m);
 
@@ -413,7 +413,7 @@ namespace smt {
             for_each_expr(p, visited, e);
         }
 
-        void add_nonlocal_pattern_literals_to_core(ptr_vector<expr> & core) {
+        void add_nonlocal_pattern_literals_to_core(expr_ref_vector & core) {
             ast_manager & m = get_manager();
             for (auto const& kv : m_name2assertion) {
                 expr_ref name(kv.m_key, m);
@@ -425,8 +425,8 @@ namespace smt {
                     collect_body_func_decls(assrtn, body_fds);
 
                     for (func_decl *fd : pattern_fds) {
-                        if (!body_fds.contains(fd)) {
-                            core.insert(name);
+                        if (!body_fds.contains(fd) && !core.contains(name)) {
+                            core.push_back(name);
                             break;
                         }
                     }
diff --git a/src/solver/check_sat_result.cpp b/src/solver/check_sat_result.cpp
index 0d3c112b3..28e6afeca 100644
--- a/src/solver/check_sat_result.cpp
+++ b/src/solver/check_sat_result.cpp
@@ -48,9 +48,11 @@ void simple_check_sat_result::collect_statistics(statistics & st) const {
     st.copy(m_stats); 
 }
 
-void simple_check_sat_result::get_unsat_core(ptr_vector<expr> & r) { 
-    if (m_status == l_false) 
+void simple_check_sat_result::get_unsat_core(expr_ref_vector & r) { 
+    if (m_status == l_false) {
+        r.reset();
         r.append(m_core.size(), m_core.c_ptr()); 
+    }
 }
  
 void simple_check_sat_result::get_model_core(model_ref & m) { 
diff --git a/src/solver/check_sat_result.h b/src/solver/check_sat_result.h
index 762735b8d..7e698b806 100644
--- a/src/solver/check_sat_result.h
+++ b/src/solver/check_sat_result.h
@@ -50,12 +50,7 @@ public:
     lbool set_status(lbool r) { return m_status = r; }
     lbool status() const { return m_status; }
     virtual void collect_statistics(statistics & st) const = 0;
-    virtual void get_unsat_core(ptr_vector<expr> & r) = 0;
-    virtual void get_unsat_core(expr_ref_vector & r) {
-        ptr_vector<expr> core;
-        get_unsat_core(core);
-        r.append(core.size(), core.c_ptr());
-    }
+    virtual void get_unsat_core(expr_ref_vector & r) = 0;
     void set_model_converter(model_converter* mc) { m_mc0 = mc; }
     model_converter* mc0() const { return m_mc0.get(); }
     virtual void get_model_core(model_ref & m) = 0;
@@ -87,7 +82,7 @@ struct simple_check_sat_result : public check_sat_result {
     ~simple_check_sat_result() override;
     ast_manager& get_manager() const override { return m_proof.get_manager(); }
     void collect_statistics(statistics & st) const override;
-    void get_unsat_core(ptr_vector<expr> & r) override;
+    void get_unsat_core(expr_ref_vector & r) override;
     void get_model_core(model_ref & m) override;
     proof * get_proof() override;
     std::string reason_unknown() const override;
diff --git a/src/solver/combined_solver.cpp b/src/solver/combined_solver.cpp
index a47302f5d..ad166d425 100644
--- a/src/solver/combined_solver.cpp
+++ b/src/solver/combined_solver.cpp
@@ -298,7 +298,7 @@ public:
             m_solver1->collect_statistics(st);
     }
 
-    void get_unsat_core(ptr_vector<expr> & r) override {
+    void get_unsat_core(expr_ref_vector & r) override {
         if (m_use_solver1_results)
             m_solver1->get_unsat_core(r);
         else
diff --git a/src/solver/mus.cpp b/src/solver/mus.cpp
index a7925f268..b3d6c9ad9 100644
--- a/src/solver/mus.cpp
+++ b/src/solver/mus.cpp
@@ -64,7 +64,6 @@ struct mus::imp {
     }
 
     void add_assumption(expr* lit) {
-        SASSERT(is_literal(lit));
         m_assumptions.push_back(lit);
     }
 
@@ -78,17 +77,9 @@ struct mus::imp {
         return get_mus1(mus);
     }
 
-    lbool get_mus(ptr_vector<expr>& mus) {
-        mus.reset();
-        expr_ref_vector result(m);
-        lbool r = get_mus(result);
-        mus.append(result.size(), result.c_ptr());
-        return r;
-    }    
-
     lbool get_mus1(expr_ref_vector& mus) {
         ptr_vector<expr> unknown(m_lit2expr.size(), m_lit2expr.c_ptr());
-        ptr_vector<expr> core_exprs;
+        expr_ref_vector core_exprs(m);
         TRACE("mus", m_solver.display(tout););
         while (!unknown.empty()) { 
             IF_VERBOSE(12, verbose_stream() << "(mus reducing core: " << unknown.size() << " new core: " << mus.size() << ")\n";);
@@ -116,12 +107,12 @@ struct mus::imp {
                 if (!core_exprs.contains(not_lit)) {
                     // unknown := core_exprs \ mus
                     unknown.reset();
-                    for (unsigned i = 0; i < core_exprs.size(); ++i) {
-                        if (!mus.contains(core_exprs[i])) {
-                            unknown.push_back(core_exprs[i]);
+                    for (expr* c : core_exprs) {
+                        if (!mus.contains(c)) {
+                            unknown.push_back(c);
                         }
                     }
-                    TRACE("mus", display_vec(tout << "core exprs:", core_exprs);
+                    TRACE("mus", tout << "core exprs:" << core_exprs << "\n";
                         display_vec(tout << "core:", unknown);
                         display_vec(tout << "mus:", mus);
                     );
@@ -242,11 +233,11 @@ struct mus::imp {
 
     void get_core(expr_set& core) {
         core.reset();
-        ptr_vector<expr> core_exprs;
+        expr_ref_vector core_exprs(m);
         m_solver.get_unsat_core(core_exprs);
-        for (unsigned i = 0; i < core_exprs.size(); ++i) {
-            if (m_expr2lit.contains(core_exprs[i])) {
-                core.insert(core_exprs[i]);
+        for (expr* c : core_exprs) {
+            if (m_expr2lit.contains(c)) {
+                core.insert(c);
             }
         }
     }
@@ -375,9 +366,6 @@ void mus::add_assumption(expr* lit) {
     return m_imp->add_assumption(lit);
 }
 
-lbool mus::get_mus(ptr_vector<expr>& mus) {
-    return m_imp->get_mus(mus);
-}
 
 lbool mus::get_mus(expr_ref_vector& mus) {
     return m_imp->get_mus(mus);
diff --git a/src/solver/mus.h b/src/solver/mus.h
index f2e543f04..807b07873 100644
--- a/src/solver/mus.h
+++ b/src/solver/mus.h
@@ -47,8 +47,6 @@ class mus {
      */
     void add_assumption(expr* lit);
 
-    lbool get_mus(ptr_vector<expr>& mus);
-
     lbool get_mus(expr_ref_vector& mus);
     
     void reset();
diff --git a/src/solver/solver2tactic.cpp b/src/solver/solver2tactic.cpp
index 68d4b11f6..3c4f291a5 100644
--- a/src/solver/solver2tactic.cpp
+++ b/src/solver/solver2tactic.cpp
@@ -134,7 +134,7 @@ public:
                 in->set(proof2proof_converter(m, pr));
             }
             if (in->unsat_core_enabled()) {
-                ptr_vector<expr> core;
+                expr_ref_vector core(m);
                 local_solver->get_unsat_core(core);
                 for (expr* c : core) {
                     lcore = m.mk_join(lcore, m.mk_leaf(bool2dep.find(c)));
diff --git a/src/solver/solver_pool.cpp b/src/solver/solver_pool.cpp
index 1d0fd0c11..9dacfb5ce 100644
--- a/src/solver/solver_pool.cpp
+++ b/src/solver/solver_pool.cpp
@@ -83,12 +83,12 @@ public:
     unsigned get_num_assertions() const override { return m_base->get_num_assertions(); }
     expr * get_assertion(unsigned idx) const override { return m_base->get_assertion(idx); }
 
-    void get_unsat_core(ptr_vector<expr> & r) override {
+    void get_unsat_core(expr_ref_vector& r) override {
         m_base->get_unsat_core(r);
         unsigned j = 0;
         for (unsigned i = 0; i < r.size(); ++i)
-            if (m_pred != r[i])
-                r[j++] = r[i];
+            if (m_pred != r.get(i))
+                r[j++] = r.get(i);
         r.shrink(j);
     }
 
diff --git a/src/solver/tactic2solver.cpp b/src/solver/tactic2solver.cpp
index 9118bb658..94509e3f6 100644
--- a/src/solver/tactic2solver.cpp
+++ b/src/solver/tactic2solver.cpp
@@ -62,7 +62,7 @@ public:
     lbool check_sat_core(unsigned num_assumptions, expr * const * assumptions) override;
 
     void collect_statistics(statistics & st) const override;
-    void get_unsat_core(ptr_vector<expr> & r) override;
+    void get_unsat_core(expr_ref_vector & r) override;
     void get_model_core(model_ref & m) override;
     proof * get_proof() override;
     std::string reason_unknown() const override;
@@ -219,7 +219,7 @@ void tactic2solver::collect_statistics(statistics & st) const {
     //SASSERT(m_stats.size() > 0);
 }
 
-void tactic2solver::get_unsat_core(ptr_vector<expr> & r) {
+void tactic2solver::get_unsat_core(expr_ref_vector & r) {
     if (m_result.get()) {
         m_result->get_unsat_core(r);
     }
diff --git a/src/tactic/portfolio/bounded_int2bv_solver.cpp b/src/tactic/portfolio/bounded_int2bv_solver.cpp
index 8767644f3..6389ed739 100644
--- a/src/tactic/portfolio/bounded_int2bv_solver.cpp
+++ b/src/tactic/portfolio/bounded_int2bv_solver.cpp
@@ -148,7 +148,7 @@ public:
     void set_produce_models(bool f) override { m_solver->set_produce_models(f); }
     void set_progress_callback(progress_callback * callback) override { m_solver->set_progress_callback(callback);  }
     void collect_statistics(statistics & st) const override { m_solver->collect_statistics(st); }
-    void get_unsat_core(ptr_vector<expr> & r) override { m_solver->get_unsat_core(r); }
+    void get_unsat_core(expr_ref_vector & r) override { m_solver->get_unsat_core(r); }
     void get_model_core(model_ref & mdl) override {
         m_solver->get_model(mdl);
         if (mdl) {
diff --git a/src/tactic/portfolio/enum2bv_solver.cpp b/src/tactic/portfolio/enum2bv_solver.cpp
index 6b5fe9056..29c6aeb39 100644
--- a/src/tactic/portfolio/enum2bv_solver.cpp
+++ b/src/tactic/portfolio/enum2bv_solver.cpp
@@ -88,7 +88,7 @@ public:
     void set_produce_models(bool f) override { m_solver->set_produce_models(f); }
     void set_progress_callback(progress_callback * callback) override { m_solver->set_progress_callback(callback);  }
     void collect_statistics(statistics & st) const override { m_solver->collect_statistics(st); }
-    void get_unsat_core(ptr_vector<expr> & r) override { m_solver->get_unsat_core(r); }
+    void get_unsat_core(expr_ref_vector & r) override { m_solver->get_unsat_core(r); }
     void get_model_core(model_ref & mdl) override { 
         m_solver->get_model(mdl);
         if (mdl) {
diff --git a/src/tactic/portfolio/pb2bv_solver.cpp b/src/tactic/portfolio/pb2bv_solver.cpp
index f8794ca41..60ca6a5dc 100644
--- a/src/tactic/portfolio/pb2bv_solver.cpp
+++ b/src/tactic/portfolio/pb2bv_solver.cpp
@@ -87,7 +87,7 @@ public:
         m_rewriter.collect_statistics(st);
         m_solver->collect_statistics(st); 
     }
-    void get_unsat_core(ptr_vector<expr> & r) override { m_solver->get_unsat_core(r); }
+    void get_unsat_core(expr_ref_vector & r) override { m_solver->get_unsat_core(r); }
     void get_model_core(model_ref & mdl) override { 
         m_solver->get_model(mdl);
         if (mdl) {