Exemple #1
0
 Z3_pattern Z3_API Z3_mk_pattern(Z3_context c, unsigned num_patterns, Z3_ast const terms[]) {
     Z3_TRY;
     LOG_Z3_mk_pattern(c, num_patterns, terms);
     RESET_ERROR_CODE();
     for (unsigned i = 0; i < num_patterns; ++i) {
         if (!is_app(to_expr(terms[i]))) {
             SET_ERROR_CODE(Z3_INVALID_ARG);
             RETURN_Z3(0);
         }
     }
     app* a = mk_c(c)->m().mk_pattern(num_patterns, reinterpret_cast<app*const*>(to_exprs(terms)));
     mk_c(c)->save_ast_trail(a);
     RETURN_Z3(of_pattern(a));
     Z3_CATCH_RETURN(0);
 }
Exemple #2
0
 double Z3_API Z3_stats_get_double_value(Z3_context c, Z3_stats s, unsigned idx) {
     Z3_TRY;
     LOG_Z3_stats_get_double_value(c, s, idx);
     RESET_ERROR_CODE();
     if (idx >= to_stats_ref(s).size()) {
         SET_ERROR_CODE(Z3_IOB);
         return 0.0;
     }
     if (to_stats_ref(s).is_uint(idx)) {
         SET_ERROR_CODE(Z3_INVALID_ARG);
         return 0.0;
     }
     return to_stats_ref(s).get_double_value(idx);
     Z3_CATCH_RETURN(0.0);
 }
Exemple #3
0
 Z3_goal Z3_API Z3_apply_result_get_subgoal(Z3_context c, Z3_apply_result r, unsigned i) {
     Z3_TRY;
     LOG_Z3_apply_result_get_subgoal(c, r, i);
     RESET_ERROR_CODE();
     if (i > to_apply_result(r)->m_subgoals.size()) {
         SET_ERROR_CODE(Z3_IOB);
         RETURN_Z3(0);
     }
     Z3_goal_ref * g = alloc(Z3_goal_ref);
     g->m_goal       = to_apply_result(r)->m_subgoals[i];
     mk_c(c)->save_object(g);
     Z3_goal result  = of_goal(g);
     RETURN_Z3(result);
     Z3_CATCH_RETURN(0);
 }
Exemple #4
0
 Z3_func_decl Z3_API Z3_model_get_const_decl(Z3_context c, Z3_model m, unsigned i) {
     Z3_TRY;
     LOG_Z3_model_get_const_decl(c, m, i);
     RESET_ERROR_CODE();
     CHECK_NON_NULL(m, nullptr);
     model * _m = to_model_ref(m);
     if (i < _m->get_num_constants()) {
         RETURN_Z3(of_func_decl(_m->get_constant(i))); 
     }
     else {
         SET_ERROR_CODE(Z3_IOB, nullptr);
         RETURN_Z3(nullptr);
     }
     Z3_CATCH_RETURN(nullptr);
 }
Exemple #5
0
 Z3_ast Z3_API Z3_get_denominator(Z3_context c, Z3_ast a) {
     Z3_TRY;
     LOG_Z3_get_denominator(c, a);
     RESET_ERROR_CODE();
     rational val;
     ast * _a = to_ast(a);
     if (!is_expr(_a) || !mk_c(c)->autil().is_numeral(to_expr(_a), val)) {
         SET_ERROR_CODE(Z3_INVALID_ARG, nullptr);
         RETURN_Z3(nullptr);
     }
     expr * r = mk_c(c)->autil().mk_numeral(denominator(val), true);
     mk_c(c)->save_ast_trail(r);
     RETURN_Z3(of_expr(r));
     Z3_CATCH_RETURN(nullptr);
 }
 Z3_ast Z3_API Z3_exec_smtlib2_string(Z3_context c, Z3_string str,
                                      unsigned num_sorts,
                                      Z3_symbol sort_names[],
                                      Z3_sort sorts[],
                                      unsigned num_decls,
                                      Z3_symbol decl_names[],
                                      Z3_func_decl decls[]) { 
     Z3_TRY;
     cmd_context ctx(&mk_c(c)->fparams(), false, &(mk_c(c)->m()));
     std::string s(str);
     std::istringstream is(s);
     // No logging for this one, since it private.
     return parse_smtlib2_stream(true, c, is, num_sorts, sort_names, sorts, num_decls, decl_names, decls);
     Z3_CATCH_RETURN(0);
 }
 Z3_ast Z3_API Z3_parse_smtlib2_string(Z3_context c, Z3_string str,
                                       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;
     LOG_Z3_parse_smtlib2_string(c, str, num_sorts, sort_names, sorts, num_decls, decl_names, decls);
     std::string s(str);
     std::istringstream is(s);
     Z3_ast r = parse_smtlib2_stream(false, c, is, num_sorts, sort_names, sorts, num_decls, decl_names, decls);
     RETURN_Z3(r);
     Z3_CATCH_RETURN(0);
 }
