Как написать правило для обнаружения удаления экземпляра в клипах? - PullRequest
0 голосов
/ 01 августа 2011

Это то, что у меня сейчас есть:

(defclass classA (is-a USER) (role concrete))

(defclass classB (is-a USER) (role concrete)
  (slot a (type INSTANCE)))

(defrule classA-delete
  ?binstance <- (object (is-a classB) (a ?a&~:(instance-existp ?a)))
=>
  (send ?binstance delete))

Но правило не срабатывает, когда я удаляю экземпляр класса A.

1 Ответ

0 голосов
/ 16 марта 2012

Процесс сопоставления с образцом не имеет конкретных знаний о том, что может повлиять на результат оценки функции предиката на LHS правила (в данном случае функция instance-Существовать).В этом случае ваше правило сопоставляется только с экземплярами класса B, поэтому только изменения в этом экземпляре будут направлены на сопоставление с шаблоном повторного запуска.Когда экземпляр classB изначально сопоставлен, функция instance-existp оценивается и либо успешно, либо с ошибками.Изменение значения временного интервала приведет к повторному запуску оценки instance-existp, но изменение для интервала экземпляра или экземпляра, который не содержится в шаблоне в правиле, не приведет к повторному сопоставлению шаблонов.Если вы используете нетрадиционный элемент для проверки экземпляра, вы получите желаемое поведение:

(defclass classA (is-a USER) 
                 (role concrete))

(defclass classB (is-a USER) 
                 (role concrete)
                 (slot a (type INSTANCE)))

(definstances start
   (a of classA)
   (b of classB (a [a])))  

(defrule classA-delete
  ?binstance <- (object (is-a classB) (a ?a))
  (not (object (name ?a)))
  =>
  (send ?binstance delete))
...