Я пытаюсь утверждать новый факт в CLIPS во встроенном приложении.
Я попробовал два способа:
— Сначала используйте assert, как в примере на странице 74 в расширенном руководстве по программированию.
— Второй способ — использовать assert-string.
Я пробовал каждый путь один, а также два пути вместе.
Я использую модуль RUN_TIME. Мой код выводит правильные конструкции (defrules и deftemplates), но новый факт не утверждается. Только первоначальный факт есть. Я не знаю почему!
Вот мой код:
#include "clips.h"
int main()
{
void *theEnv, *newFact, *templatePtr;
DATA_OBJECT theValue;
extern void *InitCImage_1();
theEnv = InitCImage_1();
EnvReset(theEnv);
// One way
templatePtr = EnvFindDeftemplate(theEnv, "Navigation");
newFact = EnvCreateFact(theEnv, templatePtr);
if (newFact == NULL) return -1;
theValue.type = SYMBOL;
theValue.value = EnvAddSymbol(theEnv, "Auto");
EnvPutFactSlot(theEnv, newFact, "FlightStatus", &theValue);
EnvAssert(theEnv, newFact);
// The other way
EnvAssertString(theEnv, "(Navigation (FlightStatus Auto))");
EnvRun(theEnv,-1);
EnvListDeftemplates(theEnv, "stdout", NULL);
EnvListDefrules(theEnv, "stdout", NULL);
EnvListDeffacts(theEnv, "stdout", NULL);
}
Что не так в моем коде?
Использование:
EnvFacts(theEnv,"stdout",NULL,-1,-1,-1);
Скорее, чем:
EnvListDeffacts(theEnv, "stdout", NULL);
Дефекты — это конструкции, которые определяют список фактов, которые должны быть подтверждены при выполнении команды (сброса). Существует заранее определенный исходный факт, который утверждает (начальный факт), когда выполняется сброс. Это то, что вы видите в списке, когда вызываете EnvListDeffacts. Вместо этого вы хотите вызвать EnvFacts, чтобы увидеть факты, которые фактически были утверждены (независимо от того, были ли они созданы после сброса или непосредственно с помощью assert).
Других решений пока нет …