Exemple #8
0
    Z3_func_interp Z3_API Z3_add_func_interp(Z3_context c, Z3_model m, Z3_func_decl f, Z3_ast else_val) {
        Z3_TRY;
        LOG_Z3_add_func_interp(c, m, f, else_val);
        RESET_ERROR_CODE();
		CHECK_NON_NULL(f, nullptr);
        func_decl* d = to_func_decl(f);
        model* mdl = to_model_ref(m);
        Z3_func_interp_ref * f_ref = alloc(Z3_func_interp_ref, *mk_c(c), mdl); 
        f_ref->m_func_interp = alloc(func_interp, mk_c(c)->m(), d->get_arity());
        mk_c(c)->save_object(f_ref);
        mdl->register_decl(d, f_ref->m_func_interp);
        f_ref->m_func_interp->set_else(to_expr(else_val));
        RETURN_Z3(of_func_interp(f_ref));
        Z3_CATCH_RETURN(nullptr);
    }
Exemple #9
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 = nullptr;
     RESET_ERROR_CODE();
     CHECK_NON_NULL(m, Z3_FALSE);
     CHECK_IS_EXPR(t, 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);
 }
Exemple #10
0
 Z3_pattern Z3_API Z3_get_quantifier_pattern_ast(Z3_context c, Z3_ast a, unsigned i) {
     Z3_TRY;
     LOG_Z3_get_quantifier_pattern_ast(c, a, i);
     RESET_ERROR_CODE();
     ast * _a = to_ast(a);
     if (_a->get_kind() == AST_QUANTIFIER) {
         Z3_pattern r = of_pattern(to_quantifier(_a)->get_patterns()[i]);
         RETURN_Z3(r);
     }
     else {
         SET_ERROR_CODE(Z3_SORT_ERROR);
         RETURN_Z3(0);
     }
     Z3_CATCH_RETURN(0);
 }
Exemple #11
0
 Z3_ast_vector Z3_API Z3_solver_get_unsat_core(Z3_context c, Z3_solver s) {
     Z3_TRY;
     LOG_Z3_solver_get_unsat_core(c, s);
     RESET_ERROR_CODE();
     init_solver(c, s);
     expr_ref_vector core(mk_c(c)->m());
     to_solver_ref(s)->get_unsat_core(core);
     Z3_ast_vector_ref * v = alloc(Z3_ast_vector_ref, *mk_c(c), mk_c(c)->m());
     mk_c(c)->save_object(v);
     for (expr* e : core) {
         v->m_ast_vector.push_back(e);
     }
     RETURN_Z3(of_ast_vector(v));
     Z3_CATCH_RETURN(nullptr);
 }
Exemple #12
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);
 }
Exemple #13
0
 Z3_ast Z3_API Z3_mk_fpa_nan(Z3_context c, Z3_sort s) {
     Z3_TRY;
     LOG_Z3_mk_fpa_nan(c, s);
     RESET_ERROR_CODE();
     CHECK_VALID_AST(s, nullptr);
     if (!is_fp_sort(c, s)) {
         SET_ERROR_CODE(Z3_INVALID_ARG);
         RETURN_Z3(nullptr);
     }
     api::context * ctx = mk_c(c);
     expr * a = ctx->fpautil().mk_nan(to_sort(s));
     ctx->save_ast_trail(a);
     RETURN_Z3(of_expr(a));
     Z3_CATCH_RETURN(nullptr);
 }
