3
0
Fork 0
mirror of https://github.com/Z3Prover/z3 synced 2025-04-24 01:25:31 +00:00

working on adding basic cores to efficient SAT solver

Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
This commit is contained in:
Nikolaj Bjorner 2014-07-29 07:22:59 -07:00
parent 96dc933c99
commit e98acf4ece
8 changed files with 203 additions and 30 deletions

View file

@ -22,6 +22,7 @@ Revision History:
#include"timeout.h"
#include"dimacs.h"
#include"sat_solver.h"
#include"gparams.h"
extern bool g_display_statistics;
static sat::solver * g_solver = 0;
@ -63,11 +64,73 @@ static void display_model(sat::solver const & s) {
std::cout << "\n";
}
static void display_core(sat::solver const& s, vector<sat::literal_vector> const& tracking_clauses) {
std::cout << "core\n";
sat::literal_vector const& c = s.get_core();
for (unsigned i = 0; i < c.size(); ++i) {
sat::literal_vector const& cls = tracking_clauses[c[i].var()];
for (unsigned j = 0; j < cls.size(); ++j) {
std::cout << cls[j] << " ";
}
std::cout << "\n";
}
}
static void track_clause(sat::solver& dst,
sat::literal_vector& lits,
sat::literal_vector& assumptions,
vector<sat::literal_vector>& tracking_clauses) {
sat::literal lit = sat::literal(dst.mk_var(true, false), false);
tracking_clauses.set(lit.var(), lits);
lits.push_back(~lit);
dst.mk_clause(lits.size(), lits.c_ptr());
assumptions.push_back(lit);
}
static void track_clauses(sat::solver const& src,
sat::solver& dst,
sat::literal_vector& assumptions,
vector<sat::literal_vector>& tracking_clauses) {
for (sat::bool_var v = 0; v < src.num_vars(); ++v) {
dst.mk_var(false, true);
}
sat::literal_vector lits;
sat::literal lit;
sat::clause * const * it = src.begin_clauses();
sat::clause * const * end = src.end_clauses();
svector<sat::solver::bin_clause> bin_clauses;
src.collect_bin_clauses(bin_clauses, false);
tracking_clauses.reserve(2*src.num_vars() + (end - it) + bin_clauses.size());
for (sat::bool_var v = 1; v < src.num_vars(); ++v) {
if (src.value(v) != l_undef) {
bool sign = src.value(v) == l_false;
lits.reset();
lits.push_back(sat::literal(v, sign));
track_clause(dst, lits, assumptions, tracking_clauses);
}
}
for (; it != end; ++it) {
lits.reset();
sat::clause& cls = *(*it);
lits.append(cls.end()-cls.begin(), cls.begin());
track_clause(dst, lits, assumptions, tracking_clauses);
}
for (unsigned i = 0; i < bin_clauses.size(); ++i) {
lits.reset();
lits.push_back(bin_clauses[i].first);
lits.push_back(bin_clauses[i].second);
track_clause(dst, lits, assumptions, tracking_clauses);
}
}
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;
params_ref p = gparams::get_module("sat");
p.set_bool("produce_models", true);
sat::solver solver(p, 0);
g_solver = &solver;
@ -85,17 +148,32 @@ unsigned read_dimacs(char const * file_name) {
}
IF_VERBOSE(20, solver.display_status(verbose_stream()););
lbool r = solver.check();
lbool r;
vector<sat::literal_vector> tracking_clauses;
sat::solver solver2(p, 0);
if (p.get_bool("dimacs.core", false)) {
g_solver = &solver2;
sat::literal_vector assumptions;
track_clauses(solver, solver2, assumptions, tracking_clauses);
solver2.display(std::cout);
r = g_solver->check(assumptions.size(), assumptions.c_ptr());
}
else {
r = g_solver->check();
}
switch (r) {
case l_true:
std::cout << "sat\n";
display_model(solver);
display_model(*g_solver);
break;
case l_undef:
std::cout << "unknown\n";
break;
case l_false:
std::cout << "unsat\n";
if (p.get_bool("dimacs.core", false)) {
display_core(*g_solver, tracking_clauses);
}
break;
}
if (g_display_statistics)