コード例 #1
0
ファイル: api_solver.cpp プロジェクト: levnach/z3
 static Z3_lbool _solver_check(Z3_context c, Z3_solver s, unsigned num_assumptions, Z3_ast const assumptions[]) {
     for (unsigned i = 0; i < num_assumptions; i++) {
         if (!is_expr(to_ast(assumptions[i]))) {
             SET_ERROR_CODE(Z3_INVALID_ARG, "assumption is not an expression");
             return Z3_L_UNDEF;
         }
     }
     expr * const * _assumptions = to_exprs(assumptions);
     unsigned timeout     = to_solver(s)->m_params.get_uint("timeout", mk_c(c)->get_timeout());
     unsigned rlimit      = to_solver(s)->m_params.get_uint("rlimit", mk_c(c)->get_rlimit());
     bool     use_ctrl_c  = to_solver(s)->m_params.get_bool("ctrl_c", false);
     cancel_eh<reslimit> eh(mk_c(c)->m().limit());
     api::context::set_interruptable si(*(mk_c(c)), eh);
     lbool result;
     {
         scoped_ctrl_c ctrlc(eh, false, use_ctrl_c);
         scoped_timer timer(timeout, &eh);
         scoped_rlimit _rlimit(mk_c(c)->m().limit(), rlimit);
         try {
             result = to_solver_ref(s)->check_sat(num_assumptions, _assumptions);
         }
         catch (z3_exception & ex) {
             to_solver_ref(s)->set_reason_unknown(eh);
             if (!mk_c(c)->m().canceled()) {
                 mk_c(c)->handle_exception(ex);
             }
             return Z3_L_UNDEF;
         }
     }
     if (result == l_undef) {
         to_solver_ref(s)->set_reason_unknown(eh);
     }
     return static_cast<Z3_lbool>(result);
 }
コード例 #2
0
ファイル: api_datalog.cpp プロジェクト: perillaseed/z3
 Z3_string Z3_API Z3_fixedpoint_to_string(
     Z3_context c,
     Z3_fixedpoint d,
     unsigned num_queries,
     Z3_ast _queries[]) {
     Z3_TRY;
     expr*const* queries = to_exprs(_queries);
     LOG_Z3_fixedpoint_to_string(c, d, num_queries, _queries);
     RESET_ERROR_CODE();
     return mk_c(c)->mk_external_string(to_fixedpoint_ref(d)->to_string(num_queries, queries));
     Z3_CATCH_RETURN("");
 }
コード例 #3
0
 Z3_lbool Z3_API Z3_get_implied_equalities(Z3_context c, 
                                           unsigned num_terms,
                                           Z3_ast const terms[],
                                           unsigned class_ids[]) {
     Z3_TRY;
     LOG_Z3_get_implied_equalities(c, num_terms, terms, class_ids);
     RESET_ERROR_CODE();
     CHECK_SEARCHING(c);
     lbool result = smt::implied_equalities(mk_c(c)->get_smt_kernel(), num_terms, to_exprs(terms), class_ids);
     return static_cast<Z3_lbool>(result); 
     Z3_CATCH_RETURN(Z3_L_UNDEF);
 }
コード例 #4
0
ファイル: api_pb.cpp プロジェクト: AleksandarZeljic/z3
 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);
 }
コード例 #5
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);
 }
コード例 #6
0
ファイル: api_solver.cpp プロジェクト: levnach/z3
 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);
 }
コード例 #7
0
ファイル: api_quant.cpp プロジェクト: AleksandarZeljic/z3
 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);
 }
コード例 #8
0
ファイル: api_pb.cpp プロジェクト: AleksandarZeljic/z3
 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);
 }
コード例 #9
0
ファイル: api_model.cpp プロジェクト: kayceesrk/Z3
 Z3_bool Z3_API Z3_eval_decl(Z3_context c,
                             Z3_model m,
                             Z3_func_decl d,
                             unsigned num_args,
                             Z3_ast const args[],
                             Z3_ast* v) {
     Z3_TRY;
     LOG_Z3_eval_decl(c, m, d, num_args, args, v);
     RESET_ERROR_CODE();
     CHECK_NON_NULL(m, Z3_FALSE);
     ast_manager & mgr = mk_c(c)->m();
     model * _m = to_model_ref(m);
     app_ref app(mgr);
     app = mgr.mk_app(to_func_decl(d), num_args, to_exprs(args));
     expr_ref result(mgr);
     _m->eval(app.get(), result);
     mk_c(c)->save_ast_trail(result.get());
     *v = of_ast(result.get());
     RETURN_Z3_eval_decl Z3_TRUE;
     Z3_CATCH_RETURN(Z3_FALSE);
 }
コード例 #10
0
ファイル: api_array.cpp プロジェクト: AleksandarZeljic/z3
 Z3_ast Z3_API Z3_mk_map(Z3_context c, Z3_func_decl f, unsigned n, Z3_ast const* args) {
     Z3_TRY;
     LOG_Z3_mk_map(c, f, n, args);
     RESET_ERROR_CODE();
     if (n == 0) {
         SET_ERROR_CODE(Z3_INVALID_ARG);
         RETURN_Z3(0);
     }
     ast_manager & m = mk_c(c)->m();
     func_decl* _f      = to_func_decl(f);
     expr* const* _args = to_exprs(args);
     
     ptr_vector<sort> domain;
     for (unsigned i = 0; i < n; ++i) {
         domain.push_back(m.get_sort(_args[i]));
     }
     parameter param(_f);
     func_decl * d = m.mk_func_decl(mk_c(c)->get_array_fid(), OP_ARRAY_MAP, 1, &param, n, domain.c_ptr());
     app* r = m.mk_app(d, n, _args);
     mk_c(c)->save_ast_trail(r);
     check_sorts(c, r);
     RETURN_Z3(of_ast(r));
     Z3_CATCH_RETURN(0);
 }