mirror of
https://github.com/Z3Prover/z3
synced 2025-07-19 02:42:02 +00:00
Signed-off-by: Leonardo de Moura <leonardo@microsoft.com>
This commit is contained in:
parent
8b10e13251
commit
825b72719c
2 changed files with 189 additions and 173 deletions
|
@ -180,6 +180,7 @@ namespace sat {
|
||||||
bool vars_eliminated = m_num_elim_vars > old_num_elim_vars;
|
bool vars_eliminated = m_num_elim_vars > old_num_elim_vars;
|
||||||
|
|
||||||
if (!m_need_cleanup) {
|
if (!m_need_cleanup) {
|
||||||
|
TRACE("after_simplifier", tout << "skipping cleanup...\n";);
|
||||||
if (vars_eliminated) {
|
if (vars_eliminated) {
|
||||||
// must remove learned clauses with eliminated variables
|
// must remove learned clauses with eliminated variables
|
||||||
cleanup_clauses(s.m_learned, true, true, learned_in_use_lists);
|
cleanup_clauses(s.m_learned, true, true, learned_in_use_lists);
|
||||||
|
@ -189,6 +190,7 @@ namespace sat {
|
||||||
free_memory();
|
free_memory();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
TRACE("after_simplifier", tout << "cleanning watches...\n";);
|
||||||
cleanup_watches();
|
cleanup_watches();
|
||||||
cleanup_clauses(s.m_learned, true, vars_eliminated, learned_in_use_lists);
|
cleanup_clauses(s.m_learned, true, vars_eliminated, learned_in_use_lists);
|
||||||
cleanup_clauses(s.m_clauses, false, vars_eliminated, true);
|
cleanup_clauses(s.m_clauses, false, vars_eliminated, true);
|
||||||
|
|
|
@ -585,12 +585,26 @@ namespace sat {
|
||||||
break;
|
break;
|
||||||
case watched::CLAUSE: {
|
case watched::CLAUSE: {
|
||||||
if (value(it->get_blocked_literal()) == l_true) {
|
if (value(it->get_blocked_literal()) == l_true) {
|
||||||
|
TRACE("propagate_clause_bug", tout << "blocked literal " << it->get_blocked_literal() << "\n";
|
||||||
|
clause_offset cls_off = it->get_clause_offset();
|
||||||
|
clause & c = *(m_cls_allocator.get_clause(cls_off));
|
||||||
|
tout << c << "\n";);
|
||||||
*it2 = *it;
|
*it2 = *it;
|
||||||
it2++;
|
it2++;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
clause_offset cls_off = it->get_clause_offset();
|
clause_offset cls_off = it->get_clause_offset();
|
||||||
clause & c = *(m_cls_allocator.get_clause(cls_off));
|
clause & c = *(m_cls_allocator.get_clause(cls_off));
|
||||||
|
TRACE("propagate_clause_bug", tout << "processing... " << c << "\nwas_removed: " << c.was_removed() << "\n";);
|
||||||
|
if (c.was_removed()) {
|
||||||
|
// Remark: this method may be invoked when the watch lists are not in a consistent state,
|
||||||
|
// and may contain dead/removed clauses.
|
||||||
|
// See: sat_simplifier.cpp
|
||||||
|
// So, we must check whether the clause was marked for deletion, and ignore it.
|
||||||
|
*it2 = *it;
|
||||||
|
it2++;
|
||||||
|
break;
|
||||||
|
}
|
||||||
if (c[0] == not_l)
|
if (c[0] == not_l)
|
||||||
std::swap(c[0], c[1]);
|
std::swap(c[0], c[1]);
|
||||||
CTRACE("propagate_bug", c[1] != not_l, tout << "l: " << l << " " << c << "\n";);
|
CTRACE("propagate_bug", c[1] != not_l, tout << "l: " << l << " " << c << "\n";);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue