CLIPS eval перестает работать, если факт не существует

Я использую CLIPS API EnvEval чтобы найти факт с учетом его отношения:

auto expression = "(find-all-facts ((?f system)) TRUE)";

DATA_OBJECT outputValue;

auto res = EnvEval(pEnvironment, expression, &outputValue);
return res;

Но моя проблема в том, что если я попытаюсь найти факт, которого нет в текущем списке фактов, EnvEval всегда будет возвращать FALSE даже для фактов, которые существуют, для каждого нового вызова.

Почему такое поведение и что я делаю не так?

0

Решение

Ваш исходный код очень частичный, и я не
знать, правильно ли я понимаю ситуацию.

Но, во всяком случае, вот рабочий быстрый взлом, в соответствии с
ваша проблема, это может помочь.

PS: CLIPS очень стабильный, хорошо документированный и обновленный (спасибо Гэри).

(скомпилировано clang и gcc под linux)

файл: sample.clp

(deffacts dummy-example ""(not-important blá)
(dummy foo)
(useless bar)
(my-system aaa)
(just-noise bbb)
(my-system bbb)
(my-system ccc))

Код C

#include "clips.h"
int main(/* int argc, char *argv[] */)
{
void *theEnv;
char *expression;
DATA_OBJECT outputValue;
char *result;

void *multifieldPtr, *factPtr;
long end, i;

theEnv = CreateEnvironment();

EnvLoad(theEnv, "sample.clp");
EnvReset(theEnv);
EnvRun(theEnv, -1);

expression = strdup("(find-all-facts ((?f my-system)) TRUE)");

if (!EnvEval(theEnv, expression, &outputValue)) {
EnvPrintRouter(theEnv, WPROMPT,
"NOT successfully evaluated\n");
} else {

/* Print the result of find-all-facts field by field */
if (GetType(outputValue) == MULTIFIELD) {

end = GetDOEnd(outputValue);
multifieldPtr = GetValue(outputValue);
EnvPrintRouter(theEnv,WPROMPT,"( ");
for (i = GetDOBegin(outputValue); i <= end; i++){
if (GetMFType(multifieldPtr,i) == FACT_ADDRESS){
factPtr = GetMFValue(multifieldPtr,i);
asprintf(&result,"<Fact-%lld> ",
EnvFactIndex(theEnv, factPtr));
EnvPrintRouter(theEnv,WPROMPT,result);
}

}
EnvPrintRouter(theEnv,WPROMPT,")\n");
} else {
EnvPrintRouter(theEnv,WPROMPT,"Not a multifield!");
}

}

return(0);
}

Когда вы компилируете и запускаете, вы получаете

( <Fact-4> <Fact-6> <Fact-7> )
1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector