Я использую CLIPS
API EnvEval
чтобы найти факт с учетом его отношения:
auto expression = "(find-all-facts ((?f system)) TRUE)";
DATA_OBJECT outputValue;
auto res = EnvEval(pEnvironment, expression, &outputValue);
return res;
Но моя проблема в том, что если я попытаюсь найти факт, которого нет в текущем списке фактов, EnvEval
всегда будет возвращать FALSE даже для фактов, которые существуют, для каждого нового вызова.
Почему такое поведение и что я делаю не так?
Ваш исходный код очень частичный, и я не
знать, правильно ли я понимаю ситуацию.
Но, во всяком случае, вот рабочий быстрый взлом, в соответствии с
ваша проблема, это может помочь.
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> )
Других решений пока нет …