2015-03-29 4 views
0

У меня есть определение с одним слотом deftemplate с ограничением на разрешенные символы. Если я прямо утверждаю факт с верхнего уровня, ограничения работают как ожидалось (т. Е. Я могу использовать только один из разрешенных символов). Однако, если я делаю это из-за дефиса, ограничение фактически не существует (см. Вывод кода ниже). Как принудительно использовать ограничение из моей функции?CLIPS: утверждение фактов изнутри функции не учитывает ограничения шаблона

CLIPS> (clear) 
CLIPS> (deftemplate test-template (slot myslot (type SYMBOL) (allowed-symbols A B C))) 
CLIPS> (deffunction test-function (?s) (assert (test-template (myslot ?s)))) 
CLIPS> (assert (test-template (myslot X))) 

[CSTRNCHK1] A literal slot value found in the assert command 
does not match the allowed values for slot myslot. 
CLIPS> (test-function X) 
<Fact-1> 
CLIPS> (facts) 
f-0  (initial-fact) 
f-1  (test-template (myslot X)) 
For a total of 2 facts. 
CLIPS> 

ответ

0

Статическая проверка ограничений (которая возникает во время разбора) включена по умолчанию. Проверка динамических ограничений (которая возникает во время выполнения кода) отсутствует (см. Раздел 11 Основного руководства по программированию). Если вы включите его, вы получите нарушение ограничения в своем примере (хотя вам нужно утверждать факт со значением слота, отличным от X, дублирующиеся факты не допускаются, и во время выполнения эта проверка будет выполняться до проверки ограничения).

CLIPS> (clear) 
CLIPS> (deftemplate test-template (slot myslot (type SYMBOL) (allowed-symbols A B C))) 
CLIPS> (deffunction test-function (?s) (assert (test-template (myslot ?s)))) 
CLIPS> (assert (test-template (myslot X))) 

[CSTRNCHK1] A literal slot value found in the assert command 
does not match the allowed values for slot myslot. 
CLIPS> (test-function Y) 
<Fact-1> 
CLIPS> (set-dynamic-constraint-checking TRUE) 
FALSE 
CLIPS> (test-function Z) 

[CSTRNCHK1] Slot value Z found in fact f-2  
does not match the allowed values for slot myslot. 
[PRCCODE4] Execution halted during the actions of deffunction test-function. 
<Fact-2> 
CLIPS>