Example #1
0
static lbool core_chunking(sat::solver& s, sat::bool_var_vector& vars, sat::literal_vector const& asms, vector<sat::literal_vector>& conseq, unsigned K) {
    lbool r = s.check(asms.size(), asms.c_ptr());
    if (r != l_true) {
        return r;
    }
    sat::model const & m = s.get_model();
    sat::literal_vector lambda, backbones;
    for (unsigned i = 0; i < vars.size(); i++) {
        lambda.push_back(sat::literal(vars[i], m[vars[i]] == l_false));
    }
    while (!lambda.empty()) {
        IF_VERBOSE(1, verbose_stream() << "(sat-backbone-core " << lambda.size() << " " << backbones.size() << ")\n";);
        unsigned k = std::min(K, lambda.size());
        sat::literal_vector gamma, omegaN;
        for (unsigned i = 0; i < k; ++i) {
            sat::literal l = lambda[lambda.size() - i - 1];
            gamma.push_back(l);
            omegaN.push_back(~l);
        }
        while (true) {
            sat::literal_vector asms1(asms);
            asms1.append(omegaN);
            r = s.check(asms1.size(), asms1.c_ptr());
            if (r == l_true) {
                IF_VERBOSE(1, verbose_stream() << "(sat) " << omegaN << "\n";);
                prune_unfixed(lambda, s.get_model());
                break;
            }
Example #2
0
File: ddnf.cpp Project: EinNarr/z3
 ddnf_node* insert(tbv const& t) {
     SASSERT(!m_internalized);
     ptr_vector<tbv const> new_tbvs;
     new_tbvs.push_back(&t);
     for (unsigned i = 0; i < new_tbvs.size(); ++i) {
         tbv const& nt = *new_tbvs[i];
         IF_VERBOSE(10, m_tbv.display(verbose_stream() << "insert: ", nt); verbose_stream() << "\n";);
         if (contains(nt)) continue;
         ddnf_node* n = alloc(ddnf_node, *this, m_tbv, nt, m_noderefs.size());
         m_noderefs.push_back(n);
         m_nodes.insert(n);
         insert(*m_root, n, new_tbvs);
     }
Example #3
0
 void spacer_matrix::print_matrix()
 {
     verbose_stream() << "\nMatrix\n";
     for (const auto& row : m_matrix)
     {
         for (const auto& element : row)
         {
             verbose_stream() << element << ", ";
         }
         verbose_stream() << "\n";
     }
     verbose_stream() << "\n";
 }
Example #4
0
 func_decl* dl_decl_plugin::mk_store_select(decl_kind k, unsigned arity, sort* const* domain) {
     bool is_store = (k == OP_RA_STORE);
     ast_manager& m = *m_manager;
     symbol sym = is_store?m_store_sym:m_select_sym;
     sort * r = domain[0];
     if (!is_store) {
         r = m.mk_bool_sort();
     }
     ptr_vector<sort> sorts;
     if (!is_rel_sort(r, sorts)) {
         return 0;
     }
     if (sorts.size() + 1 != arity) {
         m_manager->raise_exception("wrong arity supplied to relational access");
         return 0;
     }
     for (unsigned i = 0; i < sorts.size(); ++i) {
         if (sorts[i] != domain[i+1]) {
             IF_VERBOSE(0,
                        verbose_stream() << "Domain: " << mk_pp(domain[0], m) << "\n" <<
                        mk_pp(sorts[i], m) << "\n" <<
                        mk_pp(domain[i+1], m) << "\n";);
             m_manager->raise_exception("sort miss-match for relational access");
             return 0;
         }
Example #5
0
void rewriter_core::cache_result(expr * k, expr * v) {
#if 0
    // trace for tracking cache usage
    verbose_stream() << "1 " << k->get_id() << std::endl;
#endif
    SASSERT(!m_proof_gen);

    TRACE("rewriter_cache_result", tout << mk_ismt2_pp(k, m()) << "\n--->\n" << mk_ismt2_pp(v, m()) << "\n";);
Example #6
0
 verbose_action::~verbose_action() {
     double sec = 0.0;
     if (m_sw) m_sw->stop();
     sec = m_sw?m_sw->get_seconds():0.0;
     if (sec < 0.001) sec = 0.0;
     IF_VERBOSE(m_lvl, 
                (verbose_stream() << sec << "s\n").flush();
                );
void unsat_core_learner::compute_unsat_core(proof *root, expr_set& asserted_b, expr_ref_vector& unsat_core)
{
    // transform proof in order to get a proof which is better suited for unsat-core-extraction
    proof_ref pr(root, m);

    reduce_hypotheses(pr);
    STRACE("spacer.unsat_core_learner",
           verbose_stream() << "Reduced proof:\n" << mk_ismt2_pp(pr, m) << "\n";
    );
Example #8
0
 ~imp() {
     m_watch.stop();
     double end_memory = static_cast<double>(memory::get_allocation_size())/static_cast<double>(1024*1024);
     verbose_stream() << "(" << m_id
                      << " :num-exprs " << m_goal.num_exprs()
                      << " :num-asts " << m_goal.m().get_num_asts()
                      << " :time " << std::fixed << std::setprecision(2) << m_watch.get_seconds()
                      << " :before-memory " << std::fixed << std::setprecision(2) << m_start_memory
                      << " :after-memory " << std::fixed << std::setprecision(2) << end_memory
                      << ")" << std::endl;
 }
Example #9
0
bool proof_checker::check(proof* p, expr_ref_vector& side_conditions) {
    proof_ref curr(m);
    m_todo.push_back(p);
    
    bool result = true;
    while (result && !m_todo.empty()) {
        curr = m_todo.back();
        m_todo.pop_back();
        result = check1(curr.get(), side_conditions);
        if (!result) {
            IF_VERBOSE(0, ast_ll_pp(verbose_stream() << "Proof check failed\n", m, curr.get()););            
            UNREACHABLE();
        }        
Example #10
0
void model_implicant::assign_value(expr* e, expr* val) {
    rational r;
    if (m.is_true(val)) {
        set_true(e);
    }
    else if (m.is_false(val)) {
        set_false(e);
    }
    else if (m_arith.is_numeral(val, r)) {
        set_number(e, r);
    }
    else if (m.is_value(val)) {
        set_value(e, val);
    }
    else {
        IF_VERBOSE(3, verbose_stream() << "Not evaluated " << mk_pp(e, m) << " := " << mk_pp(val, m) << "\n";);
        TRACE("pdr", tout << "Variable is not tracked: " << mk_pp(e, m) << " := " << mk_pp(val, m) << "\n";);
Example #11
0
 lbool gia_pareto::operator()() {
     expr_ref fml(m);
     lbool is_sat = m_solver->check_sat(0, 0);
     if (is_sat == l_true) {
         {
             solver::scoped_push _s(*m_solver.get());
             while (is_sat == l_true) {
                 if (m.canceled()) {
                     return l_undef;
                 }
                 m_solver->get_model(m_model);
                 m_solver->get_labels(m_labels);
                 IF_VERBOSE(1,
                            model_ref mdl(m_model);
                            cb.fix_model(mdl); 
                            model_smt2_pp(verbose_stream() << "new model:\n", m, *mdl, 0););
                 // TBD: we can also use local search to tune solution coordinate-wise.
                 mk_dominates();
                 is_sat = m_solver->check_sat(0, 0);
             }
Example #12
0
unsigned read_dimacs(char const * file_name) {
    g_start_time = clock();
    register_on_timeout_proc(on_timeout);
    signal(SIGINT, on_ctrl_c);
    params_ref p = gparams::get_module("sat");
    p.set_bool("produce_models", true);
    reslimit limit;
    sat::solver solver(p, limit, 0);
    g_solver = &solver;

    if (file_name) {
        std::ifstream in(file_name);
        if (in.bad() || in.fail()) {
            std::cerr << "(error \"failed to open file '" << file_name << "'\")" << std::endl;
            exit(ERR_OPEN_FILE);
        }
        parse_dimacs(in, solver);
    }
    else {
        parse_dimacs(std::cin, solver);
    }
    IF_VERBOSE(20, solver.display_status(verbose_stream()););
Example #13
0
 expr_ref closure::close_fml(expr* e) {
     expr* e0, *e1, *e2;
     expr_ref result(m);
     if (a.is_lt(e, e1, e2)) {
         result = a.mk_le(e1, e2);
     }
     else if (a.is_gt(e, e1, e2)) {
         result = a.mk_ge(e1, e2);
     }
     else if (m.is_not(e, e0) && a.is_ge(e0, e1, e2)) {
         result = a.mk_le(e1, e2);
     }
     else if (m.is_not(e, e0) && a.is_le(e0, e1, e2)) {
         result = a.mk_ge(e1, e2);
     }
     else if (a.is_ge(e) || a.is_le(e) || m.is_eq(e) ||
              (m.is_not(e, e0) && (a.is_gt(e0) || a.is_lt(e0)))) {
         result = e;
     }
     else {
         IF_VERBOSE(1, verbose_stream() << "Cannot close: " << mk_pp(e, m) << "\n";);
         result = m.mk_true();
     }
Example #14
0
 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());
 }
 display_benchmark();
 IF_VERBOSE(1, verbose_stream() << "(optimize:check-sat)\n";);
 lbool is_sat = s.check_sat(0,0);
 TRACE("opt", tout << "initial search result: " << is_sat << "\n";);
 if (is_sat != l_false) {
     s.get_model(m_model);
 }
 if (is_sat != l_true) {
     return is_sat;
 }
 IF_VERBOSE(1, verbose_stream() << "(optimize:sat)\n";);
 TRACE("opt", model_smt2_pp(tout, m, *m_model, 0););
 m_optsmt.setup(*m_opt_solver.get());
 update_lower();
 switch (m_objectives.size()) {
 case 0:
     return is_sat;
Example #15
0
    }

    // init goodvars 
    void local_search::init_goodvars() {
        m_goodvar_stack.reset();
        for (unsigned v = 0; v < num_vars(); ++v) {
            if (score(v) > 0) { // && conf_change[v] == true
                m_vars[v].m_in_goodvar_stack = true;
                m_goodvar_stack.push_back(v);
            }
        }
    }

    void local_search::reinit() {

        IF_VERBOSE(1, verbose_stream() << "(sat-local-search reinit)\n";);
        if (true || !m_is_pb) {
            //
            // the following methods does NOT converge for pseudo-boolean
            // can try other way to define "worse" and "better"
            // the current best noise is below 1000
            //
            if (m_best_unsat_rate > m_last_best_unsat_rate) {
                // worse
                m_noise -= m_noise * 2 * m_noise_delta;
                m_best_unsat_rate *= 1000.0;
            }
            else {
                // better
                m_noise += (10000 - m_noise) * m_noise_delta;
            }
Example #16
0
void prop_solver::assert_expr(expr * form)
{
    SASSERT(!m_in_level);
    m_contexts[0]->assert_expr(form);
    m_contexts[1]->assert_expr(form);
    IF_VERBOSE(21, verbose_stream() << "$ asserted " << mk_pp(form, m) << "\n";);
Example #17
0
    solver::solver(front_end_params & params):
        m_ast_manager(params.m_proof_mode, params.m_trace_stream),
        m_params(params),
        m_ctx(0),
        m_parser(parser::create(m_ast_manager, params.m_ignore_user_patterns)), 
        m_error_code(0) {
        m_parser->initialize_smtlib();
    }

    solver::~solver() {
        if (m_ctx)
            dealloc(m_ctx);
    }

    bool solver::solve_smt(char const * benchmark_file) {    
        IF_VERBOSE(100, verbose_stream() << "parsing...\n";);
        if (!m_parser->parse_file(benchmark_file)) {
            if (benchmark_file) {
                warning_msg("could not parse file '%s'.", benchmark_file);
            }
            else {
                warning_msg("could not parse input stream.");
            }
            m_error_code = ERR_PARSER;
            return false;
        }
        benchmark * benchmark = m_parser->get_benchmark();
        solve_benchmark(*benchmark);
        return true;
    }
Example #18
0
void report_tactic_progress(char const * id, unsigned val) {
    if (val > 0) {
        IF_VERBOSE(TACTIC_VERBOSITY_LVL, verbose_stream() << "(" << id << " " << val << ")" << std::endl;);
Example #19
0
}

static void on_timeout() {
    display_statistics();
    exit(0);
}

static void on_ctrl_c(int) {
    signal (SIGINT, SIG_DFL);
    display_statistics();
    raise(SIGINT);
}


unsigned read_datalog(char const * file) {
    IF_VERBOSE(1, verbose_stream() << "Z3 Datalog Engine\n";);
    smt_params     s_params;
    ast_manager m;
    datalog::register_engine re;
    g_overall_time.start();
    register_on_timeout_proc(on_timeout);
    signal(SIGINT, on_ctrl_c);
    params_ref params;
    params.set_sym("engine", symbol("datalog"));

    datalog::context ctx(m, re, s_params, params);
    datalog::relation_manager & rmgr = ctx.get_rel_context()->get_rmanager();
    datalog::relation_plugin & inner_plg = *rmgr.get_relation_plugin(symbol("tr_hashtable"));
    SASSERT(&inner_plg);
    rmgr.register_plugin(alloc(datalog::finite_product_relation_plugin, inner_plg, rmgr));
    
Example #20
0
    is >> x;
    is >> y;
    std::string line;
    std::getline(is, line);
}

static char const* g_file = 0;


void create_forwarding(
    char const* file, 
    datalog::ddnf_core& ddnf, 
    ptr_vector<tbv>& tbvs,
    vector<unsigned_vector>& fwd_indices) {

    IF_VERBOSE(1, verbose_stream() << "creating (and forgetting) forwarding index\n";);
    std::ifstream is(file);
    if (is.bad() || is.fail()) {
        std::cout << "could not load " << file << "\n";
        exit(0);
    }

    std::string line;
    unsigned W, M;
    read_nums(is, W, M);
    tbv_manager& tbvm = ddnf.get_tbv_manager();
    tbv* tX = tbvm.allocateX();
    unsigned_vector forwarding_set;
    for (unsigned r = 0; r < M; ++r) {
        unsigned P, K;
        read_nums(is, K, P);
Example #21
0
     sat::literal l = lambda[lambda.size() - i - 1];
     gamma.push_back(l);
     omegaN.push_back(~l);
 }
 while (true) {
     sat::literal_vector asms1(asms);
     asms1.append(omegaN);
     r = s.check(asms1.size(), asms1.c_ptr());
     if (r == l_true) {
         IF_VERBOSE(1, verbose_stream() << "(sat) " << omegaN << "\n";);
         prune_unfixed(lambda, s.get_model());
         break;
     }
     sat::literal_vector const& core = s.get_core();
     sat::literal_vector occurs;
     IF_VERBOSE(1, verbose_stream() << "(core " << core.size() << ")\n";);
     for (unsigned i = 0; i < omegaN.size(); ++i) {
         if (core.contains(omegaN[i])) {
             occurs.push_back(omegaN[i]);
         }
     }
     if (occurs.size() == 1) {
         sat::literal lit = occurs.back();
         sat::literal nlit = ~lit;
         backbones.push_back(~lit);
         back_remove(lambda, ~lit);
         back_remove(gamma, ~lit);
         s.mk_clause(1, &nlit);
     }
     for (unsigned i = 0; i < omegaN.size(); ++i) {
         if (occurs.contains(omegaN[i])) {
Example #22
0
/**
   \brief Apply local context simplification at (OR args[0] ... args[num_args-1])
   Basic idea:
   - Replace args[i] by false in the other arguments
   - If args[i] is of the form (not t), then replace t by true in the other arguments.
   To make sure the simplification is efficient we bound the depth.
*/
bool bool_rewriter::local_ctx_simp(unsigned num_args, expr * const * args, expr_ref & result) {
    expr_ref_vector old_args(m());
    expr_ref_vector new_args(m());
    expr_ref        new_arg(m());
    expr_fast_mark1 neg_lits;
    expr_fast_mark2 pos_lits;
    bool simp     = false;
    bool modified = false;
    bool forward  = true;
    unsigned rounds = 0;

    while (true) {
        rounds++;
#if 0
        if (rounds > 10)
            verbose_stream() << "rounds: " << rounds << "\n";
#endif

#define PUSH_NEW_ARG(ARG) {                     \
    new_args.push_back(ARG);                    \
    if (m().is_not(ARG))                        \
        neg_lits.mark(to_app(ARG)->get_arg(0)); \
    else                                        \
        pos_lits.mark(ARG);                     \
}

#define PROCESS_ARG()                                                                           \
        {                                                                                       \
            expr * arg = args[i];                                                               \
            if (m().is_not(arg) && m().is_or(to_app(arg)->get_arg(0)) &&                        \
                simp_nested_not_or(to_app(to_app(arg)->get_arg(0))->get_num_args(),             \
                                   to_app(to_app(arg)->get_arg(0))->get_args(),                 \
                                   neg_lits,                                                    \
                                   pos_lits,                                                    \
                                   new_arg)) {                                                  \
                modified = true; simp = true;                                                   \
                arg = new_arg;                                                                  \
            }                                                                                   \
            if (simp_nested_eq_ite(arg, neg_lits, pos_lits, new_arg)) {                         \
                modified = true; simp = true;                                                   \
                 arg = new_arg;                                                                 \
            }                                                                                   \
            if (m().is_false(arg))                                                              \
                continue;                                                                       \
            if (m().is_true(arg)) {                                                             \
                result = arg;                                                                   \
                return true;                                                                    \
            }                                                                                   \
            if (m_flat && m().is_or(arg)) {                                                     \
                unsigned sz = to_app(arg)->get_num_args();                                      \
                for (unsigned j = 0; j < sz; j++) {                                             \
                    expr * arg_arg = to_app(arg)->get_arg(j);                                   \
                    PUSH_NEW_ARG(arg_arg);                                                      \
                }                                                                               \
            }                                                                                   \
            else {                                                                              \
                PUSH_NEW_ARG(arg);                                                              \
            }                                                                                   \
        }

        m_local_ctx_cost += 2*num_args;
#if 0
        static unsigned counter = 0;
        counter++;
        if (counter % 10000 == 0)
            verbose_stream() << "local-ctx-cost: " << m_local_ctx_cost << "\n";
#endif

        if (forward) {
            for (unsigned i = 0; i < num_args; i++) {
                PROCESS_ARG();
            }
            forward = false;
        }
        else {
            unsigned i = num_args;
            while (i > 0) {
                --i;
                PROCESS_ARG();
            }
            if (!modified) {
                if (simp) {
                    result = mk_or_app(num_args, args);
                    return true;
                }
                return false; // didn't simplify
            }
            // preserve the original order...
            std::reverse(new_args.c_ptr(), new_args.c_ptr() + new_args.size());
            modified = false;
            forward  = true;
        }
        pos_lits.reset();
        neg_lits.reset();
        old_args.reset();
        old_args.swap(new_args);
        SASSERT(new_args.empty());
        args     = old_args.c_ptr();
        num_args = old_args.size();
    }
}
Example #23
0
void itp_solver::get_itp_core (expr_ref_vector &core)
{
    scoped_watch _t_ (m_itp_watch);

    typedef obj_hashtable<expr> expr_set;
    expr_set B;
    for (unsigned i = m_first_assumption, sz = m_assumptions.size(); i < sz; ++i) {
        expr *a = m_assumptions.get (i);
        app_ref def(m);
        if (is_proxy(a, def)) { B.insert(def.get()); }
        B.insert (a);
    }

    proof_ref pr(m);
    pr = get_proof ();

    if (!m_new_unsat_core) {
        // old code
        farkas_learner learner_old;
        learner_old.set_split_literals(m_split_literals);

        learner_old.get_lemmas (pr, B, core);
        elim_proxies (core);
        simplify_bounds (core); // XXX potentially redundant
    } else {
        // new code
        unsat_core_learner learner(m);

        if (m_farkas_optimized) {
            if (true) // TODO: proper options
            {
                unsat_core_plugin_farkas_lemma_optimized* plugin_farkas_lemma_optimized = alloc(unsat_core_plugin_farkas_lemma_optimized, learner,m);
                learner.register_plugin(plugin_farkas_lemma_optimized);
            }
            else
            {
                unsat_core_plugin_farkas_lemma_bounded* plugin_farkas_lemma_bounded = alloc(unsat_core_plugin_farkas_lemma_bounded, learner,m);
                learner.register_plugin(plugin_farkas_lemma_bounded);
            }

        } else {
            unsat_core_plugin_farkas_lemma* plugin_farkas_lemma = alloc(unsat_core_plugin_farkas_lemma, learner, m_split_literals, m_farkas_a_const);
            learner.register_plugin(plugin_farkas_lemma);
        }

        if (m_minimize_unsat_core) {
            unsat_core_plugin_min_cut* plugin_min_cut = alloc(unsat_core_plugin_min_cut, learner, m);
            learner.register_plugin(plugin_min_cut);
        } else {
            unsat_core_plugin_lemma* plugin_lemma = alloc(unsat_core_plugin_lemma, learner);
            learner.register_plugin(plugin_lemma);
        }

        learner.compute_unsat_core(pr, B, core);

        elim_proxies (core);
        simplify_bounds (core); // XXX potentially redundant

//            // debug
//            expr_ref_vector core2(m);
//            unsat_core_learner learner2(m);
//
//            unsat_core_plugin_farkas_lemma* plugin_farkas_lemma2 = alloc(unsat_core_plugin_farkas_lemma, learner2, m_split_literals);
//            learner2.register_plugin(plugin_farkas_lemma2);
//            unsat_core_plugin_lemma* plugin_lemma2 = alloc(unsat_core_plugin_lemma, learner2);
//            learner2.register_plugin(plugin_lemma2);
//            learner2.compute_unsat_core(pr, B, core2);
//
//            elim_proxies (core2);
//            simplify_bounds (core2);
//
//            IF_VERBOSE(2,
//                       verbose_stream () << "Itp Core:\n"
//                       << mk_pp (mk_and (core), m) << "\n";);
//            IF_VERBOSE(2,
//                       verbose_stream () << "Itp Core2:\n"
//                       << mk_pp (mk_and (core2), m) << "\n";);
        //SASSERT(mk_and (core) == mk_and (core2));
    }

    IF_VERBOSE(2,
               verbose_stream () << "Itp Core:\n"
               << mk_pp (mk_and (core), m) << "\n";);