int main() { VC vc = vc_createValidityChecker(NULL); /* Prove that for integers x and y: * x > 0 AND y > 0 => 2x + y >= 3 */ Type integer = vc_intType(vc); Expr x = vc_varExpr(vc, "x", integer); Expr y = vc_varExpr(vc, "y", integer); Expr zero = vc_ratExpr(vc, 0, 1); Expr x_positive = vc_gtExpr(vc, x, zero); Expr y_positive = vc_gtExpr(vc, y, zero); Expr two = vc_ratExpr(vc, 2, 1); Expr twox = vc_multExpr(vc, two, x); Expr twox_plus_y = vc_plusExpr(vc, twox, y); Expr three = vc_ratExpr(vc, 3, 1); Expr twox_plus_y_geq_3 = vc_geExpr(vc, twox_plus_y, three); Expr formula = vc_impliesExpr(vc, vc_andExpr(vc, x_positive, y_positive), twox_plus_y_geq_3); char* formulaString = vc_printExprString(vc, formula); printf("Checking validity of formula %s with CVC4.\n", formulaString); printf("CVC4 should return 1 (meaning VALID).\n"); printf("Result from CVC4 is: %d\n", vc_query(vc, formula)); free(formulaString); return 0; }
void test4(int regressLevel) { VC vc = vc_createValidityChecker(NULL); // Check x >= 10 /\ x >= 40 /\ y <= 0 --> // x >= 1 /\ y < 10 Type r = vc_realType(vc); Expr x = vc_varExpr(vc, "x", r); Expr y = vc_varExpr(vc, "y", r); Expr ten = vc_ratExpr(vc, 10, 1); Expr ge = vc_geExpr(vc, x, ten); Expr forty = vc_ratExpr(vc, 40, 1); Expr ge2 = vc_geExpr(vc, x, forty); Expr zero = vc_ratExpr(vc, 0, 1); Expr ge3 = vc_leExpr(vc, y, zero); Expr children[3]; Expr hyp, one, conc, query; int i; children[0] = ge; children[1] = ge2; children[2] = ge3; hyp = vc_andExprN(vc, children, 3); vc_deleteType(r); vc_deleteExpr(ge); vc_deleteExpr(forty); vc_deleteExpr(ge2); vc_deleteExpr(zero); vc_deleteExpr(ge3); one = vc_ratExpr(vc, 1, 1); ge = vc_geExpr(vc, x, one); ge2 = vc_ltExpr(vc, y, ten); conc = vc_andExpr(vc, ge, ge2); query = vc_impliesExpr(vc, hyp, conc); vc_deleteExpr(x); vc_deleteExpr(y); vc_deleteExpr(ten); vc_deleteExpr(hyp); vc_deleteExpr(one); vc_deleteExpr(ge); vc_deleteExpr(ge2); vc_deleteExpr(conc); for (i = 0; i < 100*regressLevel; i++) vc_query(vc, query); vc_deleteExpr(query); vc_destroyValidityChecker(vc); }
Expr parse() { char token[15]; Expr expr = NULL, leftExpr, rightExpr, eqExpr; readToken(token); switch(token[0]){ case '+': leftExpr = parse(); rightExpr = parse(); expr = vc_plusExpr(vc, leftExpr, rightExpr); break; case '-': if(token[1] == '\0'){ leftExpr = parse(); rightExpr = parse(); expr = vc_minusExpr(vc, leftExpr, rightExpr); } else{ // assert token[1] is a digit expr = parseNumber(token); } break; case '*': leftExpr = parse(); rightExpr = parse(); expr = vc_multExpr(vc, leftExpr, rightExpr); break; case '<': if (token[1] == '='){ leftExpr = parse(); rightExpr = parse(); expr = vc_leExpr(vc, leftExpr, rightExpr); } else{ leftExpr = parse(); rightExpr = parse(); expr = vc_ltExpr(vc, leftExpr, rightExpr); } break; case '>': if (token[1] == '='){ leftExpr = parse(); rightExpr = parse(); expr = vc_geExpr(vc, leftExpr, rightExpr); } else{ leftExpr = parse(); rightExpr = parse(); expr = vc_gtExpr(vc, leftExpr, rightExpr); } break; case '=': leftExpr = parse(); rightExpr = parse(); expr = vc_eqExpr(vc, leftExpr, rightExpr); break; case '!': // assert token[1] == '='; leftExpr = parse(); rightExpr = parse(); eqExpr = vc_eqExpr(vc, leftExpr, rightExpr); linkedlist_add(&exprPool, eqExpr); expr = vc_notExpr(vc, eqExpr); break; case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': expr = parseNumber(token); break; case 'x': expr = hashmap_get(&vars, token); if (expr == NULL){ expr = vc_varExpr(vc, token, intType); char* token_copy = (char*) malloc(sizeof(char)*(strlen(token)+1)); strcpy(token_copy, token); hashmap_put(&vars, token_copy, expr); linkedlist_add(&exprPool, expr); } return expr; case 'r': expr = hashmap_get(&vars, token); if (expr == NULL){ expr = vc_varExpr(vc, token, realType); char* token_copy = (char*) malloc(sizeof(char)*(strlen(token)+1)); strcpy(token_copy, token); hashmap_put(&vars, token_copy, expr); linkedlist_add(&exprPool, expr); } return expr; default: printf( "%s", token); throwRuntimeException( "unexpected type of token" ); } linkedlist_add(&exprPool, expr); return expr; }
value caml_vc_geExpr(value vc, value e1, value e2) { CAMLparam3(vc,e1,e2); CAMLreturn(alloc_Expr(vc_geExpr(VC_val(vc),Expr_val(e1),Expr_val(e2)))); }