Избегайте сопоставления с образцом (ошибки), пока слот не будет установлен правильно
LHS правила R_blup
содержит
(test (>= ?s2 2))
то есть он проверяет, если ?s2
больше или равно 2. ?s2
соответствует слоту экземпляра с именем s2
,
К сожалению я получаю ошибку
Function >= expected argument #1 to be of type integer or float
Проблема в том, что мой код выполняет (test ...
прежде чем я могу установить аргумент № 1, то есть, прежде чем я могу установить s2
к целому числу или значению с плавающей запятой. s2
должен быть установлен в целое число внутри вызова Python, который запускается другим правилом R_blah
,
Ошибка вызывается в середине другого вызова Python, принадлежащего другому правилу R_xyz
, Этот вызов Python изменяет экземпляр через clips_instance.Slots["slot_name"] = some_value
,
Как это обычно обрабатывается? Я вижу три решения, которые мне не очень нравятся:
- Установка значения по умолчанию (целое) для
s2
, - Модификация
(test ...
сверятьnil
первый. - Добавление еще одной проверки / правила, чтобы подождать, пока
s2
не являетсяnil
больше
Возможно ли попробовать / исключить / передать ошибку?
1 ответ
Используйте функцию object-pattern-match-delay для задержки сопоставления с образцом, чтобы создать элементарную операцию для серии изменений:
CLIPS> (defclass POINT (is-a USER) (slot x) (slot y))
CLIPS>
(defrule check
(object (is-a POINT) (x ?s2))
(test (>= ?s2 2))
=>)
CLIPS> (make-instance [p1] of POINT)
[ARGACCES5] Function >= expected argument #1 to be of type integer or float
[DRIVE1] This error occurred in the join network
Problem resides in associated join
Of pattern #1 in rule check
[p1]
CLIPS> (agenda)
CLIPS>
(object-pattern-match-delay
(make-instance [p2] of POINT)
(make-instance [p3] of POINT)
(send [p2] put-x 3)
(send [p3] put-x 0))
0
CLIPS> (agenda)
0 check: [p2]
For a total of 1 activation.
CLIPS>