Пример 6.38. Использование условного элемента exists

(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:


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: