mirror of
https://github.com/Z3Prover/z3
synced 2025-08-05 10:50:24 +00:00
prepare for theory plugins
Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
This commit is contained in:
parent
141edef0d6
commit
116390833b
27 changed files with 492 additions and 336 deletions
|
@ -68,19 +68,23 @@ namespace sat {
|
|||
m_activity = s.get_config().m_drat_activity;
|
||||
}
|
||||
|
||||
std::ostream& operator<<(std::ostream& out, drat::status st) {
|
||||
switch (st) {
|
||||
case drat::status::learned: return out << "l";
|
||||
case drat::status::deleted: return out << "d";
|
||||
case drat::status::asserted: return out << "c a";
|
||||
case drat::status::ba: return out << "c ba";
|
||||
case drat::status::euf: return out << "c euf";
|
||||
std::ostream& operator<<(std::ostream& out, status st) {
|
||||
if (st.is_redundant())
|
||||
out << "l";
|
||||
else if (st.is_deleted())
|
||||
out << "d";
|
||||
else if (st.is_asserted())
|
||||
out << "a";
|
||||
|
||||
switch (st.orig) {
|
||||
case status::orig::ba: return out << " ba";
|
||||
case status::orig::euf: return out << " euf";
|
||||
default: return out;
|
||||
}
|
||||
}
|
||||
|
||||
void drat::dump(unsigned n, literal const* c, status st) {
|
||||
if (st == status::asserted && !s.m_ext)
|
||||
if (st.is_asserted() && !s.m_ext)
|
||||
return;
|
||||
if (m_activity && ((m_num_add % 1000) == 0))
|
||||
dump_activity();
|
||||
|
@ -90,35 +94,29 @@ namespace sat {
|
|||
char* lastd = digits + sizeof(digits);
|
||||
|
||||
unsigned len = 0;
|
||||
switch (st) {
|
||||
case status::asserted:
|
||||
buffer[0] = 'c';
|
||||
buffer[1] = ' ';
|
||||
buffer[2] = 'a';
|
||||
buffer[3] = ' ';
|
||||
len = 4;
|
||||
switch (st.st) {
|
||||
case status::st::asserted:
|
||||
buffer[len++] = 'a';
|
||||
buffer[len++] = ' ';
|
||||
break;
|
||||
case status::deleted:
|
||||
buffer[0] = 'd';
|
||||
buffer[1] = ' ';
|
||||
len = 2;
|
||||
case status::st::deleted:
|
||||
buffer[len++] = 'd';
|
||||
buffer[len++] = ' ';
|
||||
break;
|
||||
case status::euf:
|
||||
buffer[0] = 'c';
|
||||
buffer[1] = ' ';
|
||||
buffer[2] = 'e';
|
||||
buffer[3] = 'u';
|
||||
buffer[4] = 'f';
|
||||
buffer[5] = ' ';
|
||||
len = 6;
|
||||
default:
|
||||
break;
|
||||
case status::ba:
|
||||
buffer[0] = 'c';
|
||||
buffer[1] = ' ';
|
||||
buffer[2] = 'b';
|
||||
buffer[3] = 'a';
|
||||
buffer[4] = ' ';
|
||||
len = 5;
|
||||
}
|
||||
switch (st.orig) {
|
||||
case status::orig::euf:
|
||||
buffer[len++] = 'e';
|
||||
buffer[len++] = 'u';
|
||||
buffer[len++] = 'f';
|
||||
buffer[len++] = ' ';
|
||||
break;
|
||||
case status::orig::ba:
|
||||
buffer[len++] = 'b';
|
||||
buffer[len++] = 'a';
|
||||
buffer[len++] = ' ';
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
|
@ -147,10 +145,13 @@ namespace sat {
|
|||
buffer[len++] = '0';
|
||||
buffer[len++] = '\n';
|
||||
m_out->write(buffer, len);
|
||||
|
||||
m_out->flush();
|
||||
|
||||
}
|
||||
|
||||
void drat::dump_activity() {
|
||||
(*m_out) << "c a ";
|
||||
(*m_out) << "c activity ";
|
||||
for (unsigned v = 0; v < s.num_vars(); ++v) {
|
||||
(*m_out) << s.m_activity[v] << " ";
|
||||
}
|
||||
|
@ -159,12 +160,10 @@ namespace sat {
|
|||
|
||||
void drat::bdump(unsigned n, literal const* c, status st) {
|
||||
unsigned char ch = 0;
|
||||
switch (st) {
|
||||
case status::asserted: return;
|
||||
case status::ba: return;
|
||||
case status::euf: return;
|
||||
case status::learned: ch = 'a'; break;
|
||||
case status::deleted: ch = 'd'; break;
|
||||
switch (st.st) {
|
||||
case status::st::asserted: return;
|
||||
case status::st::redundant: ch = 'a'; break;
|
||||
case status::st::deleted: ch = 'd'; break;
|
||||
default: UNREACHABLE(); break;
|
||||
}
|
||||
char buffer[10000];
|
||||
|
@ -217,10 +216,10 @@ namespace sat {
|
|||
|
||||
declare(l);
|
||||
IF_VERBOSE(20, trace(verbose_stream(), 1, &l, st););
|
||||
if (st == status::learned) {
|
||||
if (st.is_redundant()) {
|
||||
verify(1, &l);
|
||||
}
|
||||
if (st == status::deleted) {
|
||||
if (st.is_deleted()) {
|
||||
return;
|
||||
}
|
||||
if (m_check_unsat) {
|
||||
|
@ -237,15 +236,15 @@ namespace sat {
|
|||
literal lits[2] = { l1, l2 };
|
||||
|
||||
IF_VERBOSE(20, trace(verbose_stream(), 2, lits, st););
|
||||
if (st == status::deleted) {
|
||||
if (st.is_deleted()) {
|
||||
// noop
|
||||
// don't record binary as deleted.
|
||||
}
|
||||
else {
|
||||
if (st == status::learned) {
|
||||
if (st.is_redundant()) {
|
||||
verify(2, lits);
|
||||
}
|
||||
clause* c = m_alloc.mk_clause(2, lits, st == status::learned);
|
||||
clause* c = m_alloc.mk_clause(2, lits, st.is_redundant());
|
||||
m_proof.push_back(c);
|
||||
m_status.push_back(st);
|
||||
if (!m_check_unsat) return;
|
||||
|
@ -268,12 +267,12 @@ namespace sat {
|
|||
|
||||
void drat::bool_def(bool_var v, unsigned n) {
|
||||
if (m_out)
|
||||
(*m_out) << "c b " << v << " := " << n << " 0\n";
|
||||
(*m_out) << "b " << v << " " << n << " 0\n";
|
||||
}
|
||||
|
||||
void drat::def_begin(unsigned n, symbol const& name) {
|
||||
if (m_out)
|
||||
(*m_out) << "c n " << n << " := " << name;
|
||||
(*m_out) << "n " << n << " " << name;
|
||||
}
|
||||
|
||||
void drat::def_add_arg(unsigned arg) {
|
||||
|
@ -319,13 +318,13 @@ namespace sat {
|
|||
unsigned n = c.size();
|
||||
IF_VERBOSE(20, trace(verbose_stream(), n, c.begin(), st););
|
||||
|
||||
if (st == status::learned) {
|
||||
if (st.is_redundant()) {
|
||||
verify(c);
|
||||
}
|
||||
|
||||
m_status.push_back(st);
|
||||
m_proof.push_back(&c);
|
||||
if (st == status::deleted) {
|
||||
if (st.is_deleted()) {
|
||||
if (n > 0) del_watch(c, c[0]);
|
||||
if (n > 1) del_watch(c, c[1]);
|
||||
return;
|
||||
|
@ -471,7 +470,7 @@ namespace sat {
|
|||
void drat::validate_propagation() const {
|
||||
for (unsigned i = 0; i < m_proof.size(); ++i) {
|
||||
status st = m_status[i];
|
||||
if (m_proof[i] && m_proof[i]->size() > 1 && st != status::deleted) {
|
||||
if (m_proof[i] && m_proof[i]->size() > 1 && !st.is_deleted()) {
|
||||
clause& c = *m_proof[i];
|
||||
unsigned num_undef = 0, num_true = 0;
|
||||
for (unsigned j = 0; j < c.size(); ++j) {
|
||||
|
@ -494,14 +493,15 @@ namespace sat {
|
|||
SASSERT(lits.size() == n);
|
||||
for (unsigned i = 0; i < m_proof.size(); ++i) {
|
||||
status st = m_status[i];
|
||||
if (m_proof[i] && m_proof[i]->size() > 1 && st == status::asserted) {
|
||||
if (m_proof[i] && m_proof[i]->size() > 1 && st.is_asserted()) {
|
||||
clause& c = *m_proof[i];
|
||||
unsigned j = 0;
|
||||
for (; j < c.size() && c[j] != ~l; ++j) {}
|
||||
if (j != c.size()) {
|
||||
if (st.orig == status::orig::sat && j != c.size()) {
|
||||
lits.append(j, c.begin());
|
||||
lits.append(c.size() - j - 1, c.begin() + j + 1);
|
||||
if (!is_drup(lits.size(), lits.c_ptr())) return false;
|
||||
if (!is_drup(lits.size(), lits.c_ptr()))
|
||||
return false;
|
||||
lits.resize(n);
|
||||
}
|
||||
}
|
||||
|
@ -562,7 +562,7 @@ namespace sat {
|
|||
clause& c = *m_proof[i];
|
||||
status st = m_status[i];
|
||||
if (match(n, lits, c)) {
|
||||
if (st == status::deleted) {
|
||||
if (st.is_deleted()) {
|
||||
num_del++;
|
||||
}
|
||||
else {
|
||||
|
@ -601,7 +601,7 @@ namespace sat {
|
|||
}
|
||||
for (unsigned i = 0; i < m_proof.size(); ++i) {
|
||||
clause* c = m_proof[i];
|
||||
if (m_status[i] != status::deleted && c) {
|
||||
if (!m_status[i].is_deleted() && c) {
|
||||
unsigned num_true = 0;
|
||||
unsigned num_undef = 0;
|
||||
for (unsigned j = 0; j < c->size(); ++j) {
|
||||
|
@ -716,14 +716,16 @@ namespace sat {
|
|||
clauses.set_end(it2);
|
||||
}
|
||||
|
||||
drat::status drat::get_status(bool learned) const {
|
||||
return learned || s.m_searching ? status::learned : status::asserted;
|
||||
status drat::get_status(bool learned) const {
|
||||
if (learned || s.m_searching)
|
||||
return status::redundant();
|
||||
return status::asserted();
|
||||
}
|
||||
|
||||
void drat::add() {
|
||||
++m_num_add;
|
||||
if (m_out) (*m_out) << "0\n";
|
||||
if (m_bout) bdump(0, nullptr, status::learned);
|
||||
if (m_bout) bdump(0, nullptr, status::redundant());
|
||||
if (m_check_unsat) {
|
||||
SASSERT(m_inconsistent);
|
||||
}
|
||||
|
@ -735,53 +737,60 @@ namespace sat {
|
|||
if (m_bout) bdump(1, &l, st);
|
||||
if (m_check) append(l, st);
|
||||
}
|
||||
void drat::add(literal l1, literal l2, bool learned) {
|
||||
++m_num_add;
|
||||
void drat::add(literal l1, literal l2, status st) {
|
||||
if (st.is_deleted())
|
||||
++m_num_del;
|
||||
else
|
||||
++m_num_add;
|
||||
literal ls[2] = {l1, l2};
|
||||
status st = get_status(learned);
|
||||
if (m_out) dump(2, ls, st);
|
||||
if (m_bout) bdump(2, ls, st);
|
||||
if (m_check) append(l1, l2, st);
|
||||
}
|
||||
void drat::add(clause& c, bool learned) {
|
||||
++m_num_add;
|
||||
status st = get_status(learned);
|
||||
void drat::add(clause& c, status st) {
|
||||
if (st.is_deleted())
|
||||
++m_num_del;
|
||||
else
|
||||
++m_num_add;
|
||||
if (m_out) dump(c.size(), c.begin(), st);
|
||||
if (m_bout) bdump(c.size(), c.begin(), st);
|
||||
if (m_check) {
|
||||
clause* cl = m_alloc.mk_clause(c.size(), c.begin(), learned);
|
||||
append(*cl, get_status(learned));
|
||||
clause* cl = m_alloc.mk_clause(c.size(), c.begin(), st.is_redundant());
|
||||
append(*cl, st);
|
||||
}
|
||||
}
|
||||
void drat::add(literal_vector const& lits, status th) {
|
||||
++m_num_add;
|
||||
void drat::add(literal_vector const& lits, status st) {
|
||||
if (st.is_deleted())
|
||||
++m_num_del;
|
||||
else
|
||||
++m_num_add;
|
||||
if (m_check) {
|
||||
switch (lits.size()) {
|
||||
case 0: add(); break;
|
||||
case 1: append(lits[0], th); break;
|
||||
case 1: append(lits[0], st); break;
|
||||
default: {
|
||||
clause* c = m_alloc.mk_clause(lits.size(), lits.c_ptr(), true);
|
||||
append(*c, th);
|
||||
clause* c = m_alloc.mk_clause(lits.size(), lits.c_ptr(), st.is_redundant());
|
||||
append(*c, st);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (m_out)
|
||||
dump(lits.size(), lits.c_ptr(), th);
|
||||
dump(lits.size(), lits.c_ptr(), st);
|
||||
}
|
||||
void drat::add(literal_vector const& c) {
|
||||
++m_num_add;
|
||||
if (m_out) dump(c.size(), c.begin(), status::learned);
|
||||
if (m_bout) bdump(c.size(), c.begin(), status::learned);
|
||||
if (m_out) dump(c.size(), c.begin(), status::redundant());
|
||||
if (m_bout) bdump(c.size(), c.begin(), status::redundant());
|
||||
if (m_check) {
|
||||
for (literal lit : c) declare(lit);
|
||||
switch (c.size()) {
|
||||
case 0: add(); break;
|
||||
case 1: append(c[0], status::learned); break;
|
||||
case 1: append(c[0], status::redundant()); break;
|
||||
default: {
|
||||
verify(c.size(), c.begin());
|
||||
clause* cl = m_alloc.mk_clause(c.size(), c.c_ptr(), true);
|
||||
append(*cl, status::ba);
|
||||
append(*cl, status::redundant());
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -790,17 +799,17 @@ namespace sat {
|
|||
|
||||
void drat::del(literal l) {
|
||||
++m_num_del;
|
||||
if (m_out) dump(1, &l, status::deleted);
|
||||
if (m_bout) bdump(1, &l, status::deleted);
|
||||
if (m_check_unsat) append(l, status::deleted);
|
||||
if (m_out) dump(1, &l, status::deleted());
|
||||
if (m_bout) bdump(1, &l, status::deleted());
|
||||
if (m_check_unsat) append(l, status::deleted());
|
||||
}
|
||||
|
||||
void drat::del(literal l1, literal l2) {
|
||||
++m_num_del;
|
||||
literal ls[2] = {l1, l2};
|
||||
if (m_out) dump(2, ls, status::deleted);
|
||||
if (m_bout) bdump(2, ls, status::deleted);
|
||||
if (m_check) append(l1, l2, status::deleted);
|
||||
if (m_out) dump(2, ls, status::deleted());
|
||||
if (m_bout) bdump(2, ls, status::deleted());
|
||||
if (m_check) append(l1, l2, status::deleted());
|
||||
}
|
||||
|
||||
void drat::del(clause& c) {
|
||||
|
@ -816,21 +825,21 @@ namespace sat {
|
|||
}
|
||||
#endif
|
||||
++m_num_del;
|
||||
if (m_out) dump(c.size(), c.begin(), status::deleted);
|
||||
if (m_bout) bdump(c.size(), c.begin(), status::deleted);
|
||||
if (m_out) dump(c.size(), c.begin(), status::deleted());
|
||||
if (m_bout) bdump(c.size(), c.begin(), status::deleted());
|
||||
if (m_check) {
|
||||
clause* c1 = m_alloc.mk_clause(c.size(), c.begin(), c.is_learned());
|
||||
append(*c1, status::deleted);
|
||||
append(*c1, status::deleted());
|
||||
}
|
||||
}
|
||||
|
||||
void drat::del(literal_vector const& c) {
|
||||
++m_num_del;
|
||||
if (m_out) dump(c.size(), c.begin(), status::deleted);
|
||||
if (m_bout) bdump(c.size(), c.begin(), status::deleted);
|
||||
if (m_out) dump(c.size(), c.begin(), status::deleted());
|
||||
if (m_bout) bdump(c.size(), c.begin(), status::deleted());
|
||||
if (m_check) {
|
||||
clause* c1 = m_alloc.mk_clause(c.size(), c.begin(), true);
|
||||
append(*c1, status::deleted);
|
||||
append(*c1, status::deleted());
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue