3
0
Fork 0
mirror of https://github.com/Z3Prover/z3 synced 2025-06-20 04:43:39 +00:00
Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
This commit is contained in:
Nikolaj Bjorner 2019-08-31 10:09:52 -04:00
parent 4c0db00a7b
commit e816d16724
2 changed files with 23 additions and 22 deletions

View file

@ -598,6 +598,7 @@ namespace smt {
clause * cls = j.get_clause(); clause * cls = j.get_clause();
out << "clause "; out << "clause ";
if (cls) out << literal_vector(cls->get_num_literals(), cls->begin()); if (cls) out << literal_vector(cls->get_num_literals(), cls->begin());
if (cls) display_literals_smt2(out << "\n", cls->get_num_literals(), cls->begin());
break; break;
} }
case b_justification::JUSTIFICATION: { case b_justification::JUSTIFICATION: {

View file

@ -251,7 +251,7 @@ namespace smt {
context& ctx = th.get_context(); context& ctx = th.get_context();
unsigned sz = size(); unsigned sz = size();
unsigned bound = k(); unsigned bound = k();
TRACE("pb", tout << "assign: " << m_lit << " " << ~alit << " " << bound << "\n";); TRACE("pb", th.display(tout << "assign: " << m_lit << " " << ~alit << " " << bound << "\n", *this, true););
SASSERT(0 < bound && bound < sz); SASSERT(0 < bound && bound < sz);
SASSERT(ctx.get_assignment(alit) == l_false); SASSERT(ctx.get_assignment(alit) == l_false);
@ -955,7 +955,8 @@ namespace smt {
} }
c.inc_propagations(*this); c.inc_propagations(*this);
m_stats.m_num_propagations++; m_stats.m_num_propagations++;
TRACE("pb", tout << "#prop: " << c.num_propagations() << " - " << c.lit() << " => " << l << "\n";); TRACE("pb", tout << "#prop: " << c.num_propagations() << " - " << c.lit() << " => " << l << "\n";
display(tout, c, true) << "\n";);
SASSERT(validate_unit_propagation(c)); SASSERT(validate_unit_propagation(c));
ctx.assign(l, ctx.mk_justification(card_justification(c, l, get_id()))); ctx.assign(l, ctx.mk_justification(card_justification(c, l, get_id())));
} }
@ -1685,15 +1686,20 @@ namespace smt {
return arg_max; return arg_max;
} }
/**
\brief retrieve asserting literal. Prefer p, otherwise find a literal with maximal level.
Note that an asserting literal should be false with respect to the resolvent inequality.
*/
literal theory_pb::get_asserting_literal(literal p) { literal theory_pb::get_asserting_literal(literal p) {
if (get_abs_coeff(p.var()) != 0) {
return p;
}
context& ctx = get_context(); context& ctx = get_context();
unsigned lvl = 0; unsigned lvl = 0;
TRACE("pb", tout << p << " " << ctx.get_assignment(p) << "\n";);
if (ctx.get_assignment(p) == l_false && get_abs_coeff(p.var()) != 0 && p == literal(p.var(), get_coeff(p.var()) < 0)) {
return p;
}
for (unsigned i = 0; i < m_active_vars.size(); ++i) { for (bool_var v : m_active_vars) {
bool_var v = m_active_vars[i];
literal lit(v, get_coeff(v) < 0); literal lit(v, get_coeff(v) < 0);
if (ctx.get_assignment(lit) == l_false && ctx.get_assign_level(lit) > lvl) { if (ctx.get_assignment(lit) == l_false && ctx.get_assign_level(lit) > lvl) {
p = lit; p = lit;
@ -1991,8 +1997,7 @@ namespace smt {
} }
int slack = -m_bound; int slack = -m_bound;
for (unsigned i = 0; i < m_active_vars.size(); ++i) { for (bool_var v : m_active_vars) {
bool_var v = m_active_vars[i];
slack += get_abs_coeff(v); slack += get_abs_coeff(v);
} }
@ -2021,7 +2026,7 @@ namespace smt {
SASSERT(slack < 0); SASSERT(slack < 0);
SASSERT(validate_antecedents(m_antecedents)); SASSERT(validate_antecedents(m_antecedents));
TRACE("pb", tout << "antecedents " << m_antecedents << "\n";); TRACE("pb", tout << "assign " << m_antecedents << " ==> " << alit << "\n";);
ctx.assign(alit, ctx.mk_justification(theory_propagation_justification(get_id(), ctx.get_region(), m_antecedents.size(), m_antecedents.c_ptr(), alit, 0, nullptr))); ctx.assign(alit, ctx.mk_justification(theory_propagation_justification(get_id(), ctx.get_region(), m_antecedents.size(), m_antecedents.c_ptr(), alit, 0, nullptr)));
DEBUG_CODE( DEBUG_CODE(
@ -2229,8 +2234,7 @@ namespace smt {
} }
uint_set seen; uint_set seen;
bool first = true; bool first = true;
for (unsigned i = 0; i < m_active_vars.size(); ++i) { for (bool_var v: m_active_vars) {
bool_var v = m_active_vars[i];
if (seen.contains(v)) { if (seen.contains(v)) {
continue; continue;
} }
@ -2242,18 +2246,14 @@ namespace smt {
if (!first) { if (!first) {
out << " + "; out << " + ";
} }
if (coeff == 1) { literal lit(v, coeff < 0);
out << literal(v); if (coeff > 1) {
out << coeff << " * ";
} }
else if (coeff == -1) { else if (coeff < -1) {
out << literal(v, true); out << (-coeff) << " * ";
}
else if (coeff > 0) {
out << coeff << " * " << literal(v);
}
else {
out << (-coeff) << " * " << literal(v, true);
} }
out << lit << "(" << ctx.get_assignment(lit) << "@" << ctx.get_assign_level(lit) << ")";
first = false; first = false;
} }
out << " >= " << m_bound << "\n"; out << " >= " << m_bound << "\n";