#ifndef __Rectify__
#define __Rectify__
#include "Lib/Array.hpp"
#include "Lib/List.hpp"
#include "Kernel/Formula.hpp"
#include "Kernel/SubstHelper.hpp"
namespace Kernel {
class Unit;
class Clause;
class Term;
}
using namespace Kernel;
namespace Shell {
class Rectify
{
public:
Rectify()
: _free(0), _removeUnusedVars(true)
{}
static FormulaUnit* rectify(FormulaUnit*, bool removeUnusedVars=true);
static void rectify(UnitList*& units);
private:
typedef std::pair<unsigned,bool> VarWithUsageInfo;
typedef List<VarWithUsageInfo> VarUsageTrackingList;
class Renaming
: public Array<VarUsageTrackingList*>
{
public:
Renaming()
: Array<VarUsageTrackingList*>(15),
_nextVar(0)
{
fillInterval(0,15);
}
~Renaming() override;
bool tryGetBoundAndMarkUsed (int var,int& boundTo) const;
VarWithUsageInfo getBoundAndUsage(int var) const;
unsigned bind (unsigned v);
void undoBinding(unsigned v);
private:
void fillInterval (size_t start,size_t end) override;
unsigned _nextVar;
};
void reset();
unsigned rectifyVar(unsigned v);
Formula* rectify(Formula*);
FormulaList* rectify(FormulaList*);
void bindVars(VList*);
void unbindVars(VList*);
VList* rectifyBoundVars(VList*);
TermList rectify(TermList);
Term* rectify(Term* t);
Term* rectifySpecialTerm(Term* t);
Literal* rectify(Literal*);
Literal* rectifyShared(Literal* lit);
SList* rectifySortList(SList* from, bool& modified);
template<class From, class To>
bool rectify(From from, To to, unsigned cnt);
friend class Kernel::SubstHelper;
TermList apply(unsigned var) { return TermList(rectifyVar(var), false); }
Renaming _renaming;
VList* _free;
bool _removeUnusedVars;
};
}
#endif