3
0
Fork 0
mirror of https://github.com/Z3Prover/z3 synced 2025-06-06 14:13:23 +00:00

working on unit propagation explanation

Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
This commit is contained in:
Nikolaj Bjorner 2024-01-07 15:29:18 -08:00
parent 11c529162d
commit e26d597917

View file

@ -517,54 +517,52 @@ namespace polysat {
* or why it can only have a single value. * or why it can only have a single value.
*/ */
dependency_vector viable::explain() { dependency_vector viable::explain() {
dependency_vector result; dependency_vector result;
uint_set seen; uint_set seen;
auto last = m_explain.back(); auto last = m_explain.back();
auto after = last; auto after = last;
unsigned bw = c.size(last.e->var);
TRACE("bv", display_explain(tout)); TRACE("bv", display_explain(tout));
if (last.e->interval.is_full()) { auto explain_entry = [&](entry* e) {
if (m_var != last.e->var) auto index = e->constraint_index;
result.push_back(offset_claim(m_var, { last.e->var, 0 })); if (!index.is_null() && seen.contains(index.id))
for (auto const& sc : last.e->side_cond) return;
if (!index.is_null())
seen.insert(index.id);
if (m_var != e->var)
result.push_back(offset_claim(m_var, { e->var, 0 }));
for (auto const& sc : e->side_cond)
result.push_back(c.propagate(sc, c.explain_weak_eval(sc))); result.push_back(c.propagate(sc, c.explain_weak_eval(sc)));
if (!last.e->constraint_index.is_null()) result.append(e->deps);
result.push_back(c.get_dependency(last.e->constraint_index)); if (!index.is_null())
result.push_back(c.get_dependency(index));
};
if (last.e->interval.is_full()) {
explain_entry(last.e);
SASSERT(m_explain.size() == 1); SASSERT(m_explain.size() == 1);
return result;
} }
SASSERT(m_conflict || m_propagation); SASSERT(m_conflict || m_propagation);
for (unsigned i = m_explain.size() - 1; i-- > 0; ) { for (unsigned i = m_explain.size() - 1; i-- > 0; ) {
auto e = m_explain[i]; auto e = m_explain[i];
auto index = e.e->constraint_index;
explain_overlap(e, after, result); explain_overlap(e, after, result);
after = e; after = e;
if (!index.is_null() && seen.contains(index.id)) explain_entry(e.e);
continue;
if (!index.is_null())
seen.insert(index.id);
if (m_var != e.e->var)
result.push_back(offset_claim(m_var, { e.e->var, 0 }));
for (auto const& sc : e.e->side_cond)
result.push_back(c.propagate(sc, c.explain_weak_eval(sc)));
result.append(e.e->deps);
if (!index.is_null())
result.push_back(c.get_dependency(index));
if (e.e == last.e) if (e.e == last.e)
break; break;
} }
if (m_propagation) { if (m_propagation) {
NOT_IMPLEMENTED_YET();
auto first = m_explain[0];
// add constraint that:
auto sc = cs.eq(last.e->interval.hi() + 1, first.e->interval.lo());
result.push_back(c.propagate(sc, c.explain_weak_eval(sc)));
// assume first and last have same bit-width // assume first and last have same bit-width
auto first = m_explain[0];
SASSERT(first.e->bit_width == last.e->bit_width);
explain_entry(first.e);
// add constraint that there is only a single viable value.
auto sc = cs.eq(last.e->interval.hi() + 1, first.e->interval.lo());
result.push_back(c.propagate(sc, c.explain_weak_eval(sc)));
} }
return result; return result;
} }