SOLVER_TERM mk_store(SOLVER_CONTEXT ctx, SOLVER_TERM array, SOLVER_TERM index, SOLVER_TERM val){ return (SOLVER_TERM) Z3_mk_store((Z3_context) ctx, (Z3_ast) array, (Z3_ast) index, (Z3_ast) val); }
int main(){ Z3_context context; Z3_solver solver; Z3_sort bvsort1; Z3_sort bvsort4; Z3_sort memsort; Z3_ast x_ast,y_ast,z_ast,u_ast,v_ast,w_ast,test_ast; Z3_model model; Z3_config config = Z3_mk_config(); Z3_set_param_value(config,"model","true"); context = Z3_mk_context_rc(config); Z3_set_error_handler(context,error_handler); solver = Z3_mk_solver(context); Z3_solver_inc_ref(context,solver); bvsort1 = Z3_mk_bv_sort(context,8); bvsort4 = Z3_mk_bv_sort(context,32); memsort = Z3_mk_array_sort(context,bvsort4,bvsort1); y_ast = Z3_mk_const(context,Z3_mk_string_symbol(context,"mem"),memsort); Z3_inc_ref(context,y_ast); u_ast = Z3_mk_unsigned_int64(context,13,bvsort4); Z3_inc_ref(context,u_ast); v_ast = Z3_mk_select(context,y_ast,u_ast); Z3_inc_ref(context,v_ast); z_ast = Z3_mk_unsigned_int64(context,7,bvsort1); Z3_inc_ref(context,z_ast); test_ast = Z3_mk_eq(context,v_ast,z_ast); Z3_inc_ref(context,test_ast); Z3_solver_assert(context,solver,test_ast); w_ast = Z3_mk_const(context,Z3_mk_string_symbol(context,"w"),bvsort1); y_ast = Z3_mk_store(context,y_ast,u_ast,w_ast); Z3_inc_ref(context,y_ast); v_ast = Z3_mk_select(context,y_ast,u_ast); Z3_inc_ref(context,v_ast); z_ast = Z3_mk_unsigned_int64(context,2,bvsort1); Z3_inc_ref(context,z_ast); test_ast = Z3_mk_eq(context,v_ast,z_ast); Z3_inc_ref(context,test_ast); Z3_solver_assert(context,solver,test_ast); Z3_solver_check(context,solver); model = Z3_solver_get_model(context,solver); fprintf(stderr,"%s\n",Z3_model_to_string(context,model)); fprintf(stderr,"%s\n",Z3_simplify_get_help(context)); return 0; }
static void tst_get_implied_equalities2() { enable_trace("after_search"); enable_trace("get_implied_equalities"); enable_trace("implied_equalities"); Z3_config cfg = Z3_mk_config(); Z3_context ctx = Z3_mk_context(cfg); Z3_del_config(cfg); Z3_solver solver = Z3_mk_simple_solver(ctx); Z3_solver_inc_ref(ctx, solver); Z3_sort int_ty = Z3_mk_int_sort(ctx); Z3_ast a = mk_int_var(ctx,"a"); Z3_ast b = mk_int_var(ctx,"b"); Z3_ast one = Z3_mk_numeral(ctx, "1", int_ty); Z3_ast two = Z3_mk_numeral(ctx, "2", int_ty); Z3_ast x = Z3_mk_const_array(ctx, int_ty, one); Z3_ast y = Z3_mk_store(ctx, x, one, a); Z3_ast z = Z3_mk_store(ctx, y, two , b); Z3_ast u = Z3_mk_store(ctx, x, two , b); Z3_ast v = Z3_mk_store(ctx, u, one , a); unsigned const num_terms = 5; unsigned i; Z3_ast terms[5] = { x, y, z, u, v}; unsigned class_ids[5] = { 0, 0, 0, 0, 0}; Z3_get_implied_equalities(ctx, solver, num_terms, terms, class_ids); for (i = 0; i < num_terms; ++i) { printf("Class %s |-> %d\n", Z3_ast_to_string(ctx, terms[i]), class_ids[i]); } SASSERT(class_ids[1] != class_ids[0]); SASSERT(class_ids[2] != class_ids[0]); SASSERT(class_ids[3] != class_ids[0]); SASSERT(class_ids[4] != class_ids[0]); SASSERT(class_ids[4] == class_ids[2]); SASSERT(class_ids[2] != class_ids[1]); SASSERT(class_ids[3] != class_ids[1]); SASSERT(class_ids[4] != class_ids[1]); SASSERT(class_ids[3] != class_ids[2]); /* delete logical context */ Z3_solver_dec_ref(ctx, solver); Z3_del_context(ctx); }
Z3_ast Z3_mk_set_del(Z3_context c, Z3_ast set, Z3_ast elem) { return Z3_mk_store(c, set, elem, Z3_mk_false(c)); }
Z3_ast Z3_mk_set_add(Z3_context c, Z3_ast set, Z3_ast elem) { return Z3_mk_store(c, set, elem, Z3_mk_true(c)); }
int test(){ int i; /* Create a Z3 context to contain formulas */ Z3_config cfg = Z3_mk_config(); Z3_context ctx = iz3_mk_context(cfg); int num = 2; Z3_ast *constraints = (Z3_ast *)malloc(num * sizeof(Z3_ast)); #if 1 Z3_sort arr = Z3_mk_array_sort(ctx,Z3_mk_int_sort(ctx),Z3_mk_bool_sort(ctx)); Z3_symbol as = Z3_mk_string_symbol(ctx, "a"); Z3_symbol bs = Z3_mk_string_symbol(ctx, "b"); Z3_symbol xs = Z3_mk_string_symbol(ctx, "x"); Z3_ast a = Z3_mk_const(ctx,as,arr); Z3_ast b = Z3_mk_const(ctx,bs,arr); Z3_ast x = Z3_mk_const(ctx,xs,Z3_mk_int_sort(ctx)); Z3_ast c1 = Z3_mk_eq(ctx,a,Z3_mk_store(ctx,b,x,Z3_mk_true(ctx))); Z3_ast c2 = Z3_mk_not(ctx,Z3_mk_select(ctx,a,x)); #else Z3_symbol xs = Z3_mk_string_symbol(ctx, "x"); Z3_ast x = Z3_mk_const(ctx,xs,Z3_mk_bool_sort(ctx)); Z3_ast c1 = Z3_mk_eq(ctx,x,Z3_mk_true(ctx)); Z3_ast c2 = Z3_mk_eq(ctx,x,Z3_mk_false(ctx)); #endif constraints[0] = c1; constraints[1] = c2; /* print out the result for grins. */ // Z3_string smtout = Z3_benchmark_to_smtlib_string (ctx, "foo", "QFLIA", "sat", "", num, constraints, Z3_mk_true(ctx)); // Z3_string smtout = Z3_ast_to_string(ctx,constraints[0]); // Z3_string smtout = Z3_context_to_string(ctx); // puts(smtout); iz3_print(ctx,num,constraints,"iZ3temp.smt"); /* Make room for interpolants. */ Z3_ast *interpolants = (Z3_ast *)malloc((num-1) * sizeof(Z3_ast)); /* Make room for the model. */ Z3_model model = 0; /* Call the prover */ Z3_lbool result = iz3_interpolate(ctx, num, constraints, interpolants, &model); switch (result) { /* If UNSAT, print the interpolants */ case Z3_L_FALSE: printf("unsat, interpolants:\n"); for(i = 0; i < num-1; i++) printf("%s\n", Z3_ast_to_string(ctx, interpolants[i])); break; case Z3_L_UNDEF: printf("fail\n"); break; case Z3_L_TRUE: printf("sat\n"); printf("model:\n%s\n", Z3_model_to_string(ctx, model)); break; } /* Delete the model if there is one */ if (model) Z3_del_model(ctx, model); /* Delete logical context (note, we call iz3_del_context, not Z3_del_context */ iz3_del_context(ctx); return 1; }