#ifndef __PartialRedundancyHandler__
#define __PartialRedundancyHandler__
#include "Forwards.hpp"
#include "Kernel/Ordering.hpp"
#include "Lib/Stack.hpp"
#include "Lib/SharedSet.hpp"
#include "Saturation/Splitter.hpp"
#include "Options.hpp"
namespace Shell {
using namespace Lib;
using namespace Indexing;
using LiteralSet = Set<Literal*,SharedTermHash>;
using OrderingConstraints = Stack<TermOrderingConstraint>;
struct PartialRedundancyEntry {
OrderingConstraints ordCons;
LiteralSet lits;
SplitSet* splits;
bool active = true;
unsigned refcnt = 1;
void deactivate() {
ASS(!splits->isEmpty());
active = false;
}
void obtain() {
refcnt++;
}
void release() {
ASS(refcnt);
refcnt--;
if (!refcnt) {
delete this;
}
}
};
struct EntryContainer {
TermOrderingDiagramUP tod;
Stack<PartialRedundancyEntry*> entries;
};
class PartialRedundancyHandler
{
public:
static PartialRedundancyHandler* create(const Options& opts, const Ordering* ord, Splitter* splitter);
static void destroyClauseData(Clause* cl);
virtual ~PartialRedundancyHandler() = default;
virtual bool checkSuperposition(
Clause* eqClause, Literal* eqLit, Clause* rwClause, Literal* rwLit, bool eqIsResult, ResultSubstitution* subs) const = 0;
virtual void insertSuperposition(
Clause* eqClause, Clause* rwClause, TermList rwTerm, TermList rwTermS, TermList tgtTermS, TermList eqLHS,
Literal* rwLitS, Literal* eqLit, Ordering::Result eqComp, bool eqIsResult, ResultSubstitution* subs) const = 0;
virtual bool handleResolution(
Clause* queryCl, Literal* queryLit, Clause* resultCl, Literal* resultLit, ResultSubstitution* subs) const = 0;
virtual void checkEquations(Clause* cl) const = 0;
protected:
class ConstraintIndex;
static ConstraintIndex** getDataPtr(Clause* cl, bool doAllocate);
static DHMap<Clause*,ConstraintIndex*> clauseData;
};
template<bool enabled, bool orderingConstraints, bool avatarConstraints, bool literalConstraints>
class PartialRedundancyHandlerImpl
: public PartialRedundancyHandler
{
public:
PartialRedundancyHandlerImpl(const Options& opts, const Ordering* ord, Splitter* splitter)
: _redundancyCheck(opts.demodulationRedundancyCheck() != Options::DemodulationRedundancyCheck::OFF),
_encompassing(opts.demodulationRedundancyCheck() == Options::DemodulationRedundancyCheck::ENCOMPASS),
_ord(ord), _splitter(splitter) {}
bool checkSuperposition(
Clause* eqClause, Literal* eqLit, Clause* rwClause, Literal* rwLit, bool eqIsResult, ResultSubstitution* subs) const override;
void insertSuperposition(
Clause* eqClause, Clause* rwClause, TermList rwTerm, TermList rwTermS, TermList tgtTermS, TermList eqLHS,
Literal* rwLitS, Literal* eqLit, Ordering::Result eqComp, bool eqIsResult, ResultSubstitution* subs) const override;
bool handleResolution(
Clause* queryCl, Literal* queryLit, Clause* resultCl, Literal* resultLit, ResultSubstitution* subs) const override;
void checkEquations(Clause* cl) const override;
private:
bool compareWithSuperpositionPremise(
Clause* rwCl, Literal* rwLitS, TermList rwTerm, TermList rwTermS, TermList tgtTermS, Clause* eqCl, TermList eqLHS, OrderingConstraints& cons) const;
LiteralSet getRemainingLiterals(Clause* cl, Literal* lit, ResultSubstitution* subs, bool result) const;
const SplitSet* getRemainingSplits(Clause* cl, Clause* other) const;
void tryInsert(Clause* into, ResultSubstitution* subs, bool result, Clause* cl, OrderingConstraints&& ordCons,
LiteralSet&& lits, SplitSet* splits) const;
bool _redundancyCheck;
bool _encompassing;
const Ordering* _ord;
Splitter* _splitter;
};
};
#endif