Клипы — EnvAssertString против EnvAssert

Есть ли разница в функциональности между 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))

Может кто-нибудь сказать, пожалуйста, где проблема?

0

Решение

AssertString — это оболочка для Assert. В основном он анализирует строковый аргумент, создает факт соответствующего типа, назначает указанные значения слотов, присваивает значения по умолчанию неопределенным слотам, а затем подтверждает факт. В вашем примере, использующем EnvAssert, вам нужно вызвать «EnvAssignFactSlotDefaults (theEnv, newFact);» так что значения по умолчанию будут назначены слотам, которые вы не указали. Это приведет к тому, что значение True будет назначено в слот SafetyStatus и позволит найти соответствие правилу r11.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]