Ejemplo n.º 1
0
 Z3_ast Z3_API Z3_algebraic_div(Z3_context c, Z3_ast a, Z3_ast b) {
     Z3_TRY;
     LOG_Z3_algebraic_div(c, a, b);
     RESET_ERROR_CODE();
     CHECK_IS_ALGEBRAIC_X(a, 0);
     CHECK_IS_ALGEBRAIC_X(b, 0);
     if ((is_rational(c, b) && get_rational(c, b).is_zero()) ||
         (!is_rational(c, b) && am(c).is_zero(get_irrational(c, b)))) {
         SET_ERROR_CODE(Z3_INVALID_ARG);
         RETURN_Z3(0);
     }
     BIN_OP(/,div);
     Z3_CATCH_RETURN(0);
 }
Ejemplo n.º 2
0
 Z3_ast Z3_API Z3_mk_fpa_to_sbv(Z3_context c, Z3_ast rm, Z3_ast t, unsigned sz) {
     Z3_TRY;
     LOG_Z3_mk_fpa_to_sbv(c, rm, t, sz);
     RESET_ERROR_CODE();
     if (!is_rm(c, rm) || !is_fp(c, t)) {
         SET_ERROR_CODE(Z3_INVALID_ARG, "rm and float sorts expected");
         RETURN_Z3(nullptr);
     }
     api::context * ctx = mk_c(c);
     expr * a = ctx->fpautil().mk_to_sbv(to_expr(rm), to_expr(t), sz);
     ctx->save_ast_trail(a);
     RETURN_Z3(of_expr(a));
     Z3_CATCH_RETURN(nullptr);
 }
Ejemplo n.º 3
0
 Z3_ast Z3_API Z3_mk_fpa_to_real(Z3_context c, Z3_ast t) {
     Z3_TRY;
     LOG_Z3_mk_fpa_to_real(c, t);
     RESET_ERROR_CODE();
     if (!is_fp(c, t)) {
         SET_ERROR_CODE(Z3_INVALID_ARG, "fp sort expected");
         RETURN_Z3(nullptr);
     }
     api::context * ctx = mk_c(c);
     expr * a = ctx->fpautil().mk_to_real(to_expr(t));
     ctx->save_ast_trail(a);
     RETURN_Z3(of_expr(a));
     Z3_CATCH_RETURN(nullptr);
 }
Ejemplo n.º 4
0
 Z3_ast Z3_API Z3_mk_fpa_fp(Z3_context c, Z3_ast sgn, Z3_ast exp, Z3_ast sig) {
     Z3_TRY;
     LOG_Z3_mk_fpa_fp(c, sgn, exp, sig);
     RESET_ERROR_CODE();
     if (!is_bv(c, sgn) || !is_bv(c, exp) || !is_bv(c, sig)) {
         SET_ERROR_CODE(Z3_INVALID_ARG);
         RETURN_Z3(nullptr);
     }
     api::context * ctx = mk_c(c);
     expr * a = ctx->fpautil().mk_fp(to_expr(sgn), to_expr(exp), to_expr(sig));
     ctx->save_ast_trail(a);
     RETURN_Z3(of_expr(a));
     Z3_CATCH_RETURN(nullptr);
 }
Ejemplo n.º 5
0
 Z3_ast Z3_API Z3_mk_fpa_min(Z3_context c, Z3_ast t1, Z3_ast t2) {
     Z3_TRY;
     LOG_Z3_mk_fpa_min(c, t1, t2);
     RESET_ERROR_CODE();
     if (!is_fp(c, t1) || !is_fp(c, t2)) {
         SET_ERROR_CODE(Z3_INVALID_ARG);
         RETURN_Z3(nullptr);
     }
     api::context * ctx = mk_c(c);
     expr * a = ctx->fpautil().mk_min(to_expr(t1), to_expr(t2));
     ctx->save_ast_trail(a);
     RETURN_Z3(of_expr(a));
     Z3_CATCH_RETURN(nullptr);
 }
Ejemplo n.º 6
0
 unsigned Z3_API Z3_get_pattern_num_terms(Z3_context c, Z3_pattern p) {
     Z3_TRY;
     LOG_Z3_get_pattern_num_terms(c, p);
     RESET_ERROR_CODE();
     app* _p = to_pattern(p);
     if (mk_c(c)->m().is_pattern(_p)) {
         return _p->get_num_args();
     }
     else {
         SET_ERROR_CODE(Z3_SORT_ERROR);
         return 0;            
     }
     Z3_CATCH_RETURN(0);
 }
 Z3_literals Z3_API Z3_get_guessed_literals(Z3_context c) {
     Z3_TRY;
     LOG_Z3_get_guessed_literals(c);
     RESET_ERROR_CODE();
     ast_manager& m = mk_c(c)->m();
     expr_ref_vector lits(m);
     mk_c(c)->get_smt_kernel().get_guessed_literals(lits);        
     labels* lbls = alloc(labels);
     for (unsigned i = 0; i < lits.size(); ++i) {
         lbls->push_back(labeled_literal(m,lits[i].get()));
     }
     RETURN_Z3(reinterpret_cast<Z3_literals>(lbls));        
     Z3_CATCH_RETURN(0);
 }
Ejemplo n.º 8
0
 Z3_string Z3_API Z3_apply_result_to_string(Z3_context c, Z3_apply_result r) {
     Z3_TRY;
     LOG_Z3_apply_result_to_string(c, r);
     RESET_ERROR_CODE();
     std::ostringstream buffer;
     buffer << "(goals\n";
     unsigned sz = to_apply_result(r)->m_subgoals.size();
     for (unsigned i = 0; i < sz; i++) {
         to_apply_result(r)->m_subgoals[i]->display(buffer);
     }
     buffer << ")";
     return mk_c(c)->mk_external_string(buffer.str());
     Z3_CATCH_RETURN("");
 }
Ejemplo n.º 9
0
 void Z3_API Z3_add_const_interp(Z3_context c, Z3_model m, Z3_func_decl f, Z3_ast a) {
     Z3_TRY;
     LOG_Z3_add_const_interp(c, m, f, a);
     RESET_ERROR_CODE();
     func_decl* d = to_func_decl(f);
     if (!d || d->get_arity() != 0) {
         SET_ERROR_CODE(Z3_INVALID_ARG, nullptr);
     }
     else {
         model* mdl = to_model_ref(m);
         mdl->register_decl(d, to_expr(a));
     }
     Z3_CATCH;
 }
Ejemplo n.º 10
0
 Z3_sort Z3_API Z3_get_array_sort_range(Z3_context c, Z3_sort t) {
     Z3_TRY;
     LOG_Z3_get_array_sort_range(c, t);
     RESET_ERROR_CODE();
     CHECK_VALID_AST(t, 0);
     if (to_sort(t)->get_family_id() == mk_c(c)->get_array_fid() &&
             to_sort(t)->get_decl_kind() == ARRAY_SORT) {
         Z3_sort r = reinterpret_cast<Z3_sort>(to_sort(t)->get_parameter(1).get_ast());
         RETURN_Z3(r);
     }
     SET_ERROR_CODE(Z3_INVALID_ARG);
     RETURN_Z3(0);
     Z3_CATCH_RETURN(0);
 }
Ejemplo n.º 11
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.º 12
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.º 13
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();
     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);
 }
Ejemplo n.º 14
0
 Z3_bool Z3_API Z3_is_numeral_ast(Z3_context c, Z3_ast a) {
     Z3_TRY;
     LOG_Z3_is_numeral_ast(c, a);
     RESET_ERROR_CODE();        
     CHECK_IS_EXPR(a, Z3_FALSE);
     expr* e = to_expr(a);
     return
         mk_c(c)->autil().is_numeral(e) ||
         mk_c(c)->bvutil().is_numeral(e) ||
         mk_c(c)->fpautil().is_numeral(e) ||
         mk_c(c)->fpautil().is_rm_numeral(e) ||
         mk_c(c)->datalog_util().is_numeral_ext(e);
     Z3_CATCH_RETURN(Z3_FALSE);
 }
Ejemplo n.º 15
0
 unsigned Z3_API Z3_get_quantifier_num_no_patterns(Z3_context c, Z3_ast a) {
     Z3_TRY;
     LOG_Z3_get_quantifier_num_no_patterns(c, a);
     RESET_ERROR_CODE();
     ast * _a = to_ast(a);
     if (_a->get_kind() == AST_QUANTIFIER) {
         return to_quantifier(_a)->get_num_no_patterns();
     }
     else {
         SET_ERROR_CODE(Z3_SORT_ERROR);
         return 0;
     }
     Z3_CATCH_RETURN(0);
 }
Ejemplo n.º 16
0
 Z3_ast_vector Z3_API Z3_solver_get_assertions(Z3_context c, Z3_solver s) {
     Z3_TRY;
     LOG_Z3_solver_get_assertions(c, s);
     RESET_ERROR_CODE();
     init_solver(c, s);
     Z3_ast_vector_ref * v = alloc(Z3_ast_vector_ref, mk_c(c)->m());
     mk_c(c)->save_object(v);
     unsigned sz = to_solver_ref(s)->get_num_assertions();
     for (unsigned i = 0; i < sz; i++) {
         v->m_ast_vector.push_back(to_solver_ref(s)->get_assertion(i));
     }
     RETURN_Z3(of_ast_vector(v));
     Z3_CATCH_RETURN(0);
 }
