#ifndef __Superposition__
#define __Superposition__
#include "Forwards.hpp"
#include "Indexing/TermIndex.hpp"
#include "InferenceEngine.hpp"
#include "Inferences/ProofExtra.hpp"
namespace Inferences {
using namespace Kernel;
using namespace Indexing;
using namespace Saturation;
class Superposition
: public GeneratingInferenceEngine
{
public:
void attach(SaturationAlgorithm* salg) override;
void detach() override;
ClauseIterator generateClauses(Clause* premise) override;
private:
Clause* performSuperposition(
Clause* rwClause, Literal* rwLiteral, TermList rwTerm,
Clause* eqClause, Literal* eqLiteral, TermList eqLHS,
AbstractingUnifier* unifier, bool eqIsResult);
bool checkClauseColorCompatibility(Clause* eqClause, Clause* rwClause);
static bool earlyWeightLimitCheck(Clause* eqClause, Literal* eqLit,
Clause* rwClause, Literal* rwLit, TermList rwTerm, TermList eqLHS, TermList eqRHS,
ResultSubstitutionSP subst, bool eqIsResult, PassiveClauseContainer* passiveClauseContainer, unsigned numPositiveLiteralsLowerBound, const Inference& inf);
static bool checkSuperpositionFromVariable(Clause* eqClause, Literal* eqLit, TermList eqLHS);
struct ForwardResultFn;
struct LHSsFn;
struct RewritableResultsFn;
struct BackwardResultFn;
std::shared_ptr<SuperpositionSubtermIndex> _subtermIndex;
std::shared_ptr<SuperpositionLHSIndex> _lhsIndex;
};
using SuperpositionExtra = TwoLiteralRewriteInferenceExtra;
};
#endif