mirror of
https://github.com/Z3Prover/z3
synced 2025-07-19 10:52:02 +00:00
fix drat for units learned from binary clause resolution
Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
This commit is contained in:
parent
63d480fd92
commit
836f156d54
6 changed files with 76 additions and 59 deletions
|
@ -125,8 +125,9 @@ namespace sat {
|
|||
}
|
||||
|
||||
inline void simplifier::remove_clause_core(clause & c) {
|
||||
for (literal l : c)
|
||||
for (literal l : c) {
|
||||
insert_elim_todo(l.var());
|
||||
}
|
||||
m_sub_todo.erase(c);
|
||||
c.set_removed(true);
|
||||
TRACE("resolution_bug", tout << "del_clause: " << c << "\n";);
|
||||
|
@ -330,35 +331,40 @@ namespace sat {
|
|||
}
|
||||
}
|
||||
|
||||
unsigned sz0 = c.size();
|
||||
if (cleanup_clause(c, in_use_lists)) {
|
||||
s.del_clause(c);
|
||||
continue;
|
||||
}
|
||||
unsigned sz = c.size();
|
||||
if (sz == 0) {
|
||||
switch(sz) {
|
||||
case 0:
|
||||
s.set_conflict(justification());
|
||||
for (; it != end; ++it, ++it2) {
|
||||
*it2 = *it;
|
||||
}
|
||||
break;
|
||||
}
|
||||
if (sz == 1) {
|
||||
cs.set_end(it2);
|
||||
return;
|
||||
case 1:
|
||||
s.assign(c[0], justification());
|
||||
c.restore(sz0);
|
||||
s.del_clause(c);
|
||||
continue;
|
||||
}
|
||||
if (sz == 2) {
|
||||
break;
|
||||
case 2:
|
||||
s.mk_bin_clause(c[0], c[1], c.is_learned());
|
||||
s.del_clause(c, false);
|
||||
continue;
|
||||
}
|
||||
*it2 = *it;
|
||||
it2++;
|
||||
if (!c.frozen()) {
|
||||
s.attach_clause(c);
|
||||
if (s.m_config.m_drat) {
|
||||
s.m_drat.add(c, true);
|
||||
c.restore(sz0);
|
||||
s.del_clause(c, true);
|
||||
break;
|
||||
default:
|
||||
*it2 = *it;
|
||||
it2++;
|
||||
if (!c.frozen()) {
|
||||
s.attach_clause(c);
|
||||
if (sz != sz0 && s.m_config.m_drat) {
|
||||
s.m_drat.add(c, true);
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
cs.set_end(it2);
|
||||
|
@ -679,9 +685,15 @@ namespace sat {
|
|||
m_need_cleanup = true;
|
||||
m_num_elim_lits++;
|
||||
insert_elim_todo(l.var());
|
||||
c.elim(l);
|
||||
if (s.m_config.m_drat) s.m_drat.add(c, true);
|
||||
// if (s.m_config.m_drat) s.m_drat.del(c0); // can delete previous version
|
||||
if (s.m_config.m_drat && c.contains(l)) {
|
||||
m_dummy.set(c.size(), c.begin(), c.is_learned());
|
||||
c.elim(l);
|
||||
s.m_drat.add(c, true);
|
||||
s.m_drat.del(*m_dummy.get());
|
||||
}
|
||||
else {
|
||||
c.elim(l);
|
||||
}
|
||||
clause_use_list & occurs = m_use_list.get(l);
|
||||
occurs.erase_not_removed(c);
|
||||
m_sub_counter -= occurs.size()/2;
|
||||
|
@ -695,23 +707,23 @@ namespace sat {
|
|||
case 0:
|
||||
TRACE("elim_lit", tout << "clause is empty\n";);
|
||||
s.set_conflict(justification());
|
||||
return;
|
||||
break;
|
||||
case 1:
|
||||
TRACE("elim_lit", tout << "clause became unit: " << c[0] << "\n";);
|
||||
propagate_unit(c[0]);
|
||||
// propagate_unit will delete c.
|
||||
// remove_clause(c);
|
||||
return;
|
||||
break;
|
||||
case 2:
|
||||
TRACE("elim_lit", tout << "clause became binary: " << c[0] << " " << c[1] << "\n";);
|
||||
s.mk_bin_clause(c[0], c[1], c.is_learned());
|
||||
m_sub_bin_todo.push_back(bin_clause(c[0], c[1], c.is_learned()));
|
||||
remove_clause(c);
|
||||
return;
|
||||
break;
|
||||
default:
|
||||
TRACE("elim_lit", tout << "result: " << c << "\n";);
|
||||
m_sub_todo.insert(c);
|
||||
return;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -876,27 +888,30 @@ namespace sat {
|
|||
m_sub_counter--;
|
||||
TRACE("subsumption", tout << "next: " << c << "\n";);
|
||||
if (s.m_trail.size() > m_last_sub_trail_sz) {
|
||||
unsigned sz0 = c.size();
|
||||
if (cleanup_clause(c, true /* clause is in the use_lists */)) {
|
||||
remove_clause(c);
|
||||
continue;
|
||||
}
|
||||
unsigned sz = c.size();
|
||||
if (sz == 0) {
|
||||
switch (sz) {
|
||||
case 0:
|
||||
s.set_conflict(justification());
|
||||
return;
|
||||
}
|
||||
if (sz == 1) {
|
||||
case 1:
|
||||
propagate_unit(c[0]);
|
||||
// propagate_unit will delete c.
|
||||
// remove_clause(c);
|
||||
continue;
|
||||
}
|
||||
if (sz == 2) {
|
||||
case 2:
|
||||
TRACE("subsumption", tout << "clause became binary: " << c << "\n";);
|
||||
s.mk_bin_clause(c[0], c[1], c.is_learned());
|
||||
m_sub_bin_todo.push_back(bin_clause(c[0], c[1], c.is_learned()));
|
||||
c.restore(sz0);
|
||||
remove_clause(c);
|
||||
continue;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
TRACE("subsumption", tout << "using: " << c << "\n";);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue