#include "Kernel/Clause.hpp"
#include "Kernel/EqHelper.hpp"
#include "Kernel/Inference.hpp"
#include "Kernel/Term.hpp"
#include "Saturation/SaturationAlgorithm.hpp"
#include "Cases.hpp"
namespace Inferences {
using namespace std;
Clause* Cases::performParamodulation(Clause* premise, Literal* lit, TermList t) {
ASS(t.isTerm());
TermList lhs = *lit->nthArgument(0);
TermList rhs = *lit->nthArgument(1);
if((t == lhs) || (t == rhs)){
return 0;
}
static TermList troo(Term::foolTrue());
static TermList fols(Term::foolFalse());
RStack<Literal*> resLits;
for (Literal* curr : iterTraits(premise->iterLits())) {
resLits->push( curr != lit
? curr
: EqHelper::replace(curr, t, troo));
}
resLits->push(Literal::createEquality(true, t, fols, AtomicSort::boolSort()));
return Clause::fromStack(*resLits, GeneratingInference1(InferenceRule::FOOL_PARAMODULATION, premise));
}
struct Cases::ResultFn
{
ResultFn(Clause* cl, Cases& parent) : _cl(cl), _parent(parent) {}
Clause* operator()(pair<Literal*, TermList> arg)
{
return _parent.performParamodulation(_cl, arg.first, arg.second);
}
private:
Clause* _cl;
Cases& _parent;
};
struct Cases::RewriteableSubtermsFn
{
RewriteableSubtermsFn(Ordering& ord) : _ord(ord) {}
VirtualIterator<pair<Literal*, TermList> > operator()(Literal* lit)
{
return pvi( pushPairIntoRightIterator(lit,
EqHelper::getBooleanSubtermIterator(lit, _ord)) );
}
private:
Ordering& _ord;
};
ClauseIterator Cases::generateClauses(Clause* premise)
{
auto it1 = premise->getSelectedLiteralIterator();
auto it2 = getMapAndFlattenIterator(it1,RewriteableSubtermsFn(_salg->getOrdering()));
auto it3 = getMappingIterator(std::move(it2),ResultFn(premise, *this));
auto it4 = getFilteredIterator(std::move(it3),NonzeroFn());
return pvi( std::move(it4) );
}
}