00001
00027
00028
00029
00030
00031
00032
00033
00034
00035 #ifndef __signature__
00036 #define __signature__
00037
00038 #define NO_OF_BUCKETS 2039
00039
00040
00041
00042
00043
00044
00045 class TermList;
00046
00047
00048 #include "Int.hpp"
00049 #include "List.hpp"
00050
00051
00052 class Atom;
00053
00054 class Signature {
00055
00056 public:
00057
00058 class Symbol;
00059 typedef List <Symbol*,CID_PSYM_LIST> List;
00060
00061 class Symbol
00062 # if DEBUG_PREPRO
00063 : public Memory <CID_SYMBOL>
00064 # endif
00065 {
00066 public:
00067
00068 int arity () const { return _arity; }
00069 const char* name () const { return _name;}
00070 const int number () const { return _number; }
00071 void arity ( int ar ) { _arity = ar; };
00072 void kernelNumber (unsigned long n) { _kernelNumber = n; }
00073 unsigned long kernelNumber () const { return _kernelNumber; }
00074
00075 protected:
00076 Symbol (const char* name, int arity, int& number) :
00077 _name (name),
00078 _arity (arity),
00079 _number (number++)
00080 {}
00081
00082 const char* _name;
00083 int _arity;
00084 int _number;
00085 unsigned long _kernelNumber;
00086 };
00087
00088 class Fun :
00089 public Symbol
00090 {
00091 public:
00092 Fun (const char* name, int arity, int& count) :
00093 Symbol (name,arity,count)
00094 {}
00095 Compare compare (const Fun*) const;
00096 };
00097
00098 class Pred :
00099 public Symbol
00100 {
00101 public:
00102 Pred (const char* name, int arity, int& count) :
00103 Symbol (name,arity,count)
00104 {}
00105 bool isEquality () const
00106 { return number() == 0; }
00107
00108 Compare compare (const Pred*) const;
00109 };
00110
00111
00112 class Iterator {
00113 public:
00114 explicit Iterator (List** buckets);
00115 bool more ();
00116 Symbol* next ();
00117 private:
00118 List** _firstBucket;
00119 List** _currentBucket;
00120 List* _currentList;
00121 };
00122
00123
00124 class FunIterator
00125 : public Iterator {
00126 public:
00127 explicit FunIterator (Signature* s) :
00128 Iterator (s->_fbuckets)
00129 {}
00130 };
00131
00132
00133 class PredIterator
00134 : public Iterator {
00135 public:
00136 explicit PredIterator (Signature* s) :
00137 Iterator (s->_pbuckets)
00138 {}
00139 };
00140
00141 Signature ();
00142 ~Signature ();
00143
00144 Fun* createFun ( const char* name, int arity )
00145 { return static_cast<Fun*>(create (name, arity, _fbuckets, false)); }
00146 Pred* createPred ( const char* name, int arity )
00147 { return static_cast<Pred*>(create (name, arity, _pbuckets, true)); }
00148
00149
00150 Pred* equality () { return _equality; }
00151 int noOfPreds () const { return _noOfPreds; }
00152 int noOfFuns () const { return _noOfFuns; }
00153 bool arityCheck () const;
00154
00155
00156 Fun* newSkolemFunction (int arity);
00157 void createAnswerAtom (TermList args, Atom& answer);
00158 void addArithmetic ();
00159 bool isAnswer (const Pred* p) const
00160 { return p == _answer; }
00161
00162 private:
00163 List * _fbuckets [NO_OF_BUCKETS];
00164 List * _pbuckets [NO_OF_BUCKETS];
00165 int _noOfPreds;
00166 int _noOfFuns;
00167 int _lastSkolem;
00168 Pred* _answer;
00169
00170 static int hash ( const char* );
00171 Symbol* create ( const char* str, int arity, List** buckets, bool isPred );
00172 Pred* _equality;
00173
00174
00175 bool existsFun ( const char* name ) const;
00176
00177 friend class SymCounter;
00178 friend class FunIterator;
00179 friend class PredIterator;
00180 };
00181
00182
00183 ostream& operator << ( ostream& str, const Signature::Symbol* p );
00184
00185
00186
00187 extern Signature* sig;
00188
00189 #endif // __signature__