0
EnvAssert
和EnvAssertString
之間的功能有什麼不同? 我試圖用兩個斷言事實,但是當我使用EnvAssertString
斷言事實時激活相關規則,並且在我使用EnvAssert
斷言事實時未激活!CLIPS - 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))
有人能告訴我問題在哪裏嗎?
感謝@Gary爲您的快速回復,現在它的工作。 –