mirror of
https://github.com/Z3Prover/z3
synced 2025-04-12 12:08:18 +00:00
#5417 designate quantifier axioms as auxiliary
Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
This commit is contained in:
parent
4388ab2e3e
commit
a64867942d
|
@ -39,11 +39,15 @@ namespace euf {
|
||||||
}
|
}
|
||||||
|
|
||||||
void solver::add_root(unsigned n, sat::literal const* lits) {
|
void solver::add_root(unsigned n, sat::literal const* lits) {
|
||||||
|
if (!relevancy_enabled())
|
||||||
|
return;
|
||||||
ensure_dual_solver();
|
ensure_dual_solver();
|
||||||
m_dual_solver->add_root(n, lits);
|
m_dual_solver->add_root(n, lits);
|
||||||
}
|
}
|
||||||
|
|
||||||
void solver::add_aux(unsigned n, sat::literal const* lits) {
|
void solver::add_aux(unsigned n, sat::literal const* lits) {
|
||||||
|
if (!relevancy_enabled())
|
||||||
|
return;
|
||||||
ensure_dual_solver();
|
ensure_dual_solver();
|
||||||
m_dual_solver->add_aux(n, lits);
|
m_dual_solver->add_aux(n, lits);
|
||||||
}
|
}
|
||||||
|
|
|
@ -361,6 +361,7 @@ namespace euf {
|
||||||
void add_root(sat::literal_vector const& lits) { add_root(lits.size(), lits.data()); }
|
void add_root(sat::literal_vector const& lits) { add_root(lits.size(), lits.data()); }
|
||||||
void add_root(sat::literal lit) { add_root(1, &lit); }
|
void add_root(sat::literal lit) { add_root(1, &lit); }
|
||||||
void add_root(sat::literal a, sat::literal b) { sat::literal lits[2] = {a, b}; add_root(2, lits); }
|
void add_root(sat::literal a, sat::literal b) { sat::literal lits[2] = {a, b}; add_root(2, lits); }
|
||||||
|
void add_aux(sat::literal_vector const& lits) { add_aux(lits.size(), lits.data()); }
|
||||||
void add_aux(unsigned n, sat::literal const* lits);
|
void add_aux(unsigned n, sat::literal const* lits);
|
||||||
void add_aux(sat::literal a, sat::literal b) { sat::literal lits[2] = {a, b}; add_aux(2, lits); }
|
void add_aux(sat::literal a, sat::literal b) { sat::literal lits[2] = {a, b}; add_aux(2, lits); }
|
||||||
void track_relevancy(sat::bool_var v);
|
void track_relevancy(sat::bool_var v);
|
||||||
|
|
|
@ -45,8 +45,7 @@ namespace q {
|
||||||
for (expr* e : exp) {
|
for (expr* e : exp) {
|
||||||
sat::literal lit = ctx.internalize(e, l.sign(), false, false);
|
sat::literal lit = ctx.internalize(e, l.sign(), false, false);
|
||||||
add_clause(~l, lit);
|
add_clause(~l, lit);
|
||||||
if (ctx.relevancy_enabled())
|
ctx.add_aux(~l, lit);
|
||||||
ctx.add_root(~l, lit);
|
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -56,14 +55,14 @@ namespace q {
|
||||||
for (expr* e : exp)
|
for (expr* e : exp)
|
||||||
lits.push_back(ctx.internalize(e, l.sign(), false, false));
|
lits.push_back(ctx.internalize(e, l.sign(), false, false));
|
||||||
add_clause(lits);
|
add_clause(lits);
|
||||||
ctx.add_root(lits);
|
ctx.add_aux(lits);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (l.sign() == is_forall(e)) {
|
if (l.sign() == is_forall(e)) {
|
||||||
sat::literal lit = skolemize(q);
|
sat::literal lit = skolemize(q);
|
||||||
add_clause(~l, lit);
|
add_clause(~l, lit);
|
||||||
ctx.add_root(~l, lit);
|
ctx.add_aux(~l, lit);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
ctx.push_vec(m_universal, l);
|
ctx.push_vec(m_universal, l);
|
||||||
|
|
|
@ -81,9 +81,9 @@ namespace sat {
|
||||||
return literal(m_var2ext[lit.var()], lit.sign());
|
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) {
|
||||||
TRACE("dual", tout << "root: " << literal_vector(sz, clause) << "\n";);
|
|
||||||
if (sz == 1) {
|
if (sz == 1) {
|
||||||
|
TRACE("dual", tout << "unit: " << clause[0] << "\n";);
|
||||||
m_units.push_back(clause[0]);
|
m_units.push_back(clause[0]);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -91,6 +91,7 @@ namespace sat {
|
||||||
for (unsigned i = 0; i < sz; ++i)
|
for (unsigned i = 0; i < sz; ++i)
|
||||||
m_solver.mk_clause(root, ~ext2lit(clause[i]), status::input());
|
m_solver.mk_clause(root, ~ext2lit(clause[i]), status::input());
|
||||||
m_roots.push_back(~root);
|
m_roots.push_back(~root);
|
||||||
|
TRACE("dual", tout << "root: " << ~root << " => " << literal_vector(sz, clause) << "\n";);
|
||||||
}
|
}
|
||||||
|
|
||||||
void dual_solver::add_aux(unsigned sz, literal const* clause) {
|
void dual_solver::add_aux(unsigned sz, literal const* clause) {
|
||||||
|
|
Loading…
Reference in a new issue