mirror of
https://github.com/Z3Prover/z3
synced 2025-08-12 22:20:54 +00:00
add elimination stack for model reconstruction
Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
This commit is contained in:
parent
da4e8118b2
commit
42e9a0156b
4 changed files with 145 additions and 59 deletions
|
@ -39,22 +39,18 @@ namespace sat {
|
|||
class model_converter {
|
||||
|
||||
public:
|
||||
class elim_sequence {
|
||||
class elim_stack {
|
||||
unsigned m_refcount;
|
||||
elim_sequence* m_next;
|
||||
literal m_literal;
|
||||
literal_vector m_clause;
|
||||
literal_vector m_stack;
|
||||
public:
|
||||
elim_sequence(literal l, literal_vector const& clause, elim_sequence* next):
|
||||
elim_stack(literal_vector const& stack):
|
||||
m_refcount(0),
|
||||
m_next(next),
|
||||
m_literal(l),
|
||||
m_clause(clause) {
|
||||
if (m_next) m_next->inc_ref();
|
||||
m_stack(stack) {
|
||||
}
|
||||
~elim_sequence() { if (m_next) m_next->dec_ref(); }
|
||||
~elim_stack() { }
|
||||
void inc_ref() { ++m_refcount; }
|
||||
void dec_ref() { if (0 == --m_refcount) dealloc(this); }
|
||||
literal_vector const& stack() const { return m_stack; }
|
||||
};
|
||||
|
||||
enum kind { ELIM_VAR = 0, BLOCK_LIT };
|
||||
|
@ -63,20 +59,23 @@ namespace sat {
|
|||
unsigned m_var:31;
|
||||
unsigned m_kind:1;
|
||||
literal_vector m_clauses; // the different clauses are separated by null_literal
|
||||
sref_vector<elim_sequence> m_elim_sequence;
|
||||
sref_vector<elim_stack> m_elim_stack;
|
||||
entry(kind k, bool_var v):m_var(v), m_kind(k) {}
|
||||
public:
|
||||
entry(entry const & src):
|
||||
m_var(src.m_var),
|
||||
m_kind(src.m_kind),
|
||||
m_clauses(src.m_clauses),
|
||||
m_elim_sequence(src.m_elim_sequence) {
|
||||
m_elim_stack(src.m_elim_stack) {
|
||||
}
|
||||
bool_var var() const { return m_var; }
|
||||
kind get_kind() const { return static_cast<kind>(m_kind); }
|
||||
};
|
||||
private:
|
||||
vector<entry> m_entries;
|
||||
|
||||
void process_stack(model & m, literal_vector const& stack) const;
|
||||
|
||||
public:
|
||||
model_converter();
|
||||
~model_converter();
|
||||
|
@ -84,9 +83,10 @@ namespace sat {
|
|||
model_converter& operator=(model_converter const& other);
|
||||
|
||||
entry & mk(kind k, bool_var v);
|
||||
void insert(entry & e, clause const & c, elim_sequence* s = nullptr);
|
||||
void insert(entry & e, clause const & c);
|
||||
void insert(entry & e, literal l1, literal l2);
|
||||
void insert(entry & e, clause_wrapper const & c);
|
||||
void insert(entry & c, literal_vector const& covered_clause, literal_vector const& elim_stack);
|
||||
|
||||
bool empty() const { return m_entries.empty(); }
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue