示例#1
0
 void compile(goal const & g) {
     expr * lhs;
     expr * rhs;
     unsigned sz = g.size();
     for (unsigned i = 0; i < sz; i++) {
         expr * f = g.form(i);
         TRACE("diff_neq_tactic", tout << "processing: " << mk_ismt2_pp(f, m) << "\n";);
         if (u.is_le(f, lhs, rhs))
             process_le(lhs, rhs);
         else if (u.is_ge(f, lhs, rhs))
             process_le(rhs, lhs);
         else if (m.is_not(f, f) && m.is_eq(f, lhs, rhs))
             process_neq(lhs, rhs);
         else
             throw_not_supported();
     }
示例#2
0
 lbool context::optimize() {
     if (m_pareto) {
         return execute_pareto();
     }
     if (m_box_index != UINT_MAX) {
         return execute_box();
     }
     clear_state();
     init_solver(); 
     import_scoped_state(); 
     normalize();
     internalize();
     update_solver();
     solver& s = get_solver();
     for (unsigned i = 0; i < m_hard_constraints.size(); ++i) {
         TRACE("opt", tout << "Hard constraint: " << mk_ismt2_pp(m_hard_constraints[i].get(), m) << std::endl;);
         s.assert_expr(m_hard_constraints[i].get());
     }
示例#3
0
 void display_bounds(std::ostream & out) {
     unsigned sz = m_var2expr.size();
     mpq  k;
     bool strict;
     unsigned ts;
     for (unsigned x = 0; x < sz; x++) {
         if (bp.lower(x, k, strict, ts)) 
             out << nm.to_string(k) << " " << (strict ? "<" : "<=");
         else
             out << "-oo <";
         out << " " << mk_ismt2_pp(m_var2expr.get(x), m) << " ";
         if (bp.upper(x, k, strict, ts)) 
             out << (strict ? "<" : "<=") << " " << nm.to_string(k);
         else
             out << "< oo";
         out << "\n";
     }
     nm.del(k);
 }
        void operator()(sort * s) {
            if (m.is_uninterp(s)) {
                if (!m_seen_sorts.contains(s)) {
                    m_stats["uninterpreted-sorts"]++;
                    m_seen_sorts.insert(s);
                }
                m_stats["uninterpreted-sort-occurrences"]++;
            }
            else {
                params_ref prms;
                prms.set_bool("pp.single_line", true);
                std::stringstream ss;
                ss << "(declare-sort " << mk_ismt2_pp(s, m, prms) << ")";
                m_stats[ss.str()]++;

                if (s->get_info()->get_num_parameters() > 0) {
                    std::stringstream ssname;
                    ssname << "(declare-sort (_ " << s->get_name() << " *))";
                    m_stats[ssname.str()]++;
                }
            }
        }
示例#5
0
void goal::display_with_dependencies(ast_printer & prn, std::ostream & out) const {
    ptr_vector<expr> deps;
    obj_hashtable<expr> to_pp;
    out << "(goal";
    unsigned sz = size();
    for (unsigned i = 0; i < sz; i++) {
        out << "\n  |-";
        deps.reset();
        m().linearize(dep(i), deps);
        ptr_vector<expr>::iterator it  = deps.begin();
        ptr_vector<expr>::iterator end = deps.end();
        for (; it != end; ++it) {
            expr * d = *it;
            if (is_uninterp_const(d)) {
                out << " " << mk_ismt2_pp(d, m());
            }
            else {
                out << " #" << d->get_id();
                to_pp.insert(d);
            }
        }
        out << "\n  ";
        prn.display(out, form(i), 2);
    }
    if (!to_pp.empty()) {
        out << "\n  :dependencies-definitions (";
        obj_hashtable<expr>::iterator it  = to_pp.begin();
        obj_hashtable<expr>::iterator end = to_pp.end();
        for (; it != end; ++it) {
            expr * d = *it;
            out << "\n  (#" << d->get_id() << "\n  ";
            prn.display(out, d, 2);
            out << ")";
        }
        out << ")";
    }
    out << "\n  :precision " << prec() << " :depth " << depth() << ")" << std::endl;
}
func_decl_ref bvarray2uf_rewriter_cfg::mk_uf_for_array(expr * e) {
    SASSERT(is_bv_array(e));

    if (m_array_util.is_as_array(e))
        return func_decl_ref(static_cast<func_decl*>(to_app(e)->get_decl()->get_parameter(0).get_ast()), m_manager);
    else {
        func_decl * bv_f = 0;
        if (!m_arrays_fs.find(e, bv_f)) {
            sort * domain = get_index_sort(e);
            sort * range = get_value_sort(e);
            bv_f = m_manager.mk_fresh_func_decl("f_t", "", 1, &domain, range);
            TRACE("bvarray2uf_rw", tout << "for " << mk_ismt2_pp(e, m_manager) << " new func_decl is " << mk_ismt2_pp(bv_f, m_manager) << std::endl; );
            if (is_uninterp_const(e)) {
                if (m_emc)
                    m_emc->insert(to_app(e)->get_decl(),
                                  m_array_util.mk_as_array(m_manager.get_sort(e), bv_f));
            }
            else if (m_fmc)
                m_fmc->insert(bv_f);
            m_arrays_fs.insert(e, bv_f);
            m_manager.inc_ref(e);
            m_manager.inc_ref(bv_f);
        }
示例#7
0
void fpa2bv_model_converter::display(std::ostream & out) {
    out << "(fpa2bv-model-converter";
    for (obj_map<func_decl, expr*>::iterator it = m_const2bv.begin();
         it != m_const2bv.end();
         it++) {
        const symbol & n = it->m_key->get_name();
        out << "\n  (" << n << " ";
        unsigned indent = n.size() + 4;
        out << mk_ismt2_pp(it->m_value, m, indent) << ")";
    }
    for (obj_map<func_decl, expr*>::iterator it = m_rm_const2bv.begin();
         it != m_rm_const2bv.end();
         it++) {
        const symbol & n = it->m_key->get_name();
        out << "\n  (" << n << " ";
        unsigned indent = n.size() + 4;
        out << mk_ismt2_pp(it->m_value, m, indent) << ")";
    }
    for (obj_map<func_decl, func_decl*>::iterator it = m_uf2bvuf.begin();
         it != m_uf2bvuf.end();
         it++) {
        const symbol & n = it->m_key->get_name();
        out << "\n  (" << n << " ";
        unsigned indent = n.size() + 4;
        out << mk_ismt2_pp(it->m_value, m, indent) << ")";
    }
    for (obj_map<func_decl, func_decl_triple>::iterator it = m_uf23bvuf.begin();
         it != m_uf23bvuf.end();
         it++) {
        const symbol & n = it->m_key->get_name();
        out << "\n  (" << n << " ";
        unsigned indent = n.size() + 4;
        out << mk_ismt2_pp(it->m_value.f_sgn, m, indent) << " ; " <<
            mk_ismt2_pp(it->m_value.f_sig, m, indent) << " ; " <<
            mk_ismt2_pp(it->m_value.f_exp, m, indent) << " ; " <<
            ")";
    }
    out << ")" << std::endl;
}
示例#8
0
文件: theory_fpa.cpp 项目: EinNarr/z3
    app * theory_fpa::fpa_value_proc::mk_value(model_generator & mg, ptr_vector<expr> & values) {
        ast_manager & m = m_th.get_manager();

        TRACE("t_fpa_detail", for (unsigned i = 0; i < values.size(); i++)
                                  tout << "value[" << i << "] = " << mk_ismt2_pp(values[i], m) << std::endl;);
示例#9
0
    /**
       \brief Assert the negation of q after applying the interpretation in m_curr_model to the uninterpreted symbols in q.

       The variables are replaced by skolem constants. These constants are stored in sks.
    */
    void model_checker::assert_neg_q_m(quantifier * q, expr_ref_vector & sks) {
        expr_ref tmp(m_manager);
        m_curr_model->eval(q->get_expr(), tmp, true);
        TRACE("model_checker", tout << "q after applying interpretation:\n" << mk_ismt2_pp(tmp, m_manager) << "\n";);        
示例#10
0
文件: model_evaluator.cpp 项目: zv/z3
    br_status reduce_app(func_decl * f, unsigned num, expr * const * args, expr_ref & result, proof_ref & result_pr) {
        result_pr = 0;
        family_id fid = f->get_family_id();
        if (fid == null_family_id && num == 0) {
            expr * val = m_model.get_const_interp(f);
            if (val != 0) {
                result = val;
                return BR_DONE;
            }

            if (m_model_completion) {
                sort * s   = f->get_range();
                expr * val = m_model.get_some_value(s);
                m_model.register_decl(f, val);
                result = val;
                return BR_DONE;
            }
            return BR_FAILED;
        }

        br_status st = BR_FAILED;

        if (fid == m_b_rw.get_fid()) {
            decl_kind k = f->get_decl_kind();
            if (k == OP_EQ) {
                // theory dispatch for =
                SASSERT(num == 2);
                family_id s_fid = m().get_sort(args[0])->get_family_id();
                if (s_fid == m_a_rw.get_fid())
                    st = m_a_rw.mk_eq_core(args[0], args[1], result);
                else if (s_fid == m_bv_rw.get_fid())
                    st = m_bv_rw.mk_eq_core(args[0], args[1], result);
                else if (s_fid == m_dt_rw.get_fid())
                    st = m_dt_rw.mk_eq_core(args[0], args[1], result);
                else if (s_fid == m_f_rw.get_fid())
                    st = m_f_rw.mk_eq_core(args[0], args[1], result);
                else if (s_fid == m_seq_rw.get_fid())
                    st = m_seq_rw.mk_eq_core(args[0], args[1], result);
                if (st != BR_FAILED)
                    return st;
            }
            return m_b_rw.mk_app_core(f, num, args, result);
        }

        if (fid == m_a_rw.get_fid())
            st = m_a_rw.mk_app_core(f, num, args, result);
        else if (fid == m_bv_rw.get_fid())
            st = m_bv_rw.mk_app_core(f, num, args, result);
        else if (fid == m_ar_rw.get_fid())
            st = m_ar_rw.mk_app_core(f, num, args, result);
        else if (fid == m_dt_rw.get_fid())
            st = m_dt_rw.mk_app_core(f, num, args, result);
        else if (fid == m_pb_rw.get_fid())
            st = m_pb_rw.mk_app_core(f, num, args, result);
        else if (fid == m_f_rw.get_fid())
            st = m_f_rw.mk_app_core(f, num, args, result);
        else if (fid == m_seq_rw.get_fid())
            st = m_seq_rw.mk_app_core(f, num, args, result);
        else if (evaluate(f, num, args, result)) {
            TRACE("model_evaluator", tout << "reduce_app " << f->get_name() << "\n";
                  for (unsigned i = 0; i < num; i++) tout << mk_ismt2_pp(args[i], m()) << "\n";
                  tout << "---->\n" << mk_ismt2_pp(result, m()) << "\n";);
            return BR_DONE;
        }
示例#11
0
void arith_simplifier_plugin::mk_le_ge_eq_core(expr * arg1, expr * arg2, expr_ref & result) {
    set_curr_sort(arg1);
    bool is_int = m_curr_sort->get_decl_kind() == INT_SORT;
    expr_ref_vector monomials(m_manager);
    rational k;
    TRACE("arith_eq_bug", tout << mk_ismt2_pp(arg1, m_manager) << "\n" << mk_ismt2_pp(arg2, m_manager) << "\n";);
示例#12
0
 void display(std::ostream & out) override {
     out << "(proof->proof-converter-wrapper\n" << mk_ismt2_pp(m_pr.get(), m_pr.get_manager()) << ")\n";
 }    
示例#13
0
 // Check if the number of occurrences of t is below the specified threshold :solve-eqs-max-occs
 bool check_occs(expr * t) const {
     if (m_max_occs == UINT_MAX)
         return true;
     unsigned num = 0;
     m_num_occs.find(t, num);
     TRACE("solve_eqs_check_occs", tout << mk_ismt2_pp(t, m_manager) << " num_occs: " << num << " max: " << m_max_occs << "\n";);
示例#14
0
 bool contains_unsupported(expr_ref_vector & b2a, expr_ref_vector & x2t) {
     for (unsigned x = 0; x < x2t.size(); x++) {
         if (!is_uninterp_const(x2t.get(x))) {
             TRACE("unsupported", tout << "unsupported atom:\n" << mk_ismt2_pp(x2t.get(x), m) << "\n";);
             return true;
         }
示例#15
0
 void operator()(app * n) {   
     unsigned num_args  = n->get_num_args();
     func_decl * decl   = n->get_decl();
     if (num_args != decl->get_arity() && !decl->is_associative() && 
         !decl->is_right_associative() && !decl->is_left_associative()) {
         TRACE("ws", tout << "unexpected number of arguments.\n" << mk_ismt2_pp(n, m_manager););