From 16c2fe5ec2ebb29da131aa590a4a0b79b1e94dc9 Mon Sep 17 00:00:00 2001 From: Aina Niemetz Date: Mon, 19 Aug 2019 15:10:04 -0700 Subject: New C++ API: Add checks for Solver::checkValid and Solver::checkValidAssuming. (#3197) --- src/api/cvc4cpp.cpp | 48 ++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 40 insertions(+), 8 deletions(-) (limited to 'src/api') diff --git a/src/api/cvc4cpp.cpp b/src/api/cvc4cpp.cpp index b29d6a26f..904da0f10 100644 --- a/src/api/cvc4cpp.cpp +++ b/src/api/cvc4cpp.cpp @@ -38,12 +38,14 @@ #include "base/cvc4_check.h" #include "expr/expr.h" #include "expr/expr_manager.h" +#include "expr/expr_manager_scope.h" #include "expr/kind.h" #include "expr/metakind.h" #include "expr/node_manager.h" #include "expr/type.h" #include "options/main_options.h" #include "options/options.h" +#include "options/smt_options.h" #include "smt/model.h" #include "smt/smt_engine.h" #include "theory/logic_info.h" @@ -3084,33 +3086,61 @@ Term Solver::simplify(const Term& t) { CVC4_API_SOLVER_TRY_CATCH_BEGIN; CVC4_API_ARG_CHECK_NOT_NULL(t); + return d_smtEngine->simplify(*t.d_expr); + CVC4_API_SOLVER_TRY_CATCH_END; } Result Solver::checkValid(void) const { - // CHECK: - // if d_queryMade -> incremental enabled + CVC4_API_SOLVER_TRY_CATCH_BEGIN; + CVC4::ExprManagerScope exmgrs(*(d_exprMgr.get())); + CVC4_API_CHECK(!d_smtEngine->isQueryMade() + || CVC4::options::incrementalSolving()) + << "Cannot make multiple queries unless incremental solving is enabled " + "(try --incremental)"; + CVC4::Result r = d_smtEngine->query(); return Result(r); + + CVC4_API_SOLVER_TRY_CATCH_END; } Result Solver::checkValidAssuming(Term assumption) const { - // CHECK: - // if assumptions.size() > 0: incremental enabled? + CVC4_API_SOLVER_TRY_CATCH_BEGIN; + CVC4::ExprManagerScope exmgrs(*(d_exprMgr.get())); + CVC4_API_CHECK(!d_smtEngine->isQueryMade() + || CVC4::options::incrementalSolving()) + << "Cannot make multiple queries unless incremental solving is enabled " + "(try --incremental)"; + CVC4_API_ARG_CHECK_NOT_NULL(assumption); + CVC4::Result r = d_smtEngine->query(*assumption.d_expr); return Result(r); + + CVC4_API_SOLVER_TRY_CATCH_END; } Result Solver::checkValidAssuming(const std::vector& assumptions) const { - // CHECK: - // if assumptions.size() > 0: incremental enabled? + CVC4_API_SOLVER_TRY_CATCH_BEGIN; + CVC4::ExprManagerScope exmgrs(*(d_exprMgr.get())); + CVC4_API_CHECK(!d_smtEngine->isQueryMade() + || CVC4::options::incrementalSolving()) + << "Cannot make multiple queries unless incremental solving is enabled " + "(try --incremental)"; + for (const Term& assumption : assumptions) + { + CVC4_API_ARG_CHECK_NOT_NULL(assumption); + } + std::vector eassumptions = termVectorToExprs(assumptions); CVC4::Result r = d_smtEngine->query(eassumptions); return Result(r); + + CVC4_API_SOLVER_TRY_CATCH_END; } /* SMT-LIB commands */ @@ -3556,7 +3586,8 @@ std::vector Solver::getValue(const std::vector& terms) const void Solver::pop(uint32_t nscopes) const { CVC4_API_SOLVER_TRY_CATCH_BEGIN; - CVC4_API_CHECK(d_smtEngine->getOption("incremental").toString() == "true") + CVC4::ExprManagerScope exmgrs(*(d_exprMgr.get())); + CVC4_API_CHECK(CVC4::options::incrementalSolving()) << "Cannot pop when not solving incrementally (use --incremental)"; CVC4_API_CHECK(nscopes <= d_smtEngine->getNumUserLevels()) << "Cannot pop beyond first pushed context"; @@ -3581,7 +3612,8 @@ void Solver::printModel(std::ostream& out) const void Solver::push(uint32_t nscopes) const { CVC4_API_SOLVER_TRY_CATCH_BEGIN; - CVC4_API_CHECK(d_smtEngine->getOption("incremental").toString() == "true") + CVC4::ExprManagerScope exmgrs(*(d_exprMgr.get())); + CVC4_API_CHECK(CVC4::options::incrementalSolving()) << "Cannot push when not solving incrementally (use --incremental)"; for (uint32_t n = 0; n < nscopes; ++n) -- cgit v1.2.3