Ejemplo n.º 17
0
 Z3_symbol Z3_API Z3_get_quantifier_bound_name(Z3_context c, Z3_ast a, unsigned i) {
     Z3_TRY;
     LOG_Z3_get_quantifier_bound_name(c, a, i);
     RESET_ERROR_CODE();
     ast * _a = to_ast(a);
     if (_a->get_kind() == AST_QUANTIFIER) {
         return of_symbol(to_quantifier(_a)->get_decl_names()[i]);
     }
     else {
         SET_ERROR_CODE(Z3_SORT_ERROR);
         return 0;
     }
     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);
         RETURN_Z3(0);
     }
     mk_c(c)->save_ast_trail(p);
     RETURN_Z3(of_ast(p));
     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.º 20
0
 Z3_stats Z3_API Z3_solver_get_statistics(Z3_context c, Z3_solver s) {
     Z3_TRY;
     LOG_Z3_solver_get_statistics(c, s);
     RESET_ERROR_CODE();
     init_solver(c, s);
     Z3_stats_ref * st = alloc(Z3_stats_ref);
     to_solver_ref(s)->collect_statistics(st->m_stats);
     get_memory_statistics(st->m_stats);
     get_rlimit_statistics(mk_c(c)->m().limit(), st->m_stats);
     mk_c(c)->save_object(st);
     Z3_stats r = of_stats(st);
     RETURN_Z3(r);
     Z3_CATCH_RETURN(0);
 }
 void Z3_API Z3_pop(Z3_context c, unsigned num_scopes) {
     Z3_TRY;
     LOG_Z3_pop(c, num_scopes);
     RESET_ERROR_CODE();
     CHECK_SEARCHING(c);
     if (num_scopes > mk_c(c)->get_smt_kernel().get_scope_level()) {
         SET_ERROR_CODE(Z3_IOB);
         return;
     }
     if (num_scopes > 0) {
         mk_c(c)->pop(num_scopes);
     }
     Z3_CATCH;
 }
Ejemplo n.º 22
0
 Z3_ast Z3_API Z3_mk_fpa_fma(Z3_context c, Z3_ast rm, Z3_ast t1, Z3_ast t2, Z3_ast t3) {
     Z3_TRY;
     LOG_Z3_mk_fpa_fma(c, rm, t1, t2, t3);
     RESET_ERROR_CODE();
     if (!is_rm(c, rm) || !is_fp(c, t1) || !is_fp(c, t2) || !is_fp(c, t3)) {
         SET_ERROR_CODE(Z3_INVALID_ARG, "rm and fp sorts expected");
         RETURN_Z3(nullptr);
     }
     api::context * ctx = mk_c(c);
     expr * a = ctx->fpautil().mk_fma(to_expr(rm), to_expr(t1), to_expr(t2), to_expr(t3));
     ctx->save_ast_trail(a);
     RETURN_Z3(of_expr(a));
     Z3_CATCH_RETURN(nullptr);
 }
Ejemplo n.º 23
0
 Z3_ast Z3_API Z3_mk_fpa_round_to_integral(Z3_context c, Z3_ast rm, Z3_ast t) {
     Z3_TRY;
     LOG_Z3_mk_fpa_round_to_integral(c, rm, t);
     RESET_ERROR_CODE();
     if (!is_rm(c, rm) || !is_fp(c, t)) {
         SET_ERROR_CODE(Z3_INVALID_ARG);
         RETURN_Z3(nullptr);
     }
     api::context * ctx = mk_c(c);
     expr * a = ctx->fpautil().mk_round_to_integral(to_expr(rm), to_expr(t));
     ctx->save_ast_trail(a);
     RETURN_Z3(of_expr(a));
     Z3_CATCH_RETURN(nullptr);
 }
Ejemplo n.º 24
0
 Z3_bool Z3_API Z3_is_quantifier_forall(Z3_context c, Z3_ast a) {
     Z3_TRY;
     LOG_Z3_is_quantifier_forall(c, a);
     RESET_ERROR_CODE();
     ast * _a = to_ast(a);
     if (_a->get_kind() == AST_QUANTIFIER) {
         return to_quantifier(_a)->is_forall();
     }
     else {
         SET_ERROR_CODE(Z3_SORT_ERROR);
         return Z3_FALSE;
     }
     Z3_CATCH_RETURN(Z3_FALSE);
 }
Ejemplo n.º 25
0
 Z3_string Z3_API Z3_stats_to_string(Z3_context c, Z3_stats s) {
     Z3_TRY;
     LOG_Z3_stats_to_string(c, s);
     RESET_ERROR_CODE();
     std::ostringstream buffer;
     to_stats_ref(s).display_smt2(buffer);
     std::string result = buffer.str();
     // Hack for removing the trailing '\n'
     result = buffer.str();
     SASSERT(result.size() > 0);
     result.resize(result.size()-1);
     return mk_c(c)->mk_external_string(result);
     Z3_CATCH_RETURN("");
 }
Ejemplo n.º 26
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.º 27
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.º 28
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);
 }
Ejemplo n.º 29
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);
 }
Ejemplo n.º 30
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);
 }