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

时间:2017-05-27 17:34:00

标签: c++ clips expert-system

我试图在嵌入式应用程序中断言CLIPS中的新事实。 我试过两种方法: - 第一次使用断言,如高级编程指南中第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);
}

我的代码有什么问题?

1 个答案:

答案 0 :(得分:0)

使用:

EnvFacts(theEnv,"stdout",NULL,-1,-1,-1);

而不是:

EnvListDeffacts(theEnv, "stdout", NULL);

Deffacts是一种结构,用于定义执行(重置)命令时要声明的事实列表。存在预定义的初始事实deffacts,其在执行重置时断言(初始事实)。当你调用EnvListDeffacts时,这就是你所看到的。您想要调用EnvFacts来查看实际已声明的事实(无论是在重置后直接使用断言创建的deffacts还是直接使用断言)。