/* * Print the full map: * - the variables are in solver->all_vars * - their values are in solver->all_values */ void print_full_map(FILE *f, ef_solver_t *solver) { uint32_t i, n; n = solver->all_vars.size; assert(n == solver->all_values.size); for (i=0; i<n; i++) { fprintf(f, "%s := ", yices_get_term_name(solver->all_vars.data[i])); yices_pp_term(f, solver->all_values.data[i], 100, 1, 10); } fprintf(f, "(%"PRIu32" variables)\n", n); }
/* * Pretty print t on stdout * - the pretty-printing area has width w, height h, offset 0 */ static void pp_term(term_t t, uint32_t w, uint32_t h) { int32_t code; printf("Area: %"PRIu32" x %"PRIu32"\n", w, h); code = yices_pp_term(stdout, t, w, h, 0); if (code == OUTPUT_ERROR) { perror("show_term"); exit(1); } printf("---\n"); }
/* * Print solution found by the ef solver */ void print_ef_solution(FILE *f, ef_solver_t *solver) { ef_prob_t *prob; uint32_t i, n; prob = solver->prob; n = ef_prob_num_evars(prob); for (i=0; i<n; i++) { fprintf(f, "%s := ", yices_get_term_name(prob->all_evars[i])); yices_pp_term(f, solver->evalue[i], 100, 1, 10); } }
/* * Show witness found for constraint i */ void print_forall_witness(FILE *f, ef_solver_t *solver, uint32_t i) { ef_prob_t *prob; ef_cnstr_t *cnstr; uint32_t j, n; prob = solver->prob; assert(i < ef_prob_num_constraints(prob)); cnstr = prob->cnstr + i; n = ef_constraint_num_uvars(cnstr); for (j=0; j<n; j++) { fprintf(f, "%s := ", yices_get_term_name(cnstr->uvars[j])); yices_pp_term(f, solver->uvalue_aux.data[j], 100, 1, 10); } }
int example2_main(void) { type_t real; term_t t, a; int32_t code; context_t *ctx; model_t *mdl; /* * Global initialization: this must called first. */ yices_init(); /* * Create an uninterpreted term of type real and call it "x" */ real = yices_real_type(); t = yices_new_uninterpreted_term(real); code = yices_set_term_name(t, "x"); /* * If code is negative, something went wrong */ if (code < 0) { printf("Error in yices_set_term\n"); yices_print_error(stdout); fflush(stdout); goto done; } /* * Create the atom (x > 0) */ a = yices_arith_gt0_atom(t); /* * Print the atom: */ printf("Atom: "); yices_pp_term(stdout, a, 120, 2, 6); /* * Check that (x > 0) is satisfiable and get a model * - create a context * - assert atom 'a' in this context * - check that the context is satisfiable */ ctx = yices_new_context(NULL); // NULL means use the default configuration code = yices_assert_formula(ctx, a); if (code < 0) { printf("Assert failed: "); yices_print_error(stdout); fflush(stdout); goto done; } switch (yices_check_context(ctx, NULL)) { // NULL means default heuristics case STATUS_SAT: // build the model and print it printf("Satisfiable\n"); mdl = yices_get_model(ctx, true); code = yices_pp_model(stdout, mdl, 120, 100, 0); if (code < 0) { printf("Print model failed: "); yices_print_error(stdout); fflush(stdout); goto done; } // cleanup: delete the model yices_free_model(mdl); break; case STATUS_UNSAT: printf("Unsatisfiable\n"); break; case STATUS_UNKNOWN: printf("Status is unknown\n"); break; case STATUS_IDLE: case STATUS_SEARCHING: case STATUS_INTERRUPTED: case STATUS_ERROR: // these codes should not be returned printf("Bug: unexpected status returned\n"); break; } /* * Delete the context: this is optional since yices_exit * would do it anyway. */ yices_free_context(ctx); done: /* * Global cleanup: free all memory used by Yices */ yices_exit(); return 0; }