3
0
Fork 0
mirror of https://github.com/Z3Prover/z3 synced 2025-04-24 01:25:31 +00:00
Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
This commit is contained in:
Nikolaj Bjorner 2017-10-11 13:17:57 -07:00
parent 97f37613c2
commit 79ceaa1d13
4 changed files with 89 additions and 61 deletions

View file

@ -1468,11 +1468,14 @@ namespace sat {
lh.simplify();
lh.collect_statistics(m_aux_stats);
}
#if 0
// Buggy
{
lookahead lh(*this);
lh.scc();
lh.collect_statistics(m_aux_stats);
}
#endif
}
@ -3049,7 +3052,6 @@ namespace sat {
m_probing.updt_params(p);
m_scc.updt_params(p);
m_rand.set_seed(m_config.m_random_seed);
m_step_size = m_config.m_step_size_init;
}

View file

@ -94,6 +94,12 @@ struct goal2sat::imp {
std::string s0 = "operator " + s + " not supported, apply simplifier before invoking translator";
throw tactic_exception(s0.c_str());
}
sat::bool_var mk_var(expr* t, bool ext) {
sat::bool_var v = m_solver.mk_var(ext);
m_map.insert(t, v);
return v;
}
void mk_clause(sat::literal l) {
TRACE("goal2sat", tout << "mk_clause: " << l << "\n";);
@ -120,7 +126,7 @@ struct goal2sat::imp {
sat::bool_var mk_true() {
if (m_true == sat::null_bool_var) {
// create fake variable to represent true;
m_true = m_solver.mk_var();
m_true = mk_var(m.mk_true(), false);
mk_clause(sat::literal(m_true, false)); // v is true
}
return m_true;
@ -139,8 +145,7 @@ struct goal2sat::imp {
}
else {
bool ext = m_default_external || !is_uninterp_const(t) || m_interface_vars.contains(t);
sat::bool_var v = m_solver.mk_var(ext);
m_map.insert(t, v);
sat::bool_var v = mk_var(t, ext);
l = sat::literal(v, sign);
TRACE("sat", tout << "new_var: " << v << ": " << mk_ismt2_pp(t, m) << "\n";);
if (ext && !is_uninterp_const(t)) {
@ -247,7 +252,7 @@ struct goal2sat::imp {
}
else {
SASSERT(num <= m_result_stack.size());
sat::bool_var k = m_solver.mk_var();
sat::bool_var k = mk_var(t, false);
sat::literal l(k, false);
m_cache.insert(t, l);
sat::literal * lits = m_result_stack.end() - num;
@ -286,7 +291,7 @@ struct goal2sat::imp {
}
else {
SASSERT(num <= m_result_stack.size());
sat::bool_var k = m_solver.mk_var();
sat::bool_var k = mk_var(t, false);
sat::literal l(k, false);
m_cache.insert(t, l);
// l => /\ lits
@ -330,7 +335,7 @@ struct goal2sat::imp {
m_result_stack.reset();
}
else {
sat::bool_var k = m_solver.mk_var();
sat::bool_var k = mk_var(n, false);
sat::literal l(k, false);
m_cache.insert(n, l);
mk_clause(~l, ~c, t);
@ -367,7 +372,7 @@ struct goal2sat::imp {
m_result_stack.reset();
}
else {
sat::bool_var k = m_solver.mk_var();
sat::bool_var k = mk_var(t, false);
sat::literal l(k, false);
m_cache.insert(t, l);
mk_clause(~l, l1, ~l2);
@ -392,7 +397,7 @@ struct goal2sat::imp {
}
sat::literal_vector lits;
convert_pb_args(num, lits);
sat::bool_var v = m_solver.mk_var(true);
sat::bool_var v = mk_var(t, true);
ensure_extension();
if (lits.size() % 2 == 0) lits[0].neg();
m_ext->add_xor(v, lits);
@ -451,7 +456,7 @@ struct goal2sat::imp {
m_ext->add_pb_ge(sat::null_bool_var, wlits, k.get_unsigned());
}
else {
sat::bool_var v = m_solver.mk_var(true);
sat::bool_var v = mk_var(t, true);
sat::literal lit(v, sign);
m_ext->add_pb_ge(v, wlits, k.get_unsigned());
TRACE("goal2sat", tout << "root: " << root << " lit: " << lit << "\n";);
@ -476,7 +481,7 @@ struct goal2sat::imp {
m_ext->add_pb_ge(sat::null_bool_var, wlits, k.get_unsigned());
}
else {
sat::bool_var v = m_solver.mk_var(true);
sat::bool_var v = mk_var(t, true);
sat::literal lit(v, sign);
m_ext->add_pb_ge(v, wlits, k.get_unsigned());
TRACE("goal2sat", tout << "root: " << root << " lit: " << lit << "\n";);
@ -525,7 +530,7 @@ struct goal2sat::imp {
m_ext->add_at_least(sat::null_bool_var, lits, k.get_unsigned());
}
else {
sat::bool_var v = m_solver.mk_var(true);
sat::bool_var v = mk_var(t, true);
sat::literal lit(v, sign);
m_ext->add_at_least(v, lits, k.get_unsigned());
TRACE("goal2sat", tout << "root: " << root << " lit: " << lit << "\n";);
@ -547,7 +552,7 @@ struct goal2sat::imp {
m_ext->add_at_least(sat::null_bool_var, lits, lits.size() - k.get_unsigned());
}
else {
sat::bool_var v = m_solver.mk_var(true);
sat::bool_var v = mk_var(t, true);
sat::literal lit(v, sign);
m_ext->add_at_least(v, lits, lits.size() - k.get_unsigned());
m_result_stack.shrink(sz - t->get_num_args());