summaryrefslogtreecommitdiff
path: root/src/smt
diff options
context:
space:
mode:
authorAndrew Reynolds <andrew.j.reynolds@gmail.com>2020-11-30 22:22:24 -0600
committerGitHub <noreply@github.com>2020-11-30 22:22:24 -0600
commit6489cf590b441aeb5e1bdf9800c9718d06842149 (patch)
tree98eaa6adb49fea33593a770d37d2e89cc7c15bbb /src/smt
parentacdffc72bd559fa4b64da2ee2b3373208354e7a1 (diff)
More fixes for quantifier elimination (#5533)
Fixes #5506, fixes #5507.
Diffstat (limited to 'src/smt')
-rw-r--r--src/smt/quant_elim_solver.cpp14
-rw-r--r--src/smt/quant_elim_solver.h13
-rw-r--r--src/smt/smt_engine.cpp3
3 files changed, 26 insertions, 4 deletions
diff --git a/src/smt/quant_elim_solver.cpp b/src/smt/quant_elim_solver.cpp
index e5ecafd4a..4636cf17a 100644
--- a/src/smt/quant_elim_solver.cpp
+++ b/src/smt/quant_elim_solver.cpp
@@ -14,6 +14,7 @@
#include "smt/quant_elim_solver.h"
+#include "expr/skolem_manager.h"
#include "expr/subs.h"
#include "smt/smt_solver.h"
#include "theory/quantifiers/cegqi/nested_qe.h"
@@ -33,7 +34,8 @@ QuantElimSolver::~QuantElimSolver() {}
Node QuantElimSolver::getQuantifierElimination(Assertions& as,
Node q,
- bool doFull)
+ bool doFull,
+ bool isInternalSubsolver)
{
Trace("smt-qe") << "QuantElimSolver: get qe : " << q << std::endl;
if (q.getKind() != EXISTS && q.getKind() != FORALL)
@@ -41,11 +43,13 @@ Node QuantElimSolver::getQuantifierElimination(Assertions& as,
throw ModalException(
"Expecting a quantified formula as argument to get-qe.");
}
+ NodeManager* nm = NodeManager::currentNM();
+ // ensure the body is rewritten
+ q = nm->mkNode(q.getKind(), q[0], Rewriter::rewrite(q[1]));
// do nested quantifier elimination if necessary
q = quantifiers::NestedQe::doNestedQe(q, true);
Trace("smt-qe") << "QuantElimSolver: after nested quantifier elimination : "
<< q << std::endl;
- NodeManager* nm = NodeManager::currentNM();
// tag the quantified formula with the quant-elim attribute
TypeNode t = nm->booleanType();
Node n_attr = nm->mkSkolem("qe", t, "Auxiliary variable for qe attr.");
@@ -121,6 +125,12 @@ Node QuantElimSolver::getQuantifierElimination(Assertions& as,
// do extended rewrite to minimize the size of the formula aggressively
theory::quantifiers::ExtendedRewriter extr(true);
ret = extr.extendedRewrite(ret);
+ // if we are not an internal subsolver, convert to witness form, since
+ // internally generated skolems should not escape
+ if (!isInternalSubsolver)
+ {
+ ret = SkolemManager::getWitnessForm(ret);
+ }
return ret;
}
// otherwise, just true/false
diff --git a/src/smt/quant_elim_solver.h b/src/smt/quant_elim_solver.h
index 96ed1f73d..ca55fc618 100644
--- a/src/smt/quant_elim_solver.h
+++ b/src/smt/quant_elim_solver.h
@@ -79,8 +79,19 @@ class QuantElimSolver
* extended command get-qe-disjunct, which can be used
* for incrementally computing the result of a
* quantifier elimination.
+ *
+ * @param as The assertions of the SmtEngine
+ * @param q The quantified formula we are eliminating quantifiers from
+ * @param doFull Whether we are doing full quantifier elimination on q
+ * @param isInternalSubsolver Whether the SmtEngine we belong to is an
+ * internal subsolver. If it is not, then we convert the final result to
+ * witness form.
+ * @return The result of eliminating quantifiers from q.
*/
- Node getQuantifierElimination(Assertions& as, Node q, bool doFull);
+ Node getQuantifierElimination(Assertions& as,
+ Node q,
+ bool doFull,
+ bool isInternalSubsolver);
private:
/** The SMT solver, which is used during doQuantifierElimination. */
diff --git a/src/smt/smt_engine.cpp b/src/smt/smt_engine.cpp
index 722f6a080..d3ba676fc 100644
--- a/src/smt/smt_engine.cpp
+++ b/src/smt/smt_engine.cpp
@@ -1498,7 +1498,8 @@ Node SmtEngine::getQuantifierElimination(Node q, bool doFull, bool strict)
if(!d_logic.isPure(THEORY_ARITH) && strict){
Warning() << "Unexpected logic for quantifier elimination " << d_logic << endl;
}
- return d_quantElimSolver->getQuantifierElimination(*d_asserts, q, doFull);
+ return d_quantElimSolver->getQuantifierElimination(
+ *d_asserts, q, doFull, d_isInternalSubsolver);
}
bool SmtEngine::getInterpol(const Node& conj,
generated by cgit on debian on lair
contact matthew@masot.net with questions or feedback