Z3_ast parse_smtlib2_stream(bool exec, Z3_context c, std::istream& is,
                             unsigned num_sorts,
                             Z3_symbol const sort_names[],
                             Z3_sort const sorts[],
                             unsigned num_decls,
                             Z3_symbol const decl_names[],
                             Z3_func_decl const decls[]) {
     Z3_TRY;
     cmd_context ctx(&mk_c(c)->fparams(), false, &(mk_c(c)->m()));
     ctx.set_ignore_check(true);
     if (exec) {
         ctx.set_solver(alloc(z3_context_solver, *mk_c(c)));
     }
     for (unsigned i = 0; i < num_decls; ++i) {
        ctx.insert(to_symbol(decl_names[i]), to_func_decl(decls[i]));
     }
     for (unsigned i = 0; i < num_sorts; ++i) {
         psort* ps = ctx.pm().mk_psort_cnst(to_sort(sorts[i]));
         ctx.insert(ctx.pm().mk_psort_user_decl(0, to_symbol(sort_names[i]), ps));
     }
     if (!parse_smt2_commands(ctx, is)) {
         SET_ERROR_CODE(Z3_PARSER_ERROR);
         return of_ast(mk_c(c)->m().mk_true());
     }
     ptr_vector<expr>::const_iterator it  = ctx.begin_assertions();
     ptr_vector<expr>::const_iterator end = ctx.end_assertions();
     unsigned size = static_cast<unsigned>(end - it);
     return of_ast(mk_c(c)->mk_and(size, it));
     Z3_CATCH_RETURN(0);
 }
 Z3_lbool Z3_API Z3_check_assumptions(Z3_context c, 
                                      unsigned num_assumptions, Z3_ast const assumptions[], 
                                      Z3_model * m, Z3_ast* proof, 
                                      unsigned* core_size, Z3_ast core[]) {
     Z3_TRY;
     LOG_Z3_check_assumptions(c, num_assumptions, assumptions, m, proof, core_size, core);
     RESET_ERROR_CODE();
     CHECK_SEARCHING(c);
     expr * const* _assumptions = to_exprs(assumptions);
     flet<bool> _model(mk_c(c)->fparams().m_model, true);
     cancel_eh<smt::kernel> eh(mk_c(c)->get_smt_kernel());
     api::context::set_interruptable(*(mk_c(c)), eh);
     lbool result;
     result = mk_c(c)->get_smt_kernel().check(num_assumptions, _assumptions);
     if (result != l_false && m) {
         model_ref _m;
         mk_c(c)->get_smt_kernel().get_model(_m);
         if (_m) {
             Z3_model_ref * m_ref = alloc(Z3_model_ref); 
             m_ref->m_model = _m;
             // Must bump reference counter for backward compatibility reasons.
             // Don't need to invoke save_object, since the counter was bumped
             m_ref->inc_ref(); 
             *m = of_model(m_ref);
         }
         else {
             *m = 0;
         }
     }
     if (result == l_false && core_size) {
         *core_size = mk_c(c)->get_smt_kernel().get_unsat_core_size();
         if (*core_size > num_assumptions) {
             SET_ERROR_CODE(Z3_INVALID_ARG);
         }
         for (unsigned i = 0; i < *core_size; ++i) {
             core[i] = of_ast(mk_c(c)->get_smt_kernel().get_unsat_core_expr(i));
         }
     }
     else if (core_size) {
         *core_size = 0;
     }
     if (result == l_false && proof) {
         *proof = of_ast(mk_c(c)->get_smt_kernel().get_proof());
     }
     else if (proof) {
         *proof = 0; // breaks abstraction.
     }
     RETURN_Z3_check_assumptions static_cast<Z3_lbool>(result);         
     Z3_CATCH_RETURN(Z3_L_UNDEF);
 }
