static void tst10() { sat_solver<gate_extension> s; literal l1 = s.mk_var(); literal l2 = s.mk_var(); literal l3 = s.mk_var(); s.push_scope(); s.assign(l1, mk_axiom()); s.push_scope(); literal l4 = s.mk_var(); literal l5 = s.mk_var(); literal l6 = s.mk_iff(l4, l5); literal l7 = s.mk_var(); literal l8 = s.mk_or(l6, l7); s.assign(l8, mk_axiom()); s.mk_transient_clause(~l8, l3); s.mk_transient_clause(~l8, l2); s.mk_transient_clause(literal_vector(~l3, ~l1, ~l2)); SASSERT(s.inconsistent()); #ifdef Z3DEBUG bool r = #endif s.resolve_conflict(); SASSERT(r); SASSERT(s.m_scope_lvl == 1); s.pop_scope(1); SASSERT(s.m_ref_count[l4.var()] > 0); SASSERT(s.m_ref_count[l5.var()] > 0); SASSERT(s.m_ref_count[l6.var()] > 0); SASSERT(s.m_ref_count[l7.var()] > 0); SASSERT(s.m_ref_count[l8.var()] > 0); s.push_scope(); s.assign(~l1, mk_axiom()); s.push_scope(); s.assign(l5, mk_axiom()); s.mk_transient_clause(~l5, ~l4); s.propagate(); SASSERT(s.get_assignment(l6) == l_false); SASSERT(s.get_assignment(l8) == l_undef); #ifdef Z3DEBUG s.del_learned_clauses(); SASSERT(s.m_ref_count[l7.var()] == 0); SASSERT(s.m_ref_count[l8.var()] == 0); SASSERT(s.m_ref_count[l4.var()] > 0); SASSERT(s.m_ref_count[l5.var()] > 0); SASSERT(s.m_ref_count[l6.var()] > 0); #endif s.mk_transient_clause(l6, l3); s.mk_transient_clause(l6, l2); s.mk_transient_clause(literal_vector(~l3, l1, ~l2)); SASSERT(s.inconsistent()); #ifdef Z3DEBUG r = #endif s.resolve_conflict(); SASSERT(r); }
void context::display(std::ostream& out, b_justification j) const { switch (j.get_kind()) { case b_justification::AXIOM: out << "axiom"; break; case b_justification::BIN_CLAUSE: { literal l2 = j.get_literal(); out << "bin-clause "; display_literal(out, l2); break; } case b_justification::CLAUSE: { clause * cls = j.get_clause(); out << "clause "; if (cls) out << literal_vector(cls->get_num_literals(), cls->begin()); break; } case b_justification::JUSTIFICATION: { out << "justification " << j.get_justification()->get_from_theory() << ": "; literal_vector lits; const_cast<conflict_resolution&>(*m_conflict_resolution).justification2literals(j.get_justification(), lits); display_literals(out, lits); break; } default: UNREACHABLE(); break; } out << "\n"; }