#ifndef __ProofProducingSATSolver__
#define __ProofProducingSATSolver__
#include "Lib/ScopedPtr.hpp"
#include "SATInference.hpp"
#include "SATSolver.hpp"
namespace SAT {
class ProofProducingSATSolver final : public SATSolver {
public:
ProofProducingSATSolver() = default;
explicit ProofProducingSATSolver(SATSolver *inner) :
_inner(inner),
_addedClauses(nullptr) {}
void addClause(SATClause* cl) override
{
SATClauseList::push(cl,_addedClauses);
_inner->addClause(cl);
}
VarAssignment getAssignment(unsigned var) override {
return _inner->getAssignment(var);
}
bool isZeroImplied(unsigned var) override {
return _inner->isZeroImplied(var);
}
void ensureVarCount(unsigned newVarCnt) override {
_inner->ensureVarCount(newVarCnt);
}
unsigned newVar() override {
return _inner->newVar();
}
void suggestPolarity(unsigned var, unsigned pol) override {
_inner->suggestPolarity(var, pol);
}
void randomizeForNextAssignment(unsigned maxVar) override {
_inner->randomizeForNextAssignment(maxVar);
}
Status solveUnderAssumptionsLimited(const SATLiteralStack &assumps, unsigned conflictCountLimit) override {
return _inner->solveUnderAssumptionsLimited(assumps, conflictCountLimit);
}
SATLiteralStack failedAssumptions() override {
return _inner->failedAssumptions();
}
SATClauseList *minimizePremises(SATClauseList *premises) override {
return _inner->minimizePremises(premises);
}
SATClauseList *premiseList() const { return _addedClauses; }
SATClauseList *minimizedPremises() { return _inner->minimizePremises(_addedClauses); }
SATClause *proof();
private:
ScopedPtr<SATSolver> _inner;
SATClauseList* _addedClauses = nullptr;
};
}
#endif