示例#1
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);
 }
示例#2
0
 Z3_sort Z3_API Z3_get_relation_column(Z3_context c, Z3_sort s, unsigned col) {
     Z3_TRY;
     LOG_Z3_get_relation_column(c, s, col);
     RESET_ERROR_CODE();  
     sort * r = to_sort(s);
     if (Z3_get_sort_kind(c, s) != Z3_RELATION_SORT) {
         SET_ERROR_CODE(Z3_INVALID_ARG);
         RETURN_Z3(0);
     }
     if (col >= r->get_num_parameters()) {
         SET_ERROR_CODE(Z3_IOB);
         RETURN_Z3(0);
     }
     parameter const& p = r->get_parameter(col);
     if (!p.is_ast() || !is_sort(p.get_ast())) {
         UNREACHABLE();
         warning_msg("Sort parameter expected at %d", col);
         SET_ERROR_CODE(Z3_INTERNAL_FATAL);
         RETURN_Z3(0);
     }
     Z3_sort res = of_sort(to_sort(p.get_ast()));
     RETURN_Z3(res);
     Z3_CATCH_RETURN(0);
 }
示例#3
0
文件: api_fpa.cpp 项目: angr/angr-z3
 Z3_bool Z3_API Z3_fpa_get_numeral_significand_uint64(Z3_context c, Z3_ast t, uint64_t * n) {
     Z3_TRY;
     LOG_Z3_fpa_get_numeral_significand_uint64(c, t, n);
     RESET_ERROR_CODE();
     CHECK_NON_NULL(t, 0);
     CHECK_VALID_AST(t, 0);
     if (n == nullptr) {
         SET_ERROR_CODE(Z3_INVALID_ARG, "invalid nullptr argument");
         return false;
     }
     ast_manager & m = mk_c(c)->m();
     mpf_manager & mpfm = mk_c(c)->fpautil().fm();
     unsynch_mpz_manager & mpzm = mpfm.mpz_manager();
     family_id fid = mk_c(c)->get_fpa_fid();
     fpa_decl_plugin * plugin = (fpa_decl_plugin*)m.get_plugin(fid);
     SASSERT(plugin != 0);
     expr * e = to_expr(t);
     if (!is_app(e) || is_app_of(e, fid, OP_FPA_NAN) || !is_fp(c, t)) {
         SET_ERROR_CODE(Z3_INVALID_ARG, "invalid expression argument, expecting a valid fp, not a NaN");
         *n = 0;
         return false;
     }
     scoped_mpf val(mpfm);
     bool r = plugin->is_numeral(e, val);
     const mpz & z = mpfm.sig(val);
     if (!r ||
         !(mpfm.is_normal(val) || mpfm.is_denormal(val) || mpfm.is_zero(val) || mpfm.is_inf(val)) ||
         !mpzm.is_uint64(z)) {
         SET_ERROR_CODE(Z3_INVALID_ARG, "invalid expression argument, expecting a valid fp, not a NaN");
         *n = 0;
         return false;
     }
     *n = mpzm.get_uint64(z);
     return true;
     Z3_CATCH_RETURN(0);
 }
示例#4
0
 unsigned get_model_func_num_entries_core(Z3_context c, Z3_model m, unsigned i) {
     RESET_ERROR_CODE();
     CHECK_NON_NULL(m, 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) {
             return g->num_entries();
         }
         SET_ERROR_CODE(Z3_IOB, nullptr);
         return 0;
     }
     return 0;
 }
示例#5
0
文件: api_quant.cpp 项目: Jornason/z3
 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);
 }
示例#6
0
文件: api_fpa.cpp 项目: angr/angr-z3
 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, "fp sort expected");
         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);
 }
示例#7
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);
 }
示例#8
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);
 }
示例#9
0
文件: api_tactic.cpp 项目: EinNarr/z3
 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);
 }
示例#10
0
文件: api_quant.cpp 项目: Jornason/z3
 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);
 }
示例#11
0
文件: api_fpa.cpp 项目: angr/angr-z3
 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, "fp sort expected");
         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);
 }
示例#12
0
文件: api_quant.cpp 项目: Jornason/z3
    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);
    }
示例#13
0
文件: api_quant.cpp 项目: Jornason/z3
 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);
 }
示例#14
0
文件: api_quant.cpp 项目: Jornason/z3
 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);
 }
示例#15
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);
 }
示例#16
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);
 }
示例#17
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);
 }
示例#18
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);
 }
示例#19
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);
 }
 Z3_ast Z3_API Z3_exec_smtlib2_file(Z3_context c, Z3_string file_name,
                                    unsigned num_sorts,
                                    Z3_symbol sort_names[],
                                    Z3_sort sorts[],
                                    unsigned num_decls,
                                    Z3_symbol decl_names[],
                                    Z3_func_decl decls[]) { 
     Z3_TRY;
     std::ifstream is(file_name);
     if (!is) {
         SET_ERROR_CODE(Z3_PARSER_ERROR);
         return 0;
     }
     // 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);
 }
示例#21
0
 Z3_ast Z3_API Z3_get_algebraic_number_upper(Z3_context c, Z3_ast a, unsigned precision) {
     Z3_TRY;
     LOG_Z3_get_algebraic_number_upper(c, a, precision);
     RESET_ERROR_CODE();
     if (!Z3_is_algebraic_number(c, a)) {
         SET_ERROR_CODE(Z3_INVALID_ARG, nullptr);
         RETURN_Z3(nullptr);
     }
     expr * e = to_expr(a);
     algebraic_numbers::anum const & val = mk_c(c)->autil().to_irrational_algebraic_numeral(e);
     rational l;
     mk_c(c)->autil().am().get_upper(val, l, precision);
     expr * r = mk_c(c)->autil().mk_numeral(l, false);
     mk_c(c)->save_ast_trail(r);
     RETURN_Z3(of_expr(r));
     Z3_CATCH_RETURN(nullptr);
 }
示例#22
0
 Z3_string Z3_API Z3_get_numeral_string(Z3_context c, Z3_ast a) {
     Z3_TRY;
     // This function invokes Z3_get_numeral_rational, but it is still ok to add LOG command here because it does not return a Z3 object.
     LOG_Z3_get_numeral_string(c, a);
     RESET_ERROR_CODE();
     CHECK_IS_EXPR(a, "");
     rational r;
     Z3_bool ok = Z3_get_numeral_rational(c, a, r);
     if (ok == Z3_TRUE) {
         return mk_c(c)->mk_external_string(r.to_string());
     }
     else {
         // floats are separated from all others to avoid huge rationals.
         fpa_util & fu = mk_c(c)->fpautil();
         scoped_mpf tmp(fu.fm());
         mpf_rounding_mode rm;
         if (mk_c(c)->fpautil().is_rm_numeral(to_expr(a), rm)) {
             switch (rm) {
             case OP_FPA_RM_NEAREST_TIES_TO_EVEN:
                 return mk_c(c)->mk_external_string("roundNearestTiesToEven");
                 break;
             case OP_FPA_RM_NEAREST_TIES_TO_AWAY:
                 return mk_c(c)->mk_external_string("roundNearestTiesToAway");
                 break;
             case OP_FPA_RM_TOWARD_POSITIVE:
                 return mk_c(c)->mk_external_string("roundTowardPositive");
                 break;
             case OP_FPA_RM_TOWARD_NEGATIVE:
                 return mk_c(c)->mk_external_string("roundTowardNegative");
                 break;
             case OP_FPA_RM_TOWARD_ZERO:
             default:
                 return mk_c(c)->mk_external_string("roundTowardZero");
                 break;
             }
         }
         else if (mk_c(c)->fpautil().is_numeral(to_expr(a), tmp)) {
             return mk_c(c)->mk_external_string(fu.fm().to_string(tmp));
         }
         else {
             SET_ERROR_CODE(Z3_INVALID_ARG, nullptr);
             return "";
         }
     }
     Z3_CATCH_RETURN("");
 }
示例#23
0
文件: api_tactic.cpp 项目: EinNarr/z3
 Z3_model Z3_API Z3_apply_result_convert_model(Z3_context c, Z3_apply_result r, unsigned i, Z3_model m) {
     Z3_TRY;
     LOG_Z3_apply_result_convert_model(c, r, i, m);
     RESET_ERROR_CODE();
     if (i > to_apply_result(r)->m_subgoals.size()) {
         SET_ERROR_CODE(Z3_IOB);
         RETURN_Z3(0);
     }
     model_ref new_m = to_model_ref(m)->copy();
     if (to_apply_result(r)->m_mc)
         to_apply_result(r)->m_mc->operator()(new_m, i);
     Z3_model_ref * m_ref = alloc(Z3_model_ref); 
     m_ref->m_model = new_m;
     mk_c(c)->save_object(m_ref);
     RETURN_Z3(of_model(m_ref));
     Z3_CATCH_RETURN(0);
 }
示例#24
0
文件: api_solver.cpp 项目: ai-se/z3
 Z3_model Z3_API Z3_solver_get_model(Z3_context c, Z3_solver s) {
     Z3_TRY;
     LOG_Z3_solver_get_model(c, s);
     RESET_ERROR_CODE();
     init_solver(c, s);
     model_ref _m;
     to_solver_ref(s)->get_model(_m);
     if (!_m) {
         SET_ERROR_CODE(Z3_INVALID_USAGE);
         RETURN_Z3(0);
     }
     Z3_model_ref * m_ref = alloc(Z3_model_ref); 
     m_ref->m_model = _m;
     mk_c(c)->save_object(m_ref);
     RETURN_Z3(of_model(m_ref));
     Z3_CATCH_RETURN(0);
 }
