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:
parent
2afc58cc08
commit
adb3d68743
4 changed files with 18 additions and 13 deletions
|
@ -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();
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue