3
0
Fork 0
mirror of https://github.com/Z3Prover/z3 synced 2025-04-23 17:15:31 +00:00
Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
This commit is contained in:
Nikolaj Bjorner 2023-12-28 17:36:42 -08:00
parent bd93379346
commit 91b9d78cd3
8 changed files with 81 additions and 51 deletions

View file

@ -220,7 +220,8 @@ namespace intblast {
m_solver->assert_expr(a.mk_lt(v, a.mk_int(b)));
}
IF_VERBOSE(10, verbose_stream() << "check\n";
IF_VERBOSE(2, verbose_stream() << "check\n" << original_es << "\n");
IF_VERBOSE(3, verbose_stream() << "check\n";
m_solver->display(verbose_stream());
verbose_stream() << es << "\n");
@ -230,14 +231,18 @@ namespace intblast {
IF_VERBOSE(2, verbose_stream() << "(sat.intblast :result " << r << ")\n");
if (r == l_true) {
model_ref mdl;
m_solver->get_model(mdl);
verbose_stream() << original_es << "\n";
verbose_stream() << *mdl << "\n";
verbose_stream() << es << "\n";
m_solver->display(verbose_stream());
IF_VERBOSE(0,
model_ref mdl;
m_solver->get_model(mdl);
verbose_stream() << original_es << "\n";
verbose_stream() << *mdl << "\n";
verbose_stream() << es << "\n";
m_solver->display(verbose_stream()););
SASSERT(false);
}
m_solver = nullptr;
return r;
}

View file

@ -75,7 +75,10 @@ namespace polysat {
if (!l.hi().is_one())
return false;
v = l.var();
val = -l.lo().val();
if (l.lo().val() == 0)
val = 0;
else
val = l.manager().max_value() + 1 - l.lo().val();
return true;
}

View file

@ -172,8 +172,10 @@ namespace polysat {
s.set_conflict(m_viable.explain(), "viable-conflict");
return sat::check_result::CR_CONTINUE;
case find_t::singleton: {
TRACE("bv", tout << "check-propagate v" << m_var << " := " << m_value << "\n");
auto d = s.propagate(m_constraints.eq(var2pdd(m_var), m_value), m_viable.explain(), "viable-propagate");
auto p = var2pdd(m_var).mk_var(m_var);
auto sc = m_constraints.eq(p, m_value);
TRACE("bv", tout << "check-propagate v" << m_var << " := " << m_value << " " << sc << "\n");
auto d = s.propagate(sc, m_viable.explain(), "viable-propagate");
propagate_assignment(m_var, m_value, d);
return sat::check_result::CR_CONTINUE;
}
@ -297,8 +299,6 @@ namespace polysat {
return;
v = w;
}
if (v != null_var)
verbose_stream() << "propagate activation " << v << " " << sc << " " << dep << "\n";
if (v != null_var && !m_viable.add_unitary(v, idx.id))
s.set_conflict(m_viable.explain(), "viable-conflict");
}

View file

@ -23,16 +23,29 @@ Author:
namespace polysat {
void solver::add_value(euf::enode* n, model& mdl, expr_ref_vector& values) {
auto p = expr2pdd(n->get_expr());
rational val;
if (!m_core.try_eval(p, val)) {
ctx.s().display(verbose_stream());
verbose_stream() << ctx.bpp(n) << " := " << p << "\n";
UNREACHABLE();
void solver::add_value(euf::enode* n, model& mdl, expr_ref_vector& values) {
expr_ref value(m);
if (n->interpreted())
value = n->get_expr();
else if (n->get_decl() && n->get_decl()->get_family_id() == bv.get_family_id()) {
bv_rewriter rw(m);
expr_ref_vector args(m);
for (auto arg : euf::enode_args(n))
args.push_back(values.get(arg->get_root_id()));
rw.mk_app(n->get_decl(), args.size(), args.data(), value);
}
VERIFY(m_core.try_eval(p, val));
values.set(n->get_root_id(), bv.mk_numeral(val, get_bv_size(n)));
else {
auto p = expr2pdd(n->get_expr());
rational val;
if (!m_core.try_eval(p, val)) {
ctx.s().display(verbose_stream());
verbose_stream() << ctx.bpp(n) << " := " << p << "\n";
UNREACHABLE();
}
VERIFY(m_core.try_eval(p, val));
value = bv.mk_numeral(val, get_bv_size(n));
}
values.set(n->get_root_id(), value);
}
bool solver::add_dep(euf::enode* n, top_sort<euf::enode>& dep) {
@ -87,12 +100,14 @@ namespace polysat {
auto r = m_intblast.check_propagation(lit, core, eqs);
VERIFY (r != l_true);
}
void solver::validate_conflict(sat::literal_vector const& core, euf::enode_pair_vector const& eqs) {
if (!ctx.get_config().m_core_validate)
return;
auto r = m_intblast.check_core(core, eqs);
VERIFY (r != l_true);
}
void solver::validate_axiom(sat::literal_vector const& clause) {
if (!ctx.get_config().m_core_validate)
return;

View file

@ -114,6 +114,7 @@ namespace polysat {
hint = mk_proof_hint(hint_info);
auto ex = euf::th_explain::conflict(*this, lits, eqs, hint);
TRACE("bv", ex->display(tout << "conflict: ") << "\n"; s().display(tout));
validate_conflict(lits, eqs);
ctx.set_conflict(ex);
}
@ -217,7 +218,7 @@ namespace polysat {
auto d = dependency(eq.var());
auto id = eq_constraint(p, q, d);
TRACE("bv", tout << eq << " := " << s().value(eq) << " @" << s().scope_lvl() << "\n");
m_core.assign_eh(id, false, s().lvl(eq));
m_core.assign_eh(id, true, s().lvl(eq));
}
// Core uses the propagate callback to add unit propagations to the trail.