00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066 #include "predicate.h"
00067 #include "clause.h"
00068 #include "groundpredicate.h"
00069
00070 double Predicate::fixedSizeB_ = -1;
00071
00072
00073 void Predicate::setDirty() { dirty_ = true; if (parent_) parent_->setDirty(); }
00074
00075
00076 void Predicate::setParentDirty() { if (parent_) parent_->setDirty(); }
00077
00078
00079 bool Predicate::canBeGroundedAs(const GroundPredicate* const & gndPred)
00080 {
00081 if ( ((unsigned int) template_->getId()) != gndPred->getId()) return false;
00082 if (allTermsAreDiffVars()) return true;
00083
00084 int varGndings[MAX_VAR];
00085 memset(varGndings, -1, MAX_VAR*sizeof(int));
00086 for (int i = 0; i < terms_->size(); i++)
00087 {
00088 int termType = (*terms_)[i]->getType();
00089
00090 if (termType == Term::CONSTANT)
00091 {
00092 assert((*terms_)[i]->getId() >= 0);
00093 if ( ((unsigned int) (*terms_)[i]->getId()) != gndPred->getTermId(i))
00094 return false;
00095 }
00096 else
00097 if (termType == Term::VARIABLE)
00098 {
00099 int varId = -(*terms_)[i]->getId();
00100 assert(varId > 0);
00101 assert(varId < MAX_VAR);
00102 if (varGndings[varId] < 0)
00103 varGndings[varId] = gndPred->getTermId(i);
00104 else
00105 if (varGndings[varId] != (int) gndPred->getTermId(i))
00106 return false;
00107 }
00108 else
00109 {
00110 assert(false);
00111 }
00112 }
00113 return true;
00114 }
00115
00116
00117 bool Predicate::same(const GroundPredicate* const & gp)
00118 {
00119 if ( getId() != (int) gp->getId() ) return false;
00120 if ( terms_->size() != (int) gp->getNumTerms() ) return false;
00121 for (int i = 0; i < terms_->size(); i++)
00122 if ( (*terms_)[i]->getId() != (int) gp->getTermId(i) ) return false;
00123 return true;
00124 }
00125
00126 double
00127 Predicate::getNumGroundingsIfAllVarDiff(const Domain* const & domain) const
00128 {
00129 int numGnd = 1;
00130 for (int i = 0; i < template_->getNumTerms(); i++)
00131 numGnd *= domain->getNumConstantsByType(template_->getTermTypeAsInt(i));
00132 return numGnd;
00133 }
00134
00135
00136 void Predicate::createAllGroundings(const int& predId,
00137 const Domain* const & domain,
00138 Array<Predicate*>& returnArray)
00139 {
00140 const PredicateTemplate* pt = domain->getPredicateTemplate(predId);
00141 if (pt == NULL)
00142 {
00143 cout << "ERROR in Predicate::createAllGroundings: no predicate with id "
00144 << predId << " in domain" << endl;
00145 return;
00146 }
00147 if (pt->isEqualPredicateTemplate())
00148 {
00149 cout << "ERROR in Predicate::createAllGroundings: cannot create "
00150 << "groundings for '=' predicate" << endl;
00151 return;
00152 }
00153
00154 ArraysAccessor<int> acc;
00155 for (int i = 0; i < pt->getNumTerms(); i++)
00156 {
00157 int typeId = pt->getTermTypeAsInt(i);
00158 assert(typeId >= 0);
00159 const Array<int>* constArr = domain->getConstantsByType(typeId);
00160 assert(constArr->size() > 0);
00161 acc.appendArray(constArr);
00162 }
00163
00164
00165 while (acc.hasNextCombination())
00166 {
00167 Predicate* pred = new Predicate(pt);
00168 int constId;
00169 while (acc.nextItemInCombination(constId))
00170 pred->appendTerm(new Term(constId, (void*)pred, true));
00171 returnArray.append(pred);
00172
00173 }
00174 }
00175
00176
00177
00178 void Predicate::createAllGroundingsUnifyingWithTerm(const int& predId,
00179 const Domain* const & domain,
00180 Array<Predicate*>& returnArray,
00181 int termTypeId,int termConstId)
00182 {
00183 Array<int> tmpArr;
00184 const PredicateTemplate* pt = domain->getPredicateTemplate(predId);
00185 if (pt == NULL)
00186 {
00187 cout << "ERROR in Predicate::createAllGroundings: no predicate with id "
00188 << predId << " in domain" << endl;
00189 return;
00190 }
00191 if (pt->isEqualPredicateTemplate())
00192 {
00193 cout << "ERROR in Predicate::createAllGroundings: cannot create "
00194 << "groundings for '=' predicate" << endl;
00195 return;
00196 }
00197
00198 ArraysAccessor<int> acc;
00199 for (int i = 0; i < pt->getNumTerms(); i++)
00200 {
00201 int typeId = pt->getTermTypeAsInt(i);
00202 assert(typeId >= 0);
00203 const Array<int>* constArr;
00204 if(typeId != termTypeId) {
00205 constArr = domain->getConstantsByType(typeId);
00206 } else {
00207 tmpArr.clear();
00208 tmpArr.append(termConstId);
00209 constArr = &tmpArr;
00210 }
00211 assert(constArr->size() > 0);
00212 acc.appendArray(constArr);
00213 }
00214
00215 while (acc.hasNextCombination())
00216 {
00217 Predicate* pred = new Predicate(pt);
00218 int constId;
00219 while (acc.nextItemInCombination(constId))
00220 pred->appendTerm(new Term(constId, (void*)pred, true));
00221 returnArray.append(pred);
00222
00223 }
00224 }
00225
00226
00227
00228 void Predicate::createAllGroundings(const Domain* const & domain,
00229 Array<Predicate*>* const & predReturnArray,
00230 Array<int*>* const & constReturnArray)
00231 {
00232 assert(predReturnArray == NULL || constReturnArray == NULL);
00233
00234 if (isGrounded())
00235 {
00236 if (predReturnArray)
00237 predReturnArray->append(new Predicate(*this));
00238 else
00239 {
00240 assert(constReturnArray);
00241 int* constArr = new int[terms_->size()];
00242 for (int j = 0; j < terms_->size(); j++)
00243 {
00244 constArr[j] = (*terms_)[j]->getId();
00245 assert(constArr[j] >= 0);
00246 }
00247 constReturnArray->append(constArr);
00248 }
00249 return;
00250 }
00251
00252
00253 Array<VarsGroundedType*> vgtArr;
00254 for (int i = 0; i < terms_->size(); i++)
00255 {
00256 const Term* t = (*terms_)[i];
00257 if (t->getType() == Term::VARIABLE)
00258 {
00259 int id = -(t->getId());
00260 assert(id > 0);
00261 if (id >= vgtArr.size()) vgtArr.growToSize(id+1,NULL);
00262 VarsGroundedType*& vgt = vgtArr[id];
00263 if (vgt == NULL)
00264 {
00265 vgt = new VarsGroundedType;
00266 vgt->typeId = getTermTypeAsInt(i);
00267 assert(vgt->typeId >= 0);
00268 }
00269 assert(getTermTypeAsInt(i) == vgt->typeId);
00270 vgt->vars.append((Term*)t);
00271 }
00272 }
00273
00274 Array<int> negVarId;
00275 ArraysAccessor<int> acc;
00276 for (int i = 0; i < vgtArr.size(); i++)
00277 {
00278 if (vgtArr[i] == NULL) continue;
00279 negVarId.append(i);
00280 acc.appendArray(domain->getConstantsByType(vgtArr[i]->typeId));
00281 }
00282
00283 while (acc.hasNextCombination())
00284 {
00285 int i = 0;
00286 int constId;
00287 while (acc.nextItemInCombination(constId))
00288 {
00289 Array<Term*>& vars = vgtArr[ negVarId[i] ]->vars;
00290 for (int j = 0; j < vars.size(); j++) vars[j]->setId(constId);
00291 i++;
00292 }
00293
00294 if (predReturnArray)
00295 predReturnArray->append(new Predicate(*this));
00296 else
00297 {
00298 assert(constReturnArray);
00299 int* constArr = new int[terms_->size()];
00300 for (int j = 0; j < terms_->size(); j++)
00301 {
00302 constArr[j] = (*terms_)[j]->getId();
00303 assert(constArr[j] >= 0);
00304 }
00305 constReturnArray->append(constArr);
00306 }
00307 }
00308
00309
00310 for (int i = 0; i < vgtArr.size(); i++)
00311 {
00312 if (vgtArr[i] == NULL) continue;
00313 Array<Term*>& vars = vgtArr[i]->vars;
00314 for (int j = 0; j < vars.size(); j++) vars[j]->setId(-i);
00315 delete vgtArr[i];
00316 }
00317 }