mirror of
https://github.com/Z3Prover/z3
synced 2025-06-06 06:03:23 +00:00
debugging mc
Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
This commit is contained in:
parent
c7ee532173
commit
e4f29a7b8a
38 changed files with 143 additions and 123 deletions
|
@ -864,7 +864,7 @@ void cmd_context::insert(symbol const & s, object_ref * r) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void cmd_context::model_add(symbol const & s, unsigned arity, sort *const* domain, expr * t) {
|
void cmd_context::model_add(symbol const & s, unsigned arity, sort *const* domain, expr * t) {
|
||||||
if (!m_mc0.get()) m_mc0 = alloc(generic_model_converter, m());
|
if (!m_mc0.get()) m_mc0 = alloc(generic_model_converter, m(), "cmd_context");
|
||||||
if (m_solver.get() && !m_solver->mc0()) m_solver->set_model_converter(m_mc0.get());
|
if (m_solver.get() && !m_solver->mc0()) m_solver->set_model_converter(m_mc0.get());
|
||||||
func_decl_ref fn(m().mk_func_decl(s, arity, domain, m().get_sort(t)), m());
|
func_decl_ref fn(m().mk_func_decl(s, arity, domain, m().get_sort(t)), m());
|
||||||
dictionary<func_decls>::entry * e = m_func_decls.insert_if_not_there2(s, func_decls());
|
dictionary<func_decls>::entry * e = m_func_decls.insert_if_not_there2(s, func_decls());
|
||||||
|
@ -874,7 +874,7 @@ void cmd_context::model_add(symbol const & s, unsigned arity, sort *const* domai
|
||||||
}
|
}
|
||||||
|
|
||||||
void cmd_context::model_del(func_decl* f) {
|
void cmd_context::model_del(func_decl* f) {
|
||||||
if (!m_mc0.get()) m_mc0 = alloc(generic_model_converter, m());
|
if (!m_mc0.get()) m_mc0 = alloc(generic_model_converter, m(), "model_del");
|
||||||
if (m_solver.get() && !m_solver->mc0()) m_solver->set_model_converter(m_mc0.get());
|
if (m_solver.get() && !m_solver->mc0()) m_solver->set_model_converter(m_mc0.get());
|
||||||
m_mc0->hide(f);
|
m_mc0->hide(f);
|
||||||
}
|
}
|
||||||
|
|
|
@ -326,7 +326,7 @@ namespace datalog {
|
||||||
rules.set_output_predicate(qpred);
|
rules.set_output_predicate(qpred);
|
||||||
|
|
||||||
if (m_ctx.get_model_converter()) {
|
if (m_ctx.get_model_converter()) {
|
||||||
generic_model_converter* mc = alloc(generic_model_converter, m);
|
generic_model_converter* mc = alloc(generic_model_converter, m, "dl_rule");
|
||||||
mc->hide(qpred);
|
mc->hide(qpred);
|
||||||
m_ctx.add_model_converter(mc);
|
m_ctx.add_model_converter(mc);
|
||||||
}
|
}
|
||||||
|
|
|
@ -225,7 +225,7 @@ class horn_tactic : public tactic {
|
||||||
}
|
}
|
||||||
queries.reset();
|
queries.reset();
|
||||||
queries.push_back(q);
|
queries.push_back(q);
|
||||||
generic_model_converter* mc1 = alloc(generic_model_converter, m);
|
generic_model_converter* mc1 = alloc(generic_model_converter, m, "horn");
|
||||||
mc1->hide(q);
|
mc1->hide(q);
|
||||||
g->add(mc1);
|
g->add(mc1);
|
||||||
}
|
}
|
||||||
|
|
|
@ -299,7 +299,7 @@ namespace datalog {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (m_context.get_model_converter()) {
|
if (m_context.get_model_converter()) {
|
||||||
generic_model_converter* fmc = alloc(generic_model_converter, m);
|
generic_model_converter* fmc = alloc(generic_model_converter, m, "dl_mk_bit_blast");
|
||||||
bit_blast_model_converter* bvmc = alloc(bit_blast_model_converter, m);
|
bit_blast_model_converter* bvmc = alloc(bit_blast_model_converter, m);
|
||||||
func_decl_ref_vector const& old_funcs = m_rewriter.m_cfg.old_funcs();
|
func_decl_ref_vector const& old_funcs = m_rewriter.m_cfg.old_funcs();
|
||||||
func_decl_ref_vector const& new_funcs = m_rewriter.m_cfg.new_funcs();
|
func_decl_ref_vector const& new_funcs = m_rewriter.m_cfg.new_funcs();
|
||||||
|
|
|
@ -90,7 +90,7 @@ namespace datalog {
|
||||||
|
|
||||||
// set to false each unreached predicate
|
// set to false each unreached predicate
|
||||||
if (m_context.get_model_converter()) {
|
if (m_context.get_model_converter()) {
|
||||||
generic_model_converter* mc0 = alloc(generic_model_converter, m);
|
generic_model_converter* mc0 = alloc(generic_model_converter, m, "dl_coi");
|
||||||
for (auto const& kv : engine) {
|
for (auto const& kv : engine) {
|
||||||
if (!kv.m_value.is_reachable()) {
|
if (!kv.m_value.is_reachable()) {
|
||||||
mc0->add(kv.m_key, m.mk_false());
|
mc0->add(kv.m_key, m.mk_false());
|
||||||
|
@ -127,7 +127,7 @@ namespace datalog {
|
||||||
if (res && m_context.get_model_converter()) {
|
if (res && m_context.get_model_converter()) {
|
||||||
func_decl_set::iterator end = pruned_preds.end();
|
func_decl_set::iterator end = pruned_preds.end();
|
||||||
func_decl_set::iterator it = pruned_preds.begin();
|
func_decl_set::iterator it = pruned_preds.begin();
|
||||||
generic_model_converter* mc0 = alloc(generic_model_converter, m);
|
generic_model_converter* mc0 = alloc(generic_model_converter, m, "dl_coi");
|
||||||
for (; it != end; ++it) {
|
for (; it != end; ++it) {
|
||||||
const rule_vector& rules = source.get_predicate_rules(*it);
|
const rule_vector& rules = source.get_predicate_rules(*it);
|
||||||
expr_ref_vector fmls(m);
|
expr_ref_vector fmls(m);
|
||||||
|
|
|
@ -126,7 +126,7 @@ namespace opt {
|
||||||
m_box_index(UINT_MAX),
|
m_box_index(UINT_MAX),
|
||||||
m_optsmt(m),
|
m_optsmt(m),
|
||||||
m_scoped_state(m),
|
m_scoped_state(m),
|
||||||
m_fm(m),
|
m_fm(m, "opt"),
|
||||||
m_objective_refs(m),
|
m_objective_refs(m),
|
||||||
m_enable_sat(false),
|
m_enable_sat(false),
|
||||||
m_is_clausal(false),
|
m_is_clausal(false),
|
||||||
|
@ -1062,7 +1062,7 @@ namespace opt {
|
||||||
std::ostringstream out;
|
std::ostringstream out;
|
||||||
out << mk_pp(term, m);
|
out << mk_pp(term, m);
|
||||||
app* q = m.mk_fresh_const(out.str().c_str(), m.get_sort(term));
|
app* q = m.mk_fresh_const(out.str().c_str(), m.get_sort(term));
|
||||||
if (!fm) fm = alloc(generic_model_converter, m);
|
if (!fm) fm = alloc(generic_model_converter, m, "opt");
|
||||||
m_hard_constraints.push_back(m.mk_eq(q, term));
|
m_hard_constraints.push_back(m.mk_eq(q, term));
|
||||||
fm->hide(q);
|
fm->hide(q);
|
||||||
return q;
|
return q;
|
||||||
|
|
|
@ -50,7 +50,7 @@ namespace opt {
|
||||||
if (is_sat != l_true) {
|
if (is_sat != l_true) {
|
||||||
return is_sat;
|
return is_sat;
|
||||||
}
|
}
|
||||||
m_filter = alloc(generic_model_converter, m);
|
m_filter = alloc(generic_model_converter, m, "sortmax");
|
||||||
rational offset = m_lower;
|
rational offset = m_lower;
|
||||||
m_upper = offset;
|
m_upper = offset;
|
||||||
expr_ref_vector in(m);
|
expr_ref_vector in(m);
|
||||||
|
|
|
@ -44,7 +44,7 @@ namespace qe {
|
||||||
m(m),
|
m(m),
|
||||||
m_asms(m),
|
m_asms(m),
|
||||||
m_trail(m),
|
m_trail(m),
|
||||||
m_fmc(alloc(generic_model_converter, m))
|
m_fmc(alloc(generic_model_converter, m, "qsat"))
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -900,7 +900,7 @@ void sat2goal::mc::flush_gmc() {
|
||||||
sat::literal_vector updates;
|
sat::literal_vector updates;
|
||||||
m_smc.expand(updates);
|
m_smc.expand(updates);
|
||||||
m_smc.reset();
|
m_smc.reset();
|
||||||
if (!m_gmc) m_gmc = alloc(generic_model_converter, m);
|
if (!m_gmc) m_gmc = alloc(generic_model_converter, m, "sat2goal");
|
||||||
// now gmc owns the model converter
|
// now gmc owns the model converter
|
||||||
sat::literal_vector clause;
|
sat::literal_vector clause;
|
||||||
expr_ref_vector tail(m);
|
expr_ref_vector tail(m);
|
||||||
|
@ -1018,7 +1018,7 @@ void sat2goal::mc::insert(sat::bool_var v, app * atom, bool aux) {
|
||||||
if (aux) {
|
if (aux) {
|
||||||
SASSERT(is_uninterp_const(atom));
|
SASSERT(is_uninterp_const(atom));
|
||||||
SASSERT(m.is_bool(atom));
|
SASSERT(m.is_bool(atom));
|
||||||
if (!m_gmc) m_gmc = alloc(generic_model_converter, m);
|
if (!m_gmc) m_gmc = alloc(generic_model_converter, m, "sat2goal");
|
||||||
m_gmc->hide(atom->get_decl());
|
m_gmc->hide(atom->get_decl());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -43,7 +43,6 @@ std::ostream& solver::display(std::ostream & out, unsigned n, expr* const* assum
|
||||||
get_assertions(fmls);
|
get_assertions(fmls);
|
||||||
ast_pp_util visitor(get_manager());
|
ast_pp_util visitor(get_manager());
|
||||||
model_converter_ref mc = get_model_converter();
|
model_converter_ref mc = get_model_converter();
|
||||||
mc = concat(mc0(), mc.get());
|
|
||||||
if (mc.get()) {
|
if (mc.get()) {
|
||||||
mc->collect(visitor);
|
mc->collect(visitor);
|
||||||
}
|
}
|
||||||
|
@ -180,7 +179,6 @@ void solver::assert_expr(expr* f) {
|
||||||
expr_ref fml(f, get_manager());
|
expr_ref fml(f, get_manager());
|
||||||
if (m_enforce_model_conversion) {
|
if (m_enforce_model_conversion) {
|
||||||
model_converter_ref mc = get_model_converter();
|
model_converter_ref mc = get_model_converter();
|
||||||
mc = concat(mc0(), mc.get());
|
|
||||||
if (mc) {
|
if (mc) {
|
||||||
(*mc)(fml);
|
(*mc)(fml);
|
||||||
}
|
}
|
||||||
|
@ -196,7 +194,6 @@ void solver::assert_expr(expr* f, expr* t) {
|
||||||
IF_VERBOSE(0, verbose_stream() << "enforce model conversion\n";);
|
IF_VERBOSE(0, verbose_stream() << "enforce model conversion\n";);
|
||||||
exit(0);
|
exit(0);
|
||||||
model_converter_ref mc = get_model_converter();
|
model_converter_ref mc = get_model_converter();
|
||||||
mc = concat(mc0(), mc.get());
|
|
||||||
if (mc) {
|
if (mc) {
|
||||||
(*mc)(fml);
|
(*mc)(fml);
|
||||||
// (*mc)(a);
|
// (*mc)(a);
|
||||||
|
|
|
@ -65,7 +65,7 @@ void extract_clauses_and_dependencies(goal_ref const& g, expr_ref_vector& clause
|
||||||
bool2dep.insert(b, d);
|
bool2dep.insert(b, d);
|
||||||
assumptions.push_back(b);
|
assumptions.push_back(b);
|
||||||
if (!fmc) {
|
if (!fmc) {
|
||||||
fmc = alloc(generic_model_converter, m);
|
fmc = alloc(generic_model_converter, m, "solver2tactic");
|
||||||
}
|
}
|
||||||
fmc->hide(to_app(b)->get_decl());
|
fmc->hide(to_app(b)->get_decl());
|
||||||
}
|
}
|
||||||
|
|
|
@ -86,7 +86,7 @@ public:
|
||||||
|
|
||||||
func_decl_ref_vector const& fns = rw2.fresh_constants();
|
func_decl_ref_vector const& fns = rw2.fresh_constants();
|
||||||
if (!fns.empty()) {
|
if (!fns.empty()) {
|
||||||
generic_model_converter* filter = alloc(generic_model_converter, m);
|
generic_model_converter* filter = alloc(generic_model_converter, m, "card2bv");
|
||||||
for (func_decl* f : fns) filter->hide(f);
|
for (func_decl* f : fns) filter->hide(f);
|
||||||
g->add(filter);
|
g->add(filter);
|
||||||
}
|
}
|
||||||
|
|
|
@ -198,7 +198,7 @@ class degree_shift_tactic : public tactic {
|
||||||
SASSERT(!m_var2degree.empty());
|
SASSERT(!m_var2degree.empty());
|
||||||
generic_model_converter * xmc = 0;
|
generic_model_converter * xmc = 0;
|
||||||
if (m_produce_models) {
|
if (m_produce_models) {
|
||||||
xmc = alloc(generic_model_converter, m);
|
xmc = alloc(generic_model_converter, m, "degree_shift");
|
||||||
mc = xmc;
|
mc = xmc;
|
||||||
}
|
}
|
||||||
for (auto const& kv : m_var2degree) {
|
for (auto const& kv : m_var2degree) {
|
||||||
|
|
|
@ -266,7 +266,7 @@ class fix_dl_var_tactic : public tactic {
|
||||||
m_rw.set_substitution(&subst);
|
m_rw.set_substitution(&subst);
|
||||||
|
|
||||||
if (m_produce_models) {
|
if (m_produce_models) {
|
||||||
generic_model_converter * mc = alloc(generic_model_converter, m);
|
generic_model_converter * mc = alloc(generic_model_converter, m, "fix_dl");
|
||||||
mc->add(var, zero);
|
mc->add(var, zero);
|
||||||
g->add(mc);
|
g->add(mc);
|
||||||
}
|
}
|
||||||
|
|
|
@ -222,7 +222,7 @@ class lia2pb_tactic : public tactic {
|
||||||
|
|
||||||
ref<generic_model_converter> gmc;
|
ref<generic_model_converter> gmc;
|
||||||
if (m_produce_models) {
|
if (m_produce_models) {
|
||||||
gmc = alloc(generic_model_converter, m);
|
gmc = alloc(generic_model_converter, m, "lia2pb");
|
||||||
}
|
}
|
||||||
|
|
||||||
expr_ref zero(m);
|
expr_ref zero(m);
|
||||||
|
|
|
@ -85,7 +85,7 @@ class nla2bv_tactic : public tactic {
|
||||||
TRACE("nla2bv", g.display(tout);
|
TRACE("nla2bv", g.display(tout);
|
||||||
tout << "Muls: " << count_mul(g) << "\n";
|
tout << "Muls: " << count_mul(g) << "\n";
|
||||||
);
|
);
|
||||||
m_fmc = alloc(generic_model_converter, m_manager);
|
m_fmc = alloc(generic_model_converter, m_manager, "nla2bv");
|
||||||
m_bounds(g);
|
m_bounds(g);
|
||||||
collect_power2(g);
|
collect_power2(g);
|
||||||
if(!collect_vars(g)) {
|
if(!collect_vars(g)) {
|
||||||
|
|
|
@ -94,7 +94,7 @@ class normalize_bounds_tactic : public tactic {
|
||||||
|
|
||||||
generic_model_converter * gmc = 0;
|
generic_model_converter * gmc = 0;
|
||||||
if (produce_models) {
|
if (produce_models) {
|
||||||
gmc = alloc(generic_model_converter, m);
|
gmc = alloc(generic_model_converter, m, "normalize_bounds");
|
||||||
in->add(gmc);
|
in->add(gmc);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -947,7 +947,7 @@ private:
|
||||||
|
|
||||||
if (m_produce_models) {
|
if (m_produce_models) {
|
||||||
model_converter_ref mc;
|
model_converter_ref mc;
|
||||||
generic_model_converter * mc1 = alloc(generic_model_converter, m);
|
generic_model_converter * mc1 = alloc(generic_model_converter, m, "pb2bv");
|
||||||
for (auto const& kv : m_const2bit)
|
for (auto const& kv : m_const2bit)
|
||||||
mc1->hide(kv.m_value);
|
mc1->hide(kv.m_value);
|
||||||
// store temp int constants in the filter
|
// store temp int constants in the filter
|
||||||
|
|
|
@ -765,7 +765,7 @@ struct purify_arith_proc {
|
||||||
|
|
||||||
// add generic_model_converter to eliminate auxiliary variables from model
|
// add generic_model_converter to eliminate auxiliary variables from model
|
||||||
if (produce_models) {
|
if (produce_models) {
|
||||||
generic_model_converter * fmc = alloc(generic_model_converter, m());
|
generic_model_converter * fmc = alloc(generic_model_converter, m(), "purify");
|
||||||
mc = fmc;
|
mc = fmc;
|
||||||
obj_map<app, expr*> & f2v = r.cfg().m_app2fresh;
|
obj_map<app, expr*> & f2v = r.cfg().m_app2fresh;
|
||||||
for (auto const& kv : f2v) {
|
for (auto const& kv : f2v) {
|
||||||
|
@ -775,7 +775,7 @@ struct purify_arith_proc {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (produce_models && !m_sin_cos.empty()) {
|
if (produce_models && !m_sin_cos.empty()) {
|
||||||
generic_model_converter* emc = alloc(generic_model_converter, m());
|
generic_model_converter* emc = alloc(generic_model_converter, m(), "purify_sin_cos");
|
||||||
mc = concat(mc.get(), emc);
|
mc = concat(mc.get(), emc);
|
||||||
obj_map<app, std::pair<expr*,expr*> >::iterator it = m_sin_cos.begin(), end = m_sin_cos.end();
|
obj_map<app, std::pair<expr*,expr*> >::iterator it = m_sin_cos.begin(), end = m_sin_cos.end();
|
||||||
for (; it != end; ++it) {
|
for (; it != end; ++it) {
|
||||||
|
|
|
@ -325,7 +325,7 @@ class recover_01_tactic : public tactic {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (m_produce_models) {
|
if (m_produce_models) {
|
||||||
gmc = alloc(generic_model_converter, m);
|
gmc = alloc(generic_model_converter, m, "recover_01");
|
||||||
new_goal->add(gmc);
|
new_goal->add(gmc);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -265,10 +265,10 @@ struct bv_size_reduction_tactic::imp {
|
||||||
subst.insert(v, new_def);
|
subst.insert(v, new_def);
|
||||||
if (m_produce_models) {
|
if (m_produce_models) {
|
||||||
if (!m_mc)
|
if (!m_mc)
|
||||||
m_mc = alloc(bv_size_reduction_mc, m);
|
m_mc = alloc(bv_size_reduction_mc, m, "bv_size_reduction");
|
||||||
m_mc->add(v, new_def);
|
m_mc->add(v, new_def);
|
||||||
if (!m_fmc && new_const)
|
if (!m_fmc && new_const)
|
||||||
m_fmc = alloc(generic_model_converter, m);
|
m_fmc = alloc(generic_model_converter, m, "bv_size_reduction");
|
||||||
if (new_const)
|
if (new_const)
|
||||||
m_fmc->hide(new_const);
|
m_fmc->hide(new_const);
|
||||||
}
|
}
|
||||||
|
@ -334,7 +334,7 @@ struct bv_size_reduction_tactic::imp {
|
||||||
m_mc = alloc(bv_size_reduction_mc, m);
|
m_mc = alloc(bv_size_reduction_mc, m);
|
||||||
m_mc->insert(v->get_decl(), new_def);
|
m_mc->insert(v->get_decl(), new_def);
|
||||||
if (!m_fmc && new_const)
|
if (!m_fmc && new_const)
|
||||||
m_fmc = alloc(generic_model_converter, m);
|
m_fmc = alloc(generic_model_converter, m, "bv_size_reduction");
|
||||||
if (new_const)
|
if (new_const)
|
||||||
m_fmc->hide(new_const);
|
m_fmc->hide(new_const);
|
||||||
}
|
}
|
||||||
|
|
|
@ -65,7 +65,7 @@ class bvarray2uf_tactic : public tactic {
|
||||||
model_converter_ref mc;
|
model_converter_ref mc;
|
||||||
|
|
||||||
if (m_produce_models) {
|
if (m_produce_models) {
|
||||||
generic_model_converter * fmc = alloc(generic_model_converter, m_manager);
|
generic_model_converter * fmc = alloc(generic_model_converter, m_manager, "bvarray2uf");
|
||||||
mc = fmc;
|
mc = fmc;
|
||||||
m_rw.set_mcs(fmc);
|
m_rw.set_mcs(fmc);
|
||||||
}
|
}
|
||||||
|
|
|
@ -25,7 +25,6 @@ Revision History:
|
||||||
#include "ast/datatype_decl_plugin.h"
|
#include "ast/datatype_decl_plugin.h"
|
||||||
#include "ast/bv_decl_plugin.h"
|
#include "ast/bv_decl_plugin.h"
|
||||||
#include "ast/rewriter/rewriter_def.h"
|
#include "ast/rewriter/rewriter_def.h"
|
||||||
#include "tactic/generic_model_converter.h"
|
|
||||||
#include "ast/rewriter/var_subst.h"
|
#include "ast/rewriter/var_subst.h"
|
||||||
#include "ast/ast_util.h"
|
#include "ast/ast_util.h"
|
||||||
#include "ast/rewriter/enum2bv_rewriter.h"
|
#include "ast/rewriter/enum2bv_rewriter.h"
|
||||||
|
@ -128,7 +127,7 @@ public:
|
||||||
for (sort* s : m_non_fd_sorts)
|
for (sort* s : m_non_fd_sorts)
|
||||||
m_fd_sorts.remove(s);
|
m_fd_sorts.remove(s);
|
||||||
if (!m_fd_sorts.empty()) {
|
if (!m_fd_sorts.empty()) {
|
||||||
ref<generic_model_converter> filter = alloc(generic_model_converter, m);
|
ref<generic_model_converter> filter = alloc(generic_model_converter, m, "dt2bv");
|
||||||
enum2bv_rewriter rw(m, m_params);
|
enum2bv_rewriter rw(m, m_params);
|
||||||
rw.set_is_fd(&m_is_fd);
|
rw.set_is_fd(&m_is_fd);
|
||||||
expr_ref new_curr(m);
|
expr_ref new_curr(m);
|
||||||
|
|
|
@ -55,7 +55,7 @@ class elim_term_ite_tactic : public tactic {
|
||||||
m_num_fresh++;
|
m_num_fresh++;
|
||||||
if (m_produce_models) {
|
if (m_produce_models) {
|
||||||
if (!m_mc)
|
if (!m_mc)
|
||||||
m_mc = alloc(generic_model_converter, m);
|
m_mc = alloc(generic_model_converter, m, "elim_term_ite");
|
||||||
m_mc->hide(_result->get_decl());
|
m_mc->hide(_result->get_decl());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -808,7 +808,7 @@ class elim_uncnstr_tactic : public tactic {
|
||||||
m_mc = 0;
|
m_mc = 0;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
m_mc = alloc(mc, m());
|
m_mc = alloc(mc, m(), "elim_uncstr");
|
||||||
}
|
}
|
||||||
|
|
||||||
void init_rw(bool produce_proofs) {
|
void init_rw(bool produce_proofs) {
|
||||||
|
@ -867,7 +867,7 @@ class elim_uncnstr_tactic : public tactic {
|
||||||
app_ref_vector & fresh_vars = m_rw->cfg().m_fresh_vars;
|
app_ref_vector & fresh_vars = m_rw->cfg().m_fresh_vars;
|
||||||
m_num_elim_apps = fresh_vars.size();
|
m_num_elim_apps = fresh_vars.size();
|
||||||
if (produce_models && !fresh_vars.empty()) {
|
if (produce_models && !fresh_vars.empty()) {
|
||||||
generic_model_converter * fmc = alloc(generic_model_converter, m());
|
generic_model_converter * fmc = alloc(generic_model_converter, m(), "elim_uncnstr");
|
||||||
for (app * f : fresh_vars)
|
for (app * f : fresh_vars)
|
||||||
fmc->hide(f);
|
fmc->hide(f);
|
||||||
g->add(concat(fmc, m_mc.get()));
|
g->add(concat(fmc, m_mc.get()));
|
||||||
|
|
|
@ -93,7 +93,7 @@ public:
|
||||||
result.push_back(g.get());
|
result.push_back(g.get());
|
||||||
unsigned num_extra_names = dnames.get_num_names();
|
unsigned num_extra_names = dnames.get_num_names();
|
||||||
if (num_extra_names > 0) {
|
if (num_extra_names > 0) {
|
||||||
generic_model_converter * fmc = alloc(generic_model_converter, m);
|
generic_model_converter * fmc = alloc(generic_model_converter, m, "nnf");
|
||||||
g->add(fmc);
|
g->add(fmc);
|
||||||
for (unsigned i = 0; i < num_extra_names; i++)
|
for (unsigned i = 0; i < num_extra_names; i++)
|
||||||
fmc->hide(dnames.get_name_decl(i));
|
fmc->hide(dnames.get_name_decl(i));
|
||||||
|
|
|
@ -153,7 +153,7 @@ class occf_tactic : public tactic {
|
||||||
if (!is_target(cls))
|
if (!is_target(cls))
|
||||||
continue;
|
continue;
|
||||||
if (produce_models && !m_mc) {
|
if (produce_models && !m_mc) {
|
||||||
m_mc = alloc(generic_model_converter, m);
|
m_mc = alloc(generic_model_converter, m, "occf");
|
||||||
g->add(m_mc);
|
g->add(m_mc);
|
||||||
}
|
}
|
||||||
expr * keep = 0;
|
expr * keep = 0;
|
||||||
|
|
|
@ -393,7 +393,7 @@ struct reduce_args_tactic::imp {
|
||||||
ptr_buffer<expr> new_args;
|
ptr_buffer<expr> new_args;
|
||||||
var_ref_vector new_vars(m_manager);
|
var_ref_vector new_vars(m_manager);
|
||||||
ptr_buffer<expr> new_eqs;
|
ptr_buffer<expr> new_eqs;
|
||||||
generic_model_converter * f_mc = alloc(generic_model_converter, m_manager);
|
generic_model_converter * f_mc = alloc(generic_model_converter, m_manager, "reduce_args");
|
||||||
for (auto const& kv : decl2arg2funcs) {
|
for (auto const& kv : decl2arg2funcs) {
|
||||||
func_decl * f = kv.m_key;
|
func_decl * f = kv.m_key;
|
||||||
arg2func * map = kv.m_value;
|
arg2func * map = kv.m_value;
|
||||||
|
|
|
@ -606,7 +606,7 @@ class solve_eqs_tactic : public tactic {
|
||||||
m_num_eliminated_vars += m_ordered_vars.size();
|
m_num_eliminated_vars += m_ordered_vars.size();
|
||||||
if (m_produce_models) {
|
if (m_produce_models) {
|
||||||
if (mc.get() == 0)
|
if (mc.get() == 0)
|
||||||
mc = alloc(gmc, m());
|
mc = alloc(gmc, m(), "solve_eqs");
|
||||||
for (app * v : m_ordered_vars) {
|
for (app * v : m_ordered_vars) {
|
||||||
expr * def = 0;
|
expr * def = 0;
|
||||||
proof * pr;
|
proof * pr;
|
||||||
|
|
|
@ -813,7 +813,7 @@ class tseitin_cnf_tactic : public tactic {
|
||||||
m_frame_stack.reset();
|
m_frame_stack.reset();
|
||||||
m_clauses.reset();
|
m_clauses.reset();
|
||||||
if (m_produce_models)
|
if (m_produce_models)
|
||||||
m_mc = alloc(generic_model_converter, m);
|
m_mc = alloc(generic_model_converter, m, "tseitin");
|
||||||
else
|
else
|
||||||
m_mc = 0;
|
m_mc = 0;
|
||||||
|
|
||||||
|
|
|
@ -29,6 +29,7 @@ Notes:
|
||||||
|
|
||||||
|
|
||||||
void generic_model_converter::add(func_decl * d, expr* e) {
|
void generic_model_converter::add(func_decl * d, expr* e) {
|
||||||
|
VERIFY(e);
|
||||||
struct entry et(d, e, m, ADD);
|
struct entry et(d, e, m, ADD);
|
||||||
VERIFY(d->get_range() == m.get_sort(e));
|
VERIFY(d->get_range() == m.get_sort(e));
|
||||||
m_first_idx.insert_if_not_there(et.m_f, m_entries.size());
|
m_first_idx.insert_if_not_there(et.m_f, m_entries.size());
|
||||||
|
@ -39,9 +40,10 @@ void generic_model_converter::operator()(model_ref & md) {
|
||||||
TRACE("model_converter", tout << "before generic_model_converter\n"; model_v2_pp(tout, *md); display(tout););
|
TRACE("model_converter", tout << "before generic_model_converter\n"; model_v2_pp(tout, *md); display(tout););
|
||||||
model_evaluator ev(*(md.get()));
|
model_evaluator ev(*(md.get()));
|
||||||
ev.set_model_completion(true);
|
ev.set_model_completion(true);
|
||||||
ev.set_expand_array_equalities(false);
|
ev.set_expand_array_equalities(false);
|
||||||
expr_ref val(m);
|
expr_ref val(m);
|
||||||
unsigned arity;
|
unsigned arity;
|
||||||
|
bool reset_ev = false;
|
||||||
for (unsigned i = m_entries.size(); i-- > 0; ) {
|
for (unsigned i = m_entries.size(); i-- > 0; ) {
|
||||||
entry const& e = m_entries[i];
|
entry const& e = m_entries[i];
|
||||||
switch (e.m_instruction) {
|
switch (e.m_instruction) {
|
||||||
|
@ -50,32 +52,16 @@ void generic_model_converter::operator()(model_ref & md) {
|
||||||
break;
|
break;
|
||||||
case instruction::ADD:
|
case instruction::ADD:
|
||||||
ev(e.m_def, val);
|
ev(e.m_def, val);
|
||||||
#if 0
|
|
||||||
if (e.m_f->get_name() == symbol("XX")) {
|
|
||||||
IF_VERBOSE(0, verbose_stream() << e.m_f->get_name() << " " << e.m_def << " -> " << val << "\n";);
|
|
||||||
ptr_vector<expr> ts;
|
|
||||||
ts.push_back(e.m_def);
|
|
||||||
while (!ts.empty()) {
|
|
||||||
app* t = to_app(ts.back());
|
|
||||||
ts.pop_back();
|
|
||||||
if (t->get_num_args() > 0) {
|
|
||||||
ts.append(t->get_num_args(), t->get_args());
|
|
||||||
}
|
|
||||||
expr_ref tmp(m);
|
|
||||||
ev(t, tmp);
|
|
||||||
IF_VERBOSE(0, verbose_stream() << mk_pp(t, m) << " -> " << tmp << "\n";);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
TRACE("model_converter", tout << e.m_f->get_name() << " ->\n" << e.m_def << "\n==>\n" << val << "\n";);
|
TRACE("model_converter", tout << e.m_f->get_name() << " ->\n" << e.m_def << "\n==>\n" << val << "\n";);
|
||||||
arity = e.m_f->get_arity();
|
arity = e.m_f->get_arity();
|
||||||
|
reset_ev = false;
|
||||||
if (arity == 0) {
|
if (arity == 0) {
|
||||||
expr* old_val = md->get_const_interp(e.m_f);
|
expr* old_val = md->get_const_interp(e.m_f);
|
||||||
if (old_val && old_val == val) {
|
if (old_val && old_val == val) {
|
||||||
// skip
|
// skip
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
if (old_val) ev.reset();
|
reset_ev = old_val != nullptr;
|
||||||
md->register_decl(e.m_f, val);
|
md->register_decl(e.m_f, val);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -85,12 +71,17 @@ void generic_model_converter::operator()(model_ref & md) {
|
||||||
// skip
|
// skip
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
if (old_val) ev.reset();
|
reset_ev = old_val != nullptr;
|
||||||
func_interp * new_fi = alloc(func_interp, m, arity);
|
func_interp * new_fi = alloc(func_interp, m, arity);
|
||||||
new_fi->set_else(val);
|
new_fi->set_else(val);
|
||||||
md->register_decl(e.m_f, new_fi);
|
md->register_decl(e.m_f, new_fi);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (reset_ev) {
|
||||||
|
ev.reset();
|
||||||
|
ev.set_model_completion(true);
|
||||||
|
ev.set_expand_array_equalities(false);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -98,7 +89,9 @@ void generic_model_converter::operator()(model_ref & md) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void generic_model_converter::display(std::ostream & out) {
|
void generic_model_converter::display(std::ostream & out) {
|
||||||
|
unsigned i = 0;
|
||||||
for (entry const& e : m_entries) {
|
for (entry const& e : m_entries) {
|
||||||
|
++i;
|
||||||
switch (e.m_instruction) {
|
switch (e.m_instruction) {
|
||||||
case instruction::HIDE:
|
case instruction::HIDE:
|
||||||
display_del(out, e.m_f);
|
display_del(out, e.m_f);
|
||||||
|
@ -112,7 +105,7 @@ void generic_model_converter::display(std::ostream & out) {
|
||||||
|
|
||||||
model_converter * generic_model_converter::translate(ast_translation & translator) {
|
model_converter * generic_model_converter::translate(ast_translation & translator) {
|
||||||
ast_manager& to = translator.to();
|
ast_manager& to = translator.to();
|
||||||
generic_model_converter * res = alloc(generic_model_converter, to);
|
generic_model_converter * res = alloc(generic_model_converter, to, m_orig.c_str());
|
||||||
for (entry const& e : m_entries) {
|
for (entry const& e : m_entries) {
|
||||||
res->m_entries.push_back(entry(translator(e.m_f.get()), translator(e.m_def.get()), to, e.m_instruction));
|
res->m_entries.push_back(entry(translator(e.m_f.get()), translator(e.m_def.get()), to, e.m_instruction));
|
||||||
}
|
}
|
||||||
|
|
|
@ -39,13 +39,14 @@ class generic_model_converter : public model_converter {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
ast_manager& m;
|
ast_manager& m;
|
||||||
|
std::string m_orig;
|
||||||
vector<entry> m_entries;
|
vector<entry> m_entries;
|
||||||
obj_map<func_decl, unsigned> m_first_idx;
|
obj_map<func_decl, unsigned> m_first_idx;
|
||||||
|
|
||||||
expr_ref simplify_def(entry const& e);
|
expr_ref simplify_def(entry const& e);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
generic_model_converter(ast_manager & m) : m(m) {}
|
generic_model_converter(ast_manager & m, char const* orig) : m(m), m_orig(orig) {}
|
||||||
|
|
||||||
virtual ~generic_model_converter() { }
|
virtual ~generic_model_converter() { }
|
||||||
|
|
||||||
|
|
|
@ -24,6 +24,7 @@ Notes:
|
||||||
* Add or overwrite value in model.
|
* Add or overwrite value in model.
|
||||||
*/
|
*/
|
||||||
void model_converter::display_add(std::ostream& out, ast_manager& m, func_decl* f, expr* e) const {
|
void model_converter::display_add(std::ostream& out, ast_manager& m, func_decl* f, expr* e) const {
|
||||||
|
VERIFY(e);
|
||||||
smt2_pp_environment_dbg env(m);
|
smt2_pp_environment_dbg env(m);
|
||||||
smt2_pp_environment* _env = m_env ? m_env : &env;
|
smt2_pp_environment* _env = m_env ? m_env : &env;
|
||||||
VERIFY(f->get_range() == m.get_sort(e));
|
VERIFY(f->get_range() == m.get_sort(e));
|
||||||
|
|
|
@ -81,9 +81,10 @@ public:
|
||||||
for (func_decl* f : m_bv_fns) result->m_bv_fns.push_back(tr(f));
|
for (func_decl* f : m_bv_fns) result->m_bv_fns.push_back(tr(f));
|
||||||
for (func_decl* f : m_int_fns) result->m_int_fns.push_back(tr(f));
|
for (func_decl* f : m_int_fns) result->m_int_fns.push_back(tr(f));
|
||||||
for (bound_manager* b : m_bounds) result->m_bounds.push_back(b->translate(dst_m));
|
for (bound_manager* b : m_bounds) result->m_bounds.push_back(b->translate(dst_m));
|
||||||
if (mc0()) {
|
model_converter_ref mc = external_model_converter();
|
||||||
|
if (mc) {
|
||||||
ast_translation tr(m, dst_m);
|
ast_translation tr(m, dst_m);
|
||||||
result->set_model_converter(mc0()->translate(tr));
|
result->set_model_converter(mc->translate(tr));
|
||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
@ -151,11 +152,36 @@ public:
|
||||||
virtual void get_model_core(model_ref & mdl) {
|
virtual void get_model_core(model_ref & mdl) {
|
||||||
m_solver->get_model(mdl);
|
m_solver->get_model(mdl);
|
||||||
if (mdl) {
|
if (mdl) {
|
||||||
extend_model(mdl);
|
model_converter_ref mc = bounded_model_converter();
|
||||||
filter_model(mdl);
|
if (mc) (*mc)(mdl);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
virtual model_converter_ref get_model_converter() const { return m_solver->get_model_converter(); }
|
model_converter* external_model_converter() const {
|
||||||
|
return concat(mc0(), bounded_model_converter());
|
||||||
|
}
|
||||||
|
model_converter* bounded_model_converter() const {
|
||||||
|
if (m_int2bv.empty() && m_bv_fns.empty()) return nullptr;
|
||||||
|
generic_model_converter* mc = alloc(generic_model_converter, m, "bounded_int2bv");
|
||||||
|
for (func_decl* f : m_bv_fns)
|
||||||
|
mc->hide(f);
|
||||||
|
for (auto const& kv : m_int2bv) {
|
||||||
|
rational offset;
|
||||||
|
VERIFY (m_bv2offset.find(kv.m_value, offset));
|
||||||
|
expr_ref value(m_bv.mk_bv2int(m.mk_const(kv.m_value)), m);
|
||||||
|
if (!offset.is_zero()) {
|
||||||
|
value = m_arith.mk_add(value, m_arith.mk_numeral(offset, true));
|
||||||
|
}
|
||||||
|
TRACE("int2bv", tout << mk_pp(kv.m_key, m) << " " << value << "\n";);
|
||||||
|
mc->add(kv.m_key, value);
|
||||||
|
}
|
||||||
|
return mc;
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual model_converter_ref get_model_converter() const {
|
||||||
|
model_converter_ref mc = concat(mc0(), bounded_model_converter());
|
||||||
|
mc = concat(mc.get(), m_solver->get_model_converter().get());
|
||||||
|
return mc;
|
||||||
|
}
|
||||||
virtual proof * get_proof() { return m_solver->get_proof(); }
|
virtual proof * get_proof() { return m_solver->get_proof(); }
|
||||||
virtual std::string reason_unknown() const { return m_solver->reason_unknown(); }
|
virtual std::string reason_unknown() const { return m_solver->reason_unknown(); }
|
||||||
virtual void set_reason_unknown(char const* msg) { m_solver->set_reason_unknown(msg); }
|
virtual void set_reason_unknown(char const* msg) { m_solver->set_reason_unknown(msg); }
|
||||||
|
@ -198,35 +224,10 @@ public:
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return r;
|
return r;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
void filter_model(model_ref& mdl) const {
|
|
||||||
if (m_bv_fns.empty()) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
generic_model_converter filter(m);
|
|
||||||
for (func_decl* f : m_bv_fns) filter.hide(f);
|
|
||||||
filter(mdl);
|
|
||||||
}
|
|
||||||
|
|
||||||
void extend_model(model_ref& mdl) {
|
|
||||||
generic_model_converter ext(m);
|
|
||||||
for (auto const& kv : m_int2bv) {
|
|
||||||
rational offset;
|
|
||||||
VERIFY (m_bv2offset.find(kv.m_value, offset));
|
|
||||||
expr_ref value(m_bv.mk_bv2int(m.mk_const(kv.m_value)), m);
|
|
||||||
if (!offset.is_zero()) {
|
|
||||||
value = m_arith.mk_add(value, m_arith.mk_numeral(offset, true));
|
|
||||||
}
|
|
||||||
TRACE("int2bv", tout << mk_pp(kv.m_key, m) << " " << value << "\n";);
|
|
||||||
ext.add(kv.m_key, value);
|
|
||||||
}
|
|
||||||
ext(mdl);
|
|
||||||
}
|
|
||||||
|
|
||||||
void accumulate_sub(expr_safe_replace& sub) const {
|
void accumulate_sub(expr_safe_replace& sub) const {
|
||||||
for (unsigned i = 0; i < m_bounds.size(); ++i) {
|
for (unsigned i = 0; i < m_bounds.size(); ++i) {
|
||||||
accumulate_sub(sub, *m_bounds[i]);
|
accumulate_sub(sub, *m_bounds[i]);
|
||||||
|
|
|
@ -50,9 +50,10 @@ public:
|
||||||
|
|
||||||
virtual solver* translate(ast_manager& dst_m, params_ref const& p) {
|
virtual solver* translate(ast_manager& dst_m, params_ref const& p) {
|
||||||
solver* result = alloc(enum2bv_solver, dst_m, p, m_solver->translate(dst_m, p));
|
solver* result = alloc(enum2bv_solver, dst_m, p, m_solver->translate(dst_m, p));
|
||||||
if (mc0()) {
|
model_converter_ref mc = external_model_converter();
|
||||||
|
if (mc) {
|
||||||
ast_translation tr(m, dst_m);
|
ast_translation tr(m, dst_m);
|
||||||
result->set_model_converter(mc0()->translate(tr));
|
result->set_model_converter(mc->translate(tr));
|
||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
@ -91,18 +92,43 @@ public:
|
||||||
virtual void get_model_core(model_ref & mdl) {
|
virtual void get_model_core(model_ref & mdl) {
|
||||||
m_solver->get_model(mdl);
|
m_solver->get_model(mdl);
|
||||||
if (mdl) {
|
if (mdl) {
|
||||||
extend_model(mdl);
|
model_converter_ref mc = enum_model_converter();
|
||||||
filter_model(mdl);
|
if (mc) (*mc)(mdl);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
virtual model_converter_ref get_model_converter() const { return m_solver->get_model_converter(); }
|
model_converter* enum_model_converter() const {
|
||||||
|
if (m_rewriter.enum2def().empty() &&
|
||||||
|
m_rewriter.enum2bv().empty()) {
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
generic_model_converter* mc = alloc(generic_model_converter, m, "enum2bv");
|
||||||
|
for (auto const& kv : m_rewriter.enum2bv())
|
||||||
|
mc->hide(kv.m_value);
|
||||||
|
for (auto const& kv : m_rewriter.enum2def())
|
||||||
|
mc->add(kv.m_key, kv.m_value);
|
||||||
|
return mc;
|
||||||
|
}
|
||||||
|
|
||||||
|
model_converter* external_model_converter() const {
|
||||||
|
return concat(mc0(), enum_model_converter());
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual model_converter_ref get_model_converter() const {
|
||||||
|
model_converter_ref mc = external_model_converter();
|
||||||
|
mc = concat(mc.get(), m_solver->get_model_converter().get());
|
||||||
|
return mc;
|
||||||
|
}
|
||||||
virtual proof * get_proof() { return m_solver->get_proof(); }
|
virtual proof * get_proof() { return m_solver->get_proof(); }
|
||||||
virtual std::string reason_unknown() const { return m_solver->reason_unknown(); }
|
virtual std::string reason_unknown() const { return m_solver->reason_unknown(); }
|
||||||
virtual void set_reason_unknown(char const* msg) { m_solver->set_reason_unknown(msg); }
|
virtual void set_reason_unknown(char const* msg) { m_solver->set_reason_unknown(msg); }
|
||||||
virtual void get_labels(svector<symbol> & r) { m_solver->get_labels(r); }
|
virtual void get_labels(svector<symbol> & r) { m_solver->get_labels(r); }
|
||||||
virtual ast_manager& get_manager() const { return m; }
|
virtual ast_manager& get_manager() const { return m; }
|
||||||
virtual lbool find_mutexes(expr_ref_vector const& vars, vector<expr_ref_vector>& mutexes) { return m_solver->find_mutexes(vars, mutexes); }
|
virtual lbool find_mutexes(expr_ref_vector const& vars, vector<expr_ref_vector>& mutexes) {
|
||||||
virtual expr_ref_vector cube(expr_ref_vector& vars, unsigned backtrack_level) { return m_solver->cube(vars, backtrack_level); }
|
return m_solver->find_mutexes(vars, mutexes);
|
||||||
|
}
|
||||||
|
virtual expr_ref_vector cube(expr_ref_vector& vars, unsigned backtrack_level) {
|
||||||
|
return m_solver->cube(vars, backtrack_level);
|
||||||
|
}
|
||||||
|
|
||||||
virtual lbool get_consequences_core(expr_ref_vector const& asms, expr_ref_vector const& vars, expr_ref_vector& consequences) {
|
virtual lbool get_consequences_core(expr_ref_vector const& asms, expr_ref_vector const& vars, expr_ref_vector& consequences) {
|
||||||
datatype_util dt(m);
|
datatype_util dt(m);
|
||||||
|
@ -152,20 +178,7 @@ public:
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
void filter_model(model_ref& mdl) {
|
|
||||||
generic_model_converter filter(m);
|
|
||||||
for (auto const& kv : m_rewriter.enum2bv()) {
|
|
||||||
filter.hide(kv.m_value);
|
|
||||||
}
|
|
||||||
filter(mdl);
|
|
||||||
}
|
|
||||||
|
|
||||||
void extend_model(model_ref& mdl) {
|
|
||||||
generic_model_converter ext(m);
|
|
||||||
for (auto const& kv : m_rewriter.enum2def())
|
|
||||||
ext.add(kv.m_key, kv.m_value);
|
|
||||||
ext(mdl);
|
|
||||||
}
|
|
||||||
|
|
||||||
virtual unsigned get_num_assertions() const {
|
virtual unsigned get_num_assertions() const {
|
||||||
return m_solver->get_num_assertions();
|
return m_solver->get_num_assertions();
|
||||||
|
|
|
@ -50,9 +50,10 @@ public:
|
||||||
virtual solver* translate(ast_manager& dst_m, params_ref const& p) {
|
virtual solver* translate(ast_manager& dst_m, params_ref const& p) {
|
||||||
flush_assertions();
|
flush_assertions();
|
||||||
solver* result = alloc(pb2bv_solver, dst_m, p, m_solver->translate(dst_m, p));
|
solver* result = alloc(pb2bv_solver, dst_m, p, m_solver->translate(dst_m, p));
|
||||||
if (mc0()) {
|
model_converter_ref mc = external_model_converter();
|
||||||
|
if (mc.get()) {
|
||||||
ast_translation tr(m, dst_m);
|
ast_translation tr(m, dst_m);
|
||||||
result->set_model_converter(mc0()->translate(tr));
|
result->set_model_converter(mc->translate(tr));
|
||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
@ -93,7 +94,14 @@ public:
|
||||||
filter_model(mdl);
|
filter_model(mdl);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
virtual model_converter_ref get_model_converter() const { return m_solver->get_model_converter(); }
|
model_converter* external_model_converter() const {
|
||||||
|
return concat(mc0(), filter_model_converter());
|
||||||
|
}
|
||||||
|
virtual model_converter_ref get_model_converter() const {
|
||||||
|
model_converter_ref mc = concat(mc0(), filter_model_converter());
|
||||||
|
mc = concat(mc.get(), m_solver->get_model_converter().get());
|
||||||
|
return mc;
|
||||||
|
}
|
||||||
virtual proof * get_proof() { return m_solver->get_proof(); }
|
virtual proof * get_proof() { return m_solver->get_proof(); }
|
||||||
virtual std::string reason_unknown() const { return m_solver->reason_unknown(); }
|
virtual std::string reason_unknown() const { return m_solver->reason_unknown(); }
|
||||||
virtual void set_reason_unknown(char const* msg) { m_solver->set_reason_unknown(msg); }
|
virtual void set_reason_unknown(char const* msg) { m_solver->set_reason_unknown(msg); }
|
||||||
|
@ -105,16 +113,23 @@ public:
|
||||||
flush_assertions();
|
flush_assertions();
|
||||||
return m_solver->get_consequences(asms, vars, consequences); }
|
return m_solver->get_consequences(asms, vars, consequences); }
|
||||||
|
|
||||||
void filter_model(model_ref& mdl) {
|
model_converter* filter_model_converter() const {
|
||||||
if (m_rewriter.fresh_constants().empty()) {
|
if (m_rewriter.fresh_constants().empty()) {
|
||||||
return;
|
return nullptr;
|
||||||
}
|
}
|
||||||
generic_model_converter filter(m);
|
generic_model_converter* filter = alloc(generic_model_converter, m, "pb2bv");
|
||||||
func_decl_ref_vector const& fns = m_rewriter.fresh_constants();
|
func_decl_ref_vector const& fns = m_rewriter.fresh_constants();
|
||||||
for (func_decl* f : fns) {
|
for (func_decl* f : fns) {
|
||||||
filter.hide(f);
|
filter->hide(f);
|
||||||
|
}
|
||||||
|
return filter;
|
||||||
|
}
|
||||||
|
|
||||||
|
void filter_model(model_ref& mdl) {
|
||||||
|
model_converter_ref mc = filter_model_converter();
|
||||||
|
if (mc.get()) {
|
||||||
|
(*mc)(mdl);
|
||||||
}
|
}
|
||||||
filter(mdl);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual unsigned get_num_assertions() const {
|
virtual unsigned get_num_assertions() const {
|
||||||
|
|
|
@ -65,7 +65,7 @@ class macro_finder_tactic : public tactic {
|
||||||
produce_proofs ? new_proofs.get(i) : 0,
|
produce_proofs ? new_proofs.get(i) : 0,
|
||||||
unsat_core_enabled ? new_deps.get(i) : 0);
|
unsat_core_enabled ? new_deps.get(i) : 0);
|
||||||
|
|
||||||
generic_model_converter * evmc = alloc(generic_model_converter, mm.get_manager());
|
generic_model_converter * evmc = alloc(generic_model_converter, mm.get_manager(), "macro_finder");
|
||||||
unsigned num = mm.get_num_macros();
|
unsigned num = mm.get_num_macros();
|
||||||
for (unsigned i = 0; i < num; i++) {
|
for (unsigned i = 0; i < num; i++) {
|
||||||
expr_ref f_interp(mm.get_manager());
|
expr_ref f_interp(mm.get_manager());
|
||||||
|
|
|
@ -77,7 +77,7 @@ class quasi_macros_tactic : public tactic {
|
||||||
produce_proofs ? proofs.get(i) : 0,
|
produce_proofs ? proofs.get(i) : 0,
|
||||||
produce_unsat_cores ? deps.get(i) : 0);
|
produce_unsat_cores ? deps.get(i) : 0);
|
||||||
|
|
||||||
generic_model_converter * evmc = alloc(generic_model_converter, mm.get_manager());
|
generic_model_converter * evmc = alloc(generic_model_converter, mm.get_manager(), "quasi_macros");
|
||||||
unsigned num = mm.get_num_macros();
|
unsigned num = mm.get_num_macros();
|
||||||
for (unsigned i = 0; i < num; i++) {
|
for (unsigned i = 0; i < num; i++) {
|
||||||
expr_ref f_interp(mm.get_manager());
|
expr_ref f_interp(mm.get_manager());
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue