3
0
Fork 0
mirror of https://github.com/Z3Prover/z3 synced 2025-04-08 18:31:49 +00:00

bug fixes exposed from regression tests

Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
This commit is contained in:
Nikolaj Bjorner 2013-12-04 08:35:27 -08:00
parent b9d433e3e5
commit 8fa0d6e4f3

View file

@ -387,7 +387,7 @@ namespace smt {
}
if (ctx.b_internalized(arg)) {
bv = ctx.get_bool_var(arg);
if (null_theory_var == ctx.get_var_theory(bv)) {
if (is_uninterp(arg) && null_theory_var == ctx.get_var_theory(bv)) {
ctx.set_var_theory(bv, get_id());
}
has_bv = (ctx.get_var_theory(bv) == get_id());
@ -423,6 +423,7 @@ namespace smt {
expr_ref tmp(m), fml(m);
tmp = m.mk_fresh_const("pb_proxy",m.mk_bool_sort());
fml = m.mk_iff(tmp, arg);
TRACE("pb", tout << "create proxy " << fml << "\n";);
ctx.internalize(fml, false);
SASSERT(ctx.b_internalized(tmp));
bv = ctx.get_bool_var(tmp);
@ -537,8 +538,9 @@ namespace smt {
break;
}
}
TRACE("pb", display(tout << "validate: ", c);
tout << "sum: " << sum << " " << maxsum << " " << ctx.get_assignment(c.lit()) << "\n";
TRACE("pb", display(tout << "validate: ", c, true);
tout << "sum: " << sum << " " << maxsum << " ";
tout << ctx.get_assignment(c.lit()) << "\n";
);
SASSERT(sum <= maxsum);
@ -551,6 +553,7 @@ namespace smt {
context& ctx = get_context();
ptr_vector<ineq>* ineqs = 0;
literal nlit(v, is_true);
TRACE("pb", tout << "assign: " << ~nlit << "\n";);
if (m_watch.find(nlit.index(), ineqs)) {
for (unsigned i = 0; i < ineqs->size(); ++i) {
if (assign_watch(v, is_true, *ineqs, i)) {
@ -609,10 +612,15 @@ namespace smt {
context& ctx = get_context();
numeral maxsum = numeral::zero();
numeral mininc = numeral::zero();
for (unsigned i = 0; i < c.size(); ++i) {
if (ctx.get_assignment(c.lit(i)) != l_false) {
lbool asgn = ctx.get_assignment(c.lit(i));
if (asgn != l_false) {
maxsum += c.coeff(i);
}
if (asgn == l_undef && (mininc.is_zero() || mininc > c.coeff(i))) {
mininc = c.coeff(i);
}
}
TRACE("pb",
@ -635,6 +643,17 @@ namespace smt {
SASSERT(c.max_sum() >= c.k());
m_assign_ineqs_trail.push_back(&c);
}
// perform unit propagation
if (false && maxsum >= c.k() && maxsum - mininc < c.k()) {
literal_vector& lits = get_unhelpful_literals(c, true);
lits.push_back(c.lit());
for (unsigned i = 0; i < c.size(); ++i) {
if (ctx.get_assignment(c.lit(i)) == l_undef) {
add_assign(c, lits, c.lit(i));
}
}
}
}
/**
@ -709,7 +728,7 @@ namespace smt {
}
TRACE("pb",
tout << "assign: " << literal(v) << " <- " << is_true << "\n";
tout << "assign: " << literal(v,!is_true) << "\n";
display(tout, c); );
@ -966,11 +985,21 @@ namespace smt {
std::ostream& theory_pb::display(std::ostream& out, ineq& c, bool values) const {
ast_manager& m = get_manager();
context& ctx = get_context();
out << c.lit() << " ";
out << c.lit();
if (c.lit() != null_literal) {
if (values) {
out << "@(" << ctx.get_assignment(c.lit());
if (ctx.get_assignment(c.lit()) != l_undef) {
out << ":" << ctx.get_assign_level(c.lit());
}
out << ")";
}
expr_ref tmp(m);
ctx.literal2expr(c.lit(), tmp);
out << tmp << "\n";
out << " " << tmp << "\n";
}
else {
out << " ";
}
for (unsigned i = 0; i < c.size(); ++i) {
literal l(c.lit(i));
@ -1141,7 +1170,7 @@ namespace smt {
}
SASSERT(ctx.get_assignment(c.lit()) == l_true);
if (ctx.get_assign_level(c.lit().var()) > ctx.get_base_level()) {
if (ctx.get_assign_level(c.lit()) > ctx.get_base_level()) {
m_ineq_literals.push_back(c.lit());
}
}