Пример 6.32. Улучшенное правило Find-2-coeval-Person

(deftemplate person

(slot name)

(slot age))

(deftemplate person-pair

(slot namel)

(slot name2)

(slot age))

(deffacts people

(person (name Joe) (age 20))

(person (name Bob) (age 20))

(person (name Joe) (age 34))

(person (name Sue) (age 34))

(person (name Sue) (age 20)))

(defrule Find-2-Coeval-Person

(person (name?x) (age?z))

(person (name?ys~?x) (age?z))

(not (person-pair (namel?x) (name2?y) (age?z)))

(not (person-pair (namel?y) (name2?x) (age?z)))

=>

(printout t "name="?x " name="?y " age="?z crlf)

(assert (person-pair (namel?x) (name2?y) (age?z))))

Обратите внимание на произведенные изменения. Во-первых, с помощью конструктора deftemplate был Добавлен дополнительный шаблон person-pair. В фактах, соответствующих данному шаблону, будет храниться информация об уже найденных парах ровесников. Кроме того, было сильно изменено и само правило. В его левой части было добавлено два условия:

(not (person-pair (namel?x) (name2?y) (age?z)))

(not (person-pair (namel?y) (name2?x) (age?z)))

Эти условные элементы проверяют наличие фактов типа person-pair и, тем самым отслеживают, была ли уже обработана данная пара или ее переста­новка. Если эти факты отсутствуют, то это означает, что обработка еще не была выполнена. В этом случае правило активируется, и выполняются дей­ствия, описанные в правой части правила. А именно выводится на экран сообщение о найденной паре ровесников и добавляется соответствующий факт person-pair, утверждающий, что данная пара уже была обработана. Для запуска программы выполните команды reset и run. Программа выве­дет на экран следующую информацию:


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



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