/ / CLIPS: potwierdzanie faktów w obrębie funkcji nie respektuje ograniczeń szablonów - więzów, asercji, klipów, szczeliny

CLIPS: potwierdzanie faktów z poziomu funkcji nie respektuje ograniczeń szablonu - ograniczeń, asercji, klipów, slotu

Mam definicję deflektora z jednym slotemograniczenie dozwolonych symboli. Jeśli bezpośrednio stwierdzam fakt z najwyższego poziomu, ograniczenia działają zgodnie z oczekiwaniami (tzn. Mogę używać tylko jednego z dozwolonych symboli). Jednakże, jeśli zrobię to z wewnątrz funkcji, ograniczenie nie istnieje w rzeczywistości (zobacz wynik kodu poniżej). Jak wymusić ograniczenie z mojej funkcji?

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>

Odpowiedzi:

0 dla odpowiedzi № 1

Sprawdzanie ograniczeń statycznych (które występuje podczasparsowanie) jest domyślnie włączone. Sprawdzanie ograniczeń dynamicznych (które występuje podczas wykonywania kodu) nie jest (patrz sekcja 11 Podstawowego przewodnika programowania). Jeśli go włączysz, otrzymasz naruszenie ograniczenia w swoim przykładzie (chociaż musisz potwierdzić fakt o wartości gniazda innej niż X - zduplikowane fakty nie są dozwolone i podczas wykonywania to sprawdzenie nastąpi przed sprawdzeniem ograniczenia).

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>