Иллюстрированный самоучитель по введению в экспертные системы

Прямая и обратная цепочки рассуждений

Листинг 5.4. Набор правил для построения башни из блоков.

;; СТРАТЕГИЯ РАЗРЕШЕНИЯ КОНФЛИКТОВ
(declare (strategy mea))
;; Шаблоны
;; Объект block характеризуется цветом, размером и положением,
(deftemplate block
(field color (type SYMBOL))
(field size (type INTEGER))
(field place (type SYMBOL)))
;; Вектор 'on' указывает, что блок <upper>
;; находится на блоке <lower>. (deftemplate on
(field upper (type SYMBOL"
(field lower (type SYMBOL))
(field place (type SYMBOL) (default heap)])
;; Текущая цель (goal) может быть либо 'найти' (find),
;; либо 'уложить' (build), (deftemplate goal
(field task (type SYMBOL)))
;; ИНИЦИАЛИЗАЦИЯ
;; Имеются три блока разных цветов и размеров.
;; Предполагается, что они находятся в куче.
(deffacts the-facts
(block (color red) (size 10))
(block(color yellow) (size 20))
(block (color blue) (size 30))
)
;; ПРАВИЛА
;; Задать первую цель: найти первый блок,
(defrule begin
(initial-fact) ›
(assert (goal (task find))))
;; Взять самый большой блок в куче (heap),
(defrule pick-up
?my-goal < – (goal (task find))
?my-block < – (block (size?S1) (place heap))
(not (block (color?C2) (size?S2&:(>-?S2?S1))
(place heap))) ›
(modify?my-block (place hand))
(modify?my-goal (task build)))
;; Установить первый блок в основание башни (tower).
;; Этот блок не имеет под собой никакого другого,
(defrule place-first
?my-goal < – (goal (task build))
?my-block <strong><-</strong> (block (place hand))
(not (block (place tower)))
 ›
(modify?my-block (place tower))
(modify?my-goal (task find)))
;; Установить последующие блоки на тот,
;; что лежит в основании башни,
(defrule put-down
?my-goal < – (goal (task build))
?my-block < – (block (color?C0)
(place hand))
(block (color?C1) (place tower)))
(not (on (upper?C2) (lower?C1)
(place tower)))
 ›
(modify?my-block (place tower))
(assert (on (upper?CO) (lower?C1)
(place tower)))
(modify?my-goal (task find)))
;; Если в куче больше нет блоков, прекратить процесс,
(defrule stop
?my-goal < – (goal (task find))
(not (block (place heap)))
 ›
(retract?my-goal))

Обратите внимание на то, что порядок перечисления правил в программе не имеет значения. В программе управления роботом, представленной в листинге 5.3, правило прекращения выполнения стояло в списке первым, а в этой программе оно стоит в самом конце списка. Трассировку выполнения приведенной программы и некоторые комментарии вы найдете во врезке 5.4.

Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.