Ejemplo n.º 3
0
 Z3_ast Z3_API Z3_get_model_func_entry_value(Z3_context c,
         Z3_model m,
         unsigned i,
         unsigned j) {
     Z3_TRY;
     LOG_Z3_get_model_func_entry_value(c, m, i, j);
     RESET_ERROR_CODE();
     CHECK_NON_NULL(m, 0);
     if (j >= get_model_func_num_entries_core(c, m, i)) {
         SET_ERROR_CODE(Z3_IOB);
         RETURN_Z3(0);
     }
     Z3_func_decl d = get_model_func_decl_core(c, m, i);
     if (d) {
         model * _m = to_model_ref(m);
         func_interp * g = _m->get_func_interp(to_func_decl(d));
         if (g && j < g->num_entries()) {
             func_entry const* e = g->get_entry(j);
             expr* a = e->get_result();
             mk_c(c)->save_ast_trail(a);
             RETURN_Z3(of_ast(a));
         }
         SET_ERROR_CODE(Z3_IOB);
         RETURN_Z3(0);
     }
     RETURN_Z3(0);
     Z3_CATCH_RETURN(0);
 }
Ejemplo n.º 4
0
 Z3_ast Z3_API Z3_algebraic_root(Z3_context c, Z3_ast a, unsigned k) {
     Z3_TRY;
     LOG_Z3_algebraic_root(c, a, k);
     RESET_ERROR_CODE();
     CHECK_IS_ALGEBRAIC_X(a, 0);
     if (k % 2 == 0) {
         if ((is_rational(c, a) && get_rational(c, a).is_neg()) ||
             (!is_rational(c, a) && am(c).is_neg(get_irrational(c, a)))) {
             SET_ERROR_CODE(Z3_INVALID_ARG);
             RETURN_Z3(0);
         }
     }
     algebraic_numbers::manager & _am = am(c);
     scoped_anum _r(_am);
     if (is_rational(c, a)) {
         scoped_anum av(_am);                                     
         _am.set(av, get_rational(c, a).to_mpq());   
         _am.root(av, k, _r);
     }
     else {
         algebraic_numbers::anum const & av = get_irrational(c, a);
         _am.root(av, k, _r);
     }
     expr * r = au(c).mk_numeral(_r, false);
     mk_c(c)->save_ast_trail(r);
     RETURN_Z3(of_ast(r));
     Z3_CATCH_RETURN(0);
 }
Ejemplo n.º 5
0
 Z3_ast Z3_API Z3_mk_bound(Z3_context c, unsigned index, Z3_sort ty) {
     Z3_TRY;
     LOG_Z3_mk_bound(c, index, ty);
     RESET_ERROR_CODE();
     ast* a = mk_c(c)->m().mk_var(index, to_sort(ty));
     mk_c(c)->save_ast_trail(a);
     RETURN_Z3(of_ast(a));
     Z3_CATCH_RETURN(0);
 }
 Z3_ast Z3_API Z3_get_literal(Z3_context c,Z3_literals lbls, unsigned idx) {
     Z3_TRY;
     LOG_Z3_get_literal(c, lbls, idx);
     RESET_ERROR_CODE();
     expr* e = (*reinterpret_cast<labels*>(lbls))[idx].get_literal();
     mk_c(c)->save_ast_trail(e);
     RETURN_Z3(of_ast(e));
     Z3_CATCH_RETURN(0);
 }
Ejemplo n.º 7
0
 Z3_ast Z3_API Z3_mk_re_loop(Z3_context c, Z3_ast r, unsigned lo, unsigned hi) {
     Z3_TRY;
     LOG_Z3_mk_re_loop(c, r, lo, hi);
     RESET_ERROR_CODE();
     app* a = hi == 0 ? mk_c(c)->sutil().re.mk_loop(to_expr(r), lo) : mk_c(c)->sutil().re.mk_loop(to_expr(r), lo, hi);
     mk_c(c)->save_ast_trail(a);
     RETURN_Z3(of_ast(a));
     Z3_CATCH_RETURN(0);
 }
