EnvAssert
とEnvAssertString
の機能に違いはありますか? 私は両方を使用してファクトをアサートしようとしましたが、EnvAssertString
を使用してファクトをアサートし、EnvAssert
を使用してファクトをアサートすると、関連するルールがアクティブになります。ここで CLIPS - EnvAssertStringとEnvAssert
(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++コードスニペットです:
==> f-1 (Safety (SafetyStatus nil) (DistanceToObject 4) (BatteryLevel 100))
中:
// 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
を呼び出すと、次をアサートEnvAssert
を呼び出すと、次のようにアサートされます。
==> f-1 (Safety (SafetyStatus True) (DistanceToObject 4) (BatteryLevel 100))
誰かが問題の原因を教えてください。
お返事ありがとうございます。 –