无法在剪辑嵌入式应用程序中断言事实

Can't assert facts in clips embedded application

本文关键字:应用程序 中断 断言 事实 嵌入式      更新时间:2023-10-16

我试图在嵌入式应用程序的CLIPS中断言一个新事实。我尝试了两种方法:- 第一个使用 assert,如高级编程指南第 74 页的示例所示。- 第二种方法是使用断言字符串。我独自尝试了每种方式,也尝试了两种方式。

我正在使用RUN_TIME模块。我的代码输出正确的结构(定义规则和定义模板(,但没有断言新事实。只有初始事实在那里。我不知道为什么!

这是我的代码:

#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);

Deffacts 是定义执行(重置(命令时要断言的事实列表的构造。有一个预定义的初始事实定义,用于在执行重置时断言(初始事实(。这就是你在调用EnvListDeffacts时看到的内容。您希望改为调用 EnvFacts 以查看实际断言的事实(无论是由重置后的 deffacts 创建还是直接使用 断言(。