コード例 #1
0
ファイル: dl_mk_coalesce.cpp プロジェクト: kayceesrk/Z3
    void mk_coalesce::merge_rules(rule_ref& tgt, rule const& src) {
        SASSERT(same_body(*tgt.get(), src));
        m_sub1.reset();
        m_sub2.reset();
        m_idx = 0;
        app_ref pred(m), head(m);
        expr_ref fml1(m), fml2(m), fml(m);
        app_ref_vector tail(m);
        ptr_vector<sort> sorts1, sorts2;
        expr_ref_vector conjs1(m), conjs(m);
        rule_ref res(rm);
        bool_rewriter bwr(m);
        svector<bool> is_neg;
        tgt->get_vars(sorts1);
        src.get_vars(sorts2);

        mk_pred(head, src.get_head(), tgt->get_head()); 
        for (unsigned i = 0; i < src.get_uninterpreted_tail_size(); ++i) {
            mk_pred(pred, src.get_tail(i), tgt->get_tail(i));
            tail.push_back(pred);
            is_neg.push_back(src.is_neg_tail(i));
        }           
        extract_conjs(m_sub1, src, fml1);
        extract_conjs(m_sub2, *tgt.get(),  fml2);
        bwr.mk_or(fml1, fml2, fml);
        SASSERT(is_app(fml));
        tail.push_back(to_app(fml));
        is_neg.push_back(false);
        res = rm.mk(head, tail.size(), tail.c_ptr(), is_neg.c_ptr(), tgt->name());
        if (m_ctx.generate_proof_trace()) {
            src.to_formula(fml1);
            tgt->to_formula(fml2);
            res->to_formula(fml);
#if 0
            sort* ps = m.mk_proof_sort();
            sort* domain[3] = { ps, ps, m.mk_bool_sort() };
            func_decl* merge = m.mk_func_decl(symbol("merge-clauses"), 3, domain, ps);  // TBD: ad-hoc proof rule
            expr* args[3] = { m.mk_asserted(fml1), m.mk_asserted(fml2), fml };
            // ...m_pc->insert(m.mk_app(merge, 3, args));
#else
            svector<std::pair<unsigned, unsigned> > pos;
            vector<expr_ref_vector> substs;
            proof* p = src.get_proof();
            p = m.mk_hyper_resolve(1, &p, fml, pos, substs);
            res->set_proof(m, p);
#endif
        }
        tgt = res;
    }