Ejemplo n.º 8
0
 Z3_ast parse_smtlib2_stream(bool exec, Z3_context c, std::istream& is,
                             unsigned num_sorts,
                             Z3_symbol const sort_names[],
                             Z3_sort const sorts[],
                             unsigned num_decls,
                             Z3_symbol const decl_names[],
                             Z3_func_decl const decls[]) {
     Z3_TRY;
     scoped_ptr<cmd_context> ctx = alloc(cmd_context, false, &(mk_c(c)->m()));
     ctx->set_ignore_check(true);
     for (unsigned i = 0; i < num_decls; ++i) {
         ctx->insert(to_symbol(decl_names[i]), to_func_decl(decls[i]));
     }
     for (unsigned i = 0; i < num_sorts; ++i) {
         sort* srt = to_sort(sorts[i]);
         symbol name(to_symbol(sort_names[i]));
         if (!ctx->find_psort_decl(name)) {
             psort* ps = ctx->pm().mk_psort_cnst(srt);
             ctx->insert(ctx->pm().mk_psort_user_decl(0, name, ps));
         }
     }
     std::stringstream errstrm;
     ctx->set_regular_stream(errstrm);
     try {
         if (!parse_smt2_commands(*ctx.get(), is)) {
             ctx = nullptr;
             mk_c(c)->m_parser_error_buffer = errstrm.str();
             SET_ERROR_CODE(Z3_PARSER_ERROR);
             return of_ast(mk_c(c)->m().mk_true());
         }
     }
     catch (z3_exception& e) {
         errstrm << e.msg();
         mk_c(c)->m_parser_error_buffer = errstrm.str();            
         ctx = nullptr;
         SET_ERROR_CODE(Z3_PARSER_ERROR);
         return of_ast(mk_c(c)->m().mk_true());
     }
     ptr_vector<expr>::const_iterator it  = ctx->begin_assertions();
     ptr_vector<expr>::const_iterator end = ctx->end_assertions();
     unsigned size = static_cast<unsigned>(end - it);
     return of_ast(mk_c(c)->mk_and(size, it));
     Z3_CATCH_RETURN(0);
 }
Ejemplo n.º 9
0
 Z3_ast Z3_API Z3_mk_string(Z3_context c, Z3_string str) {
     Z3_TRY;
     LOG_Z3_mk_string(c, str);
     RESET_ERROR_CODE();
     zstring s(str, zstring::ascii);
     app* a = mk_c(c)->sutil().str.mk_string(s);
     mk_c(c)->save_ast_trail(a);
     RETURN_Z3(of_ast(a));
     Z3_CATCH_RETURN(0);
 }
Ejemplo n.º 10
0
 Z3_ast Z3_API Z3_mk_int(Z3_context c, int value, Z3_sort ty) {
     Z3_TRY;
     LOG_Z3_mk_int(c, value, ty);
     RESET_ERROR_CODE();
     if (!check_numeral_sort(c, ty)) {
         RETURN_Z3(nullptr);
     }
     ast * a = mk_c(c)->mk_numeral_core(rational(value), to_sort(ty));
     RETURN_Z3(of_ast(a));
     Z3_CATCH_RETURN(nullptr);
 }
 Z3_ast Z3_API Z3_get_context_assignment(Z3_context c) {
     Z3_TRY;
     LOG_Z3_get_context_assignment(c);
     RESET_ERROR_CODE();
     ast_manager& m = mk_c(c)->m();
     expr_ref result(m);
     expr_ref_vector assignment(m);
     mk_c(c)->get_smt_kernel().get_assignments(assignment);
     result = mk_c(c)->mk_and(assignment.size(), assignment.c_ptr());
     RETURN_Z3(of_ast(result.get()));
     Z3_CATCH_RETURN(0);
 }
Ejemplo n.º 12
0
 Z3_ast Z3_API Z3_mk_unsigned_int64(Z3_context c, uint64_t value, Z3_sort ty) {
     Z3_TRY;
     LOG_Z3_mk_unsigned_int64(c, value, ty);
     RESET_ERROR_CODE();
     if (!check_numeral_sort(c, ty)) {
         RETURN_Z3(nullptr);
     }
     rational n(value, rational::ui64());
     ast * a = mk_c(c)->mk_numeral_core(n, to_sort(ty));
     RETURN_Z3(of_ast(a));
     Z3_CATCH_RETURN(nullptr);
 }
Ejemplo n.º 13
0
 Z3_ast Z3_API Z3_mk_bv_numeral(Z3_context c, unsigned sz, Z3_bool const* bits) {
     Z3_TRY;
     LOG_Z3_mk_bv_numeral(c, sz, bits);
     RESET_ERROR_CODE();
     rational r(0);
     for (unsigned i = 0; i < sz; ++i) {
         if (bits[i]) r += rational::power_of_two(i);
     }
     ast * a = mk_c(c)->mk_numeral_core(r, mk_c(c)->bvutil().mk_sort(sz));
     RETURN_Z3(of_ast(a));
     Z3_CATCH_RETURN(nullptr);
 }
Ejemplo n.º 14
0
    Z3_ast mk_quantifier_ex_core(
        Z3_context c, 
        Z3_bool is_forall, 
        unsigned weight, 
        Z3_symbol quantifier_id,
        Z3_symbol skolem_id,
        unsigned num_patterns, Z3_pattern const patterns[], 
        unsigned num_no_patterns, Z3_ast const no_patterns[], 
        unsigned num_decls, Z3_sort const sorts[], 
        Z3_symbol const decl_names[], 
        Z3_ast body) {
        Z3_TRY;
        RESET_ERROR_CODE();
        if (!mk_c(c)->m().is_bool(to_expr(body))) {
            SET_ERROR_CODE(Z3_SORT_ERROR);
        }
        if (num_patterns > 0 && num_no_patterns > 0) {
            SET_ERROR_CODE(Z3_INVALID_USAGE);
        }
        expr * const* ps = reinterpret_cast<expr * const*>(patterns);
        expr * const* no_ps = reinterpret_cast<expr * const*>(no_patterns);
        pattern_validator v(mk_c(c)->m());
        for (unsigned i = 0; i < num_patterns; i++) {
            if (!v(num_decls, ps[i], 0, 0)) {
                SET_ERROR_CODE(Z3_INVALID_PATTERN);
                return 0;
            }
        }

        sort* const* ts = reinterpret_cast<sort * const*>(sorts);
        svector<symbol> names;
        for (unsigned i = 0; i < num_decls; ++i) {
            names.push_back(to_symbol(decl_names[i]));
        }
        expr_ref result(mk_c(c)->m());
        if (num_decls > 0) {
            result = mk_c(c)->m().mk_quantifier(
                (0 != is_forall), 
                names.size(), ts, names.c_ptr(), to_expr(body),            
                weight, 
                to_symbol(quantifier_id),
                to_symbol(skolem_id),
                num_patterns, ps,
                num_no_patterns, no_ps
                );
        }
        else {
            result = to_expr(body);
        }
        mk_c(c)->save_ast_trail(result.get());
        return of_ast(result.get());
        Z3_CATCH_RETURN(0);
    }
Ejemplo n.º 15
0
 Z3_ast Z3_API Z3_mk_real(Z3_context c, int num, int den) {
     Z3_TRY;
     LOG_Z3_mk_real(c, num, den);
     RESET_ERROR_CODE();
     if (den == 0) {
         SET_ERROR_CODE(Z3_INVALID_ARG, nullptr);
         RETURN_Z3(nullptr);
     }
     sort* s = mk_c(c)->m().mk_sort(mk_c(c)->get_arith_fid(), REAL_SORT);
     ast* a = mk_c(c)->mk_numeral_core(rational(num, den), s);
     RETURN_Z3(of_ast(a));
     Z3_CATCH_RETURN(nullptr);
 }
Ejemplo n.º 16
0
 Z3_ast Z3_API Z3_goal_formula(Z3_context c, Z3_goal g, unsigned idx) {
     Z3_TRY;
     LOG_Z3_goal_formula(c, g, idx);
     RESET_ERROR_CODE();
     if (idx >= to_goal_ref(g)->size()) {
         SET_ERROR_CODE(Z3_INVALID_ARG);
         RETURN_Z3(0);
     }
     expr * result = to_goal_ref(g)->form(idx);
     mk_c(c)->save_ast_trail(result);
     RETURN_Z3(of_ast(result));
     Z3_CATCH_RETURN(0);
 }
Ejemplo n.º 17
0
 Z3_ast Z3_API Z3_mk_atmost(Z3_context c, unsigned num_args, 
                            Z3_ast const args[], unsigned k) {
     Z3_TRY;
     LOG_Z3_mk_atmost(c, num_args, args, k);
     RESET_ERROR_CODE();
     parameter param(k);
     pb_util util(mk_c(c)->m());
     ast* a = util.mk_at_most_k(num_args, to_exprs(args), k);
     mk_c(c)->save_ast_trail(a);
     check_sorts(c, a);
     RETURN_Z3(of_ast(a));
     Z3_CATCH_RETURN(0);
 }
Ejemplo n.º 18
0
 Z3_ast Z3_API Z3_solver_get_proof(Z3_context c, Z3_solver s) {
     Z3_TRY;
     LOG_Z3_solver_get_proof(c, s);
     RESET_ERROR_CODE();
     init_solver(c, s);
     proof * p = to_solver_ref(s)->get_proof();
     if (!p) {
         SET_ERROR_CODE(Z3_INVALID_USAGE, "there is no current proof");
         RETURN_Z3(nullptr);
     }
     mk_c(c)->save_ast_trail(p);
     RETURN_Z3(of_ast(p));
     Z3_CATCH_RETURN(nullptr);
 }
Ejemplo n.º 19
0
 Z3_bool Z3_API Z3_model_eval(Z3_context c, Z3_model m, Z3_ast t, Z3_bool model_completion, Z3_ast * v) {
     Z3_TRY;
     LOG_Z3_model_eval(c, m, t, model_completion, v);
     if (v) *v = 0;
     RESET_ERROR_CODE();
     CHECK_NON_NULL(m, Z3_FALSE);
     model * _m = to_model_ref(m);
     expr_ref result(mk_c(c)->m());
     _m->eval(to_expr(t), result, model_completion == Z3_TRUE);
     mk_c(c)->save_ast_trail(result.get());
     *v = of_ast(result.get());
     RETURN_Z3_model_eval Z3_TRUE;
     Z3_CATCH_RETURN(0);
 }
Ejemplo n.º 20
0
    Z3_ast Z3_API Z3_mk_array_default(Z3_context c, Z3_ast array) {
        Z3_TRY;
        LOG_Z3_mk_array_default(c, array);
        RESET_ERROR_CODE(); 
        ast_manager & m = mk_c(c)->m();
        expr * _a        = to_expr(array);

        func_decl * f   = m.mk_func_decl(mk_c(c)->get_array_fid(), OP_ARRAY_DEFAULT, 0, 0, 1, &_a);
        app * r        = m.mk_app(f, 1, &_a);
        mk_c(c)->save_ast_trail(r);
        check_sorts(c, r);
        RETURN_Z3(of_ast(r));        
        Z3_CATCH_RETURN(0);
    }
Ejemplo n.º 21
0
 Z3_ast Z3_API Z3_get_quantifier_body(Z3_context c, Z3_ast a) {
     Z3_TRY;
     LOG_Z3_get_quantifier_body(c, a);
     RESET_ERROR_CODE();
     ast * _a = to_ast(a);
     if (_a->get_kind() == AST_QUANTIFIER) {
         Z3_ast r = of_ast(to_quantifier(_a)->get_expr());
         RETURN_Z3(r);
     }
     else {
         SET_ERROR_CODE(Z3_SORT_ERROR);
         RETURN_Z3(0);
     }
     Z3_CATCH_RETURN(0);
 }
