/ / CLIPS: afirmar fatos de dentro de uma função não respeita restrições de modelo - restrições, afirmação, clipes, slot

CLIPS: afirmando fatos de dentro de uma função não respeita restrições de template - restrições, assert, clips, slot

Eu tenho uma definição de modelo padrão de slot único comuma restrição nos símbolos permitidos. Se eu afirmar diretamente um fato do nível superior, as restrições funcionarão conforme o esperado (ou seja, só posso usar um dos símbolos permitidos). No entanto, se eu fizer isso de dentro de uma deffunction, a restrição será efetivamente inexistente (consulte a saída de código abaixo). Como impor a restrição de dentro da minha função?

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>

Respostas:

0 para resposta № 1

Verificação de restrição estática (que ocorre duranteanálise) está ativado por padrão. A verificação de restrição dinâmica (que ocorre durante a execução do código) não é (consulte a seção 11 do Guia de programação básica). Se você ativá-lo, obterá uma violação de restrição no seu exemplo (embora seja necessário afirmar um fato com um valor de slot diferente de fatos duplicados em X não são permitidos e durante a execução, essa verificação ocorrerá antes da verificação de restrição).

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>