3
0
Fork 0
mirror of https://github.com/Z3Prover/z3 synced 2025-08-22 02:57:50 +00:00

more proof hint information

Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
This commit is contained in:
Nikolaj Bjorner 2023-12-27 22:48:11 -08:00
parent 20958f1468
commit c0da732cea
6 changed files with 59 additions and 54 deletions

View file

@ -177,12 +177,11 @@ namespace polysat {
switch (m_viable.find_viable(m_var, m_value)) {
case find_t::empty:
TRACE("bv", tout << "check-conflict v" << m_var << "\n");
s.set_conflict(m_viable.explain());
// propagate_unsat_core();
s.set_conflict(m_viable.explain(), "viable-conflict");
return sat::check_result::CR_CONTINUE;
case find_t::singleton: {
TRACE("bv", tout << "check-propagate v" << m_var << " := " << m_value << "\n");
auto d = s.propagate(m_constraints.eq(var2pdd(m_var), m_value), m_viable.explain());
auto d = s.propagate(m_constraints.eq(var2pdd(m_var), m_value), m_viable.explain(), "viable-propagate");
propagate_assignment(m_var, m_value, d);
return sat::check_result::CR_CONTINUE;
}
@ -244,7 +243,7 @@ namespace polysat {
// If no saturation propagation was possible, explain the conflict using the variable assignment.
m_unsat_core = explain_eval(get_constraint(conflict_idx));
m_unsat_core.push_back(get_dependency(conflict_idx));
propagate_unsat_core();
s.set_conflict(m_unsat_core, "polysat-bail-out-conflict");
return sat::check_result::CR_CONTINUE;
}
@ -365,10 +364,10 @@ namespace polysat {
return;
switch (eval(sc)) {
case l_false:
s.propagate(d, true, explain_eval(sc));
s.propagate(d, true, explain_eval(sc), "eval-propagate");
break;
case l_true:
s.propagate(d, false, explain_eval(sc));
s.propagate(d, false, explain_eval(sc), "eval-propagate");
break;
default:
break;
@ -382,25 +381,16 @@ namespace polysat {
return d;
}
#if 0
dependency_vector core::get_dependencies(constraint_id_vector const& ids) const {
dependency_vector result;
for (auto id : ids)
result.push_back(get_dependency(id));
return result;
}
#endif
void core::propagate(constraint_id id, signed_constraint& sc, lbool value, dependency const& d) {
lbool eval_value = eval(sc);
if (eval_value == l_undef)
sc.propagate(*this, value, d);
else if (value == l_undef)
s.propagate(d, eval_value != l_true, explain_eval(sc));
s.propagate(d, eval_value != l_true, explain_eval(sc), "constraint-propagate");
else if (value != eval_value) {
m_unsat_core = explain_eval(sc);
m_unsat_core.push_back(m_constraint_index[id.id].d);
propagate_unsat_core();
s.set_conflict(m_unsat_core, "polysat-constraint-core");
}
}
@ -420,12 +410,6 @@ namespace polysat {
return s.inconsistent();
}
void core::propagate_unsat_core() {
// default is to use unsat core:
// if core is based on viable, use s.set_lemma();
s.set_conflict(m_unsat_core);
}
void core::assign_eh(constraint_id index, bool sign, unsigned level) {
struct unassign : public trail {
core& c;

View file

@ -81,7 +81,6 @@ namespace polysat {
void propagate_assignment(constraint_id idx);
void propagate_eval(constraint_id idx);
void propagate_assignment(pvar v, rational const& value, dependency dep);
void propagate_unsat_core();
void propagate(constraint_id id, signed_constraint& sc, lbool value, dependency const& d);
void add_watch(unsigned idx, unsigned var);
@ -157,7 +156,7 @@ namespace polysat {
dependency get_dependency(constraint_id idx) const;
// dependency_vector get_dependencies(constraint_id_vector const& ids) const;
lbool eval(constraint_id id);
dependency propagate(signed_constraint const& sc, dependency_vector const& deps) { return s.propagate(sc, deps); }
dependency propagate(signed_constraint const& sc, dependency_vector const& deps) { return s.propagate(sc, deps, nullptr); }
lbool eval(signed_constraint const& sc);
dependency_vector explain_eval(signed_constraint const& sc);
bool inconsistent() const;

View file

@ -136,9 +136,9 @@ namespace polysat {
virtual ~solver_interface() {}
virtual lbool add_eq_literal(pvar v, rational const& val, dependency& d) = 0;
virtual bool add_axiom(char const* name, constraint_or_dependency const* begin, constraint_or_dependency const* end, bool redundant) = 0;
virtual void set_conflict(dependency_vector const& core) = 0;
virtual dependency propagate(signed_constraint sc, dependency_vector const& deps) = 0;
virtual void propagate(dependency const& d, bool sign, dependency_vector const& deps) = 0;
virtual void set_conflict(dependency_vector const& core, char const* hint) = 0;
virtual dependency propagate(signed_constraint sc, dependency_vector const& deps, char const* hint) = 0;
virtual void propagate(dependency const& d, bool sign, dependency_vector const& deps, char const* hint) = 0;
virtual trail_stack& trail() = 0;
virtual bool inconsistent() const = 0;
virtual void get_bitvector_suffixes(pvar v, offset_slices& out) = 0;