Solver::~Solver() {}
+/* Helpers */
+/* -------------------------------------------------------------------------- */
+
+/* Split out to avoid nested API calls (problematic with API tracing). */
+/* .......................................................................... */
+
+template <typename T>
+Term Solver::mkValHelper(T t) const
+{
+ Term res = d_exprMgr->mkConst(t);
+ (void)res.d_expr->getType(true); /* kick off type checking */
+ return res;
+}
+
+Term Solver::mkRealFromStrHelper(std::string s) const
+{
+ /* CLN and GMP handle this case differently, CLN interprets it as 0, GMP
+ * throws an std::invalid_argument exception. For consistency, we treat it
+ * as invalid. */
+ CVC4_API_ARG_CHECK_EXPECTED(s != ".", s)
+ << "a string representing an integer, real or rational value.";
+
+ CVC4::Rational r = s.find('/') != std::string::npos
+ ? CVC4::Rational(s)
+ : CVC4::Rational::fromDecimal(s);
+ return mkValHelper<CVC4::Rational>(r);
+}
+
+Term Solver::mkBVFromIntHelper(uint32_t size, uint64_t val) const
+{
+ CVC4_API_SOLVER_TRY_CATCH_BEGIN;
+ CVC4_API_ARG_CHECK_EXPECTED(size > 0, size) << "a bit-width > 0";
+
+ return mkValHelper<CVC4::BitVector>(CVC4::BitVector(size, val));
+
+ CVC4_API_SOLVER_TRY_CATCH_END;
+}
+
+Term Solver::mkBVFromStrHelper(std::string s, uint32_t base) const
+{
+ CVC4_API_ARG_CHECK_EXPECTED(!s.empty(), s) << "a non-empty string";
+ CVC4_API_ARG_CHECK_EXPECTED(base == 2 || base == 10 || base == 16, s)
+ << "base 2, 10, or 16";
+
+ return mkValHelper<CVC4::BitVector>(CVC4::BitVector(s, base));
+}
+
+Term Solver::mkBVFromStrHelper(uint32_t size,
+ std::string s,
+ uint32_t base) const
+{
+ CVC4_API_ARG_CHECK_EXPECTED(!s.empty(), s) << "a non-empty string";
+ CVC4_API_ARG_CHECK_EXPECTED(base == 2 || base == 10 || base == 16, s)
+ << "base 2, 10, or 16";
+
+ Integer val(s, base);
+ CVC4_API_CHECK(val.modByPow2(size) == val)
+ << "Overflow in bitvector construction (specified bitvector size " << size
+ << " too small to hold value " << s << ")";
+
+ return mkValHelper<CVC4::BitVector>(CVC4::BitVector(size, val));
+}
+
+/* Helpers for converting vectors. */
+/* .......................................................................... */
+
+std::vector<Type> Solver::sortVectorToTypes(
+ const std::vector<Sort>& sorts) const
+{
+ std::vector<Type> res;
+ for (const Sort& s : sorts)
+ {
+ res.push_back(*s.d_type);
+ }
+ return res;
+}
+
+std::vector<Expr> Solver::termVectorToExprs(
+ const std::vector<Term>& terms) const
+{
+ std::vector<Expr> res;
+ for (const Term& t : terms)
+ {
+ res.push_back(*t.d_expr);
+ }
+ return res;
+}
+
+/* Helpers for mkTerm checks. */
+/* .......................................................................... */
+
+void Solver::checkMkTerm(Kind kind, uint32_t nchildren) const
+{
+ CVC4_API_KIND_CHECK(kind);
+ Assert(isDefinedIntKind(extToIntKind(kind)));
+ const CVC4::kind::MetaKind mk = kind::metaKindOf(extToIntKind(kind));
+ CVC4_API_KIND_CHECK_EXPECTED(
+ mk == kind::metakind::PARAMETERIZED || mk == kind::metakind::OPERATOR,
+ kind)
+ << "Only operator-style terms are created with mkTerm(), "
+ "to create variables, constants and values see mkVar(), mkConst() "
+ "and the respective theory-specific functions to create values, "
+ "e.g., mkBitVector().";
+ CVC4_API_KIND_CHECK_EXPECTED(
+ nchildren >= minArity(kind) && nchildren <= maxArity(kind), kind)
+ << "Terms with kind " << kindToString(kind) << " must have at least "
+ << minArity(kind) << " children and at most " << maxArity(kind)
+ << " children (the one under construction has " << nchildren << ")";
+}
+
+void Solver::checkMkOpTerm(Kind kind, OpTerm opTerm, uint32_t nchildren) const
+{
+ Assert(isDefinedIntKind(extToIntKind(kind)));
+ const CVC4::Kind int_kind = extToIntKind(kind);
+ const CVC4::Kind int_op_kind = opTerm.d_expr->getKind();
+ const CVC4::Kind int_op_to_kind =
+ NodeManager::operatorToKind(opTerm.d_expr->getNode());
+ CVC4_API_ARG_CHECK_EXPECTED(
+ int_kind == int_op_to_kind
+ || (kind == APPLY_CONSTRUCTOR
+ && int_op_to_kind == CVC4::Kind::UNDEFINED_KIND)
+ || (kind == APPLY_SELECTOR
+ && int_op_to_kind == CVC4::Kind::UNDEFINED_KIND)
+ || (kind == APPLY_UF && int_op_to_kind == CVC4::Kind::UNDEFINED_KIND),
+ kind)
+ << "kind that matches kind associated with given operator term";
+ CVC4_API_ARG_CHECK_EXPECTED(
+ int_op_kind == CVC4::kind::BUILTIN
+ || CVC4::kind::metaKindOf(int_kind) == kind::metakind::PARAMETERIZED,
+ opTerm)
+ << "This term constructor is for parameterized kinds only";
+ uint32_t min_arity = ExprManager::minArity(int_kind);
+ uint32_t max_arity = ExprManager::maxArity(int_kind);
+ CVC4_API_KIND_CHECK_EXPECTED(nchildren >= min_arity && nchildren <= max_arity,
+ kind)
+ << "Terms with kind " << kindToString(kind) << " must have at least "
+ << min_arity << " children and at most " << max_arity
+ << " children (the one under construction has " << nchildren << ")";
+}
+
/* Sorts Handling */
/* -------------------------------------------------------------------------- */
<< "non-null element sort";
return d_exprMgr->mkArrayType(*indexSort.d_type, *elemSort.d_type);
+
CVC4_API_SOLVER_TRY_CATCH_END;
}
CVC4_API_ARG_CHECK_EXPECTED(size > 0, size) << "size > 0";
return d_exprMgr->mkBitVectorType(size);
+
CVC4_API_SOLVER_TRY_CATCH_END;
}
CVC4_API_ARG_CHECK_EXPECTED(sig > 0, sig) << "significand size > 0";
return d_exprMgr->mkFloatingPointType(exp, sig);
+
CVC4_API_SOLVER_TRY_CATCH_END;
}
<< "a datatype declaration with at least one constructor";
return d_exprMgr->mkDatatypeType(*dtypedecl.d_dtype);
+
CVC4_API_SOLVER_TRY_CATCH_END;
}
Assert(!codomain.isFunction()); /* A function sort is not first-class. */
return d_exprMgr->mkFunctionType(*domain.d_type, *codomain.d_type);
+
CVC4_API_SOLVER_TRY_CATCH_END;
}
std::vector<Type> argTypes = sortVectorToTypes(sorts);
return d_exprMgr->mkFunctionType(argTypes, *codomain.d_type);
+
CVC4_API_SOLVER_TRY_CATCH_END;
}
std::vector<Type> types = sortVectorToTypes(sorts);
return d_exprMgr->mkPredicateType(types);
+
CVC4_API_SOLVER_TRY_CATCH_END;
}
}
return d_exprMgr->mkRecordType(Record(f));
+
CVC4_API_SOLVER_TRY_CATCH_END;
}
<< "non-null element sort";
return d_exprMgr->mkSetType(*elemSort.d_type);
+
CVC4_API_SOLVER_TRY_CATCH_END;
}
CVC4_API_ARG_CHECK_EXPECTED(arity > 0, arity) << "an arity > 0";
return d_exprMgr->mkSortConstructor(symbol, arity);
+
CVC4_API_SOLVER_TRY_CATCH_END;
}
std::vector<Type> types = sortVectorToTypes(sorts);
return d_exprMgr->mkTupleType(types);
- CVC4_API_SOLVER_TRY_CATCH_END;
-}
-std::vector<Type> Solver::sortVectorToTypes(
- const std::vector<Sort>& sorts) const
-{
- std::vector<Type> res;
- for (const Sort& s : sorts)
- {
- res.push_back(*s.d_type);
- }
- return res;
+ CVC4_API_SOLVER_TRY_CATCH_END;
}
/* Create consts */
Term Solver::mkPi() const
{
CVC4_API_SOLVER_TRY_CATCH_BEGIN;
+
Term res =
d_exprMgr->mkNullaryOperator(d_exprMgr->realType(), CVC4::kind::PI);
(void)res.d_expr->getType(true); /* kick off type checking */
return res;
- CVC4_API_SOLVER_TRY_CATCH_END;
-}
-
-template <typename T>
-Term Solver::mkValHelper(T t) const
-{
- Term res = d_exprMgr->mkConst(t);
- (void)res.d_expr->getType(true); /* kick off type checking */
- return res;
-}
-/* Split out to avoid nested API calls (problematic with API tracing). */
-Term Solver::mkRealFromStrHelper(std::string s) const
-{
- CVC4_API_SOLVER_TRY_CATCH_BEGIN;
- /* CLN and GMP handle this case differently, CLN interprets it as 0, GMP
- * throws an std::invalid_argument exception. For consistency, we treat it
- * as invalid. */
- CVC4_API_ARG_CHECK_EXPECTED(s != ".", s)
- << "a string representing an integer, real or rational value.";
-
- CVC4::Rational r = s.find('/') != std::string::npos
- ? CVC4::Rational(s)
- : CVC4::Rational::fromDecimal(s);
- return mkValHelper<CVC4::Rational>(r);
CVC4_API_SOLVER_TRY_CATCH_END;
}
CVC4_API_ARG_CHECK_NOT_NULL(s);
return mkRealFromStrHelper(std::string(s));
+
CVC4_API_SOLVER_TRY_CATCH_END;
}
d_exprMgr->mkExpr(CVC4::kind::REGEXP_EMPTY, std::vector<CVC4::Expr>());
(void)res.d_expr->getType(true); /* kick off type checking */
return res;
+
CVC4_API_SOLVER_TRY_CATCH_END;
}
Term Solver::mkRegexpSigma() const
{
CVC4_API_SOLVER_TRY_CATCH_BEGIN;
+
Term res =
d_exprMgr->mkExpr(CVC4::kind::REGEXP_SIGMA, std::vector<CVC4::Expr>());
(void)res.d_expr->getType(true); /* kick off type checking */
return res;
+
CVC4_API_SOLVER_TRY_CATCH_END;
}
<< "null sort or set sort";
return mkValHelper<CVC4::EmptySet>(CVC4::EmptySet(*s.d_type));
+
CVC4_API_SOLVER_TRY_CATCH_END;
}
Term res = d_exprMgr->mkNullaryOperator(*sort.d_type, CVC4::kind::SEP_NIL);
(void)res.d_expr->getType(true); /* kick off type checking */
return res;
+
CVC4_API_SOLVER_TRY_CATCH_END;
}
// TODO(#2771): Reenable?
// (void)res.d_expr->getType(true); /* kick off type checking */
return res;
- CVC4_API_SOLVER_TRY_CATCH_END;
-}
-
-/* Split out to avoid nested API calls (problematic with API tracing). */
-Term Solver::mkBVFromIntHelper(uint32_t size, uint64_t val) const
-{
- CVC4_API_SOLVER_TRY_CATCH_BEGIN;
- CVC4_API_ARG_CHECK_EXPECTED(size > 0, size) << "a bit-width > 0";
- return mkValHelper<CVC4::BitVector>(CVC4::BitVector(size, val));
CVC4_API_SOLVER_TRY_CATCH_END;
}
CVC4_API_SOLVER_TRY_CATCH_END;
}
-/* Split out to avoid nested API calls (problematic with API tracing). */
-Term Solver::mkBVFromStrHelper(std::string s, uint32_t base) const
-{
- CVC4_API_SOLVER_TRY_CATCH_BEGIN;
- CVC4_API_ARG_CHECK_EXPECTED(!s.empty(), s) << "a non-empty string";
- CVC4_API_ARG_CHECK_EXPECTED(base == 2 || base == 10 || base == 16, s)
- << "base 2, 10, or 16";
-
- return mkValHelper<CVC4::BitVector>(CVC4::BitVector(s, base));
- CVC4_API_SOLVER_TRY_CATCH_END;
-}
-
-Term Solver::mkBVFromStrHelper(uint32_t size,
- std::string s,
- uint32_t base) const
-{
- CVC4_API_SOLVER_TRY_CATCH_BEGIN;
- CVC4_API_ARG_CHECK_EXPECTED(!s.empty(), s) << "a non-empty string";
- CVC4_API_ARG_CHECK_EXPECTED(base == 2 || base == 10 || base == 16, s)
- << "base 2, 10, or 16";
-
- Integer val(s, base);
- CVC4_API_CHECK(val.modByPow2(size) == val)
- << "Overflow in bitvector construction (specified bitvector size " << size
- << " too small to hold value " << s << ")";
- return mkValHelper<CVC4::BitVector>(CVC4::BitVector(size, val));
- CVC4_API_SOLVER_TRY_CATCH_END;
-}
-
Term Solver::mkBitVector(const char* s, uint32_t base) const
{
CVC4_API_SOLVER_TRY_CATCH_BEGIN;
CVC4_API_ARG_CHECK_NOT_NULL(s);
return mkBVFromStrHelper(std::string(s), base);
+
CVC4_API_SOLVER_TRY_CATCH_END;
}
{
CVC4_API_SOLVER_TRY_CATCH_BEGIN;
CVC4_API_ARG_CHECK_NOT_NULL(s);
-
return mkBVFromStrHelper(size, s, base);
CVC4_API_SOLVER_TRY_CATCH_END;
}
return mkValHelper<CVC4::FloatingPoint>(
FloatingPoint::makeInf(FloatingPointSize(exp, sig), false));
+
CVC4_API_SOLVER_TRY_CATCH_END;
}
return mkValHelper<CVC4::FloatingPoint>(
FloatingPoint::makeInf(FloatingPointSize(exp, sig), true));
+
CVC4_API_SOLVER_TRY_CATCH_END;
}
return mkValHelper<CVC4::FloatingPoint>(
FloatingPoint::makeNaN(FloatingPointSize(exp, sig)));
+
CVC4_API_SOLVER_TRY_CATCH_END;
}
return mkValHelper<CVC4::FloatingPoint>(
FloatingPoint::makeZero(FloatingPointSize(exp, sig), false));
+
CVC4_API_SOLVER_TRY_CATCH_END;
}
return mkValHelper<CVC4::FloatingPoint>(
FloatingPoint::makeZero(FloatingPointSize(exp, sig), true));
+
CVC4_API_SOLVER_TRY_CATCH_END;
}
return mkValHelper<CVC4::UninterpretedConstant>(
CVC4::UninterpretedConstant(*sort.d_type, index));
+
CVC4_API_SOLVER_TRY_CATCH_END;
}
return mkValHelper<CVC4::FloatingPoint>(
CVC4::FloatingPoint(exp, sig, val.d_expr->getConst<BitVector>()));
+
CVC4_API_SOLVER_TRY_CATCH_END;
}
: d_exprMgr->mkVar(symbol, *sort.d_type);
(void)res.d_expr->getType(true); /* kick off type checking */
return res;
+
CVC4_API_SOLVER_TRY_CATCH_END;
}
: d_exprMgr->mkBoundVar(symbol, *sort.d_type);
(void)res.d_expr->getType(true); /* kick off type checking */
return res;
+
CVC4_API_SOLVER_TRY_CATCH_END;
}
/* Create terms */
/* -------------------------------------------------------------------------- */
-void Solver::checkMkTerm(Kind kind, uint32_t nchildren) const
-{
- CVC4_API_KIND_CHECK(kind);
- Assert(isDefinedIntKind(extToIntKind(kind)));
- const CVC4::kind::MetaKind mk = kind::metaKindOf(extToIntKind(kind));
- CVC4_API_KIND_CHECK_EXPECTED(
- mk == kind::metakind::PARAMETERIZED || mk == kind::metakind::OPERATOR,
- kind)
- << "Only operator-style terms are created with mkTerm(), "
- "to create variables, constants and values see mkVar(), mkConst() "
- "and the respective theory-specific functions to create values, "
- "e.g., mkBitVector().";
- CVC4_API_KIND_CHECK_EXPECTED(
- nchildren >= minArity(kind) && nchildren <= maxArity(kind), kind)
- << "Terms with kind " << kindToString(kind) << " must have at least "
- << minArity(kind) << " children and at most " << maxArity(kind)
- << " children (the one under construction has " << nchildren << ")";
-}
-
-void Solver::checkMkOpTerm(Kind kind, OpTerm opTerm, uint32_t nchildren) const
-{
- Assert(isDefinedIntKind(extToIntKind(kind)));
- const CVC4::Kind int_kind = extToIntKind(kind);
- const CVC4::Kind int_op_kind = opTerm.d_expr->getKind();
- const CVC4::Kind int_op_to_kind =
- NodeManager::operatorToKind(opTerm.d_expr->getNode());
- CVC4_API_ARG_CHECK_EXPECTED(
- int_kind == int_op_to_kind
- || (kind == APPLY_CONSTRUCTOR
- && int_op_to_kind == CVC4::Kind::UNDEFINED_KIND)
- || (kind == APPLY_SELECTOR
- && int_op_to_kind == CVC4::Kind::UNDEFINED_KIND)
- || (kind == APPLY_UF && int_op_to_kind == CVC4::Kind::UNDEFINED_KIND),
- kind)
- << "kind that matches kind associated with given operator term";
- CVC4_API_ARG_CHECK_EXPECTED(
- int_op_kind == CVC4::kind::BUILTIN
- || CVC4::kind::metaKindOf(int_kind) == kind::metakind::PARAMETERIZED,
- opTerm)
- << "This term constructor is for parameterized kinds only";
- uint32_t min_arity = ExprManager::minArity(int_kind);
- uint32_t max_arity = ExprManager::maxArity(int_kind);
- CVC4_API_KIND_CHECK_EXPECTED(nchildren >= min_arity && nchildren <= max_arity,
- kind)
- << "Terms with kind " << kindToString(kind) << " must have at least "
- << min_arity << " children and at most " << max_arity
- << " children (the one under construction has " << nchildren << ")";
-}
-
Term Solver::mkTerm(Kind kind) const
{
CVC4_API_SOLVER_TRY_CATCH_BEGIN;
}
(void)res.d_expr->getType(true); /* kick off type checking */
return res;
+
CVC4_API_SOLVER_TRY_CATCH_END;
}
{
CVC4_API_SOLVER_TRY_CATCH_BEGIN;
CVC4_API_ARG_CHECK_EXPECTED(!child.isNull(), child) << "non-null term";
-
checkMkTerm(kind, 1);
+
Term res = d_exprMgr->mkExpr(extToIntKind(kind), *child.d_expr);
(void)res.d_expr->getType(true); /* kick off type checking */
return res;
+
CVC4_API_SOLVER_TRY_CATCH_END;
}
CVC4_API_SOLVER_TRY_CATCH_BEGIN;
CVC4_API_ARG_CHECK_EXPECTED(!child1.isNull(), child1) << "non-null term";
CVC4_API_ARG_CHECK_EXPECTED(!child2.isNull(), child2) << "non-null term";
-
checkMkTerm(kind, 2);
+
Term res =
d_exprMgr->mkExpr(extToIntKind(kind), *child1.d_expr, *child2.d_expr);
(void)res.d_expr->getType(true); /* kick off type checking */
return res;
+
CVC4_API_SOLVER_TRY_CATCH_END;
}
CVC4_API_ARG_CHECK_EXPECTED(!child1.isNull(), child1) << "non-null term";
CVC4_API_ARG_CHECK_EXPECTED(!child2.isNull(), child2) << "non-null term";
CVC4_API_ARG_CHECK_EXPECTED(!child3.isNull(), child3) << "non-null term";
-
checkMkTerm(kind, 3);
+
std::vector<Expr> echildren{*child1.d_expr, *child2.d_expr, *child3.d_expr};
CVC4::Kind k = extToIntKind(kind);
Assert(isDefinedIntKind(k));
: d_exprMgr->mkExpr(k, echildren);
(void)res.d_expr->getType(true); /* kick off type checking */
return res;
+
CVC4_API_SOLVER_TRY_CATCH_END;
}
!children[i].isNull(), "parameter term", children[i], i)
<< "non-null term";
}
-
checkMkTerm(kind, children.size());
+
std::vector<Expr> echildren = termVectorToExprs(children);
CVC4::Kind k = extToIntKind(kind);
Assert(isDefinedIntKind(k));
: d_exprMgr->mkExpr(k, echildren);
(void)res.d_expr->getType(true); /* kick off type checking */
return res;
+
CVC4_API_SOLVER_TRY_CATCH_END;
}
{
CVC4_API_SOLVER_TRY_CATCH_BEGIN;
checkMkOpTerm(kind, opTerm, 0);
+
const CVC4::Kind int_kind = extToIntKind(kind);
Term res = d_exprMgr->mkExpr(int_kind, *opTerm.d_expr);
(void)res.d_expr->getType(true); /* kick off type checking */
return res;
+
CVC4_API_SOLVER_TRY_CATCH_END;
}
{
CVC4_API_SOLVER_TRY_CATCH_BEGIN;
CVC4_API_ARG_CHECK_EXPECTED(!child.isNull(), child) << "non-null term";
-
checkMkOpTerm(kind, opTerm, 1);
+
const CVC4::Kind int_kind = extToIntKind(kind);
Term res = d_exprMgr->mkExpr(int_kind, *opTerm.d_expr, *child.d_expr);
(void)res.d_expr->getType(true); /* kick off type checking */
return res;
+
CVC4_API_SOLVER_TRY_CATCH_END;
}
CVC4_API_SOLVER_TRY_CATCH_BEGIN;
CVC4_API_ARG_CHECK_EXPECTED(!child1.isNull(), child1) << "non-null term";
CVC4_API_ARG_CHECK_EXPECTED(!child2.isNull(), child2) << "non-null term";
-
checkMkOpTerm(kind, opTerm, 2);
+
const CVC4::Kind int_kind = extToIntKind(kind);
Term res = d_exprMgr->mkExpr(
int_kind, *opTerm.d_expr, *child1.d_expr, *child2.d_expr);
CVC4_API_ARG_CHECK_EXPECTED(!child1.isNull(), child1) << "non-null term";
CVC4_API_ARG_CHECK_EXPECTED(!child2.isNull(), child2) << "non-null term";
CVC4_API_ARG_CHECK_EXPECTED(!child3.isNull(), child3) << "non-null term";
-
checkMkOpTerm(kind, opTerm, 3);
+
const CVC4::Kind int_kind = extToIntKind(kind);
Term res = d_exprMgr->mkExpr(
int_kind, *opTerm.d_expr, *child1.d_expr, *child2.d_expr, *child3.d_expr);
(void)res.d_expr->getType(true); /* kick off type checking */
return res;
+
CVC4_API_SOLVER_TRY_CATCH_END;
}
!children[i].isNull(), "parameter term", children[i], i)
<< "non-null term";
}
-
checkMkOpTerm(kind, opTerm, children.size());
+
const CVC4::Kind int_kind = extToIntKind(kind);
std::vector<Expr> echildren = termVectorToExprs(children);
Term res = d_exprMgr->mkExpr(int_kind, *opTerm.d_expr, echildren);
(void)res.d_expr->getType(true); /* kick off type checking */
return res;
+
CVC4_API_SOLVER_TRY_CATCH_END;
}
CVC4_API_SOLVER_TRY_CATCH_BEGIN;
CVC4_API_CHECK(sorts.size() == terms.size())
<< "Expected the same number of sorts and elements";
-
std::vector<CVC4::Expr> args;
for (size_t i = 0, size = sorts.size(); i < size; i++)
{
args);
(void)res.d_expr->getType(true); /* kick off type checking */
return res;
- CVC4_API_SOLVER_TRY_CATCH_END;
-}
-std::vector<Expr> Solver::termVectorToExprs(
- const std::vector<Term>& terms) const
-{
- std::vector<Expr> res;
- for (const Term& t : terms)
- {
- res.push_back(*t.d_expr);
- }
- return res;
+ CVC4_API_SOLVER_TRY_CATCH_END;
}
/* Create operator terms */
CVC4_API_KIND_CHECK_EXPECTED(kind == CHAIN_OP, kind) << "CHAIN_OP";
return *mkValHelper<CVC4::Chain>(CVC4::Chain(extToIntKind(k))).d_expr.get();
+
CVC4_API_SOLVER_TRY_CATCH_END;
}
.d_expr.get();
}
return res;
+
CVC4_API_SOLVER_TRY_CATCH_END;
}
}
Assert(!res.isNull());
return res;
+
CVC4_API_SOLVER_TRY_CATCH_END;
}
}
Assert(!res.isNull());
return res;
+
CVC4_API_SOLVER_TRY_CATCH_END;
}
{
d_smtEngine->pop();
}
+
CVC4_API_SOLVER_TRY_CATCH_END;
}
{
d_smtEngine->push();
}
+
CVC4_API_SOLVER_TRY_CATCH_END;
}