3
0
Fork 0
mirror of https://github.com/Z3Prover/z3 synced 2025-08-13 14:40:55 +00:00

adding elim sequences

Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
This commit is contained in:
Nikolaj Bjorner 2017-10-16 17:58:56 -07:00
parent d9ccb3928e
commit da4e8118b2
2 changed files with 48 additions and 3 deletions

View file

@ -20,6 +20,7 @@ Revision History:
#define SAT_MODEL_CONVERTER_H_
#include "sat/sat_types.h"
#include "util/ref_vector.h"
namespace sat {
/**
@ -36,19 +37,40 @@ namespace sat {
it can be converted into a general Z3 model_converter
*/
class model_converter {
public:
class elim_sequence {
unsigned m_refcount;
elim_sequence* m_next;
literal m_literal;
literal_vector m_clause;
public:
elim_sequence(literal l, literal_vector const& clause, elim_sequence* next):
m_refcount(0),
m_next(next),
m_literal(l),
m_clause(clause) {
if (m_next) m_next->inc_ref();
}
~elim_sequence() { if (m_next) m_next->dec_ref(); }
void inc_ref() { ++m_refcount; }
void dec_ref() { if (0 == --m_refcount) dealloc(this); }
};
enum kind { ELIM_VAR = 0, BLOCK_LIT };
class entry {
friend class model_converter;
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;
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_clauses(src.m_clauses),
m_elim_sequence(src.m_elim_sequence) {
}
bool_var var() const { return m_var; }
kind get_kind() const { return static_cast<kind>(m_kind); }
@ -62,7 +84,7 @@ namespace sat {
model_converter& operator=(model_converter const& other);
entry & mk(kind k, bool_var v);
void insert(entry & e, clause const & c);
void insert(entry & e, clause const & c, elim_sequence* s = nullptr);
void insert(entry & e, literal l1, literal l2);
void insert(entry & e, clause_wrapper const & c);