Ejemplo n.º 22
0
 Z3_ast Z3_API Z3_get_quantifier_no_pattern_ast(Z3_context c, Z3_ast a, unsigned i) {
     Z3_TRY;
     LOG_Z3_get_quantifier_no_pattern_ast(c, a, i);
     RESET_ERROR_CODE();
     ast * _a = to_ast(a);
     if (_a->get_kind() == AST_QUANTIFIER) {
         Z3_ast r = of_ast(to_quantifier(_a)->get_no_pattern(i));
         RETURN_Z3(r);
     }
     else {
         SET_ERROR_CODE(Z3_SORT_ERROR);
         RETURN_Z3(0);
     }
     Z3_CATCH_RETURN(0);
 }
Ejemplo n.º 23
0
 Z3_ast Z3_API Z3_mk_fpa_to_ieee_bv(Z3_context c, Z3_ast t) {
     Z3_TRY;
     LOG_Z3_mk_fpa_to_ieee_bv(c, t);
     RESET_ERROR_CODE();
     CHECK_NON_NULL(t, nullptr);
     CHECK_VALID_AST(t, nullptr);
     if (!is_fp(c, t)) {
         SET_ERROR_CODE(Z3_INVALID_ARG);
         RETURN_Z3(nullptr);
     }
     api::context * ctx = mk_c(c);
     Z3_ast r = of_ast(ctx->fpautil().mk_to_ieee_bv(to_expr(t)));
     RETURN_Z3(r);
     Z3_CATCH_RETURN(nullptr);
 }
Ejemplo n.º 24
0
 Z3_ast Z3_API Z3_get_pattern(Z3_context c, Z3_pattern p, unsigned idx) {
     Z3_TRY;
     LOG_Z3_get_pattern(c, p, idx);
     RESET_ERROR_CODE();
     app* _p = to_pattern(p);
     if (mk_c(c)->m().is_pattern(_p)) {
         Z3_ast r = of_ast(_p->get_arg(idx));
         RETURN_Z3(r);
     }
     else {
         SET_ERROR_CODE(Z3_SORT_ERROR);
         RETURN_Z3(0);
     }
     Z3_CATCH_RETURN(0);
 }
Ejemplo n.º 25
0
 Z3_ast mk_app_array_core(Z3_context c, Z3_sort domain, Z3_ast v) {
     RESET_ERROR_CODE();   
     ast_manager & m = mk_c(c)->m();
     expr * _v        = to_expr(v);
     sort * _range = m.get_sort(_v);
     sort * _domain = to_sort(domain);
     parameter params[2]  = { parameter(_domain), parameter(_range) };
     sort * a_ty    = mk_c(c)->m().mk_sort(mk_c(c)->get_array_fid(), ARRAY_SORT, 2, params);
     parameter param(a_ty);
     func_decl * cd   = m.mk_func_decl(mk_c(c)->get_array_fid(), OP_CONST_ARRAY, 1, &param, 1, &_range);
     app * r        = m.mk_app(cd, 1, &_v);
     mk_c(c)->save_ast_trail(r);
     check_sorts(c, r);
     return of_ast(r);
 }
Ejemplo n.º 26
0
 Z3_ast Z3_API Z3_ast_map_find(Z3_context c, Z3_ast_map m, Z3_ast k) {
     Z3_TRY;
     LOG_Z3_ast_map_find(c, m, k);
     RESET_ERROR_CODE();
     obj_map<ast, ast*>::obj_map_entry * entry = to_ast_map_ref(m).find_core(to_ast(k));
     if (entry == 0) {
         SET_ERROR_CODE(Z3_INVALID_ARG);
         RETURN_Z3(0);
     }
     else {
         ast * r = entry->get_data().m_value;
         RETURN_Z3(of_ast(r));
     }
     Z3_CATCH_RETURN(0);
 }
