Есть ли разница в функциональности между EnvAssert
а также EnvAssertString
?
Я пытался утверждать факт, используя оба, но соответствующее правило активируется, когда я утверждаю факт, используя 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 — это оболочка для Assert. В основном он анализирует строковый аргумент, создает факт соответствующего типа, назначает указанные значения слотов, присваивает значения по умолчанию неопределенным слотам, а затем подтверждает факт. В вашем примере, использующем EnvAssert, вам нужно вызвать «EnvAssignFactSlotDefaults (theEnv, newFact);» так что значения по умолчанию будут назначены слотам, которые вы не указали. Это приведет к тому, что значение True будет назначено в слот SafetyStatus и позволит найти соответствие правилу r11.
Других решений пока нет …