CLIPS - EnvAssertString vs EnvAssert

CLIPS - EnvAssertString vs EnvAssert

本文关键字:EnvAssert vs EnvAssertString CLIPS      更新时间:2023-10-16

EnvAssertEnvAssertString之间的功能有差异?我试图使用两者都断言事实,但是当我使用EnvAssertString断言事实时,相关规则被激活,并且当我使用EnvAssert

断言事实时,没有被激活。

这是我在constructs.clp文件中的定义:

(deftemplate Safety
    (slot SafetyStatus (type SYMBOL) (default True) (allowed-symbols True False))
    (slot DistanceToObject (type INTEGER) (default 0))
    (slot BatteryLevel (type INTEGER) (default 0)))
(defrule r11
    ?f <- (Safety (SafetyStatus True) (BatteryLevel ?bat) (DistanceToObject ?dist))
    (test (and (> ?bat 20) (> ?dist 3)))
    => 
    (modify ?f (SafetyStatus False)))

这是我的C 代码片段:

// The rule is activated if I use this line
EnvAssertString(theEnv, "(Safety (BatteryLevel 100)(DistanceToObject 4))");
// The rule is not activated if I used these lines
templatePtr = EnvFindDeftemplate(theEnv, "Safety");
newFact = EnvCreateFact(theEnv, templatePtr);
if (newFact == NULL) return -1;
theValue.type = INTEGER;
theValue.value = EnvAddLong(theEnv, 100);
EnvPutFactSlot(theEnv, newFact, "BatteryLevel", &theValue);
theValue.type = INTEGER;
theValue.value = EnvAddLong(theEnv, 4);
EnvPutFactSlot(theEnv, newFact, "DistanceToObject", &theValue);
EnvAssert(theEnv, newFact);
EnvRun(theEnv, -1L);

呼叫EnvAssertString断言:

==> f-1     (Safety (SafetyStatus nil) (DistanceToObject 4) (BatteryLevel 100))

在调用EnvAssert时断言以下内容:

==> f-1     (Safety (SafetyStatus True) (DistanceToObject 4) (BatteryLevel 100))

有人可以告诉我问题在哪里?

assertstring是断言的包装。基本上,它解析了字符串参数,创建适当类型的事实,分配指定的插槽值,将默认值分配给未指定的插槽,然后断言事实。在使用Envassert的示例中,您需要调用" Envassignfactslotdefaults(theenv,newFact(;"因此,默认值将分配给您未指定的插槽。这将导致将值分配给SafetyStatus插槽,并允许R11规则匹配。