#ifndef __InferenceStore__
#define __InferenceStore__
#include <utility>
#include <ostream>
#include "Forwards.hpp"
#include "Lib/Allocator.hpp"
#include "Lib/DHMap.hpp"
#include "Lib/DHMultiset.hpp"
#include "Lib/Stack.hpp"
#include "Kernel/Clause.hpp"
#include "Kernel/Inference.hpp"
namespace Kernel {
using namespace Lib;
class InferenceStore
{
public:
static InferenceStore* instance();
void reset();
typedef List<int> IntList;
struct FullInference
{
FullInference(unsigned premCnt) : csId(0), premCnt(premCnt) { }
void* operator new(size_t,unsigned premCnt)
{
size_t size=sizeof(FullInference)+premCnt*sizeof(Unit*);
size-=sizeof(Unit*);
return ALLOC_KNOWN(size,"InferenceStore::FullInference");
}
size_t occupiedBytes()
{
size_t size=sizeof(FullInference)+premCnt*sizeof(Unit*);
size-=sizeof(Unit*);
return size;
}
void increasePremiseRefCounters();
int csId;
unsigned premCnt;
InferenceRule rule;
Unit* premises[1];
};
void recordSplittingNameLiteral(Unit* us, Literal* lit);
void recordIntroducedSymbol(Unit* u, SymbolType st, unsigned number);
void recordIntroducedSplitName(Unit* u, std::string name);
void outputUnsatCore(std::ostream& out, Unit* refutation);
void outputProof(std::ostream& out, Unit* refutation);
void outputProof(std::ostream& out, UnitList* units);
struct ProofPrinter;
private:
struct TPTPProofPrinter;
struct Smt2ProofCheckPrinter;
struct ProofCheckPrinter;
struct ProofPropertyPrinter;
struct SMTCheckPrinter;
ProofPrinter* createProofPrinter(std::ostream& out);
DHMultiset<Clause*> _nextClIds;
DHMap<Unit*, Literal*> _splittingNameLiterals;
typedef std::pair<SymbolType,unsigned> SymbolId;
typedef Stack<SymbolId> SymbolStack;
DHMap<unsigned,SymbolStack> _introducedSymbols;
DHMap<unsigned,std::string> _introducedSplitNames;
};
};
#endif