#ifndef __TermShifter__
#define __TermShifter__
#include "Kernel/TermTransformer.hpp"
#include "Kernel/Term.hpp"
using namespace Kernel;
class TermShifter : public TermTransformer
{
public:
explicit TermShifter(int shiftBy)
: TermTransformer(false),
_shiftBy(shiftBy) {}
static std::pair<TermList, Option<unsigned>> shift(TermList term, int shiftBy);
TermList transformSubterm(TermList t) override;
void onTermEntry(Term* t) override {
if (t->isLambdaTerm())
_cutOff++;
}
void onTermExit(Term* t) override {
if (t->isLambdaTerm())
_cutOff--;
}
bool exploreSubterms(TermList orig, TermList newTerm) override {
return orig == newTerm && newTerm.term()->hasDeBruijnIndex();
}
private:
unsigned _cutOff = 0; int _shiftBy; Option<unsigned> _minFreeIndex = Option<unsigned>();
};
#endif