コード例 #2
0
ファイル: bv_decl_plugin.cpp プロジェクト: NikolajBjorner/z3
func_decl * bv_decl_plugin::mk_func_decl(decl_kind k, unsigned bv_size) {
    switch (k) {
    case OP_BNEG:     return mk_unary(m_bv_neg, k, "bvneg", bv_size);
    case OP_BADD:     return mk_binary(m_bv_add, k, "bvadd", bv_size, true);
    case OP_BSUB:     return mk_binary(m_bv_sub, k, "bvsub", bv_size, false);
    case OP_BMUL:     return mk_binary(m_bv_mul, k, "bvmul", bv_size, true);
    case OP_BSDIV:    return mk_binary(m_bv_sdiv, k, "bvsdiv", bv_size, false);
    case OP_BUDIV:    return mk_binary(m_bv_udiv, k, "bvudiv", bv_size, false);
    case OP_BSREM:    return mk_binary(m_bv_srem, k, "bvsrem", bv_size, false);
    case OP_BUREM:    return mk_binary(m_bv_urem, k, "bvurem", bv_size, false);
    case OP_BSMOD:    return mk_binary(m_bv_smod, k, "bvsmod", bv_size, false);
    case OP_BSDIV0:   return mk_unary(m_bv_sdiv0, k, "bvsdiv0", bv_size);
    case OP_BUDIV0:   return mk_unary(m_bv_udiv0, k, "bvudiv0", bv_size);
    case OP_BSREM0:   return mk_unary(m_bv_srem0, k, "bvsrem0", bv_size);
    case OP_BUREM0:   return mk_unary(m_bv_urem0, k, "bvurem0", bv_size);
    case OP_BSMOD0:   return mk_unary(m_bv_smod0, k, "bvsmod0", bv_size);
    case OP_BSDIV_I:  return mk_binary(m_bv_sdiv_i, k, "bvsdiv_i", bv_size, false);
    case OP_BUDIV_I:  return mk_binary(m_bv_udiv_i, k, "bvudiv_i", bv_size, false);
    case OP_BSREM_I:  return mk_binary(m_bv_srem_i, k, "bvsrem_i", bv_size, false);
    case OP_BUREM_I:  return mk_binary(m_bv_urem_i, k, "bvurem_i", bv_size, false);
    case OP_BSMOD_I:  return mk_binary(m_bv_smod_i, k, "bvsmod_i", bv_size, false);
    case OP_ULEQ:     return mk_pred(m_bv_uleq, k, "bvule", bv_size);
    case OP_SLEQ:     return mk_pred(m_bv_sleq, k, "bvsle", bv_size);
    case OP_UGEQ:     return mk_pred(m_bv_ugeq, k, "bvuge", bv_size);
    case OP_SGEQ:     return mk_pred(m_bv_sgeq, k, "bvsge", bv_size);
    case OP_ULT:      return mk_pred(m_bv_ult, k, "bvult", bv_size);
    case OP_SLT:      return mk_pred(m_bv_slt, k, "bvslt", bv_size);
    case OP_UGT:      return mk_pred(m_bv_ugt, k, "bvugt", bv_size);
    case OP_SGT:      return mk_pred(m_bv_sgt, k, "bvsgt", bv_size);

    case OP_BAND:     return mk_binary(m_bv_and, k, "bvand", bv_size, true, true);
    case OP_BOR:      return mk_binary(m_bv_or, k, "bvor", bv_size, true, true);
    case OP_BNOT:     return mk_unary(m_bv_not, k, "bvnot", bv_size);
    case OP_BXOR:     return mk_binary(m_bv_xor, k, "bvxor", bv_size, true);
    case OP_BNAND:    return mk_binary(m_bv_nand, k, "bvnand", bv_size, false);
    case OP_BNOR:     return mk_binary(m_bv_nor, k, "bvnor", bv_size, false);
    case OP_BXNOR:    return mk_binary(m_bv_xnor, k, "bvxnor", bv_size, false);

    case OP_BREDOR:   return mk_reduction(m_bv_redor, k, "bvredor", bv_size);
    case OP_BREDAND:  return mk_reduction(m_bv_redand, k, "bvredand", bv_size);
    case OP_BCOMP:    return mk_comp(bv_size);
    case OP_BUMUL_NO_OVFL: return mk_pred(m_bv_mul_ovfl, k, "bvumul_noovfl", bv_size);
    case OP_BSMUL_NO_OVFL: return mk_pred(m_bv_smul_ovfl, k, "bvsmul_noovfl", bv_size);
    case OP_BSMUL_NO_UDFL: return mk_pred(m_bv_smul_udfl, k, "bvsmul_noudfl", bv_size);

    case OP_BSHL:     return mk_binary(m_bv_shl, k, "bvshl", bv_size, false);
    case OP_BLSHR:    return mk_binary(m_bv_lshr, k, "bvlshr", bv_size, false);
    case OP_BASHR:    return mk_binary(m_bv_ashr, k, "bvashr", bv_size, false);

    case OP_EXT_ROTATE_LEFT: return mk_binary(m_ext_rotate_left, k, "ext_rotate_left", bv_size, false);
    case OP_EXT_ROTATE_RIGHT: return mk_binary(m_ext_rotate_right, k, "ext_rotate_right", bv_size, false);
    default:          return nullptr;
    }
}