#ifndef HORUS_LIFTEDUTILS_H #define HORUS_LIFTEDUTILS_H #include #include #include #include #include "TinySet.h" #include "Util.h" using namespace std; class Symbol { public: Symbol (void) : id_(numeric_limits::max()) { } Symbol (unsigned id) : id_(id) { } operator unsigned (void) const { return id_; } bool valid (void) const { return id_ != numeric_limits::max(); } static Symbol invalid (void) { return Symbol(); } friend ostream& operator<< (ostream &os, const Symbol& s); private: unsigned id_; }; class LogVar { public: LogVar (void) : id_(numeric_limits::max()) { } LogVar (unsigned id) : id_(id) { } operator unsigned (void) const { return id_; } LogVar& operator++ (void) { assert (valid()); id_ ++; return *this; } bool valid (void) const { return id_ != numeric_limits::max(); } friend ostream& operator<< (ostream &os, const LogVar& X); private: unsigned id_; }; namespace std { template <> struct hash { size_t operator() (const Symbol& s) const { return std::hash() (s); }}; template <> struct hash { size_t operator() (const LogVar& X) const { return std::hash() (X); }}; }; typedef vector Symbols; typedef vector Tuple; typedef vector Tuples; typedef vector LogVars; typedef TinySet SymbolSet; typedef TinySet LogVarSet; typedef TinySet TupleSet; ostream& operator<< (ostream &os, const Tuple& t); namespace LiftedUtils { Symbol getSymbol (const string&); void printSymbolDictionary (void); } class Ground { public: Ground (Symbol f) : functor_(f) { } Ground (Symbol f, const Symbols& args) : functor_(f), args_(args) { } Symbol functor (void) const { return functor_; } Symbols args (void) const { return args_; } unsigned arity (void) const { return args_.size(); } bool isAtom (void) const { return args_.size() == 0; } friend ostream& operator<< (ostream &os, const Ground& gr); private: Symbol functor_; Symbols args_; }; typedef vector Grounds; class ConstraintTree; class ObservedFormula { public: ObservedFormula (Symbol f, unsigned a, unsigned ev) : functor_(f), arity_(a), evidence_(ev), constr_(0) { } ObservedFormula (Symbol f, unsigned ev, const Tuple& tuple) : functor_(f), arity_(tuple.size()), evidence_(ev), constr_(0) { addTuple (tuple); } Symbol functor (void) const { return functor_; } unsigned arity (void) const { return arity_; } unsigned evidence (void) const { return evidence_; } ConstraintTree* constr (void) const { return constr_; } bool isAtom (void) const { return arity_ == 0; } void addTuple (const Tuple& t); friend ostream& operator<< (ostream &os, const ObservedFormula opv); private: Symbol functor_; unsigned arity_; unsigned evidence_; ConstraintTree* constr_; }; typedef vector ObservedFormulas; class Substitution { public: void add (LogVar X_old, LogVar X_new) { subs_.insert (make_pair (X_old, X_new)); } void rename (LogVar X_old, LogVar X_new) { assert (subs_.find (X_old) != subs_.end()); subs_.find (X_old)->second = X_new; } LogVar newNameFor (LogVar X) const { assert (subs_.find (X) != subs_.end()); return subs_.find (X)->second; } private: unordered_map subs_; }; #endif // HORUS_LIFTEDUTILS_H