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

fix gc to not remove ternary clauses that are on assignment trail. This addresses issue with drat proofs that don't pass drat-trim due to deletion during gc, but use in conflicts

Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
This commit is contained in:
Nikolaj Bjorner 2019-02-22 11:14:20 +01:00
parent 598fc810b5
commit 4c799c144a
11 changed files with 201 additions and 71 deletions

View file

@ -124,9 +124,9 @@ namespace sat {
}
}
inline void simplifier::remove_clause(clause & c) {
inline void simplifier::remove_clause(clause & c, bool is_unique) {
if (!c.was_removed()) {
if (s.m_config.m_drat) {
if (s.m_config.m_drat && is_unique) {
s.m_drat.del(c);
}
for (literal l : c) {
@ -477,7 +477,7 @@ namespace sat {
s.set_learned(c1, false);
}
TRACE("subsumption", tout << c1 << " subsumed " << c2 << "\n";);
remove_clause(c2);
remove_clause(c2, false);
m_num_subsumed++;
}
else if (!c2.was_removed()) {
@ -577,7 +577,7 @@ namespace sat {
if (c1.is_learned() && !c2.is_learned())
s.set_learned(c1, false);
TRACE("subsumption", tout << c1 << " subsumed " << c2 << "\n";);
remove_clause(c2);
remove_clause(c2, false);
m_num_subsumed++;
}
}
@ -662,7 +662,7 @@ namespace sat {
for (auto it = cs.mk_iterator(); !it.at_end(); ) {
clause & c = it.curr();
it.next();
remove_clause(c);
remove_clause(c, true);
}
cs.reset();
}
@ -674,10 +674,12 @@ namespace sat {
m_num_elim_lits++;
insert_elim_todo(l.var());
if (s.m_config.m_drat && c.contains(l)) {
m_dummy.set(c.size(), c.begin(), c.is_learned());
unsigned sz = c.size();
c.elim(l);
s.m_drat.add(c, true);
s.m_drat.del(*m_dummy.get());
c.restore(sz);
s.m_drat.del(c);
c.shrink(sz-1);
}
else {
c.elim(l);
@ -690,7 +692,7 @@ namespace sat {
if (cleanup_clause(c)) {
// clause was satisfied
TRACE("elim_lit", tout << "clause was satisfied\n";);
remove_clause(c);
remove_clause(c, true);
return;
}
unsigned sz = c.size();
@ -710,7 +712,7 @@ namespace sat {
c.restore(sz0);
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);
remove_clause(c, sz0 != sz);
break;
default:
if (s.m_config.m_drat && sz0 != sz) {
@ -888,7 +890,7 @@ namespace sat {
if (s.m_trail.size() > m_last_sub_trail_sz) {
unsigned sz0 = c.size();
if (cleanup_clause(c)) {
remove_clause(c);
remove_clause(c, true);
continue;
}
unsigned sz = c.size();
@ -906,7 +908,7 @@ namespace sat {
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);
remove_clause(c, sz != sz0);
continue;
default:
if (s.m_config.m_drat && sz != sz0) {