Ejemplo n.º 27
0
 Z3_ast Z3_API Z3_mk_div(Z3_context c, Z3_ast n1, Z3_ast n2) {
     Z3_TRY;
     LOG_Z3_mk_div(c, n1, n2);
     RESET_ERROR_CODE();
     decl_kind k = OP_IDIV;
     sort* ty = mk_c(c)->m().get_sort(to_expr(n1));
     sort* real_ty = mk_c(c)->m().mk_sort(mk_c(c)->get_arith_fid(), REAL_SORT);
     if (ty == real_ty) {
         k = OP_DIV;
     }
     expr * args[2] = { to_expr(n1), to_expr(n2) };
     ast* a = mk_c(c)->m().mk_app(mk_c(c)->get_arith_fid(), k, 0, nullptr, 2, args);
     mk_c(c)->save_ast_trail(a);
     check_sorts(c, a);
     RETURN_Z3(of_ast(a));
     Z3_CATCH_RETURN(nullptr);
 }
Ejemplo n.º 28
0
 Z3_ast Z3_API Z3_mk_pbeq(Z3_context c, unsigned num_args, 
                          Z3_ast const args[], int _coeffs[],
                          int k) {
     Z3_TRY;
     LOG_Z3_mk_pble(c, num_args, args, _coeffs, k);
     RESET_ERROR_CODE();
     pb_util util(mk_c(c)->m());
     vector<rational> coeffs;
     for (unsigned i = 0; i < num_args; ++i) {
         coeffs.push_back(rational(_coeffs[i]));
     }
     ast* a = util.mk_eq(num_args, coeffs.c_ptr(), to_exprs(args), rational(k));
     mk_c(c)->save_ast_trail(a);
     check_sorts(c, a);
     RETURN_Z3(of_ast(a));
     Z3_CATCH_RETURN(0);
 }
Ejemplo n.º 29
0
 Z3_ast Z3_API Z3_mk_const_array(Z3_context c, Z3_sort domain, Z3_ast v) {
     Z3_TRY;
     LOG_Z3_mk_const_array(c, domain, v);
     RESET_ERROR_CODE(); 
     ast_manager & m = mk_c(c)->m();
     expr * _v        = to_expr(v);
     sort * _range = m.get_sort(_v);
     sort * _domain = to_sort(domain);
     parameter params[2]  = { parameter(_domain), parameter(_range) };
     sort * a_ty    = mk_c(c)->m().mk_sort(mk_c(c)->get_array_fid(), ARRAY_SORT, 2, params);
     parameter param(a_ty);
     func_decl* cd   = m.mk_func_decl(mk_c(c)->get_array_fid(), OP_CONST_ARRAY, 1, &param, 1, &_range);
     app * r        = m.mk_app(cd, 1, &_v);
     mk_c(c)->save_ast_trail(r);
     check_sorts(c, r);
     RETURN_Z3(of_ast(r));        
     Z3_CATCH_RETURN(0);
 }
Ejemplo n.º 30
0
 bool Z3_API Z3_model_eval(Z3_context c, Z3_model m, Z3_ast t, bool model_completion, Z3_ast * v) {
     Z3_TRY;
     LOG_Z3_model_eval(c, m, t, model_completion, v);
     if (v) *v = nullptr;
     RESET_ERROR_CODE();
     CHECK_NON_NULL(m, false);
     CHECK_IS_EXPR(t, false);
     model * _m = to_model_ref(m);
     params_ref p;
     ast_manager& mgr = mk_c(c)->m();
     _m->set_solver(alloc(api::seq_expr_solver, mgr, p));
     expr_ref result(mgr);
     model::scoped_model_completion _scm(*_m, model_completion);
     result = (*_m)(to_expr(t));
     mk_c(c)->save_ast_trail(result.get());
     *v = of_ast(result.get());
     RETURN_Z3_model_eval true;
     Z3_CATCH_RETURN(0);
 }