Избегайте сопоставления с образцом (ошибки), пока слот не будет установлен правильно

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,

Как это обычно обрабатывается? Я вижу три решения, которые мне не очень нравятся:

  1. Установка значения по умолчанию (целое) для s2,
  2. Модификация (test ... сверять nil первый.
  3. Добавление еще одной проверки / правила, чтобы подождать, пока 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> 
Другие вопросы по тегам