3
0
Fork 0
mirror of https://github.com/Z3Prover/z3 synced 2026-02-28 19:01:29 +00:00

Polysat: disjunctive lemmas (#5311)

* Add macro to disable linear solver for development

* Move new_* and add_* to header

* Add ref_vector_core::push_back(ref<T>&&)

* Attempt to simplify lifetime handling

* Make operator bool() explicit

* clause improvements

* display boolean assignment

* clause::resolve

* bug fixes

* more fixes

* final case of backtrack
This commit is contained in:
Jakob Rath 2021-05-28 22:53:08 +02:00 committed by GitHub
parent 5fd3ef6580
commit 8757f04d20
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
19 changed files with 524 additions and 294 deletions

View file

@ -75,7 +75,7 @@ namespace polysat {
constraint_manager m_constraints;
ptr_vector<constraint> m_original;
ptr_vector<constraint> m_redundant;
scoped_ptr_vector<clause> m_redundant_clauses;
ptr_vector<clause> m_redundant_clauses;
svector<sat::bool_var> m_disjunctive_lemma;
@ -195,7 +195,8 @@ namespace polysat {
// void assign_bool_base(sat::literal lit);
void activate_constraint(constraint& c, bool is_true);
void deactivate_constraint(constraint& c);
void decide_bool(sat::literal lit, clause* lemma);
sat::literal decide_bool(clause& lemma);
void decide_bool(sat::literal lit, clause& lemma);
void propagate_bool(sat::literal lit, clause* reason);
void assign_core(pvar v, rational const& val, justification const& j);
@ -219,7 +220,7 @@ namespace polysat {
unsigned m_clock { 0 };
void reset_marks();
bool is_marked(pvar v) const { return m_clock == m_marks[v]; }
void set_mark(pvar v) { m_marks[v] = m_clock; }
void set_mark(pvar v) { LOG_V("Marking: v" << v); m_marks[v] = m_clock; }
void set_marks(constraints_and_clauses const& cc);
void set_marks(constraint const& c);
@ -227,7 +228,8 @@ namespace polysat {
unsigned m_conflict_level { 0 };
scoped_clause resolve(pvar v);
clause_ref resolve(pvar v);
clause_ref resolve_bool(sat::literal lit);
bool can_decide() const { return !m_free_vars.empty(); }
void decide();
@ -244,25 +246,24 @@ namespace polysat {
unsigned base_level() const;
void resolve_conflict();
void resolve_conflict_clause(scoped_clause& lemma);
void backtrack(unsigned i, scoped_clause& lemma);
void backtrack(unsigned i, clause_ref lemma);
void report_unsat();
void revert_decision(pvar v, scoped_clause& reason);
void revert_bool_decision(sat::literal lit, scoped_clause& reason);
void learn_lemma(pvar v, scoped_clause&& lemma);
void learn_lemma_unit(pvar v, scoped_ptr<constraint>&& lemma);
void learn_lemma_clause(pvar v, scoped_clause&& lemma);
void revert_decision(pvar v, clause_ref reason);
void revert_bool_decision(sat::literal lit, clause_ref reason);
void learn_lemma(pvar v, clause_ref lemma);
void learn_lemma_unit(pvar v, constraint_ref lemma);
void learn_lemma_clause(pvar v, clause_ref lemma);
void backjump(unsigned new_level);
void add_lemma_unit(scoped_ptr<constraint>&& lemma);
void add_lemma_clause(scoped_clause&& lemma);
void add_lemma_unit(constraint_ref lemma);
void add_lemma_clause(clause_ref lemma);
scoped_ptr<constraint> mk_eq(pdd const& p, unsigned dep);
scoped_ptr<constraint> mk_diseq(pdd const& p, unsigned dep);
scoped_ptr<constraint> mk_ule(pdd const& p, pdd const& q, unsigned dep);
scoped_ptr<constraint> mk_ult(pdd const& p, pdd const& q, unsigned dep);
scoped_ptr<constraint> mk_sle(pdd const& p, pdd const& q, unsigned dep);
scoped_ptr<constraint> mk_slt(pdd const& p, pdd const& q, unsigned dep);
void new_constraint(scoped_ptr<constraint>&& c, bool activate);
constraint_ref mk_eq(pdd const& p, unsigned dep);
constraint_ref mk_diseq(pdd const& p, unsigned dep);
constraint_ref mk_ule(pdd const& p, pdd const& q, unsigned dep);
constraint_ref mk_ult(pdd const& p, pdd const& q, unsigned dep);
constraint_ref mk_sle(pdd const& p, pdd const& q, unsigned dep);
constraint_ref mk_slt(pdd const& p, pdd const& q, unsigned dep);
void new_constraint(constraint_ref c, bool activate);
static void insert_constraint(ptr_vector<constraint>& cs, constraint* c);
bool invariant();
@ -321,20 +322,20 @@ namespace polysat {
* Create polynomial constraints (but do not activate them).
* Each constraint is tracked by a dependency.
*/
void new_eq(pdd const& p, unsigned dep);
void new_diseq(pdd const& p, unsigned dep);
void new_ule(pdd const& p, pdd const& q, unsigned dep);
void new_ult(pdd const& p, pdd const& q, unsigned dep);
void new_sle(pdd const& p, pdd const& q, unsigned dep);
void new_slt(pdd const& p, pdd const& q, unsigned dep);
void new_eq(pdd const& p, unsigned dep) { new_constraint(mk_eq(p, dep), false); }
void new_diseq(pdd const& p, unsigned dep) { new_constraint(mk_diseq(p, dep), false); }
void new_ule(pdd const& p, pdd const& q, unsigned dep) { new_constraint(mk_ule(p, q, dep), false); }
void new_ult(pdd const& p, pdd const& q, unsigned dep) { new_constraint(mk_ult(p, q, dep), false); }
void new_sle(pdd const& p, pdd const& q, unsigned dep) { new_constraint(mk_sle(p, q, dep), false); }
void new_slt(pdd const& p, pdd const& q, unsigned dep) { new_constraint(mk_slt(p, q, dep), false); }
/** Create and activate polynomial constraints. */
void add_eq(pdd const& p, unsigned dep = null_dependency);
void add_diseq(pdd const& p, unsigned dep = null_dependency);
void add_ule(pdd const& p, pdd const& q, unsigned dep = null_dependency);
void add_ult(pdd const& p, pdd const& q, unsigned dep = null_dependency);
void add_sle(pdd const& p, pdd const& q, unsigned dep = null_dependency);
void add_slt(pdd const& p, pdd const& q, unsigned dep = null_dependency);
void add_eq(pdd const& p, unsigned dep = null_dependency) { new_constraint(mk_eq(p, dep), true); }
void add_diseq(pdd const& p, unsigned dep = null_dependency) { new_constraint(mk_diseq(p, dep), true); }
void add_ule(pdd const& p, pdd const& q, unsigned dep = null_dependency) { new_constraint(mk_ule(p, q, dep), true); }
void add_ult(pdd const& p, pdd const& q, unsigned dep = null_dependency) { new_constraint(mk_ult(p, q, dep), true); }
void add_sle(pdd const& p, pdd const& q, unsigned dep = null_dependency) { new_constraint(mk_sle(p, q, dep), true); }
void add_slt(pdd const& p, pdd const& q, unsigned dep = null_dependency) { new_constraint(mk_slt(p, q, dep), true); }
/**
* Activate the constraint corresponding to the given boolean variable.