#ifndef __Property__
#define __Property__
#include "Forwards.hpp"
#include "Lib/DArray.hpp"
#include "Lib/Array.hpp"
#include "Lib/DHSet.hpp"
#include "Kernel/Theory.hpp"
#include "SMTLIBLogic.hpp"
namespace Shell {
using namespace Kernel;
using namespace Lib;
class Property
{
public:
enum Category {
NEQ,
HEQ,
PEQ,
HNE,
NNE,
FEQ,
FNE,
EPR,
UEQ
};
static const uint64_t PR_HAS_X_EQUALS_Y = 1ul;
static const uint64_t PR_HAS_FUNCTION_DEFINITIONS = 2ul;
static const uint64_t PR_HAS_SUBSET = 4ul;
static const uint64_t PR_HAS_EXTENSIONALITY = 8ul;
static const uint64_t PR_GROUP = 16ul;
static const uint64_t PR_RING = 32ul;
static const uint64_t PR_ROBBINS_ALGEBRA = 64ul;
static const uint64_t PR_NA_RING = 128ul;
static const uint64_t PR_BOOLEAN_ALGEBRA = 256ul;
static const uint64_t PR_LATTICE = 512ul;
static const uint64_t PR_LO_GROUP = 1024ul;
static const uint64_t PR_COMBINATOR_B = 2048ul;
static const uint64_t PR_COMBINATOR = 4096ul;
static const uint64_t PR_HAS_CONDENSED_DETACHMENT1 = 8192ul;
static const uint64_t PR_HAS_CONDENSED_DETACHMENT2 = 16384ul;
static const uint64_t PR_HAS_FLD1 = 32768ul;
static const uint64_t PR_HAS_FLD2 = 65536ul;
static const uint64_t PR_HAS_INEQUALITY_RESOLVABLE_WITH_DELETION = 131072ul;
static const uint64_t PR_HAS_STRINGS = 262144ul;
static const uint64_t PR_HAS_INTEGERS = 524288ul;
static const uint64_t PR_HAS_RATS = 1048576ul;
static const uint64_t PR_HAS_REALS = 2097152ul;
static const uint64_t PR_SORTS = 4194304ul;
static const uint64_t PR_INTEGER_COMPARISON = 8388608ul;
static const uint64_t PR_RAT_COMPARISON = 16777216ul;
static const uint64_t PR_REAL_COMPARISON = 33554432ul;
static const uint64_t PR_INTEGER_LINEAR = 67108864ul;
static const uint64_t PR_RAT_LINEAR = 134217728ul;
static const uint64_t PR_REAL_LINEAR = 268435456ul;
static const uint64_t PR_INTEGER_NONLINEAR = 536870912ul;
static const uint64_t PR_RAT_NONLINEAR = 1073741824ul;
static const uint64_t PR_REAL_NONLINEAR = 2147483648ul;
static const uint64_t PR_NUMBER_CONVERSION = 4294967296ul;
static const uint64_t PR_ESSENTIALLY_GROUND = 8589934592ul;
static const uint64_t PR_LIST_AXIOMS = 17179869184ul;
static const uint64_t PR_HAS_BOOLEAN_VARIABLES = 34359738368ul;
static const uint64_t PR_HAS_ARRAYS = 68719476736ul;
static const uint64_t PR_HAS_FINITE_DOMAIN = 137438953472ul;
static const uint64_t PR_HAS_ITE = 274877906944ul;
static const uint64_t PR_HAS_LET_IN = 549755813888ul;
static const uint64_t PR_HAS_DT_CONSTRUCTORS = 1099511627776ul;
static const uint64_t PR_HAS_CDT_CONSTRUCTORS = 2199023255552ul;
static const uint64_t PR_ESSENTIALLY_BSR = 4398046511104ul;
public:
explicit Property();
static Property* scan(UnitList*);
void add(UnitList*);
Category category() const { return _category;}
static std::string categoryToString(Category cat);
std::string categoryString() const;
std::string toString() const;
std::string toSpider(const std::string& problemName) const;
DHMap<std::string,std::string> toDict() const;
int clauses() const { return _goalClauses + _axiomClauses; }
int formulas() const { return _goalFormulas + _axiomFormulas; }
int unitClauses() const { return _unitGoals + _unitAxioms; }
int hornClauses() const { return _hornGoals + _hornAxioms; }
int atoms() const { return _atoms; }
int equalityAtoms() const { return _equalityAtoms; }
int positiveEqualityAtoms() const { return _positiveEqualityAtoms; }
bool hasFormulas() const { return _axiomFormulas || _goalFormulas; }
int maxFunArity() const { return _maxFunArity; }
unsigned maxTypeConArity() const { return _maxTypeConArity; }
int totalNumberOfVariables() const { return _totalNumberOfVariables;}
bool hasProp(uint64_t p) const { return _props & p; }
void addProp(uint64_t p) { _props |= p; }
void dropProp(uint64_t p) { _props &= ~p; }
uint64_t props() const { return _props; }
void scanForInterpreted(Term* t);
bool hasInterpretedOperation(Interpretation i) const {
if(i >= _interpretationPresence.size()){ return false; }
return _interpretationPresence[i];
}
bool hasInterpretedOperation(Interpretation i, OperatorType* type) const {
return _polymorphicInterpretations.find(std::make_pair(i,type));
}
bool hasInterpretedOperations() const { return _hasInterpreted; }
bool hasNumerals() const { return hasProp(PR_HAS_INTEGERS) || hasProp(PR_HAS_REALS) || hasProp(PR_HAS_RATS); }
bool hasGoal() const { return _goalClauses > 0 || _goalFormulas > 0; }
bool hasNonDefaultSorts() const { return _hasNonDefaultSorts; }
bool hasFOOL() const { return _hasFOOL; }
bool hasArrowSort() const { return _hasArrowSort; }
bool hasApp() const { return _hasApp; }
bool hasAppliedVar() const { return _hasAppliedVar; }
bool hasBoolVar() const { return _hasBoolVar; }
bool hasLogicalProxy() const { return _hasLogicalProxy; }
bool hasPolymorphicSym() const { return _hasPolymorphicSym; }
bool hasAnswerLiteral() const { return _hasAnswerLiteral; }
bool higherOrder() const { return hasApp() || hasLogicalProxy() ||
hasArrowSort() || _hasLambda; }
bool quantifiesOverPolymorphicVar() const { return _quantifiesOverPolymorphicVar; }
bool usesSort(unsigned sort) const {
if(_usesSort.size() <= sort) return false;
return _usesSort[sort];
} bool usesSingleSort() const { return _sortsUsed==1; }
unsigned sortsUsed() const { return _sortsUsed; }
bool onlyFiniteDomainDatatypes() const { return _onlyFiniteDomainDatatypes; }
bool knownInfiniteDomain() const { return _knownInfiniteDomain; }
void setSMTLIBLogic(SMTLIBLogic smtLibLogic) {
_smtlibLogic = smtLibLogic;
}
SMTLIBLogic getSMTLIBLogic() const {
return _smtlibLogic;
}
bool allNonTheoryClausesGround(){ return _allNonTheoryClausesGround; }
template<class Numeral>
bool isNonLinear() const { return isNonLinear((Numeral*)nullptr); }
private:
bool isNonLinear(IntegerConstantType*) const { return _nonLinearInt; }
bool isNonLinear(RationalConstantType*) const { return _nonLinearRat; }
bool isNonLinear(RealConstantType*) const { return _nonLinearReal; }
static bool hasXEqualsY(const Clause* c);
static bool hasXEqualsY(const Formula*);
static bool onlyExistsForallPrefix(UnitList* units);
void scan(Unit*);
void scan(Clause*);
void scan(FormulaUnit*);
void scan(Literal* lit, int polarity, unsigned cLen, bool goal);
void scan(Formula*, int polarity);
void scan(TermList ts,bool unit,bool goal);
void scanSort(TermList sort);
int _goalClauses;
int _axiomClauses;
int _positiveEqualityAtoms;
int _equalityAtoms;
int _atoms;
int _goalFormulas;
int _axiomFormulas;
int _subformulas;
int _unitGoals;
int _unitAxioms;
int _hornGoals;
int _hornAxioms;
int _equationalClauses;
int _pureEquationalClauses;
int _groundUnitAxioms;
int _positiveAxioms;
int _groundPositiveAxioms;
int _groundGoals;
int _maxFunArity;
int _maxPredArity;
unsigned _maxTypeConArity;
int _variablesInThisClause;
int _totalNumberOfVariables;
int _maxVariablesInClause;
DHSet<int> _symbolsInFormula;
uint64_t _props;
Category _category;
bool _hasInterpreted;
bool _hasNonDefaultSorts;
unsigned _sortsUsed;
Array<bool> _usesSort;
friend struct Setter;
DArray<bool> _interpretationPresence;
DHSet<Theory::MonomorphisedInterpretation> _polymorphicInterpretations;
bool _hasFOOL;
bool _hasArrowSort;
bool _hasApp;
bool _hasAppliedVar;
bool _hasBoolVar;
bool _hasLogicalProxy;
bool _hasLambda;
bool _hasPolymorphicSym;
bool _hasAnswerLiteral;
bool _quantifiesOverPolymorphicVar;
bool _onlyFiniteDomainDatatypes;
bool _knownInfiniteDomain;
bool _allClausesGround;
bool _allNonTheoryClausesGround;
bool _allQuantifiersEssentiallyExistential;
bool _hasNumeralsInt;
bool _hasNumeralsRat;
bool _hasNumeralsReal;
bool _nonLinearInt;
bool _nonLinearRat;
bool _nonLinearReal;
SMTLIBLogic _smtlibLogic;
};
}
#endif