#ifndef __ExtensionalityClauseContainer__
#define __ExtensionalityClauseContainer__
#include "Forwards.hpp"
#include "Shell/Options.hpp"
namespace Saturation
{
using namespace Kernel;
using namespace Shell;
struct ExtensionalityClause
{
ExtensionalityClause () {}
ExtensionalityClause (Clause* clause, Literal* literal, TermList sort)
: clause(clause), literal(literal), sort(sort) {}
Clause* clause;
Literal* literal;
TermList sort;
};
typedef List<ExtensionalityClause> ExtensionalityClauseList;
typedef VirtualIterator<ExtensionalityClause> ExtensionalityClauseIterator;
typedef DHMap<TermList, ExtensionalityClauseList*> ClausesBySort;
class ExtensionalityClauseContainer
{
public:
ExtensionalityClauseContainer(const Options& opt)
: _size(0),
_maxLen(opt.extensionalityMaxLength()),
_allowPosEq(opt.extensionalityAllowPosEq())
{
_onlyKnown = (opt.extensionalityResolution() == Options::ExtensionalityResolution::KNOWN);
_onlyTagged = (opt.extensionalityResolution() == Options::ExtensionalityResolution::TAGGED);
}
Literal* addIfExtensionality(Clause* c);
static Literal* getSingleVarEq(Clause* c);
ExtensionalityClauseIterator activeIterator(TermList sort);
unsigned size() const { return _size; }
void print(std::ostream& o);
private:
ClausesBySort _clausesBySort;
void add(ExtensionalityClause c);
struct ActiveFilterFn;
unsigned _size;
bool _onlyKnown;
bool _onlyTagged;
unsigned _maxLen;
bool _allowPosEq;
};
}
#endif