Exemple #14
0
 Z3_sort Z3_API Z3_get_quantifier_bound_sort(Z3_context c, Z3_ast a, unsigned i) {
     Z3_TRY;
     LOG_Z3_get_quantifier_bound_sort(c, a, i);
     RESET_ERROR_CODE();
     ast * _a = to_ast(a);
     if (_a->get_kind() == AST_QUANTIFIER) {
         Z3_sort r = of_sort(to_quantifier(_a)->get_decl_sort(i));
         RETURN_Z3(r);
     }
     else {
         SET_ERROR_CODE(Z3_SORT_ERROR);
         RETURN_Z3(0);
     }
     Z3_CATCH_RETURN(0);
 }
Exemple #15
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);
 }
Exemple #16
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);
 }
Exemple #17
0
 Z3_ast_vector Z3_API Z3_ast_map_keys(Z3_context c, Z3_ast_map m) {
     Z3_TRY;
     LOG_Z3_ast_map_keys(c, m);
     RESET_ERROR_CODE();
     Z3_ast_vector_ref * v = alloc(Z3_ast_vector_ref, to_ast_map(m)->m);
     mk_c(c)->save_object(v);
     obj_map<ast, ast*>::iterator it  = to_ast_map_ref(m).begin();
     obj_map<ast, ast*>::iterator end = to_ast_map_ref(m).end();
     for (; it != end; ++it) {
         v->m_ast_vector.push_back(it->m_key);
     }
     Z3_ast_vector r       = of_ast_vector(v);
     RETURN_Z3(r);
     Z3_CATCH_RETURN(0);
 }
Exemple #18
0
 Z3_ast_vector Z3_API Z3_solver_get_unsat_core(Z3_context c, Z3_solver s) {
     Z3_TRY;
     LOG_Z3_solver_get_unsat_core(c, s);
     RESET_ERROR_CODE();
     init_solver(c, s);
     ptr_vector<expr> core;
     to_solver_ref(s)->get_unsat_core(core);
     Z3_ast_vector_ref * v = alloc(Z3_ast_vector_ref, mk_c(c)->m());
     mk_c(c)->save_object(v);
     for (unsigned i = 0; i < core.size(); i++) {
         v->m_ast_vector.push_back(core[i]);
     }
     RETURN_Z3(of_ast_vector(v));
     Z3_CATCH_RETURN(0);
 }
Exemple #19
0
 Z3_goal_prec Z3_API Z3_goal_precision(Z3_context c, Z3_goal g) {
     Z3_TRY;
     LOG_Z3_goal_precision(c, g);
     RESET_ERROR_CODE();
     switch (to_goal_ref(g)->prec()) {
     case goal::PRECISE: return Z3_GOAL_PRECISE;
     case goal::UNDER:   return Z3_GOAL_UNDER;
     case goal::OVER:    return Z3_GOAL_OVER;
     case goal::UNDER_OVER: return Z3_GOAL_UNDER_OVER;
     default:
         UNREACHABLE();
         return Z3_GOAL_UNDER_OVER;
     }
     Z3_CATCH_RETURN(Z3_GOAL_UNDER_OVER);
 }
Exemple #20
0
 Z3_goal Z3_API Z3_mk_goal(Z3_context c, Z3_bool models, Z3_bool unsat_cores, Z3_bool proofs) {
     Z3_TRY;
     LOG_Z3_mk_goal(c, models, unsat_cores, proofs);
     RESET_ERROR_CODE();
     if (proofs != 0 && !mk_c(c)->m().proofs_enabled()) {
         SET_ERROR_CODE(Z3_INVALID_ARG);
         RETURN_Z3(0);
     }
     Z3_goal_ref * g = alloc(Z3_goal_ref);
     g->m_goal       = alloc(goal, mk_c(c)->m(), proofs != 0, models != 0, unsat_cores != 0);
     mk_c(c)->save_object(g);
     Z3_goal r       = of_goal(g);
     RETURN_Z3(r);
     Z3_CATCH_RETURN(0);
 }
Exemple #21
0
 Z3_lbool Z3_API Z3_get_implied_equalities(Z3_context c, 
                                           Z3_solver s,
                                           unsigned num_terms,
                                           Z3_ast const terms[],
                                           unsigned class_ids[]) {
     Z3_TRY;
     LOG_Z3_get_implied_equalities(c, s, num_terms, terms, class_ids);
     ast_manager& m = mk_c(c)->m();
     RESET_ERROR_CODE();
     CHECK_SEARCHING(c);
     init_solver(c, s);
     lbool result = smt::implied_equalities(m, *to_solver_ref(s), num_terms, to_exprs(terms), class_ids);
     return static_cast<Z3_lbool>(result); 
     Z3_CATCH_RETURN(Z3_L_UNDEF);
 }
Exemple #22
0
    unsigned Z3_API Z3_get_quantifier_num_bound(Z3_context c, Z3_ast a) {
        Z3_TRY;
        LOG_Z3_get_quantifier_num_bound(c, a);
        RESET_ERROR_CODE();
        ast * _a = to_ast(a);
        if (_a->get_kind() == AST_QUANTIFIER) {

            return to_quantifier(_a)->get_num_decls();
        }
        else {
            SET_ERROR_CODE(Z3_SORT_ERROR);
            return 0;
        }        
        Z3_CATCH_RETURN(0);
    }
Exemple #23
0
 Z3_ast Z3_API Z3_mk_fpa_numeral_double(Z3_context c, double v, Z3_sort ty) {
     Z3_TRY;
     LOG_Z3_mk_fpa_numeral_double(c, v, ty);
     RESET_ERROR_CODE();
     if (!is_fp_sort(c, ty)) {
         SET_ERROR_CODE(Z3_INVALID_ARG);
         RETURN_Z3(nullptr);
     }
     api::context * ctx = mk_c(c);
     scoped_mpf tmp(ctx->fpautil().fm());
     ctx->fpautil().fm().set(tmp, ctx->fpautil().get_ebits(to_sort(ty)), ctx->fpautil().get_sbits(to_sort(ty)), v);
     expr * a = ctx->fpautil().mk_value(tmp);
     ctx->save_ast_trail(a);
     RETURN_Z3(of_expr(a));
     Z3_CATCH_RETURN(nullptr);
 }
Exemple #24
0
 Z3_ast Z3_API Z3_mk_fpa_zero(Z3_context c, Z3_sort s, Z3_bool negative) {
     Z3_TRY;
     LOG_Z3_mk_fpa_inf(c, s, negative);
     RESET_ERROR_CODE();
     CHECK_VALID_AST(s, nullptr);
     if (!is_fp_sort(c, s)) {
         SET_ERROR_CODE(Z3_INVALID_ARG);
         RETURN_Z3(nullptr);
     }
     api::context * ctx = mk_c(c);
     expr * a = negative != 0 ? ctx->fpautil().mk_nzero(to_sort(s)) :
                                ctx->fpautil().mk_pzero(to_sort(s));
     ctx->save_ast_trail(a);
     RETURN_Z3(of_expr(a));
     Z3_CATCH_RETURN(nullptr);
 }
Exemple #25
0
 Z3_func_interp Z3_API Z3_model_get_func_interp(Z3_context c, Z3_model m, Z3_func_decl f) {
     Z3_TRY;
     LOG_Z3_model_get_func_interp(c, m, f);
     RESET_ERROR_CODE();
     CHECK_NON_NULL(m, nullptr);
     func_interp * _fi       = to_model_ref(m)->get_func_interp(to_func_decl(f));
     if (!_fi) {
         SET_ERROR_CODE(Z3_INVALID_ARG, nullptr);
         RETURN_Z3(nullptr);
     }
     Z3_func_interp_ref * fi = alloc(Z3_func_interp_ref, *mk_c(c), to_model_ref(m));
     fi->m_func_interp       = _fi;
     mk_c(c)->save_object(fi);
     RETURN_Z3(of_func_interp(fi));
     Z3_CATCH_RETURN(nullptr);
 }
