3
0
Fork 0
mirror of https://github.com/Z3Prover/z3 synced 2025-08-11 05:30:51 +00:00

bug fixes

Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
This commit is contained in:
Nikolaj Bjorner 2018-02-19 21:49:03 -08:00
parent bb4888ce31
commit 4c1379e8c9
22 changed files with 238 additions and 580 deletions

View file

@ -60,7 +60,8 @@ class inc_sat_solver : public solver {
sat::literal_vector m_asms;
goal_ref_buffer m_subgoals;
proof_converter_ref m_pc;
mutable model_converter_ref m_mc0;
sref_vector<model_converter> m_mcs;
mutable model_converter_ref m_mc0; // TBD: should be saved/retained under push/pop
mutable obj_hashtable<func_decl> m_inserted_const2bits;
mutable ref<sat2goal::mc> m_sat_mc;
mutable model_converter_ref m_cached_mc;
@ -88,6 +89,7 @@ public:
m_internalized_converted(false),
m_internalized_fmls(m) {
updt_params(p);
m_mcs.push_back(nullptr);
init_preprocess();
m_solver.set_incremental(incremental_mode && !override_incremental());
}
@ -119,7 +121,7 @@ public:
for (unsigned a : m_asms_lim) result->m_asms_lim.push_back(a);
for (unsigned h : m_fmls_head_lim) result->m_fmls_head_lim.push_back(h);
for (expr* f : m_internalized_fmls) result->m_internalized_fmls.push_back(tr(f));
if (m_mc0) result->m_mc0 = m_mc0->translate(tr);
if (m_mcs.back()) result->m_mcs.push_back(m_mcs.back()->translate(tr));
if (m_sat_mc) result->m_sat_mc = dynamic_cast<sat2goal::mc*>(m_sat_mc->translate(tr));
// copy m_bb_rewriter?
result->m_internalized_converted = m_internalized_converted;
@ -186,6 +188,7 @@ public:
if (r != l_true) return r;
init_reason_unknown();
m_internalized_converted = false;
try {
// IF_VERBOSE(0, m_solver.display(verbose_stream()));
r = m_solver.check(m_asms.size(), m_asms.c_ptr());
@ -217,6 +220,7 @@ public:
internalize_formulas();
m_solver.user_push();
++m_num_scopes;
m_mcs.push_back(m_mcs.back());
m_fmls_lim.push_back(m_fmls.size());
m_asms_lim.push_back(m_asmsf.size());
m_fmls_head_lim.push_back(m_fmls_head);
@ -234,7 +238,9 @@ public:
SASSERT(n <= m_num_scopes);
m_solver.user_pop(n);
m_num_scopes -= n;
// ? m_internalized_converted = false;
while (n > 0) {
m_mcs.pop_back();
m_fmls_head = m_fmls_head_lim.back();
m_fmls.resize(m_fmls_lim.back());
m_fmls_lim.pop_back();
@ -448,12 +454,10 @@ public:
if (m_cached_mc)
return m_cached_mc;
if (is_internalized() && m_internalized_converted) {
insert_const2bits();
m_sat_mc->flush_smc(m_solver, m_map);
m_cached_mc = m_mc0.get();
m_cached_mc = m_mcs.back();
m_cached_mc = concat(solver::get_model_converter().get(), m_cached_mc.get());
m_cached_mc = concat(m_cached_mc.get(), m_sat_mc.get());
// IF_VERBOSE(0, m_cached_mc->display(verbose_stream() << "get-model-converter\n"););
return m_cached_mc;
}
else {
@ -493,12 +497,10 @@ public:
simp2_p.set_bool("elim_and", true);
simp2_p.set_bool("blast_distinct", true);
m_preprocess =
and_then(mk_card2bv_tactic(m, m_params),
and_then(mk_card2bv_tactic(m, m_params), // updates model converter
using_params(mk_simplify_tactic(m), simp2_p),
mk_max_bv_sharing_tactic(m),
mk_bit_blaster_tactic(m, m_bb_rewriter.get()),
//mk_aig_tactic(),
//mk_propagate_values_tactic(m, simp2_p),
mk_bit_blaster_tactic(m, m_bb_rewriter.get()), // updates model converter
using_params(mk_simplify_tactic(m), simp2_p));
while (m_bb_rewriter->get_num_scopes() < m_num_scopes) {
m_bb_rewriter->push();
@ -508,22 +510,6 @@ public:
private:
void insert_const2bits() const {
if (!m_bb_rewriter) return;
obj_map<func_decl, expr*> to_insert;
obj_map<func_decl, expr*> const& const2bits = m_bb_rewriter->const2bits();
for (auto const& kv : const2bits) {
if (!m_inserted_const2bits.contains(kv.m_key)) {
m_inserted_const2bits.insert(kv.m_key);
to_insert.insert(kv.m_key, kv.m_value);
}
}
if (!to_insert.empty()) {
m_mc0 = concat(m_mc0.get(), mk_bit_blaster_model_converter(m, to_insert));
}
}
lbool internalize_goal(goal_ref& g, dep2asm_t& dep2asm, bool is_lemma) {
m_pc.reset();
m_subgoals.reset();
@ -543,15 +529,15 @@ private:
m_preprocess = 0;
m_bb_rewriter = 0;
return l_undef;
}
}
if (m_subgoals.size() != 1) {
IF_VERBOSE(0, verbose_stream() << "size of subgoals is not 1, it is: " << m_subgoals.size() << "\n";);
IF_VERBOSE(0, verbose_stream() << "size of subgoals is not 1, it is: " << m_subgoals.size() << "\n");
return l_undef;
}
g = m_subgoals[0];
expr_ref_vector atoms(m);
m_pc = g->pc();
m_mc0 = concat(m_mc0.get(), g->mc());
m_mcs.set(m_mcs.size()-1, concat(m_mcs.back(), g->mc()));
TRACE("sat", g->display_with_dependencies(tout););
// ensure that if goal is already internalized, then import mc from m_solver.
@ -591,8 +577,8 @@ private:
}
lbool internalize_vars(expr_ref_vector const& vars, sat::bool_var_vector& bvars) {
for (unsigned i = 0; i < vars.size(); ++i) {
internalize_var(vars[i], bvars);
for (expr* v : vars) {
internalize_var(v, bvars);
}
return l_true;
}
@ -604,7 +590,6 @@ private:
bool internalized = false;
if (is_uninterp_const(v) && m.is_bool(v)) {
sat::bool_var b = m_map.to_bool_var(v);
if (b != sat::null_bool_var) {
bvars.push_back(b);
internalized = true;
@ -614,10 +599,9 @@ private:
SASSERT(bvutil.is_bv(bv));
app* abv = to_app(bv);
internalized = true;
unsigned sz = abv->get_num_args();
for (unsigned j = 0; j < sz; ++j) {
SASSERT(is_uninterp_const(abv->get_arg(j)));
sat::bool_var b = m_map.to_bool_var(abv->get_arg(j));
for (expr* arg : *abv) {
SASSERT(is_uninterp_const(arg));
sat::bool_var b = m_map.to_bool_var(arg);
if (b == sat::null_bool_var) {
internalized = false;
}
@ -625,7 +609,7 @@ private:
bvars.push_back(b);
}
}
CTRACE("sat", internalized, tout << "var: "; for (unsigned j = 0; j < sz; ++j) tout << bvars[bvars.size()-sz+j] << " "; tout << "\n";);
CTRACE("sat", internalized, tout << "var: " << bvars << "\n";);
}
else if (is_uninterp_const(v) && bvutil.is_bv(v)) {
// variable does not occur in assertions, so is unconstrained.
@ -813,18 +797,18 @@ private:
//IF_VERBOSE(0, m_sat_mc->display(verbose_stream() << "satmc\n"););
(*m_sat_mc)(mdl);
}
insert_const2bits();
if (m_mc0) {
if (m_mcs.back()) {
//IF_VERBOSE(0, m_mc0->display(verbose_stream() << "mc0\n"););
(*m_mc0)(mdl);
(*m_mcs.back())(mdl);
}
TRACE("sat", model_smt2_pp(tout, m, *mdl, 0););
// IF_VERBOSE(0, model_smt2_pp(verbose_stream() << "after\n", m, *mdl, 0););
#if 0
IF_VERBOSE(0, verbose_stream() << "Verifying solution\n";);
IF_VERBOSE(0, verbose_streamm() << "Verifying solution\n";);
model_evaluator eval(*mdl);
bool all_true = true;
for (expr * f : m_fmls) {
expr_ref tmp(m);
eval(f, tmp);
@ -833,13 +817,20 @@ private:
model_smt2_pp(tout, m, *(mdl.get()), 0););
if (!m.is_true(tmp)) {
IF_VERBOSE(0, verbose_stream() << "failed to verify: " << mk_pp(f, m) << "\n";);
IF_VERBOSE(0, verbose_stream() << m_params << "\n";);
IF_VERBOSE(0, m_sat_mc->display(verbose_stream() << "sat mc\n"););
IF_VERBOSE(0, if (m_mc0) m_mc0->display(verbose_stream() << "mc0\n"););
break;
all_true = false;
}
else {
VERIFY(m.is_true(tmp));
}
VERIFY(m.is_true(tmp));
}
if (!all_true) {
IF_VERBOSE(0, verbose_stream() << m_params << "\n";);
IF_VERBOSE(0, m_sat_mc->display(verbose_stream() << "sat mc\n"););
IF_VERBOSE(0, if (m_mcs.back()) m_mcs.back()->display(verbose_stream() << "mc0\n"););
//IF_VERBOSE(0, m_solver.display(verbose_stream()));
IF_VERBOSE(0, for (auto const& kv : m_map) verbose_stream() << mk_pp(kv.m_key, m) << " |-> " << kv.m_value << "\n";);
}
#endif
}
};