3
0
Fork 0
mirror of https://github.com/Z3Prover/z3 synced 2025-04-08 18:31:49 +00:00
z3/src/sat/sat_drat.h
Nikolaj Bjorner 63d480fd92 fix cnf check
Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
2019-01-11 21:17:39 -08:00

112 lines
3.7 KiB
C++

/*++
Copyright (c) 2017 Microsoft Corporation
Module Name:
sat_drat.h
Abstract:
Produce DRAT proofs.
Author:
Nikolaj Bjorner (nbjorner) 2017-2-3
Notes:
--*/
#ifndef SAT_DRAT_H_
#define SAT_DRAT_H_
namespace sat {
class drat {
public:
struct s_ext {};
struct s_unit {};
struct premise {
enum { t_clause, t_unit, t_ext } m_type;
union {
clause* m_clause;
unsigned m_literal;
};
premise(s_ext, literal l): m_type(t_ext), m_literal(l.index()) {}
premise(s_unit, literal l): m_type(t_unit), m_literal(l.index()) {}
premise(clause* c): m_type(t_clause), m_clause(c) {}
};
private:
enum status { asserted, learned, deleted, external };
struct watched_clause {
clause* m_clause;
literal m_l1, m_l2;
watched_clause(clause* c, literal l1, literal l2):
m_clause(c), m_l1(l1), m_l2(l2) {}
};
svector<watched_clause> m_watched_clauses;
typedef svector<unsigned> watch;
solver& s;
std::ostream* m_out;
ptr_vector<clause> m_proof;
svector<status> m_status;
literal_vector m_units;
vector<watch> m_watches;
svector<lbool> m_assignment;
bool m_inconsistent;
bool m_check_unsat, m_check_sat, m_check;
void dump(unsigned n, literal const* c, status st);
void append(literal l, status st);
void append(literal l1, literal l2, status st);
void append(clause& c, status st);
friend std::ostream& operator<<(std::ostream & out, status st);
status get_status(bool learned) const;
void declare(literal l);
void assign(literal l);
void propagate(literal l);
void assign_propagate(literal l);
void del_watch(clause& c, literal l);
bool is_drup(unsigned n, literal const* c);
bool is_drat(unsigned n, literal const* c);
bool is_drat(unsigned n, literal const* c, unsigned pos);
lbool value(literal l) const;
void trace(std::ostream& out, unsigned n, literal const* c, status st);
void display(std::ostream& out) const;
void validate_propagation() const;
bool match(unsigned n, literal const* lits, clause const& c) const;
public:
drat(solver& s);
~drat();
void updt_config();
void add();
void add(literal l, bool learned);
void add(literal l1, literal l2, bool learned);
void add(clause& c, bool learned);
void add(literal_vector const& c, svector<premise> const& premises);
void add(literal_vector const& c); // add learned clause
bool is_cleaned(clause& c) const;
void del(literal l);
void del(literal l1, literal l2);
void del(clause& c);
void verify(clause const& c) { verify(c.size(), c.begin()); }
void verify(unsigned n, literal const* c);
void verify(literal l1, literal l2) { literal lits[2] = {l1, l2}; verify(2, lits); }
void verify(literal l1, literal l2, literal l3) { literal lits[3] = {l1, l2, l3}; verify(3, lits); }
bool contains(clause const& c) { return contains(c.size(), c.begin()); }
bool contains(unsigned n, literal const* c);
bool contains(literal l1, literal l2) { literal lits[2] = {l1, l2}; return contains(2, lits); }
bool contains(literal l1, literal l2, literal l3) { literal lits[3] = {l1, l2, l3}; return contains(3, lits); }
void check_model(model const& m);
};
};
#endif