Прямая и обратная цепочки рассуждений
Листинг 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.