示例#1
0
    lbool check_sat(unsigned sz, expr * const * assumptions, double const* weights, double max_weight) {
        m_weights.reset();
        if (weights != 0) {
            m_weights.append(sz, weights);
        }
        SASSERT(m_weights.empty() == (m_weights.c_ptr() == 0));
        m_solver.pop_to_base_level();
        dep2asm_t dep2asm;
        m_model = 0;
        lbool r = internalize_formulas();
        if (r != l_true) return r;
        r = internalize_assumptions(sz, assumptions, dep2asm);
        if (r != l_true) return r;

        r = m_solver.check(m_asms.size(), m_asms.c_ptr(), m_weights.c_ptr(), max_weight);
        switch (r) {
        case l_true:
            if (sz > 0 && !weights) {
                check_assumptions(dep2asm);
            }
            break;
        case l_false:
            // TBD: expr_dependency core is not accounted for.
            if (!m_asms.empty()) {
                extract_core(dep2asm);
            }
            break;
        default:
            break;
        }
        return r;
    }
示例#2
0
 virtual void push() {
     internalize_formulas();
     m_solver.user_push();
     ++m_num_scopes;
     m_fmls_lim.push_back(m_fmls.size());
     m_asms_lim.push_back(m_asmsf.size());
     m_fmls_head_lim.push_back(m_fmls_head);
     if (m_bb_rewriter) m_bb_rewriter->push();
     m_map.push();
 }
示例#3
0
 void display_weighted(std::ostream& out, unsigned sz, expr * const * assumptions, unsigned const* weights) {
     m_weights.reset();
     if (weights != 0) {
         for (unsigned i = 0; i < sz; ++i) m_weights.push_back(weights[i]);
     }
     m_solver.pop_to_base_level();
     dep2asm_t dep2asm;
     VERIFY(l_true == internalize_formulas());
     VERIFY(l_true == internalize_assumptions(sz, assumptions, dep2asm));
     svector<unsigned> nweights;
     for (unsigned i = 0; i < m_asms.size(); ++i) {
         nweights.push_back((unsigned) m_weights[i]);
     }
     m_solver.display_wcnf(out, m_asms.size(), m_asms.c_ptr(), nweights.c_ptr());
 }
示例#4
0
 void display_weighted(std::ostream& out, unsigned sz, expr * const * assumptions, unsigned const* weights) {
     if (weights != nullptr) {
         for (unsigned i = 0; i < sz; ++i) m_weights.push_back(weights[i]);
     }
     init_preprocess();
     m_solver.pop_to_base_level();
     dep2asm_t dep2asm;
     expr_ref_vector asms(m);
     for (unsigned i = 0; i < sz; ++i) {
         expr_ref a(m.mk_fresh_const("s", m.mk_bool_sort()), m);
         expr_ref fml(m.mk_implies(a, assumptions[i]), m);
         assert_expr(fml);
         asms.push_back(a);
     }
     VERIFY(l_true == internalize_formulas());
     VERIFY(l_true == internalize_assumptions(sz, asms.c_ptr(), dep2asm));
     svector<unsigned> nweights;
     for (unsigned i = 0; i < m_asms.size(); ++i) {
         nweights.push_back((unsigned) m_weights[i]);
     }
     m_weights.reset();
     m_solver.display_wcnf(out, m_asms.size(), m_asms.c_ptr(), nweights.c_ptr());
 }
示例#5
0
            if (!is_literal(assumptions[i])) {
                expr_ref a(m.mk_fresh_const("s", m.mk_bool_sort()), m);
                expr_ref fml(m.mk_eq(a, assumptions[i]), m);
                assert_expr(fml);
                _assumptions.push_back(a);
                asm2fml.insert(a, assumptions[i]);
            }
            else {
                _assumptions.push_back(assumptions[i]);
                asm2fml.insert(assumptions[i], assumptions[i]);
            }
        }

        TRACE("sat", tout << _assumptions << "\n";);
        dep2asm_t dep2asm;
        lbool r = internalize_formulas();
        if (r != l_true) return r;
        r = internalize_assumptions(sz, _assumptions.c_ptr(), dep2asm);
        if (r != l_true) return r;

        init_reason_unknown();
        m_internalized_converted = false;
        try {
            // IF_VERBOSE(0, m_solver.display(verbose_stream()));
            r = m_solver.check(m_asms.size(), m_asms.c_ptr());
        }
        catch (z3_exception& ex) {
            IF_VERBOSE(10, verbose_stream() << "exception: " << ex.msg() << "\n";);
            r = l_undef;            
        }
        switch (r) {