#ifndef _proof_h_INCLUDED
#define _proof_h_INCLUDED
namespace CaDiCaL {
class File;
struct Clause;
struct Internal;
class Tracer;
class FileTracer;
class LratBuilder;
class Proof {
Internal *internal;
vector<int> clause; vector<uint64_t> proof_chain; uint64_t clause_id; bool redundant;
vector<Tracer *> tracers; vector<FileTracer *> file_tracers; LratBuilder *lratbuilder;
void add_literal (int internal_lit); void add_literals (Clause *);
void add_literals (const vector<int> &);
void add_original_clause (
bool restore = false); void add_derived_clause ();
void add_assumption_clause ();
void delete_clause ();
void weaken_minus ();
void strengthen ();
void finalize_clause ();
void add_assumption ();
void add_constraint ();
public:
Proof (Internal *);
~Proof ();
void connect (LratBuilder *lb) { lratbuilder = lb; }
void connect (Tracer *t) { tracers.push_back (t); }
void disconnect (Tracer *t);
void add_original_clause (uint64_t, bool, const vector<int> &);
void add_assumption_clause (uint64_t, const vector<int> &,
const vector<uint64_t> &);
void add_assumption_clause (uint64_t, int, const vector<uint64_t> &);
void add_assumption (int);
void add_constraint (const vector<int> &);
void reset_assumptions ();
void add_external_original_clause (uint64_t, bool, const vector<int> &,
bool restore = false);
void delete_external_original_clause (uint64_t, bool,
const vector<int> &);
void add_derived_empty_clause (uint64_t, const vector<uint64_t> &);
void add_derived_unit_clause (uint64_t, int unit,
const vector<uint64_t> &);
void add_derived_clause (Clause *c, const vector<uint64_t> &);
void add_derived_clause (uint64_t, bool, const vector<int> &,
const vector<uint64_t> &);
void delete_clause (uint64_t, bool, const vector<int> &);
void weaken_minus (uint64_t, const vector<int> &);
void weaken_plus (uint64_t, const vector<int> &);
void delete_unit_clause (uint64_t id, const int lit);
void delete_clause (Clause *);
void weaken_minus (Clause *);
void weaken_plus (Clause *);
void strengthen (uint64_t);
void finalize_unit (uint64_t, int);
void finalize_external_unit (uint64_t, int);
void finalize_clause (uint64_t, const vector<int> &c);
void finalize_clause (Clause *);
void report_status (int, uint64_t);
void begin_proof (uint64_t);
void conclude_unsat (ConclusionType, const vector<uint64_t> &);
void conclude_sat (const vector<int> &model);
void conclude_unknown (const vector<int> &trace);
void solve_query ();
void flush_clause (Clause *); void strengthen_clause (Clause *, int, const vector<uint64_t> &);
void otfs_strengthen_clause (Clause *, const vector<int> &,
const vector<uint64_t> &);
void flush ();
};
}
#endif