3
0
Fork 0
mirror of https://github.com/Z3Prover/z3 synced 2025-08-23 19:47:52 +00:00
relevancy propagation applies to quantifier unfolding.
This commit is contained in:
Nikolaj Bjorner 2021-07-29 15:04:49 -07:00
parent 211a6c8752
commit b8a437bd8a
8 changed files with 60 additions and 36 deletions

View file

@ -28,15 +28,28 @@ namespace sat {
SASSERT(!m_solver.get_config().m_drat);
}
void dual_solver::push() {
m_solver.user_push();
m_roots.push_scope();
m_tracked_vars.push_scope();
m_units.push_scope();
m_vars.push_scope();
void dual_solver::flush() {
while (m_num_scopes > 0) {
m_solver.user_push();
m_roots.push_scope();
m_tracked_vars.push_scope();
m_units.push_scope();
m_vars.push_scope();
--m_num_scopes;
}
}
void dual_solver::pop(unsigned num_scopes) {
void dual_solver::push() {
++m_num_scopes;
}
void dual_solver::pop(unsigned num_scopes) {
if (m_num_scopes >= num_scopes) {
m_num_scopes -= num_scopes;
return;
}
num_scopes -= m_num_scopes;
m_num_scopes = 0;
m_solver.user_pop(num_scopes);
unsigned old_sz = m_tracked_vars.old_size(num_scopes);
for (unsigned i = m_tracked_vars.size(); i-- > old_sz; )
@ -66,6 +79,7 @@ namespace sat {
}
void dual_solver::track_relevancy(bool_var w) {
flush();
bool_var v = ext2var(w);
if (!m_is_tracked.get(v, false)) {
m_is_tracked.setx(v, true, false);
@ -81,7 +95,8 @@ namespace sat {
return literal(m_var2ext[lit.var()], lit.sign());
}
void dual_solver::add_root(unsigned sz, literal const* clause) {
void dual_solver::add_root(unsigned sz, literal const* clause) {
flush();
if (sz == 1) {
TRACE("dual", tout << "unit: " << clause[0] << "\n";);
m_units.push_back(clause[0]);
@ -95,6 +110,7 @@ namespace sat {
}
void dual_solver::add_aux(unsigned sz, literal const* clause) {
flush();
TRACE("dual", tout << "aux: " << literal_vector(sz, clause) << "\n";);
m_lits.reset();
for (unsigned i = 0; i < sz; ++i)
@ -103,6 +119,7 @@ namespace sat {
}
void dual_solver::add_assumptions(solver const& s) {
flush();
m_lits.reset();
for (bool_var v : m_tracked_vars)
m_lits.push_back(literal(v, l_false == s.value(m_var2ext[v])));
@ -113,7 +130,7 @@ namespace sat {
}
}
bool dual_solver::operator()(solver const& s) {
bool dual_solver::operator()(solver const& s) {
m_core.reset();
m_core.append(m_units);
if (m_roots.empty())