mirror of
https://github.com/Z3Prover/z3
synced 2025-04-22 16:45:31 +00:00
slicing equivalent vars + explain
This commit is contained in:
parent
e09636065b
commit
b4902f374b
2 changed files with 44 additions and 0 deletions
|
@ -625,6 +625,30 @@ namespace polysat {
|
|||
explain_equal(var2slice(x), var2slice(y), out_deps);
|
||||
}
|
||||
|
||||
void slicing::explain_equal(pvar x, pvar y, std::function<void(sat::literal)> const& on_lit) {
|
||||
SASSERT(m_marked_lits.empty());
|
||||
SASSERT(m_tmp_deps.empty());
|
||||
explain_equal(x, y, m_tmp_deps);
|
||||
for (void* dp : m_tmp_deps) {
|
||||
dep_t const d = dep_t::decode(dp);
|
||||
if (d.is_null())
|
||||
continue;
|
||||
if (d.is_lit()) {
|
||||
sat::literal lit = d.lit();
|
||||
if (m_marked_lits.contains(lit))
|
||||
continue;
|
||||
m_marked_lits.insert(lit);
|
||||
on_lit(d.lit());
|
||||
}
|
||||
else {
|
||||
// equivalence between to variables cannot be due to value assignment
|
||||
UNREACHABLE();
|
||||
}
|
||||
}
|
||||
m_marked_lits.reset();
|
||||
m_tmp_deps.reset();
|
||||
}
|
||||
|
||||
void slicing::explain(ptr_vector<void>& out_deps) {
|
||||
SASSERT(is_conflict());
|
||||
m_egraph.begin_explain();
|
||||
|
@ -1530,6 +1554,16 @@ namespace polysat {
|
|||
explain_value(n, on_lit, on_var);
|
||||
}
|
||||
|
||||
pvar_vector slicing::equivalent_vars(pvar v) const {
|
||||
pvar_vector xs;
|
||||
for (enode* n : euf::enode_class(var2slice(v))) {
|
||||
pvar const x = slice2var(n);
|
||||
if (x != null_var)
|
||||
xs.push_back(x);
|
||||
}
|
||||
return xs;
|
||||
}
|
||||
|
||||
std::ostream& slicing::display(std::ostream& out) const {
|
||||
enode_vector base;
|
||||
for (pvar v = 0; v < m_var2slice.size(); ++v) {
|
||||
|
|
|
@ -375,6 +375,16 @@ namespace polysat {
|
|||
void collect_fixed(pvar v, justified_fixed_bits_vector& out);
|
||||
void explain_fixed(enode* just, std::function<void(sat::literal)> const& on_lit, std::function<void(pvar)> const& on_var);
|
||||
|
||||
/**
|
||||
* Collect variables that are equivalent to v (including v itself)
|
||||
*
|
||||
* NOTE: this might miss some variables that are equal due to equivalent base slices. With 'polysat.slicing.congruence=true' and after propagate(), it should return all equal variables.
|
||||
*/
|
||||
pvar_vector equivalent_vars(pvar v) const;
|
||||
|
||||
/** Explain why variables x and y are equivalent */
|
||||
void explain_equal(pvar x, pvar y, std::function<void(sat::literal)> const& on_lit);
|
||||
|
||||
std::ostream& display(std::ostream& out) const;
|
||||
std::ostream& display_tree(std::ostream& out) const;
|
||||
};
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue