void Z3Sort::AddFuncDecl(Z3_func_decl Decl) const { Z3_inc_ref(*Ctx, Z3_func_decl_to_ast(*Ctx, Decl)); string Name(Z3_get_symbol_string(*Ctx, Z3_get_decl_name(*Ctx, Decl))); auto it = FuncDecls.find(Name); if (it != FuncDecls.end()) { Z3_dec_ref(*Ctx, Z3_func_decl_to_ast(*Ctx, it->second)); } FuncDecls[Name] = Decl; }
void display_function_interpretations(Z3_context c, FILE * out, Z3_model m) { unsigned num_functions, i; fprintf(out, "function interpretations:\n"); num_functions = Z3_get_model_num_funcs(c, m); for (i = 0; i < num_functions; i++) { Z3_func_decl fdecl; Z3_symbol name; Z3_ast func_else; unsigned num_entries, j; fdecl = Z3_get_model_func_decl(c, m, i); name = Z3_get_decl_name(c, fdecl); display_symbol(c, out, name); fprintf(out, " = {"); num_entries = Z3_get_model_func_num_entries(c, m, i); for (j = 0; j < num_entries; j++) { unsigned num_args, k; if (j > 0) { fprintf(out, ", "); } num_args = Z3_get_model_func_entry_num_args(c, m, i, j); fprintf(out, "("); for (k = 0; k < num_args; k++) { if (k > 0) { fprintf(out, ", "); } display_solver_term((SOLVER_CONTEXT)c, out,(SOLVER_TERM)Z3_get_model_func_entry_arg(c, m, i, j, k)); } fprintf(out, "|->"); display_solver_term((SOLVER_CONTEXT)c, out,(SOLVER_TERM)Z3_get_model_func_entry_value(c, m, i, j)); fprintf(out, ")"); } if (num_entries > 0) { fprintf(out, ", "); } fprintf(out, "(else|->"); func_else = Z3_get_model_func_else(c, m, i); display_solver_term((SOLVER_CONTEXT)c, out, (SOLVER_TERM)func_else); fprintf(out, ")}\n"); } }
void display_model(Z3_context c, FILE * out, Z3_model m){ unsigned num_constants; unsigned i; num_constants = Z3_get_model_num_constants(c, m); for (i = 0; i < num_constants; i++) { Z3_symbol name; Z3_func_decl cnst = Z3_get_model_constant(c, m, i); Z3_ast a, v; Z3_bool ok; name = Z3_get_decl_name(c, cnst); display_symbol(c, out, name); fprintf(out, " = "); a = Z3_mk_app(c, cnst, 0, 0); v = a; ok = Z3_eval(c, m, a, &v); display_solver_term((SOLVER_CONTEXT)c, out, (SOLVER_TERM)v); fprintf(out, "\n"); } // display_function_interpretations(c, out, m); }