summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndres Noetzli <andres.noetzli@gmail.com>2020-07-15 16:42:00 -0700
committerGitHub <noreply@github.com>2020-07-15 18:42:00 -0500
commit3b87ce3ab67fd463a733ad11402e32f94eb1017e (patch)
treef58e422e35ca61ca61045f09643d61d2e500a77c
parentf1351ca7462d3d601e0dec78b71f54e0c7ee381f (diff)
Use Nodes for SmtEngine assertions (#4752)
This commit changes SmtEngine::assertFormula() to use Nodes rather than Exprs and changes AssertionList to be Node-based. This is work towards removing the Expr layer.
-rw-r--r--src/api/cvc4cpp.cpp2
-rw-r--r--src/preprocessing/passes/sygus_inference.cpp2
-rw-r--r--src/smt/abduction_solver.cpp2
-rw-r--r--src/smt/smt_engine.cpp113
-rw-r--r--src/smt/smt_engine.h6
-rw-r--r--src/theory/quantifiers/expr_miner.cpp2
-rw-r--r--src/theory/quantifiers/sygus/ce_guided_single_inv.cpp2
-rw-r--r--src/theory/quantifiers/sygus/cegis_core_connective.cpp4
-rw-r--r--src/theory/quantifiers/sygus/sygus_repair_const.cpp2
-rw-r--r--src/theory/smt_engine_subsolver.cpp4
-rw-r--r--test/system/CMakeLists.txt3
11 files changed, 71 insertions, 71 deletions
diff --git a/src/api/cvc4cpp.cpp b/src/api/cvc4cpp.cpp
index c4ba701b9..fa995a00a 100644
--- a/src/api/cvc4cpp.cpp
+++ b/src/api/cvc4cpp.cpp
@@ -4202,7 +4202,7 @@ void Solver::assertFormula(Term term) const
CVC4_API_SOLVER_TRY_CATCH_BEGIN;
CVC4_API_SOLVER_CHECK_TERM(term);
CVC4_API_ARG_CHECK_NOT_NULL(term);
- d_smtEngine->assertFormula(*term.d_expr);
+ d_smtEngine->assertFormula(Node::fromExpr(*term.d_expr));
CVC4_API_SOLVER_TRY_CATCH_END;
}
diff --git a/src/preprocessing/passes/sygus_inference.cpp b/src/preprocessing/passes/sygus_inference.cpp
index 31f927359..7336ac159 100644
--- a/src/preprocessing/passes/sygus_inference.cpp
+++ b/src/preprocessing/passes/sygus_inference.cpp
@@ -303,7 +303,7 @@ bool SygusInference::solveSygus(std::vector<Node>& assertions,
// make a separate smt call
std::unique_ptr<SmtEngine> rrSygus;
theory::initializeSubsolver(rrSygus);
- rrSygus->assertFormula(body.toExpr());
+ rrSygus->assertFormula(body);
Trace("sygus-infer") << "*** Check sat..." << std::endl;
Result r = rrSygus->checkSat();
Trace("sygus-infer") << "...result : " << r << std::endl;
diff --git a/src/smt/abduction_solver.cpp b/src/smt/abduction_solver.cpp
index adb80b719..01e2a4f0f 100644
--- a/src/smt/abduction_solver.cpp
+++ b/src/smt/abduction_solver.cpp
@@ -69,7 +69,7 @@ bool AbductionSolver::getAbduct(const Node& goal,
l.enableSygus();
d_subsolver->setLogic(l);
// assert the abduction query
- d_subsolver->assertFormula(aconj.toExpr());
+ d_subsolver->assertFormula(aconj);
return getAbductInternal(abd);
}
diff --git a/src/smt/smt_engine.cpp b/src/smt/smt_engine.cpp
index 380878e41..ff5cff5b6 100644
--- a/src/smt/smt_engine.cpp
+++ b/src/smt/smt_engine.cpp
@@ -1270,8 +1270,7 @@ void SmtEngine::defineFunction(Expr func,
debugCheckFunctionBody(formula, formals, func);
// Substitute out any abstract values in formula
- Expr form =
- d_private->substituteAbstractValues(Node::fromExpr(formula)).toExpr();
+ Node formNode = d_private->substituteAbstractValues(Node::fromExpr(formula));
TNode funcNode = func.getTNode();
vector<Node> formalsNodes;
@@ -1281,7 +1280,6 @@ void SmtEngine::defineFunction(Expr func,
++i) {
formalsNodes.push_back((*i).getNode());
}
- TNode formNode = form.getTNode();
DefinedFunction def(funcNode, formalsNodes, formNode);
// Permit (check-sat) (define-fun ...) (get-value ...) sequences.
// Otherwise, (check-sat) (get-value ((! foo :named bar))) breaks
@@ -1378,21 +1376,21 @@ void SmtEngine::defineFunctionsRec(
// assert the quantified formula
// notice we don't call assertFormula directly, since this would
// duplicate the output on raw-benchmark.
- Expr e = d_private->substituteAbstractValues(Node::fromExpr(lem)).toExpr();
+ Node n = d_private->substituteAbstractValues(Node::fromExpr(lem));
if (d_assertionList != nullptr)
{
- d_assertionList->push_back(e);
+ d_assertionList->push_back(n);
}
if (global && d_globalDefineFunRecLemmas != nullptr)
{
// Global definitions are asserted at check-sat-time because we have to
// make sure that they are always present
Assert(!language::isInputLangSygus(options::inputLanguage()));
- d_globalDefineFunRecLemmas->emplace_back(Node::fromExpr(e));
+ d_globalDefineFunRecLemmas->emplace_back(n);
}
else
{
- d_private->addFormula(e.getNode(), false, true, false, maybeHasFv);
+ d_private->addFormula(n, false, true, false, maybeHasFv);
}
}
}
@@ -1616,16 +1614,16 @@ void SmtEnginePrivate::addFormula(
//d_assertions.push_back(Rewriter::rewrite(n));
}
-void SmtEngine::ensureBoolean(const Expr& e)
+void SmtEngine::ensureBoolean(const Node& n)
{
- Type type = e.getType(options::typeChecking());
- Type boolType = d_exprManager->booleanType();
+ TypeNode type = n.getType(options::typeChecking());
+ TypeNode boolType = NodeManager::currentNM()->booleanType();
if(type != boolType) {
stringstream ss;
ss << "Expected " << boolType << "\n"
- << "The assertion : " << e << "\n"
+ << "The assertion : " << n << "\n"
<< "Its type : " << type;
- throw TypeCheckingException(e, ss.str());
+ throw TypeCheckingException(n.toExpr(), ss.str());
}
}
@@ -1734,17 +1732,16 @@ Result SmtEngine::checkSatisfiability(const vector<Expr>& assumptions,
for (Expr e : d_assumptions)
{
// Substitute out any abstract values in ex.
- e = d_private->substituteAbstractValues(Node::fromExpr(e)).toExpr();
- Assert(e.getExprManager() == d_exprManager);
+ Node n = d_private->substituteAbstractValues(Node::fromExpr(e));
// Ensure expr is type-checked at this point.
- ensureBoolean(e);
+ ensureBoolean(n);
/* Add assumption */
if (d_assertionList != NULL)
{
- d_assertionList->push_back(e);
+ d_assertionList->push_back(n);
}
- d_private->addFormula(e.getNode(), inUnsatCore, true, true);
+ d_private->addFormula(n, inUnsatCore, true, true);
}
if (d_globalDefineFunRecLemmas != nullptr)
@@ -1884,28 +1881,27 @@ vector<Expr> SmtEngine::getUnsatAssumptions(void)
return res;
}
-Result SmtEngine::assertFormula(const Expr& ex, bool inUnsatCore)
+Result SmtEngine::assertFormula(const Node& formula, bool inUnsatCore)
{
- Assert(ex.getExprManager() == d_exprManager);
SmtScope smts(this);
finalOptionsAreSet();
doPendingPops();
- Trace("smt") << "SmtEngine::assertFormula(" << ex << ")" << endl;
+ Trace("smt") << "SmtEngine::assertFormula(" << formula << ")" << endl;
if (Dump.isOn("raw-benchmark")) {
- Dump("raw-benchmark") << AssertCommand(ex);
+ Dump("raw-benchmark") << AssertCommand(formula.toExpr());
}
// Substitute out any abstract values in ex
- Expr e = d_private->substituteAbstractValues(Node::fromExpr(ex)).toExpr();
+ Node n = d_private->substituteAbstractValues(formula);
- ensureBoolean(e);
+ ensureBoolean(n);
if(d_assertionList != NULL) {
- d_assertionList->push_back(e);
+ d_assertionList->push_back(n);
}
bool maybeHasFv = language::isInputLangSygus(options::inputLanguage());
- d_private->addFormula(e.getNode(), inUnsatCore, true, false, maybeHasFv);
+ d_private->addFormula(n, inUnsatCore, true, false, maybeHasFv);
return quickCheck().asEntailmentResult();
}/* SmtEngine::assertFormula() */
@@ -2115,7 +2111,7 @@ Result SmtEngine::checkSynth()
// we push a context so that this conjecture is removed if we modify it
// later
internalPush();
- assertFormula(body.toExpr(), true);
+ assertFormula(body, true);
}
else
{
@@ -2277,23 +2273,22 @@ bool SmtEngine::addToAssignment(const Expr& ex) {
finalOptionsAreSet();
doPendingPops();
// Substitute out any abstract values in ex
- Expr e = d_private->substituteAbstractValues(Node::fromExpr(ex)).toExpr();
- Type type = e.getType(options::typeChecking());
+ Node n = d_private->substituteAbstractValues(Node::fromExpr(ex));
+ TypeNode type = n.getType(options::typeChecking());
// must be Boolean
- PrettyCheckArgument(
- type.isBoolean(), e,
- "expected Boolean-typed variable or function application "
- "in addToAssignment()" );
- Node n = e.getNode();
+ PrettyCheckArgument(type.isBoolean(),
+ n,
+ "expected Boolean-typed variable or function application "
+ "in addToAssignment()");
// must be a defined constant, or a variable
PrettyCheckArgument(
(((d_definedFunctions->find(n) != d_definedFunctions->end())
&& n.getNumChildren() == 0)
|| n.isVar()),
- e,
+ n,
"expected variable or defined-function application "
"in addToAssignment(),\ngot %s",
- e.toString().c_str());
+ n.toString().c_str());
if(!options::produceAssignments()) {
return false;
}
@@ -2449,7 +2444,7 @@ Result SmtEngine::blockModel()
std::vector<Expr> eassertsProc = getExpandedAssertions();
Expr eblocker = ModelBlocker::getModelBlocker(
eassertsProc, m, options::blockModelsMode());
- return assertFormula(eblocker);
+ return assertFormula(Node::fromExpr(eblocker));
}
Result SmtEngine::blockModelValues(const std::vector<Expr>& exprs)
@@ -2474,7 +2469,7 @@ Result SmtEngine::blockModelValues(const std::vector<Expr>& exprs)
// we always do block model values mode here
Expr eblocker = ModelBlocker::getModelBlocker(
eassertsProc, m, options::BlockModelsMode::VALUES, exprs);
- return assertFormula(eblocker);
+ return assertFormula(Node::fromExpr(eblocker));
}
std::pair<Expr, Expr> SmtEngine::getSepHeapAndNilExpr(void)
@@ -2602,7 +2597,7 @@ void SmtEngine::checkUnsatCore() {
Notice() << "SmtEngine::checkUnsatCore(): pushing core assertions (size == " << core.size() << ")" << endl;
for(UnsatCore::iterator i = core.begin(); i != core.end(); ++i) {
Notice() << "SmtEngine::checkUnsatCore(): pushing core member " << *i << endl;
- coreChecker.assertFormula(*i);
+ coreChecker.assertFormula(Node::fromExpr(*i));
}
Result r;
try {
@@ -2745,9 +2740,11 @@ void SmtEngine::checkModel(bool hardFailure) {
}
// Now go through all our user assertions checking if they're satisfied.
- for(AssertionList::const_iterator i = d_assertionList->begin(); i != d_assertionList->end(); ++i) {
- Notice() << "SmtEngine::checkModel(): checking assertion " << *i << endl;
- Node n = Node::fromExpr(*i);
+ for (const Node& assertion : *d_assertionList)
+ {
+ Notice() << "SmtEngine::checkModel(): checking assertion " << assertion
+ << endl;
+ Node n = assertion;
// Apply any define-funs from the problem.
{
@@ -2826,7 +2823,7 @@ void SmtEngine::checkModel(bool hardFailure) {
stringstream ss;
ss << "SmtEngine::checkModel(): "
<< "ERRORS SATISFYING ASSERTIONS WITH MODEL:" << endl
- << "assertion: " << *i << endl
+ << "assertion: " << assertion << endl
<< "simplifies to: " << n << endl
<< "expected `true'." << endl
<< "Run with `--check-models -v' for additional diagnostics.";
@@ -2899,23 +2896,20 @@ void SmtEngine::checkSynthSolution()
std::vector<Node> auxAssertions;
// expand definitions cache
std::unordered_map<Node, Node, NodeHashFunction> cache;
- for (AssertionList::const_iterator i = d_assertionList->begin();
- i != d_assertionList->end();
- ++i)
+ for (const Node& assertion : *d_assertionList)
{
- Notice() << "SmtEngine::checkSynthSolution(): checking assertion " << *i << endl;
- Trace("check-synth-sol") << "Retrieving assertion " << *i << "\n";
- Node assertion = Node::fromExpr(*i);
+ Notice() << "SmtEngine::checkSynthSolution(): checking assertion "
+ << assertion << endl;
+ Trace("check-synth-sol") << "Retrieving assertion " << assertion << "\n";
// Apply any define-funs from the problem.
- assertion =
+ Node n =
d_private->getProcessAssertions()->expandDefinitions(assertion, cache);
- Notice() << "SmtEngine::checkSynthSolution(): -- expands to " << assertion
- << endl;
- Trace("check-synth-sol") << "Expanded assertion " << assertion << "\n";
- if (conjs.find(assertion) == conjs.end())
+ Notice() << "SmtEngine::checkSynthSolution(): -- expands to " << n << endl;
+ Trace("check-synth-sol") << "Expanded assertion " << n << "\n";
+ if (conjs.find(n) == conjs.end())
{
Trace("check-synth-sol") << "It is an auxiliary assertion\n";
- auxAssertions.push_back(assertion);
+ auxAssertions.push_back(n);
}
else
{
@@ -2959,12 +2953,12 @@ void SmtEngine::checkSynthSolution()
<< conjBody << endl;
Trace("check-synth-sol") << "Substituted body of assertion to " << conjBody
<< "\n";
- solChecker.assertFormula(conjBody.toExpr());
+ solChecker.assertFormula(conjBody);
// Assert all auxiliary assertions. This may include recursive function
// definitions that were added as assertions to the sygus problem.
for (const Node& a : auxAssertions)
{
- solChecker.assertFormula(a.toExpr());
+ solChecker.assertFormula(a);
}
Result r = solChecker.checkSat();
Notice() << "SmtEngine::checkSynthSolution(): result is " << r << endl;
@@ -3244,8 +3238,13 @@ vector<Expr> SmtEngine::getAssertions() {
throw ModalException(msg);
}
Assert(d_assertionList != NULL);
+ std::vector<Expr> res;
+ for (const Node& n : *d_assertionList)
+ {
+ res.emplace_back(n.toExpr());
+ }
// copy the result out
- return vector<Expr>(d_assertionList->begin(), d_assertionList->end());
+ return res;
}
void SmtEngine::push()
diff --git a/src/smt/smt_engine.h b/src/smt/smt_engine.h
index f6b1d08bf..3ed2b987c 100644
--- a/src/smt/smt_engine.h
+++ b/src/smt/smt_engine.h
@@ -371,7 +371,7 @@ class CVC4_PUBLIC SmtEngine
*
* @throw TypeCheckingException, LogicException, UnsafeInterruptException
*/
- Result assertFormula(const Expr& e, bool inUnsatCore = true);
+ Result assertFormula(const Node& formula, bool inUnsatCore = true);
/**
* Check if a given (set of) expression(s) is entailed with respect to the
@@ -915,7 +915,7 @@ class CVC4_PUBLIC SmtEngine
typedef context::CDHashMap<Node, smt::DefinedFunction, NodeHashFunction>
DefinedFunctionMap;
/** The type of our internal assertion list */
- typedef context::CDList<Expr> AssertionList;
+ typedef context::CDList<Node> AssertionList;
/** The type of our internal assignment set */
typedef context::CDHashSet<Node, NodeHashFunction> AssignmentSet;
@@ -1072,7 +1072,7 @@ class CVC4_PUBLIC SmtEngine
*
* throw@ TypeCheckingException
*/
- void ensureBoolean(const Expr& e);
+ void ensureBoolean(const Node& n);
void internalPush();
diff --git a/src/theory/quantifiers/expr_miner.cpp b/src/theory/quantifiers/expr_miner.cpp
index 00a627adf..72e47fac8 100644
--- a/src/theory/quantifiers/expr_miner.cpp
+++ b/src/theory/quantifiers/expr_miner.cpp
@@ -80,7 +80,7 @@ void ExprMiner::initializeChecker(std::unique_ptr<SmtEngine>& checker,
// Convert bound variables to skolems. This ensures the satisfiability
// check is ground.
Node squery = convertToSkolem(query);
- checker->assertFormula(squery.toExpr());
+ checker->assertFormula(squery);
}
Result ExprMiner::doCheck(Node query)
diff --git a/src/theory/quantifiers/sygus/ce_guided_single_inv.cpp b/src/theory/quantifiers/sygus/ce_guided_single_inv.cpp
index 0612c85f8..cd9bbeb1f 100644
--- a/src/theory/quantifiers/sygus/ce_guided_single_inv.cpp
+++ b/src/theory/quantifiers/sygus/ce_guided_single_inv.cpp
@@ -377,7 +377,7 @@ bool CegSingleInv::solve()
// solve the single invocation conjecture using a fresh copy of SMT engine
std::unique_ptr<SmtEngine> siSmt;
initializeSubsolver(siSmt);
- siSmt->assertFormula(siq.toExpr());
+ siSmt->assertFormula(siq);
Result r = siSmt->checkSat();
Trace("sygus-si") << "Result: " << r << std::endl;
if (r.asSatisfiabilityResult().isSat() != Result::UNSAT)
diff --git a/src/theory/quantifiers/sygus/cegis_core_connective.cpp b/src/theory/quantifiers/sygus/cegis_core_connective.cpp
index dcdd89c1b..a7f32155c 100644
--- a/src/theory/quantifiers/sygus/cegis_core_connective.cpp
+++ b/src/theory/quantifiers/sygus/cegis_core_connective.cpp
@@ -744,7 +744,7 @@ Node CegisCoreConnective::constructSolutionFromPool(Component& ccheck,
Node query = rasserts.size() == 1 ? rasserts[0] : nm->mkNode(AND, rasserts);
for (const Node& a : rasserts)
{
- checkSol->assertFormula(a.toExpr());
+ checkSol->assertFormula(a);
}
Result r = checkSol->checkSat();
Trace("sygus-ccore") << "----- check-sat returned " << r << std::endl;
@@ -782,7 +782,7 @@ Node CegisCoreConnective::constructSolutionFromPool(Component& ccheck,
std::shuffle(scasserts.begin(), scasserts.end(), Random::getRandom());
for (const Node& sca : scasserts)
{
- checkSc->assertFormula(sca.toExpr());
+ checkSc->assertFormula(sca);
}
Result rsc = checkSc->checkSat();
Trace("sygus-ccore")
diff --git a/src/theory/quantifiers/sygus/sygus_repair_const.cpp b/src/theory/quantifiers/sygus/sygus_repair_const.cpp
index 3e632fc56..2514b05e2 100644
--- a/src/theory/quantifiers/sygus/sygus_repair_const.cpp
+++ b/src/theory/quantifiers/sygus/sygus_repair_const.cpp
@@ -235,7 +235,7 @@ bool SygusRepairConst::repairSolution(Node sygusBody,
repcChecker->setOption("miniscope-quant", true);
repcChecker->setOption("miniscope-quant-fv", true);
repcChecker->setOption("quant-split", true);
- repcChecker->assertFormula(fo_body.toExpr());
+ repcChecker->assertFormula(fo_body);
// check satisfiability
Result r = repcChecker->checkSat();
Trace("sygus-repair-const") << "...got : " << r << std::endl;
diff --git a/src/theory/smt_engine_subsolver.cpp b/src/theory/smt_engine_subsolver.cpp
index 863d1ab86..41526c30d 100644
--- a/src/theory/smt_engine_subsolver.cpp
+++ b/src/theory/smt_engine_subsolver.cpp
@@ -70,7 +70,7 @@ Result checkWithSubsolver(std::unique_ptr<SmtEngine>& smte,
return r;
}
initializeSubsolver(smte, needsTimeout, timeout);
- smte->assertFormula(query.toExpr());
+ smte->assertFormula(query);
return smte->checkSat();
}
@@ -106,7 +106,7 @@ Result checkWithSubsolver(Node query,
}
std::unique_ptr<SmtEngine> smte;
initializeSubsolver(smte, needsTimeout, timeout);
- smte->assertFormula(query.toExpr());
+ smte->assertFormula(query);
r = smte->checkSat();
if (r.asSatisfiabilityResult().isSat() == Result::SAT)
{
diff --git a/test/system/CMakeLists.txt b/test/system/CMakeLists.txt
index 041d14295..589ff0db7 100644
--- a/test/system/CMakeLists.txt
+++ b/test/system/CMakeLists.txt
@@ -31,6 +31,7 @@ cvc4_add_system_test(ouroborous)
cvc4_add_system_test(reset_assertions)
cvc4_add_system_test(sep_log_api)
cvc4_add_system_test(smt2_compliance)
-cvc4_add_system_test(statistics)
+# TODO(cvc4-projects#209): Add methods for retrieving statistics to new API
+# cvc4_add_system_test(statistics)
cvc4_add_system_test(two_solvers)
# TODO: Move CVC4JavaTest.java to test/java and delete run_java_test (after full cmake migration)
generated by cgit on debian on lair
contact matthew@masot.net with questions or feedback