示例#25
0
 Z3_ast_vector Z3_API Z3_model_get_sort_universe(Z3_context c, Z3_model m, Z3_sort s) {
     Z3_TRY;
     LOG_Z3_model_get_sort_universe(c, m, s);
     RESET_ERROR_CODE();
     if (!to_model_ref(m)->has_uninterpreted_sort(to_sort(s))) {
         SET_ERROR_CODE(Z3_INVALID_ARG, nullptr);
         RETURN_Z3(nullptr);
     }
     ptr_vector<expr> const & universe = to_model_ref(m)->get_universe(to_sort(s));
     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 : universe) {
         v->m_ast_vector.push_back(e);
     }
     RETURN_Z3(of_ast_vector(v));
     Z3_CATCH_RETURN(nullptr);
 }
示例#26
0
 void Z3_API Z3_func_interp_add_entry(Z3_context c, Z3_func_interp fi, Z3_ast_vector args, Z3_ast value) {
     Z3_TRY;
     LOG_Z3_func_interp_add_entry(c, fi, args, value);
     //CHECK_NON_NULL(fi, void);
     //CHECK_NON_NULL(args, void);
     //CHECK_NON_NULL(value, void);
     func_interp* _fi = to_func_interp_ref(fi);
     expr* _value = to_expr(value);
     if (to_ast_vector_ref(args).size() != _fi->get_arity()) {
         SET_ERROR_CODE(Z3_IOB, nullptr);
         return;
     }
     // check sorts of value
     expr* const* _args = (expr* const*) to_ast_vector_ref(args).c_ptr();
     _fi->insert_entry(_args, _value);
     Z3_CATCH;
 }
示例#27
0
文件: api_solver.cpp 项目: levnach/z3
 void Z3_API Z3_solver_from_file(Z3_context c, Z3_solver s, Z3_string file_name) {
     Z3_TRY;
     LOG_Z3_solver_from_file(c, s, file_name);
     char const* ext = get_extension(file_name);
     std::ifstream is(file_name);
     init_solver(c, s);
     if (!is) {
         SET_ERROR_CODE(Z3_FILE_ACCESS_ERROR, nullptr);
     }
     else if (ext && (std::string("dimacs") == ext || std::string("cnf") == ext)) {
         solver_from_dimacs_stream(c, s, is);
     }
     else {
         solver_from_stream(c, s, is);
     }
     Z3_CATCH;
 }
示例#28
0
 Z3_ast Z3_API Z3_mk_fpa_to_fp_unsigned(Z3_context c, Z3_ast rm, Z3_ast t, Z3_sort s) {
     Z3_TRY;
     LOG_Z3_mk_fpa_to_fp_unsigned(c, rm, t, s);
     RESET_ERROR_CODE();
     api::context * ctx = mk_c(c);
     fpa_util & fu = ctx->fpautil();
     if (!fu.is_rm(to_expr(rm)) ||
         !ctx->bvutil().is_bv(to_expr(t)) ||
         !fu.is_float(to_sort(s))) {
         SET_ERROR_CODE(Z3_INVALID_ARG);
         return nullptr;
     }
     expr * a = fu.mk_to_fp_unsigned(to_sort(s), to_expr(rm), to_expr(t));
     ctx->save_ast_trail(a);
     RETURN_Z3(of_expr(a));
     Z3_CATCH_RETURN(nullptr);
 }
示例#29
0
文件: api_goal.cpp 项目: bishoksan/z3
 Z3_string Z3_API Z3_goal_to_dimacs_string(Z3_context c, Z3_goal g) {
     Z3_TRY;
     LOG_Z3_goal_to_dimacs_string(c, g);
     RESET_ERROR_CODE();
     std::ostringstream buffer;
     if (!to_goal_ref(g)->is_cnf()) { 
         SET_ERROR_CODE(Z3_INVALID_ARG, "If this is not what you want, then preprocess by optional bit-blasting and applying tseitin-cnf");
         RETURN_Z3(nullptr);
     }
     to_goal_ref(g)->display_dimacs(buffer);
     // Hack for removing the trailing '\n'
     std::string result = buffer.str();
     SASSERT(result.size() > 0);
     result.resize(result.size()-1);
     return mk_c(c)->mk_external_string(result);
     Z3_CATCH_RETURN("");
 }
示例#30
0
 Z3_ast Z3_API Z3_mk_fpa_to_fp_int_real(Z3_context c, Z3_ast rm, Z3_ast exp, Z3_ast sig, Z3_sort s) {
     Z3_TRY;
     LOG_Z3_mk_fpa_to_fp_int_real(c, rm, exp, sig, s);
     RESET_ERROR_CODE();
     api::context * ctx = mk_c(c);
     fpa_util & fu = ctx->fpautil();
     if (!fu.is_rm(to_expr(rm)) ||
         !ctx->autil().is_int(to_expr(exp)) ||
         !ctx->autil().is_real(to_expr(sig)) ||
         !fu.is_float(to_sort(s))) {
         SET_ERROR_CODE(Z3_INVALID_ARG);
         return nullptr;
     }
     expr * a = fu.mk_to_fp(to_sort(s), to_expr(rm), to_expr(exp), to_expr(sig));
     ctx->save_ast_trail(a);
     RETURN_Z3(of_expr(a));
     Z3_CATCH_RETURN(nullptr);
 }