2016-10-26 3 views
0

Я определил класс с ограниченными вариантами слот:CLIPS: разрешено-символ

(defclass TARGET (is-a USER) 
    (slot uuid 
     (type STRING)) 
    (slot function 
     (type SYMBOL) 
     (allowed-symbols a1 a2 b c d e f g)) 
) 

(make-instance target of TARGET 
    (uuid "a123") 
    (function zzz)  
) 

Я ожидал, что CLIPS жаловаться на «ZZZ» (не допускается), но это не так. Зачем?

С уважением. Nicola

ответ

2

Проверка ограничений выполняется статически (во время разбора) и динамически (во время исполнения). По умолчанию включена только статическая проверка ограничений. Назначения слотов для экземпляров выполняются динамически, когда вызывается передача сообщений, потому что при выполнении обработчика сообщения возможно замещение незаконного значения юридическим значением.

В следующем случае эта информация не генерирует ошибку, если она определена, поскольку недопустимое значение может быть заменено во время выполнения, но defrule генерирует ошибку, поскольку шаблоны объектов непосредственно захватывают значение слота без использования сообщение передача.

CLIPS> (clear) 
CLIPS> 
(defclass TARGET (is-a USER) 
    (slot uuid 
     (type STRING)) 
    (slot function 
     (type SYMBOL) 
     (allowed-symbols a1 a2 b c d e f g))) 
CLIPS> 
(definstances static 
    (target1 of TARGET (uuid "a123") (function zzz))) 
CLIPS>  
(defrule static 
    (object (is-a TARGET) (function zzz)) 
    =>) 

[CSTRNCHK1] A literal restriction value found in CE #1 
does not match the allowed values for slot function. 

ERROR: 
(defrule MAIN::static 
    (object (is-a TARGET) 
      (function zzz)) 
    =>) 
CLIPS> (reset) 
CLIPS>   
(make-instance target2 of TARGET 
    (uuid "b456") 
    (function zzz)) 
[target2] 
CLIPS> 

Если включить динамическую проверку ограничений, вы будете видеть ошибки во время выполнения, когда экземпляры фактически созданы:

CLIPS> (set-dynamic-constraint-checking TRUE) 
FALSE 
CLIPS> 
(make-instance target3 of TARGET 
    (uuid "c789") 
    (function zzz)) 
[CSTRNCHK1] zzz for slot function of instance [target3] found in put-function primary in class TARGET 
does not match the allowed values. 
[PRCCODE4] Execution halted during the actions of message-handler put-function primary in class TARGET 
FALSE 
CLIPS> (reset) 
[CSTRNCHK1] zzz for slot function of instance [target1] found in put-function primary in class TARGET 
does not match the allowed values. 
[PRCCODE4] Execution halted during the actions of message-handler put-function primary in class TARGET 
CLIPS>