#ifndef __ShortConflictMetaDP__
#define __ShortConflictMetaDP__
#include "Forwards.hpp"
#include "Lib/ScopedPtr.hpp"
#include "Lib/Stack.hpp"
#include "SAT/SAT2FO.hpp"
#include "SAT/SATSolver.hpp"
#include "DecisionProcedure.hpp"
namespace DP {
using namespace Lib;
using namespace Kernel;
using namespace SAT;
class ShortConflictMetaDP : public DecisionProcedure {
public:
ShortConflictMetaDP(DecisionProcedure* inner, SAT2FO& sat2fo, SATSolver& solver)
: _inner(inner), _sat2fo(sat2fo), _solver(solver) {}
void addLiterals(LiteralIterator lits, bool onlyEqualites) override {
_inner->addLiterals(std::move(lits), onlyEqualites);
}
void reset() override {
_inner->reset();
_unsatCores.reset();
}
Status getStatus(bool getMultipleCores) override;
void getModel(LiteralStack& model) override {
_inner->getModel(model);
}
unsigned getUnsatCoreCount() override { return _unsatCores.size(); }
void getUnsatCore(LiteralStack& res, unsigned coreIndex) override;
private:
unsigned getCoreSize(const LiteralStack& core);
Stack<LiteralStack> _unsatCores;
ScopedPtr<DecisionProcedure> _inner;
SAT2FO& _sat2fo;
SATSolver& _solver;
};
}
#endif