#include "BwdDemodulation.hpp"
#include "Saturation/SaturationAlgorithm.hpp"
#define DEBUG(...)
using Demod = Inferences::ALASCA::Demodulation;
namespace Inferences {
namespace ALASCA {
void BwdDemodulation::attach(SaturationAlgorithm* salg)
{
BackwardSimplificationEngine::attach(salg);
_index = _salg->getSimplifyingIndex<AlascaIndex<Rhs>>();
_index->setShared(_shared);
}
void BwdDemodulation::detach()
{
ASS(_salg);
_index = nullptr;
BackwardSimplificationEngine::detach();
}
auto applyResultSubstitution(ResultSubstitution& subs, TermList t)
{ return subs.applyToBoundQuery(t); }
auto applyResultSubstitution(ResultSubstitution& subs, Literal* lit)
{
Stack<TermList> terms(lit->arity());
for (unsigned i = 0; i < lit->arity(); i++) {
terms.push(applyResultSubstitution(subs, *lit->nthArgument(i)));
}
return Literal::create(lit, terms.begin());
}
void BwdDemodulation::perform(Clause* premise, BwSimplificationRecordIterator& simplifications)
{
DEBUG_CODE(unsigned cnt = 0;)
for (auto lhs : Lhs::iter(*_shared, premise)) {
DEBUG_CODE(cnt++;)
Stack<BwSimplificationRecord> simpls;
Set<Clause*> simplified;
for (auto rhs : _index->instances(lhs.biggerSide())) {
auto toSimpl = rhs.data->clause;
if (simplified.contains(toSimpl)) {
} else {
auto maybeSimpl = Demod::apply(*_shared, lhs, *rhs.data);
if (maybeSimpl.isSome()) {
simplified.insert(toSimpl);
simpls.push(BwSimplificationRecord(toSimpl, maybeSimpl.unwrap()));
}
}
}
if (!simpls.isEmpty()) {
simplifications = pvi(arrayIter(std::move(simpls)));
return;
}
}
ASS(cnt <= 1)
simplifications = BwSimplificationRecordIterator::getEmpty();
}
} }