(deftemplate hero
(multislot name)
(slot status (default unoccupied)))
(deffacts goal-and-heroes
(goal save-the-world)
(hero (name Death Defying Man))
(hero (name Stupendous Man))
(hero (name Incredible Man)))
(defrule save-the-world
(goal save-the-world)
(exists (hero (status unoccupied)))
=>
(printout t "The day is saved." crlf))
Данная программа определяет шаблон — героя, имеющего составное поле с именем героя и простое поле, содержащее статус "не занят" по умолчанию. Конструктор deffacts определяет трех ничем не занятых героев и текущую цель — спасение мира. Правило проверяет, есть в данный момент эта цель, и в случае положительного ответа проверяет, если ли какой-нибудь еще не занятый герой. Если все условные элементы правила удовлетворены, оно сообщает, что мир спасен. Обратите внимание: несмотря на то, что у нас все три героя не заняты, правило будет активировано только один раз.
Так как способ реализации exists использует условный элемент not, то условный элемент exists может привести к автоматическому добавлению образцов initial-fact или initial-object в левую часть правила. Поэтому не забывайте использовать команду reset (которая создает initial-fact и initial-object), чтобы быть уверенным в корректной работе условного элемента exists.
|
|
6.5.7. Условный элемент forall
Условный элемент forall позволяет определить, что некоторое заданное условие выполняется для всех заданных условных элементов.
Определение 6.22. Синтаксис условного элемента forall
<условный-элемент foга11>::= (forall <условный-элемент>
<условный-элемент>+)
CLIPS автоматически заменяет f о rail комбинацией условных элементов not и and. Например, следующее правило (пример 6.39) будет преобразовано так, как показано в примере 6.40.
Пример 6.39. Правило example
(defrule example
(forall (a?x) (b?x) (c?x))=>)
Пример 6.40. Преобразованное правило example
(defrule example
(not (and (a?x)
(not (and (b?x)
(c?x)))))=>)
Рассмотрим следующий пример. Правило all-students-passed определяет, прошли ли все студенты чтение, письмо и арифметику, используя условие forall: