int main() { ExprManager em; SmtEngine smt(&em); // Prove that for integers x and y: // x > 0 AND y > 0 => 2x + y >= 3 Type integer = em.integerType(); Expr x = em.mkVar("x", integer); Expr y = em.mkVar("y", integer); Expr zero = em.mkConst(Rational(0)); Expr x_positive = em.mkExpr(kind::GT, x, zero); Expr y_positive = em.mkExpr(kind::GT, y, zero); Expr two = em.mkConst(Rational(2)); Expr twox = em.mkExpr(kind::MULT, two, x); Expr twox_plus_y = em.mkExpr(kind::PLUS, twox, y); Expr three = em.mkConst(Rational(3)); Expr twox_plus_y_geq_3 = em.mkExpr(kind::GEQ, twox_plus_y, three); Expr formula = em.mkExpr(kind::AND, x_positive, y_positive). impExpr(twox_plus_y_geq_3); cout << "Checking validity of formula " << formula << " with CVC4." << endl; cout << "CVC4 should report VALID." << endl; cout << "Result from CVC4 is: " << smt.query(formula) << endl; return 0; }
int main() { ExprManager em; Options opts; SmtEngine smt(&em); smt.setOption("incremental", SExpr("true")); Expr x = em.mkVar("x", em.integerType()); Expr y = em.mkVar("y", em.integerType()); smt.assertFormula(em.mkExpr(kind::GT, em.mkExpr(kind::PLUS, x, y), em.mkConst(Rational(5)))); Expr q = em.mkExpr(kind::GT, x, em.mkConst(Rational(0))); Result r = smt.query(q); if(r != Result::INVALID) { exit(1); } Statistics stats = smt.getStatistics(); for(Statistics::iterator i = stats.begin(); i != stats.end(); ++i) { cout << "stat " << (*i).first << " is " << (*i).second << endl; } smt.assertFormula(em.mkExpr(kind::LT, y, em.mkConst(Rational(5)))); r = smt.query(q); Statistics stats2 = smt.getStatistics(); bool different = false; for(Statistics::iterator i = stats2.begin(); i != stats2.end(); ++i) { cout << "stat1 " << (*i).first << " is " << stats.getStatistic((*i).first) << endl; cout << "stat2 " << (*i).first << " is " << (*i).second << endl; if(smt.getStatistic((*i).first) != (*i).second) { cout << "SMT engine reports different value for statistic " << (*i).first << ": " << smt.getStatistic((*i).first) << endl; exit(1); } different = different || stats.getStatistic((*i).first) != (*i).second; } #ifdef CVC4_STATISTICS_ON if(!different) { cout << "stats are the same! bailing.." << endl; exit(1); } #endif /* CVC4_STATISTICS_ON */ return r == Result::VALID ? 0 : 1; }
int main() { ExprManager em; SmtEngine smt(&em); smt.setOption("produce-models", true); // Produce Models smt.setOption("output-language", "cvc4"); // Set the output-language to CVC's smt.setOption("default-dag-thresh", 0); //Disable dagifying the output smt.setLogic(string("QF_UFLIRA")); // Sorts SortType u = em.mkSort("u"); Type integer = em.integerType(); Type boolean = em.booleanType(); Type uToInt = em.mkFunctionType(u, integer); Type intPred = em.mkFunctionType(integer, boolean); // Variables Expr x = em.mkVar("x", u); Expr y = em.mkVar("y", u); // Functions Expr f = em.mkVar("f", uToInt); Expr p = em.mkVar("p", intPred); // Constants Expr zero = em.mkConst(Rational(0)); Expr one = em.mkConst(Rational(1)); // Terms Expr f_x = em.mkExpr(kind::APPLY_UF, f, x); Expr f_y = em.mkExpr(kind::APPLY_UF, f, y); Expr sum = em.mkExpr(kind::PLUS, f_x, f_y); Expr p_0 = em.mkExpr(kind::APPLY_UF, p, zero); Expr p_f_y = em.mkExpr(kind::APPLY_UF, p, f_y); // Construct the assumptions Expr assumptions = em.mkExpr(kind::AND, em.mkExpr(kind::LEQ, zero, f_x), // 0 <= f(x) em.mkExpr(kind::LEQ, zero, f_y), // 0 <= f(y) em.mkExpr(kind::LEQ, sum, one), // f(x) + f(y) <= 1 p_0.notExpr(), // not p(0) p_f_y); // p(f(y)) smt.assertFormula(assumptions); cout << "Given the following assumptions:" << endl << assumptions << endl << "Prove x /= y is valid. " << "CVC4 says: " << smt.query(em.mkExpr(kind::DISTINCT, x, y)) << "." << endl; cout << "Now we call checksat on a trivial query to show that" << endl << "the assumptions are satisfiable: " << smt.checkSat(em.mkConst(true)) << "."<< endl; cout << "Finally, after a SAT call, we recursively call smt.getValue(...) on" << "all of the assumptions to see what the satisfying model looks like." << endl; prefixPrintGetValue(smt, assumptions); return 0; }