Пример #1
0
    void operator()(goal_ref const & g, goal_ref_buffer & result) override {
        ast_manager& m(g->m());
        tactic_report report("qfufbv_ackr", *g);
        fail_if_unsat_core_generation("qfufbv_ackr", g);
        fail_if_proof_generation("qfufbv_ackr", g);

        TRACE("qfufbv_ackr_tactic", g->display(tout << "goal:\n"););
Пример #2
0
        void operator()(goal_ref const & g, 
                        goal_ref_buffer & result) {
            SASSERT(g->is_well_sorted());
            fail_if_proof_generation("occf", g);

            bool produce_models = g->models_enabled();
            tactic_report report("occf", *g);
            
            m_mc = nullptr;
            
            ptr_vector<expr> new_lits;
            
            cnstr2bvar c2b;
            
            unsigned sz = g->size();
            for (unsigned i = 0; i < sz; i++) {
                checkpoint();
                expr * f = g->form(i);
                expr_dependency * d = g->dep(i);
                if (!m.is_or(f))
                    continue;
                app * cls = to_app(f);
                if (!is_target(cls))
                    continue;
                if (produce_models && !m_mc) {
                    m_mc = alloc(generic_model_converter, m, "occf");
                    g->add(m_mc);
                }
                expr * keep = nullptr;
                new_lits.reset();
                unsigned num = cls->get_num_args();
                for (unsigned j = 0; j < num; j++) {
                    expr * l = cls->get_arg(j);
                    if (is_constraint(l)) {
                        expr * new_l = get_aux_lit(c2b, l, g);
                        if (new_l != nullptr) {
                            new_lits.push_back(new_l);
                        }
                        else if (keep == nullptr) {
                            keep = l;
                        }
                        else {
                            new_l = mk_aux_lit(c2b, l, produce_models, g);
                            new_lits.push_back(new_l);
                        }
                    }
                    else {
                        new_lits.push_back(l);
                    }
                }
                if (keep != nullptr)
                    new_lits.push_back(keep);
                g->update(i, m.mk_or(new_lits.size(), new_lits.c_ptr()), nullptr, d);
            }
            g->inc_depth();
            result.push_back(g.get());
            TRACE("occf", g->display(tout););
Пример #3
0
 virtual void operator()(goal_ref const & g, 
                         goal_ref_buffer & result, 
                         model_converter_ref & mc, 
                         proof_converter_ref & pc,
                         expr_dependency_ref & core) {
     SASSERT(g->is_well_sorted());        
     mc = 0; pc = 0; core = 0; result.reset();
     
     TRACE("sls", g->display(tout););
Пример #4
0
 virtual void operator()(goal_ref const & g, 
                         goal_ref_buffer & result, 
                         model_converter_ref & mc, 
                         proof_converter_ref & pc,
                         expr_dependency_ref & core) {
     fail_if_proof_generation("aig", g);
     mc = 0; pc = 0; core = 0;
     operator()(g);
     g->inc_depth();
     result.push_back(g.get());
 }
 virtual void operator()(goal_ref const & in, 
                         goal_ref_buffer & result, 
                         model_converter_ref & mc, 
                         proof_converter_ref & pc,
                         expr_dependency_ref & core) {
     
     mc = 0; pc = 0; core = 0;
     reduce(*(in.get()));
     in->inc_depth();
     result.push_back(in.get());
 }
Пример #6
0
void extract_clauses_and_dependencies(goal_ref const& g, expr_ref_vector& clauses, ptr_vector<expr>& assumptions, expr2expr_map& bool2dep, ref<filter_model_converter>& fmc) {
    expr2expr_map dep2bool;
    ptr_vector<expr> deps;
    ast_manager& m = g->m();
    expr_ref_vector clause(m);
    unsigned sz = g->size();
    for (unsigned i = 0; i < sz; i++) {
        expr * f            = g->form(i);
        expr_dependency * d = g->dep(i);
        if (d == 0 || !g->unsat_core_enabled()) {
            clauses.push_back(f);
        }
        else {
            // create clause (not d1 \/ ... \/ not dn \/ f) when the d's are the assumptions/dependencies of f.
            clause.reset();
            clause.push_back(f);
            deps.reset();
            m.linearize(d, deps);
            SASSERT(!deps.empty()); // d != 0, then deps must not be empty
            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) && m.is_bool(d)) {
                    // no need to create a fresh boolean variable for d
                    if (!bool2dep.contains(d)) {
                        assumptions.push_back(d);
                        bool2dep.insert(d, d);
                    }
                    clause.push_back(m.mk_not(d));
                }
                else {
                    // must normalize assumption
                    expr * b = 0;
                    if (!dep2bool.find(d, b)) {
                        b = m.mk_fresh_const(0, m.mk_bool_sort());
                        dep2bool.insert(d, b);
                        bool2dep.insert(b, d);
                        assumptions.push_back(b);
                        if (!fmc) {
                            fmc = alloc(filter_model_converter, m);
                        }
                        fmc->insert(to_app(b)->get_decl());
                    }
                    clause.push_back(m.mk_not(b));
                }
            }
            SASSERT(clause.size() > 1);
            expr_ref cls(m);
            cls = mk_or(m, clause.size(), clause.c_ptr());
            clauses.push_back(cls);
        }
    }
}
Пример #7
0
    virtual void operator()(goal_ref const & g,
        goal_ref_buffer & result,
        model_converter_ref & mc,
        proof_converter_ref & pc,
        expr_dependency_ref & core) {
        mc = 0;
        ast_manager& m(g->m());
        tactic_report report("qfufbv_ackr", *g);
        fail_if_unsat_core_generation("qfufbv_ackr", g);
        fail_if_proof_generation("qfufbv_ackr", g);

        TRACE("qfufbv_ackr_tactic", g->display(tout << "goal:\n"););
Пример #8
0
        void operator()(goal_ref const & g, 
                        goal_ref_buffer & result, 
                        model_converter_ref & mc, 
                        proof_converter_ref & pc,
                        expr_dependency_ref & core) {
            mc = 0; pc = 0; core = 0;
            bool proofs_enabled = g->proofs_enabled();

            if (proofs_enabled && m_blast_quant)
                throw tactic_exception("quantified variable blasting does not support proof generation");
            
            tactic_report report("bit-blaster", *g);
            
            TRACE("before_bit_blaster", g->display(tout););
Пример #9
0
        bool full_eval(goal_ref const & g, model & mdl) {
            bool res = true;

            unsigned sz = g->size();
            for (unsigned i = 0; i < sz && res; i++) {
                checkpoint();
                expr_ref o(m_manager);

                if (!mdl.eval(g->form(i), o, true))
                    exit(ERR_INTERNAL_FATAL);

                res = m_manager.is_true(o.get());
            }        

            TRACE("sls", tout << "Evaluation: " << res << std::endl;);
Пример #10
0
        virtual void operator()(goal_ref const & g,
                                goal_ref_buffer & result,
                                model_converter_ref & mc,
                                proof_converter_ref & pc,
                                expr_dependency_ref & core) {
            SASSERT(g->is_well_sorted());
            m_proofs_enabled      = g->proofs_enabled();
            m_produce_models      = g->models_enabled();
            m_produce_unsat_cores = g->unsat_core_enabled();

            mc = 0; pc = 0; core = 0; result.reset();
            tactic_report report("fpa2bv", *g);
            m_rw.reset();

            TRACE("fpa2bv", tout << "BEFORE: " << std::endl; g->display(tout););
Пример #11
0
 bool simplify(goal_ref const& g, pb_preproc_model_converter& mc) {
     reset();
     normalize(g);
     if (g->inconsistent()) {
         return false;
     }
     for (unsigned i = 0; i < g->size(); ++i) {
         process_vars(i, g);
     }
     
     if (m_ge.empty()) {
         return false;
     }
     
     for (unsigned i = 0; i < m_ge.size(); ++i) {
         classify_vars(i, to_app(g->form(m_ge[i])));
     }
     
     declassifier dcl(m_vars);
     expr_mark visited;        
     for (unsigned i = 0; !m_vars.empty() && i < m_other.size(); ++i) {
         for_each_expr(dcl, visited, g->form(m_other[i]));
     }
     
     if (m_vars.empty()) {
         return false;
     }
     
     // display_annotation(tout, g);
     m_progress = false;
     // first eliminate variables
     var_map::iterator it = next_resolvent(m_vars.begin()); 
     while (it != m_vars.end()) {            
         app * e = it->m_key;
         rec const& r = it->m_value;
         TRACE("pb", tout << mk_pp(e, m) << " " << r.pos.size() << " " << r.neg.size() << "\n";);
         if (r.pos.empty()) {                
             replace(r.neg, e, m.mk_false(), g);
             mc.set_value(e, false);
         }
         else if (r.neg.empty()) {
             replace(r.pos, e, m.mk_true(), g);
             mc.set_value(e, true);
         }
         if (g->inconsistent()) return false;
         ++it;
         it = next_resolvent(it);
     }        
Пример #12
0
        void operator()(goal_ref const & g, 
                        goal_ref_buffer & result, 
                        model_converter_ref & mc, 
                        proof_converter_ref & pc,
                        expr_dependency_ref & core) {
            SASSERT(g->is_well_sorted());
            mc = 0; pc = 0; core = 0;
            tactic_report report("horn", *g);
            bool produce_proofs = g->proofs_enabled();

            if (produce_proofs) {                
                if (!m_ctx.get_params().generate_proof_trace()) {
                    params_ref params = m_ctx.get_params().p;
                    params.set_bool("generate_proof_trace", true);
                    updt_params(params);
                }
            }

            unsigned sz = g->size();
            expr_ref q(m), f(m);
            expr_ref_vector queries(m);
            std::stringstream msg;

            m_ctx.reset();
            m_ctx.ensure_opened();

            for (unsigned i = 0; i < sz; i++) {
                f = g->form(i);
                formula_kind k = get_formula_kind(f);
                switch(k) {
                case IS_RULE:
                    m_ctx.add_rule(f, symbol::null);
                    break;
                case IS_QUERY:
                    queries.push_back(f);
                    break;
                default: 
                    msg << "formula is not in Horn fragment: " << mk_pp(g->form(i), m) << "\n";
                    TRACE("horn", tout << msg.str(););
                    throw tactic_exception(msg.str().c_str());
                }
            }
Пример #13
0
 void reduce_core(goal_ref const& g, goal_ref_buffer& result) {
     init(g);
     m_context.push();
     assert_clauses(g);
     m_context.push();   // internalize assertions. 
     prune_clauses();
     goal_ref r(g);
     insert_result(r);
     r->elim_true();
     result.push_back(r.get());        
     m_context.pop(2);
     TRACE("unit_subsumption_tactic", g->display(tout); r->display(tout););
Пример #14
0
    virtual void operator()(
        goal_ref const & g, 
        goal_ref_buffer & result, 
        model_converter_ref & mc, 
        proof_converter_ref & pc,
        expr_dependency_ref & core) {
        SASSERT(g->is_well_sorted());
        pc = 0; core = 0;

        if (g->proofs_enabled()) {
            throw tactic_exception("pb-preprocess does not support proofs");
        }

        pb_preproc_model_converter* pp = alloc(pb_preproc_model_converter, m);
        mc = pp;

        g->inc_depth();        
        result.push_back(g.get());       
        while (simplify(g, *pp));
        // decompose(g);
    }
Пример #15
0
    void operator()(goal_ref const & g, goal_ref_buffer & result,
                    model_converter_ref & mc, proof_converter_ref & pc,
                    expr_dependency_ref & core) override {
        mc = nullptr;
        tactic_report report("collect-statistics", *g);

        collect_proc cp(m, m_stats);
        expr_mark visited;
        const unsigned sz = g->size();
        for (unsigned i = 0; i < sz; i++)
            for_each_expr(cp, visited, g->form(i));

        std::cout << "(" << std::endl;
        stats_type::iterator it = m_stats.begin();
        stats_type::iterator end = m_stats.end();
        for (; it != end; it++)
            std::cout << " :" << it->first << "    " << it->second << std::endl;
        std::cout << ")" << std::endl;

        g->inc_depth();
        result.push_back(g.get());
    }
Пример #16
0
 void operator()(goal_ref const & g, 
                 goal_ref_buffer & result, 
                 model_converter_ref & mc, 
                 proof_converter_ref & pc,
                 expr_dependency_ref & core) {
     mc = 0; pc = 0; core = 0;
     
     if (!is_target(*g))
         throw tactic_exception("bv1 blaster cannot be applied to goal");
     
     tactic_report report("bv1-blaster", *g);
     m_num_steps = 0;
     
     bool proofs_enabled = g->proofs_enabled();
     expr_ref   new_curr(m());
     proof_ref  new_pr(m());
     unsigned   size = g->size();
     for (unsigned idx = 0; idx < size; idx++) {
         if (g->inconsistent())
             break;
         expr * curr = g->form(idx);
         m_rw(curr, new_curr, new_pr);
         m_num_steps += m_rw.get_num_steps();
         if (proofs_enabled) {
             proof * pr = g->pr(idx);
             new_pr     = m().mk_modus_ponens(pr, new_pr);
         }
         g->update(idx, new_curr, new_pr, g->dep(idx));
     }
     
     if (g->models_enabled())
         mc = mk_bv1_blaster_model_converter(m(), m_rw.cfg().m_const2bits);
     g->inc_depth();
     result.push_back(g.get());
     m_rw.cfg().cleanup();
 }
Пример #17
0
 virtual void operator()(goal_ref const & in, 
                         goal_ref_buffer & result, 
                         model_converter_ref & mc, 
                         proof_converter_ref & pc,
                         expr_dependency_ref & core) {
     double val = (*m_p)(*(in.get())).get_value();
     #pragma omp critical (probe_value_tactic)
     {
         if (m_msg)
             m_ctx.diagnostic_stream() << m_msg << " ";
         m_ctx.diagnostic_stream() << val;
         if (m_newline)
             m_ctx.diagnostic_stream() << std::endl;
     }
     skip_tactic::operator()(in, result, mc, pc, core);
 }
Пример #18
0
 void operator()(goal_ref const & g, 
                 goal_ref_buffer & result) {
     tactic_report report("add-bounds", *g);
     bound_manager bm(m);
     expr_fast_mark1 visited;
     add_bound_proc proc(bm, *(g.get()), m_lower, m_upper);
     unsigned sz = g->size();
     for (unsigned i = 0; i < sz; i++)
         quick_for_each_expr(proc, visited, g->form(i));
     visited.reset();
     g->inc_depth();
     result.push_back(g.get());
     if (proc.m_num_bounds > 0) 
         g->updt_prec(goal::UNDER);
     report_tactic_progress(":added-bounds", proc.m_num_bounds);
     TRACE("add_bounds", g->display(tout););
Пример #19
0
 void operator()(goal_ref const & g,
                 goal_ref_buffer & result,
                 model_converter_ref & mc,
                 proof_converter_ref & pc,
                 expr_dependency_ref & core) override {
     mc = nullptr; pc = nullptr; core = nullptr;
     bool produce_proofs = g->proofs_enabled();
     tactic_report report("dt2bv", *g);
     unsigned   size = g->size();
     expr_fast_mark1 visited;
     check_fd proc(*this);
     for (unsigned i = 0; i < size; ++i) {
         quick_for_each_expr(proc, visited, g->form(i));
     }
     obj_hashtable<sort>::iterator it = m_non_fd_sorts.begin(), end = m_non_fd_sorts.end();
     for (; it != end; ++it) {
         m_fd_sorts.remove(*it);
     }
     if (!m_fd_sorts.empty()) {
         ref<extension_model_converter> ext = alloc(extension_model_converter, m);
         ref<filter_model_converter> filter = alloc(filter_model_converter, m);
         enum2bv_rewriter rw(m, m_params);
         rw.set_is_fd(&m_is_fd);            
         expr_ref   new_curr(m);
         proof_ref  new_pr(m);
         for (unsigned idx = 0; idx < size; idx++) {
             rw(g->form(idx), new_curr, new_pr);
             if (produce_proofs) {
                 proof * pr = g->pr(idx);
                 new_pr = m.mk_modus_ponens(pr, new_pr);
             }
             g->update(idx, new_curr, new_pr, g->dep(idx));
         }
         expr_ref_vector bounds(m);
         rw.flush_side_constraints(bounds);
         for (unsigned i = 0; i < bounds.size(); ++i) {
             g->assert_expr(bounds[i].get());
         }
         {
             obj_map<func_decl, func_decl*>::iterator it = rw.enum2bv().begin(), end = rw.enum2bv().end();
             for (; it != end; ++it) {
                 filter->insert(it->m_value);
             }
         }
         {
             obj_map<func_decl, expr*>::iterator it = rw.enum2def().begin(), end = rw.enum2def().end();
             for (; it != end; ++it) {
                 ext->insert(it->m_key, it->m_value);
             }
         }
         
         mc = concat(filter.get(), ext.get());
         report_tactic_progress(":fd-num-translated", rw.num_translated());
     }
     g->inc_depth();
     result.push_back(g.get());
     TRACE("dt2bv", g->display(tout););
 virtual void operator()(goal_ref const & g, 
                         goal_ref_buffer & result, 
                         model_converter_ref & mc, 
                         proof_converter_ref & pc,
                         expr_dependency_ref & core) {
     SASSERT(g->is_well_sorted());
     ast_manager & m = g->m();
     bool produce_proofs = g->proofs_enabled();
     rw r(m, produce_proofs);
     #pragma omp critical (tactic_cancel)
     {
         m_rw = &r;
     }
     mc = 0; pc = 0; core = 0; result.reset();
     tactic_report report("distribute-forall", *g);
     
     expr_ref   new_curr(m);
     proof_ref  new_pr(m);
     unsigned size = g->size();
     for (unsigned idx = 0; idx < size; idx++) {
         if (g->inconsistent())
             break;
         expr * curr = g->form(idx);
         r(curr, new_curr, new_pr);
         if (g->proofs_enabled()) {
             proof * pr = g->pr(idx);
             new_pr     = m.mk_modus_ponens(pr, new_pr);
         }
         g->update(idx, new_curr, new_pr, g->dep(idx));
     }
     
     g->inc_depth();
     result.push_back(g.get());
     TRACE("distribute-forall", g->display(tout););
Пример #21
0
        void operator()(goal_ref const & g, 
                        goal_ref_buffer & result, 
                        model_converter_ref & mc, 
                        proof_converter_ref & pc,
                        expr_dependency_ref & core) {
            SASSERT(g->is_well_sorted());
            mc = 0; pc = 0; core = 0;
            tactic_report report("elim-term-ite", *g);
            bool produce_proofs = g->proofs_enabled();
            m_rw.cfg().m_produce_models = g->models_enabled();

            m_rw.m_cfg.m_num_fresh = 0;
            m_rw.m_cfg.m_goal = g.get();
            expr_ref   new_curr(m);
            proof_ref  new_pr(m);
            unsigned   size = g->size();
            for (unsigned idx = 0; idx < size; idx++) {
                expr * curr = g->form(idx);
                m_rw(curr, new_curr, new_pr);
                if (produce_proofs) {
                    proof * pr = g->pr(idx);
                    new_pr     = m.mk_modus_ponens(pr, new_pr);
                }
                g->update(idx, new_curr, new_pr, g->dep(idx));
            }
            mc = m_rw.m_cfg.m_mc.get();
            report_tactic_progress(":elim-term-ite-consts", m_rw.m_cfg.m_num_fresh);
            g->inc_depth();
            result.push_back(g.get());
            TRACE("elim_term_ite", g->display(tout););
Пример #22
0
        void operator()(goal_ref const & g, 
                        goal_ref_buffer & result, 
                        model_converter_ref & mc, 
                        proof_converter_ref & pc,
                        expr_dependency_ref & core) {
            SASSERT(g->is_well_sorted());
            mc = 0; pc = 0; core = 0;
            tactic_report report("qe", *g);
            m_fparams.m_model = g->models_enabled();
            proof_ref new_pr(m);
            expr_ref new_f(m);
            bool produce_proofs = g->proofs_enabled();

            unsigned sz = g->size();
            for (unsigned i = 0; i < sz; i++) {
                checkpoint();
                if (g->inconsistent())
                    break;
                expr * f = g->form(i);
                if (!has_quantifiers(f))
                    continue;
                m_qe(m.mk_true(), f, new_f);
                new_pr = 0;
                if (produce_proofs) {
                    new_pr = m.mk_modus_ponens(g->pr(i), new_pr);
                }
                g->update(i, new_f, new_pr, g->dep(i));                
            }
            g->inc_depth();
            result.push_back(g.get());
            TRACE("qe", g->display(tout););
Пример #23
0
    virtual void operator()(goal_ref const & in,
                            goal_ref_buffer & result,
                            model_converter_ref & mc,
                            proof_converter_ref & pc,
                            expr_dependency_ref & core) {

        bool models_enabled = in->models_enabled();
        bool proofs_enabled = in->proofs_enabled();
        bool cores_enabled  = in->unsat_core_enabled();

        ast_manager & m = in->m();
        goal_ref_buffer      r1;
        model_converter_ref mc1;
        proof_converter_ref pc1;
        expr_dependency_ref core1(m);
        result.reset();
        mc   = 0;
        pc   = 0;
        core = 0;
        m_t1->operator()(in, r1, mc1, pc1, core1);
        SASSERT(!is_decided(r1) || (!pc1 && !core1)); // the pc and core of decided goals is 0
        unsigned r1_size = r1.size();
        SASSERT(r1_size > 0);
        checkpoint();
        if (r1_size == 1) {
            if (r1[0]->is_decided()) {
                result.push_back(r1[0]);
                if (models_enabled) mc = mc1;
                SASSERT(!pc); SASSERT(!core);
                return;
            }
            goal_ref r1_0 = r1[0];
            m_t2->operator()(r1_0, result, mc, pc, core);
            if (models_enabled) mc = concat(mc1.get(), mc.get());
            if (proofs_enabled) pc = concat(pc1.get(), pc.get());
            if (cores_enabled) core = m.mk_join(core1.get(), core);
        }
        else {
            if (cores_enabled) core = core1;
            proof_converter_ref_buffer pc_buffer;
            model_converter_ref_buffer mc_buffer;
            sbuffer<unsigned>          sz_buffer;
            goal_ref_buffer            r2;
            for (unsigned i = 0; i < r1_size; i++) {
                checkpoint();
                goal_ref g = r1[i];
                r2.reset();
                model_converter_ref mc2;
                proof_converter_ref pc2;
                expr_dependency_ref  core2(m);
                m_t2->operator()(g, r2, mc2, pc2, core2);
                if (is_decided(r2)) {
                    SASSERT(r2.size() == 1);
                    if (is_decided_sat(r2)) {
                        // found solution...
                        result.push_back(r2[0]);
                        if (models_enabled) {
                            // mc2 contains the actual model
                            model_ref md;
                            md = alloc(model, m);
                            apply(mc2, md, 0);
                            apply(mc1, md, i);
                            mc   = model2model_converter(md.get());
                        }
                        SASSERT(!pc); SASSERT(!core);
                        return;
                    }
                    else {
                        SASSERT(is_decided_unsat(r2));
                        // the proof and unsat core of a decided_unsat goal are stored in the node itself.
                        // pc2 and core2 must be 0.
                        SASSERT(!pc2);
                        SASSERT(!core2);
                        if (models_enabled) mc_buffer.push_back(0);
                        if (proofs_enabled) pc_buffer.push_back(proof2proof_converter(m, r2[0]->pr(0)));
                        if (models_enabled || proofs_enabled) sz_buffer.push_back(0);
                        if (cores_enabled) core = m.mk_join(core.get(), r2[0]->dep(0));
                    }
                }
                else {
                    result.append(r2.size(), r2.c_ptr());
                    if (models_enabled) mc_buffer.push_back(mc2.get());
                    if (proofs_enabled) pc_buffer.push_back(pc2.get());
                    if (models_enabled || proofs_enabled) sz_buffer.push_back(r2.size());
                    if (cores_enabled) core = m.mk_join(core.get(), core2.get());
                }
            }

            if (result.empty()) {
                // all subgoals were shown to be unsat.
                // create an decided_unsat goal with the proof
                in->reset_all();
                proof_ref pr(m);
                if (proofs_enabled)
                    apply(m, pc1, pc_buffer, pr);
                SASSERT(cores_enabled || core == 0);
                in->assert_expr(m.mk_false(), pr, core);
                core = 0;
                result.push_back(in.get());
                SASSERT(!mc); SASSERT(!pc); SASSERT(!core);
            }
            else {
                if (models_enabled) mc = concat(mc1.get(), mc_buffer.size(), mc_buffer.c_ptr(), sz_buffer.c_ptr());
                if (proofs_enabled) pc = concat(pc1.get(), pc_buffer.size(), pc_buffer.c_ptr(), sz_buffer.c_ptr());
                SASSERT(cores_enabled || core == 0);
            }
        }
    }
Пример #24
0
    void operator()(goal_ref const & g) {
        SASSERT(g->is_well_sorted());
        tactic_report report("aig", *g);

        mk_aig_manager mk(*this, g->m());
        if (m_aig_per_assertion) {
            for (unsigned i = 0; i < g->size(); i++) {
                aig_ref r = m_aig_manager->mk_aig(g->form(i));
                m_aig_manager->max_sharing(r);
                expr_ref new_f(g->m());
                m_aig_manager->to_formula(r, new_f);
                expr_dependency * ed = g->dep(i);
                g->update(i, new_f, 0, ed);
            }
        }
        else {
            fail_if_unsat_core_generation("aig", g);
            aig_ref r = m_aig_manager->mk_aig(*(g.get()));
            g->reset(); // save memory
            m_aig_manager->max_sharing(r);
            m_aig_manager->to_formula(r, *(g.get()));
        }
        SASSERT(g->is_well_sorted());
    }
Пример #25
0
    virtual void operator()(
        goal_ref const & g, 
        goal_ref_buffer & result, 
        model_converter_ref & mc, 
        proof_converter_ref & pc,
        expr_dependency_ref & core) {
        SASSERT(g->is_well_sorted());
        mc = 0; pc = 0; core = 0;
        m_trail.reset();
        m_fd.reset();
        m_max.reset();
        m_nonfd.reset();
        m_bounds.reset();
        ref<bvmc> mc1 = alloc(bvmc);

        tactic_report report("eq2bv", *g);

        m_bounds(*g);

        for (unsigned i = 0; i < g->size(); i++) {            
            collect_fd(g->form(i));
        }
        cleanup_fd(mc1);
        
        if (m_max.empty()) {
            result.push_back(g.get());
            return;
        }

        for (unsigned i = 0; i < g->size(); i++) {            
            expr_ref   new_curr(m);
            proof_ref  new_pr(m);  
            if (is_bound(g->form(i))) {
                g->update(i, m.mk_true(), 0, 0);
                continue;
            }
            m_rw(g->form(i), new_curr, new_pr);
            if (m.proofs_enabled() && !new_pr) {
                new_pr = m.mk_rewrite(g->form(i), new_curr);
                new_pr = m.mk_modus_ponens(g->pr(i), new_pr);
            }
            g->update(i, new_curr, new_pr, g->dep(i));
        }
        obj_map<expr, unsigned>::iterator it = m_max.begin(), end = m_max.end();
        for (; it != end; ++it) {
            expr* c = it->m_key;
            bool strict;
            rational r;
            if (m_bounds.has_lower(c, r, strict)) {
                SASSERT(!strict);
                expr* d = m_fd.find(c);
                g->assert_expr(bv.mk_ule(bv.mk_numeral(r, m.get_sort(d)), d), m_bounds.lower_dep(c));
            }
            if (m_bounds.has_upper(c, r, strict)) {
                SASSERT(!strict);
                expr* d = m_fd.find(c);
                g->assert_expr(bv.mk_ule(d, bv.mk_numeral(r, m.get_sort(d))), m_bounds.upper_dep(c));
            }
        }        
        g->inc_depth();
        mc = mc1.get();
        result.push_back(g.get());
        TRACE("pb", g->display(tout););
Пример #26
0
 void operator()(goal_ref const & g, goal_ref_buffer& result) override {
     TRACE("sine", g->display(tout););
Пример #27
0
 void mk_proof(proof_ref& pr, goal_ref const& s, unsigned i, unsigned j) {
     if (s->proofs_enabled()) {
         proof* th_lemma = m.mk_th_lemma(a.get_family_id(), m.mk_implies(s->form(i), s->form(j)), 0, 0);
         pr = m.mk_modus_ponens(s->pr(i), th_lemma);
     }        
 }