mirror of
https://github.com/Z3Prover/z3
synced 2025-08-26 13:06:05 +00:00
When adding clauses, prioritize bool-propagation over evaluation
See test_band1 and clause: v2 == v0 & v1 --> v2 <= 0
This commit is contained in:
parent
587e77648a
commit
917e1b6a4c
2 changed files with 29 additions and 2 deletions
|
@ -142,8 +142,32 @@ namespace polysat {
|
|||
return;
|
||||
|
||||
if (value_propagate) {
|
||||
#if 1 // this should be already done with insert_eval when constructing the clause (maybe not for non-redundant clauses?)
|
||||
// (this loop also masks the mistake of calling clause_builder::insert instead of clause_builder::insert_eval)
|
||||
#if 1
|
||||
// First, try to bool-propagate.
|
||||
// Otherwise, we might get a clause-conflict and a missed propagation after resolving the conflict.
|
||||
// With this, we will get a constraint-conflict instead.
|
||||
// TODO: maybe it makes sense to choose bool vs. eval depending on which has the lower level?
|
||||
sat::literal undef_lit = sat::null_literal;
|
||||
for (sat::literal lit : cl) {
|
||||
if (s.m_bvars.is_false(lit))
|
||||
continue;
|
||||
if (s.m_bvars.is_true(lit)) {
|
||||
undef_lit = sat::null_literal;
|
||||
break;
|
||||
}
|
||||
SASSERT(!s.m_bvars.is_assigned(lit));
|
||||
if (undef_lit == sat::null_literal)
|
||||
undef_lit = lit;
|
||||
else {
|
||||
undef_lit = sat::null_literal;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (undef_lit != sat::null_literal)
|
||||
s.assign_propagate(undef_lit, cl);
|
||||
|
||||
// this should be already done with insert_eval when constructing the clause (maybe not for non-redundant clauses?)
|
||||
// (this loop also masks the mistake of calling clause_builder::insert instead of clause_builder::insert_eval)
|
||||
for (sat::literal lit : cl) {
|
||||
if (s.m_bvars.is_false(lit))
|
||||
continue;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue