3
0
Fork 0
mirror of https://github.com/Z3Prover/z3 synced 2025-04-22 00:26:38 +00:00

fixes to literal propagation exposed by bitwise and unit test

Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
This commit is contained in:
Nikolaj Bjorner 2021-12-19 15:21:12 -08:00
parent 2afc58cc08
commit adb3d68743
4 changed files with 18 additions and 13 deletions

View file

@ -113,10 +113,7 @@ namespace polysat {
SASSERT(empty());
for (auto lit : cl) {
auto c = s.lit2cnstr(lit);
if (c.bvalue(s) != l_false) {
SASSERT(c.is_currently_false(s));
c->set_var_dependent();
}
SASSERT(c.bvalue(s) == l_false);
insert(~c);
}
SASSERT(!empty());
@ -252,7 +249,7 @@ namespace polysat {
auto eq = s.eq(s.var(v), s.get_value(v));
cm().ensure_bvar(eq.get());
if (eq.bvalue(s) == l_undef)
s.assign_eval(s.get_level(v), eq.blit());
s.assign_eval(eq.blit());
lemma.push(~eq);
}
s.decay_activity();

View file

@ -88,8 +88,15 @@ namespace polysat {
if (m_bvars.is_false(cl[i]))
continue;
signed_constraint sc = s.lit2cnstr(cl[i]);
if (sc.is_currently_false(s))
continue;
if (sc.is_currently_false(s)) {
if (m_bvars.is_true(cl[i])) {
s.set_conflict(sc);
return;
}
s.assign_eval(~cl[i]);
continue;
}
m_bvars.watch(cl[i]).push_back(&cl);
std::swap(cl[!first], cl[i]);
if (!first)

View file

@ -596,10 +596,8 @@ namespace polysat {
case l_false:
break;
case l_undef:
if (lit2cnstr(lit).is_currently_false(*this)) {
unsigned level = m_level; // TODO
assign_eval(level, lit);
}
if (lit2cnstr(lit).is_currently_false(*this))
assign_eval(lit);
else {
num_choices++;
choice = lit;
@ -732,7 +730,10 @@ namespace polysat {
m_search.push_boolean(lit);
}
void solver::assign_eval(unsigned level, sat::literal lit) {
void solver::assign_eval(sat::literal lit) {
unsigned level = 0;
for (auto v : lit2cnstr(lit)->vars())
level = std::max(get_level(v), level);
m_bvars.eval(lit, level);
m_trail.push_back(trail_instr_t::assign_bool_i);
m_search.push_boolean(lit);

View file

@ -149,7 +149,7 @@ namespace polysat {
void assign_propagate(sat::literal lit, clause& reason);
void assign_decision(sat::literal lit, clause* lemma);
void assign_eval(unsigned level, sat::literal lit);
void assign_eval(sat::literal lit);
void activate_constraint(signed_constraint c);
void deactivate_constraint(signed_constraint c);
void decide_bool(clause& lemma);