Exemple #26
0
 Z3_string Z3_API Z3_param_descrs_to_string(Z3_context c, Z3_param_descrs p) {
     Z3_TRY;
     LOG_Z3_param_descrs_to_string(c, p);
     RESET_ERROR_CODE();
     std::ostringstream buffer;
     buffer << "(";
     unsigned sz = to_param_descrs_ptr(p)->size();
     for (unsigned i = 0; i < sz; i++) {
         if (i > 0) 
             buffer << ", ";
         buffer << to_param_descrs_ptr(p)->get_param_name(i);
     }
     buffer << ")";
     return mk_c(c)->mk_external_string(buffer.str());
     Z3_CATCH_RETURN("");
 }
Exemple #27
0
 Z3_ast_vector Z3_API Z3_fixedpoint_get_assertions(
     Z3_context c,
     Z3_fixedpoint d)
 {
     Z3_TRY;
     LOG_Z3_fixedpoint_get_assertions(c, d);
     ast_manager& m = mk_c(c)->m();
     Z3_ast_vector_ref* v = alloc(Z3_ast_vector_ref, m);
     mk_c(c)->save_object(v);
     unsigned num_asserts = to_fixedpoint_ref(d)->ctx().get_num_assertions();
     for (unsigned i = 0; i < num_asserts; ++i) {
         v->m_ast_vector.push_back(to_fixedpoint_ref(d)->ctx().get_assertion(i));
     }
     RETURN_Z3(of_ast_vector(v));
     Z3_CATCH_RETURN(0);
 }
Exemple #28
0
 Z3_func_entry Z3_API Z3_func_interp_get_entry(Z3_context c, Z3_func_interp f, unsigned i) {
     Z3_TRY;
     LOG_Z3_func_interp_get_entry(c, f, i);
     RESET_ERROR_CODE();
     CHECK_NON_NULL(f, nullptr);
     if (i >= to_func_interp_ref(f)->num_entries()) {
         SET_ERROR_CODE(Z3_IOB, nullptr);
         RETURN_Z3(nullptr);
     }
     Z3_func_entry_ref * e = alloc(Z3_func_entry_ref, *mk_c(c), to_func_interp(f)->m_model.get());
     e->m_func_interp = to_func_interp_ref(f);
     e->m_func_entry  = to_func_interp_ref(f)->get_entry(i);
     mk_c(c)->save_object(e);
     RETURN_Z3(of_func_entry(e));
     Z3_CATCH_RETURN(nullptr);
 }
Exemple #29
0
 Z3_string Z3_API Z3_ast_map_to_string(Z3_context c, Z3_ast_map m) {
     Z3_TRY;
     LOG_Z3_ast_map_to_string(c, m);
     RESET_ERROR_CODE();
     std::ostringstream buffer;
     ast_manager & mng = to_ast_map(m)->m;
     buffer << "(ast-map";
     obj_map<ast, ast*>::iterator it  = to_ast_map_ref(m).begin();
     obj_map<ast, ast*>::iterator end = to_ast_map_ref(m).end();
     for (; it != end; ++it) {
         buffer << "\n  (" << mk_ismt2_pp(it->m_key, mng, 3) << "\n   " << mk_ismt2_pp(it->m_value, mng, 3) << ")";
     }
     buffer << ")";
     return mk_c(c)->mk_external_string(buffer.str());
     Z3_CATCH_RETURN(0);
 }
Exemple #30
0
 Z3_param_kind Z3_API Z3_param_descrs_get_kind(Z3_context c, Z3_param_descrs p, Z3_symbol n) {
     Z3_TRY;
     LOG_Z3_param_descrs_get_kind(c, p, n);
     RESET_ERROR_CODE();
     param_kind k = to_param_descrs_ptr(p)->get_kind(to_symbol(n));
     switch (k) {
     case CPK_UINT:    return Z3_PK_UINT;
     case CPK_BOOL:    return Z3_PK_BOOL;
     case CPK_DOUBLE:  return Z3_PK_DOUBLE;
     case CPK_STRING:  return Z3_PK_STRING;
     case CPK_SYMBOL:  return Z3_PK_SYMBOL;
     case CPK_INVALID: return Z3_PK_INVALID;
     default:          return Z3_PK_OTHER;
     }
     Z3_CATCH_RETURN(Z3_PK_INVALID);
 }