дб. Четвертое издание джозеф Джарратано Университет Хьюстон клиэрЛэйк Гари Райли People5oft, Издательский дом "Вильямс" Москва СанктПетербург Киев 2007 ббк 32. 973. 26 018 75 Д
Скачать 3.73 Mb.
|
если бы слот пате был определен с использованием ключевого слова multislot вместо ключевого слова slot, тов этом слоте можно было бы хранить любое количество полей. Таким образом, следующий факт является недопустимым, если слот пате однозначен, и допустимым, если слот пате многозначен 564 Глава 7. Введение в CLIPS и последующему заданию факта таким образом (number-list (values 7 9 3 4 20)) (all-orders- processed) Во-вторых, для факта, содержащего единственный слот, имя слота обычно становится синонимом имени отношения. Например, следующие факты (time 8:45) (food- groups meat dairy bread fruits-and-vegetables) несут в себе не меньше смысла, чем такие факты (time (value 8:45)) (food- groups (values meat dairy bread fruits-and-vegetables)) Связи между терминами, рассматриваемыми в этом разделе, представлены графически на рис. 7.1. 7.7 Добавление и удаление фактов Все факты, известные системе группируются и сохраняются в списке фактов. Этот список фактов позволяет добавлять и удалять факты, представляющие информацию. Новые факты могут быть добавлены к списку фактов с использованием команды assert. Команда assert имеет следующий синтаксис (assert следующий упорядоченный факт может использоваться в качестве флажка для указания на то, что все заказы обработаны 7.7. Добавление и удаление фактов 565 Рис. 7.1. Краткий обзор терминов, применяемых при описании конструкции deftem- plate (slot еуе-color) (slot hair-color))J CLIPS> (assert (person (name "John (}. Public" ) (age 23) (еуе-color blue) (hair- со1ох black)))J "John Q. Public" ) (age 23) (еуе-color blue) (hair-color black)) For а total of 1 fact. CLIPS> Терм "f — 0" представляет собой идентификатор факта, присвоенный этому факту системой. Каждому факту, вставляемому в список фактов, присваивается уникальный идентификатор факта, начинающийся с буквы f и заканчивающийся целым числом, которое называется индексом факта. Индекс факта 0 был показан также в возвращаемом значении показанной выше команды assert. Обратите внимание на то, что, как показано в этой книге, к выводу команды facts были добавлены дополнительные пробелы между слотами (age 23 ) и еуе-color blue ) для повышения удобства чтения. Но обычно система CLIPS помещает только один пробел между слотами и переносит строку вывода с крайнего правого столбца на крайний левый столбец. В других примерах вывода CLIPS, приведенных в настоящей книге, к выводу CLIPS иногда также добавляются пробелы для повышения удобства чтения, при условии, что такое добавление пробелов не вызывает путаницы. При обычных обстоятельствах система CLIPS не допускает ввод дублируюиихся фактов (хотя такое поведение системы может быть изменено, как будет показано в разделе 12.2). Поэтому попытка поместить в список фактов второй факт "John Q. Public" с идентичными значениями слотов не приведет к значимому результату. Но, безусловно, к списку фактов можно легко добавлять другие факты, не являющиеся дубликатами существующих фактов, например, как показано ниже. CLIPS> (assert (person (name "Jane Q. Public" ) (age 36) (еуе-color green) (hair-color red))) 1 "John Q. Public" ) (age 23) (еуе-color blue) (hair-color black)) 7.7. Добавление и удаление фактов 567 f-1 (person (name "Jane Q. Public" ) (age 36) (еуе-color green) (hair-color red)) For а total of 2 facts. CLIPS> Как показывает синтаксис команды assert, с помощью единственной команды assert можно ввести в систему несколько фактов одновременно. Например, следующая команда добавляет в список фактов сразу два факта (assert (person (name "John Q. Public" ) (age 23) (еуе-color blue) (hair- color black)) (person (name "Jane Q. Public" ) (age 36) (еуе-color green) (hair-color red))) Важно помнить, что идентификаторы фактов в списке фактов необязательно должны быть последовательными. Кроме того, факты можно не только добавлять к списку фактов, но и удалять из этого списка с помощью определенного способа. После удаления фактов из списка фактов идентификаторы удаленных фактов становятся пропущенными в списке фактов, поэтому входе выполнения программы CLIPS может быть нарушена строгая последовательность индексов фактов. Количество фактов, содержащихся в списке фактов, может стать весьма значительным, поэтому часто желательно иметь возможность рассматривать только часть списка фактов. Такая возможность обеспечивается с помощью задания дополнительных параметров команды facts. Полный синтаксис команды facts приведен ниже (facts [ что синтаксис команды facts допускает использование от нуля до трех параметров. Если параметры не заданы, отображаются все факты. Если задан параметр 568 Глава 7. Введение в CLIPS (retract Например, информацию о человеке по имени John Q. Public можно удалить из списка фактов с помощью такой команды 0) Аналогичным образом, следующая команда позволяет извлечь из списка фактов тот факт, который относится к Jane Q ° Public: (retract 1) Попытка извлечь несуществующий факт приводит к получению следующего сообщения об ошибке (в этом сообщении ключ [PRNTUTIL1] представляет собой ключ для поиска описания данного сообщения об ошибке в справочном руководстве CLIPS Reference Manual): [PRNTUTIL1] Unable to find fact CLIPS> (retract 1) ! [PRNTUTIL1] Unable to find fact f-1. Единственная команда retract может использоваться для одновременного извлечения нескольких фактов. Например, следующая команда извлекает факты f — О и f — 1: (retract О 1) 7.8 Модификация и дублирование фактов Значения слотов фактов с конструкцией def template могут модифицироваться с помощью команды modify. Синтаксис команды modiйу является таковым (modify Удаление фактов из списка фактов называется извлечением и выполняется с помощью команды retract. Команда retract имеет следующий синтаксис. Модификация и дублирование фактов 569 Например, после наступления очередного дня рождения лица по имени John Q. Public можно изменить его возраст сна с помощью такой команды modify: CLIPS> (modify О (age 24))J (facts)J f-2 (person (name "John Q. Public" ) (age 24) (еуе-color blue) (hair-color black)) For а total of 1 fact. CLIPS> Команда пюЖйу действует по принципу извлечения первоначального факта и последующего добавления нового факта после модификации указанных значений слотов. В связи с этим для модифицированного факта вырабатывается новый индекс факта. Команда duplicate действует по такому же принципу, за исключением того, что извлечение первоначального факта не происходит. Таким образом, если найдется давно пропавший брат-близнец Джона, Джек, то информацию о нем можно будет добавить к списку фактов, продублировав факт с информацией о Джоне и изменив значение слота пате, как показано ниже (duplicate 2 (name "Jack S. Public"))J (facts)J f-2 (person (name "John Q ° Public" ) (age 24) (еуе-color blue) (hair-color black)) f-3 (person (name "Jack S. Public" ) (age 24) (еуе-color blue) (hair-color black)) For а total of 2 facts. Команды modify и duplicate не могут использоваться для работы с упорядоченными фактами Глава 7. Введение в CLIPS 7.9 Команда watch В этом определении rules, activations, statistics, compilations, focus, deffunctions,globals,generic-functions, methods, instances, slots,messages, message — handlers или all. Отслеживание этих элементов может осуществляться в любых комбинациях для получения необходимого объема отладочной информации. Команда watch может быть вызвана на выполнение несколько раз для отслеживания больше чем одного аспекта функционирования системы CLIPS. Чтобы разрешить отслеживание с помощью команды watch всех аспектов функционирования системы CLIPS, можно применить ключевое слово all. По умолчанию сразу после запуска системы отслеживаются действия по компиляции, compilations, а остальные элементы команды watch не отслеживаются. Если осуществляется отслеживание фактов с помощью символа система CLIPS автоматически выводит сообщение, указывающее на то, что в списке фактов произошло некоторое обновление, при выполнении каждой операции вставки или удаления фактов. Применение этой команды отладки иллюстрируется в следующем командном диалоге CLIPS> (facts 3 3) f-3 (person (name "Jack S. Public" ) (age 24) (еуе-color blue) (hair-color black)) For а total of 1 fact. CLIPS> (watch facts)J CLIPS> (modify 3 (age 25))J < f-3 (person (name "Jack S. Public" ) (age 24) (еуе-color blue) (hair-color black)) > f-4 (person (name "Jack S. Public" ) (age 25) (еуе-color blue) (hair-color Команда watch является полезным средством отладки программ. Результаты применения команды watch для отслеживания фактов рассматриваются в этом разделе, а остальные компоненты команды watch обсуждаются в этой и последующих главах. Команда watch имеет такой синтаксис (watch 571 7.10. Конструкция de f f acts (например, начальные знания. Еще одна ситуация, в которой удобно автоматически вводить группу фактов, относится к прогону тестовых наборов для отладки программы. Группы фактов, представляющих начальные знания, можно определить с помощью конструкции deffacts. Например, ниже приведен оператор de f facts, предоставляющий начальную информацию о некоторых лицах, которые уже упоминались в данной главе people "Some people we know" (person (name "John Q. Public" ) (age 24) (еуе-color blue) (hair-color black)) (person (name "Jack S. Public" ) (age 24) (еуе-color blue) (hair-color black)) (person (name "Jane Q. Public" ) (аде 36) (еуе-color green) (hair-color Конструкция бей facts имеет следующий общий формат (deffacts Последовательность знаков < указывает, что происходит извлечение факта, а последовательность знаков > указывает, что происходит добавление факта. Существует возможность обеспечить отслеживание только конкретных фактов, указав одно или несколько имен конструкций deй1етр1а1е в конце команды watch. Например, выполнение команды ( watch facts person) приводит к тому, что сообщения, касающиеся фактов, отображаются только применительно к факту Отображение результатов, предусмотренных командой можно отменить с использованием соответствующей команды unwatch. Команда unwatch имеет такой синтаксис Глава 7. Введение в CLIPS (reset) Предположим, что введена конструкция бей с именем people (после конструкции deftemplate с именем person); в таком случае формируется следующий диалог, показывающий, как происходит ввод фактов в список фактов с помощью команды reset: CLIPS> (unwatch facts)J CLIPS> (reset)J CLIPS> (facts)J f — О (initial-fact) (person (name "John Q. Public" ) (age 24) (еуе-color blue) (hair- color black)) (person (name "Jack S. Public" ) (age 24) (еуе-color blue) (hair-color black)) f-3 (person (name "Jane Q. Public" ) (age 36) (еуе-color green) (hair-color red)) For а total of 4 facts. CLIPS> f — 2 В этом выводе показаны факты из оператора с1еГfacts и новый факт, выработанный командой reset, который имеет имя initial fàñt. После запуска система CLIPS автоматически определяет следующие две конструкции (deftemplate initial-fact) (deffacts initial-fact (initial-fact)) комментарий правила, этот комментарий сохраняется в определении конструкции бей после загрузки соответствующего определения системой Вслед за именем или комментарием находятся факты, которые вводятся в список фактов с помощью оператора de f f Факты, заданные в операторе беййася, вводятся с помощью команды reset языка CLIPS. Команда reset удаляет все факты из списка фактов, а затем вводит факты из существующего оператора de f f acts. Синтаксис команды reset является таковым 7.11. Компоненты правила Таким образом, даже если в программе не определены какие-либо операторы def команда reset осуществляет ввод факта (initial — fact). Факт initial — fact всегда имеет идентификатор факта f — О. Польза от применения факта ( initial — fact) заключается в том, что с него начинается выполнение программы (как описано в следующем разделе. 7.11 Компоненты правила IF the emergency is а fire THEN the response is to activate the sprinkler system Экспертная система сможет выполнять содержательную работу только в том случае, если в ней присутствуют не только факты, но и правила. После обсуждения того, как происходит добавление и извлечение фактов, мы можем приступить к рассмотрению принципов действия правила. Правила могут быть введены непосредственно в систему CLIPS или загружены из файла с правилами, созданного с помощью текстового редактора (вопрос о том, как загружаются конструкции из файла, будет рассматриваться в разделе 7.17). По-видимому, для создания любых программ, кроме самых небольших, целесообразно использовать один из встроенных редакторов, предусмотренных в системе CLIPS. Информацию об исполняемых файлах редакторов для операционных систем Windows 2000/XP и можно найти в документе Interfaces Guide, который представлен в электронном виде на компакт-диске, прилагаемом к данной книге. А информация о редакторе, который может использоваться в такой среде, как представлена в документе Basic Programming биМе. Встроенные редакторы позволяют избирательно переопределять конструкции вовремя разработки программы, и эта возможность является чрезвычайно полезной. Например, если вовремя ввода в режиме верхнего уровня какой-то конструкции будет допущена опечатка, то потребуется заново набрать текст всей конструкции. Если же эта конструкция вначале введена в редакторе, то обеспечивается возможность исправить опечатку и переопределить конструкцию с помощью нескольких нажатий клавиш непосредственно из редактора. Но первоначально в качестве демонстрируемых примеров рассматриваются правила, введенные непосредственно в систему CLIPS из приглашения режима верхнего уровня. В качестве примера рассмотрим, какие типы фактов и правил могут оказаться полезными в той ситуации, когда приходится осуществлять текущий контроль и реагировать на несколько возможных чрезвычайных ситуаций. Одной из таких чрезвычайных ситуаций может оказаться пожара другой — наводнение. Ниже приведен псевдокод одного из возможных правил в экспертной системе текущего контроля над промышленной установкой. Глава 7. Введение в CLIPS 574 (deftemplate emergency (slot type)) В этой конструкции поле type факта emergency должно содержать такие символы, как f ire (пожар, flood (наводнение) и power outage (прекращение подачи электроэнергии). Аналогичным образом, ответ экспертной системы, может быть представлен следующей конструкцией de f template: (deftemplate response (slot action)) В данной конструкции поле action факта response указывает на то, какой ответ должен быть выработан системой. Правило, выраженное с помощью синтаксиса CLIPS, приведено ниже. Это правило можно ввести, набирая его текст после приглашения CLIPS, но прежде чем появится возможность ввести правило, необходимо ввести такие конструкции de f template, care emergency и response. Однако, в свою очередь, перед вводом любых из этих конструкций необходимо набрать в приглашении режима верхнего уровня команду ( clear), а затем нажать клавишу ввода. В результате этого будут удалены все конструкции deftemplate и def созданные в результате выполнения примеров предыдущего раздела. Полное описание команды clear приведено в разделе. (defrule fire-emergency "An example rule" (emergency (type fire)) — > (assert (response (action Если правило будет введено безошибочно, в полном соответствии стем, что показано в данном примере, снова появится приглашение CLIPS. В противном случае будет выведено сообщение об ошибке, которое с наибольшей вероятностью будет указывать на неправильно введенное ключевое слово или на несогласованную круглую скобку. Ниже приведено тоже правило, в котором добавлены комментарии, соответствующие отдельным частям правила. Комментарии начинаются сточки с запятой и продолжаются до конца строки, обозначенного символом возврата каретки. Комментарии игнорируются системой CLIPS; дополнительная информация о комментариях приведена в разделе 7.18. Заголовок правила fire-emergency "An example rule" Прежде чем преобразовать этот псевдокод вправило, необходимо определить конструкции de f template для фактов такого типа, которые упоминаются в этом правиле. Чрезвычайная ситуация может быть представлена с помощью следующей конструкции de f template: 7.11. Компоненты правила 575 Шаблоны (emergency (type Стрелка THEN > Действия (assert (response (action activate- sprinkler-system)))) Определение правила имеет следующий общий формат (defrule * Левая часть (Left-Hand Side — LHS) правила => окружающие шаблоны и действия, являются вложенными, толевые и правые круглые скобки должны быть правильно сбалансированы. В правиле fire — emergency имеются один шаблон и одно действие. Заголовок правила состоит из трех частей. Правило должно начинаться с ключевого слова за которым следует имя правила. В качестве имени можно применить любой допустимый символ CLIPS. Если правило вводится с именем правила, которое является таким же, как и у существующего правила, тоновое правило заменяет старое. В данном правиле именем правила является f ire — emergency. За именем следует необязательная строка комментария. Для этого правила комментарием служит "An example rule" (Пример правила. Комментарий обычно используется для описания назначения правила или представления любой другой информации, которую пожелает ввести программист. В отличие от обычных комментариев, начинающихся сточки с запятой, комментарий, который следует за именем правила, не игнорируется и может быть выведен на внешнее устройство вместе с остальной частью правила (с помощью команды ppde f rule, описанной в разделе 7.13). За заголовком правила следует от нуля и больше условных элементов (Conditional Element СЕ. Простейшим типом условного элемента является условный элемент шаблона, или просто шаблон. Каждый шаблон состоит из одного или нескольких ограничений, которые предназначены для сопоставления с полями факта, заданного с помощью конструкции deftemplate. В правиле fire — emergency шаблоном является (emergency (type fire) ). Ограничение для поля 1уре указывает на то, что это правило удовлетворяется только Глава 7. Введение в CLIPS 576 7.12 Рабочий список правили выполнение программы Программа CLIPS может быть вызвана на выполнение с помощью команды run. Команда run имеет следующий синтаксис для фактов emergency, содержащих в своем поле type символ fire. Система CLIPS предпринимает попытки сопоставить шаблоны правил с фактами в списке фактов. Если все шаблоны правила согласуются с фактами, правило активизируется и помещается в рабочий список правил в коллекцию активизированных правил. В рабочем списке правил может находиться от нуля и больше правил. Символ который следует за шаблонами в правилах, называется стрелкой. Этот символ образуется путем нажатия клавиши со знаком равенства, а затем клавиши со знаком "больше". Стрелка — это символ, представляющий начало части правила IF — THEN. Часть правила, находящаяся перед стрелкой, называется левой частью (Left-Hand Side — LHS), а часть, находящаяся за стрелкой, называется правой частью Side — RHS). Если правило не имеет шаблонов, тов качестве шаблона для данного правила добавляется специальный шаблон ( initial — fact ) . Поскольку конструкции de f f acts с именем initial — fact определяются автоматически, все правила, не имеющие шаблонов в своих левых частях, активизируются после выполнения любой команды поскольку при этом в список фактов автоматически вводится факт (initial — fact) Таким образом, после выполнения команды reset в рабочий список правил помещаются все правила, не имеющие шаблонов в левой части. Последней частью правила является список действий, выполняемых после запуска правила. Правило может не иметь действий. Такой способ использования правил не особенно полезен, но иногда применяется. В рассматриваемом примере одно из действий предусматривает внесение факта (response (action activate — sprinkler — system) в список фактов. Термин "запуск" означает, что система выполняет действия одного из правил, находящихся в рабочем списке правил. Обычно программа при отсутствии правил в рабочем списке правил прекращает свое выполнение. Если же в рабочем списке правил имеется несколько правил, то система CLIPS автоматически определяет, какое из правил является подходящим для запуска. Система CLIPS упорядочивает правила, находящиеся в рабочем списке правил, с учетом возрастания приоритета и запускает правило с наивысшим приоритетом. Приоритет правила представляет собой целочисленный атрибут, который принято называть значимостью. Понятие значимости будет описано более подробно в главе 9. 7.12. Рабочий список правили выполнение программы 577 (run [ данном случае условный элемент правила fire — emergency удовлетворяется под действием факта (emergency (type fire) поэтому после вызова программы на выполнение должен произойти запуск правила fire — emergency. Правило активизируется после того, как все шаблоны правила согласовываются с фактами. Процесс сопоставления с шаблонами всегда поддерживается в актуальном состоянии и происходит без учета того, произошел ли ввод фактов в список фактов доили после определения того или иного правила. Безусловно, для вызова правил на выполнение требуются факты, поэтому основным методом запуска или перезапуска экспертной системы, написанной на языке CLIPS, является команда reset. Как правило, факты, введенные в список фактов с помощью команды reset, удовлетворяют шаблонам одного или нескольких правил, что приводит к передаче результатов активизации этих правил в рабочий список правил. Затем, после ввода команды run, начинается выполнение программы. Отображение рабочего списка правил (agenda) Если в рабочем списке правил активизированные правила отсутствуют, то после ввода команды agenda снова появляется приглашение CLIPS. А если правило fire — етегдепсубыло активизировано фактом (type fire) ) с индексом факта 1, то выполнение команды agenda приводит к получению следующего вывода (reset)J CLIPS> (assert (emergency (type fire)))J CLIPS> (agenda)J Список правил, находящихся в рабочем списке правил, можно вывести на внешнее устройство с помощью команды agenda. Синтаксис команды agenda является таковым: Глава 7. Введение в CLIPS 578 0 fire-emergency: f-1 For а total of 1 activation. CLIPS> В этом выводе число 0 показывает значимость данного правила в рабочем списке правил. За обозначением значимости следует имя правила, после чего отображаются идентификаторы фактов, которые согласуются с шаблонами правила. В данном случае имеется только один идентификатор факта, f — 1. Правила и релаксация правил Теперь возникает интересный вопрос "Что произойдет, если снова будет вызвана команда run?" Напрашивается ответ, что имеется правило и налицо факт, который удовлетворяет этому правилу, поэтому должен снова произойти запуск правила. Но если сейчас будет предпринята попытка выполнить команду это не приведет к получению каких-либо результатов. Проверка рабочего списка правил покажет, что запуск правил не произошел, поскольку в рабочем списке правил отсутствовали правила. Запуск правила не происходит снова потому, что именно так спроектирована система CLIPS. Правила в системе демонстрируют свойство, называемое релаксацией под этим подразумевается, что запуск правил применительно к какому-то конкретному множеству фактов не происходит больше одного раза. А если бы свойство релаксации не было предусмотрено, то экспертные системы всегда попадали бы в тривиальные циклы. Под этим подразумевается то, что после запуска какого-то правила этот запуск происходил бы применительно к одному и тому же факту снова и снова, тогда как в реальном мире стимул, вызвавший запуск рефлекса, в конечном итоге исчезает. Например, огонь был бы наконец потушен с помощью спринклерной системы, или пожар, все уничтожив, закончился бы сам Поскольку в данном случаев рабочем списке правил находится правило fire — выполнение команды run приведет к запуску этого правила. В качестве результата выполнения действия этого правила к списку фактов будет добавлен факт (response (action activate- sprinkler-system) как показано в следующем выводе опа. Рабочий список правили выполнение программы 579 (refresh (agenda)J CLIPS> (refresh fire-emergency)J CLIPS> (agenda)J О f-1 For а total of 1 activation. CLIPS) Отслеживание активизаций, правили статистических данных Если осуществляется отслеживание активизаций, то система автоматически выводит сообщение при каждом добавлении или удалении активизированного правила из рабочего списка правил. Как ив случае фактов, последовательность знаков указывает, что активизированное правило удаляется из рабочего списка правила последовательность знаков > указывает, что активизированное правило добавляется к рабочему списку правил. Вслед за этой начальной последовательностью знаков отображается активизированное правило в том же формате, собой. Нов компьютерном мире после ввода факта в список фактов он остается в списке до тех пор, пока не будет удален явно. В случае необходимости можно обеспечить повторный запуск правила путем извлечения факта (emergency (type fire) ) и повторного его ввода. По существу, система CLIPS запоминает идентификаторы фактов, вызвавших запуск правила, и не активизирует снова это правило с помощью точно повторяющейся комбинации идентификаторов фактов. Идентичные множества идентификаторов фактов должны совпадать взаимно однозначно, как по порядку расположения, так и по индексам фактов. Ниже приведены примеры, которые показывают, как может оказаться так, что один и тот же факт согласуется с шаблоном больше чем одним способом. В таком случаев рабочий список правил может быть помещено несколько активизированных правил с одними тем же множеством идентификаторов фактов, относящихся к одному правилу, причем каждое из этих активизированных правил соответствует каждому отдельному согласованию. Еще один вариант состоит в том, что для повторного запуска правила можно применить команду refresh. Команда reйгеяЬ помещает в рабочий список правил все активизированные правила, соответствующие некоторому правилу, запуск которых уже произошел (с учетом того условия, что факты, вызвавшие активизацию, все еще присутствуют в списке фактов. Команда refresh имеет следующий синтаксис Глава 7. Введение в CLIPS который используется в команде agenda. Ниже приведена последовательность команд, которая показывает, как происходит отслеживание активизаций. CLIPS> (reset)J CLIPS> (watch activations)J CLIPS> (assert (emergency (type fire)))J > Activation 0 fire-emergency: f-1 (agenda)J 0 fire-emergency: f-1 For а total of 1 activation. CLIPS> ( хе1гас1. 1 ) 1 < Activation 0 fire-emergency: f-1 CLIPS> (agenda)J CLIPS> Если же осуществляется отслеживание правил, то система CLIPS выводит сообщение при запуске каждого правила. Приведенная ниже последовательность команд показывает, как происходит отслеживание активизаций и правил (reset)J CLIPS> (watch rules)J CLIPS> (assert (emergency (type fire)))J > Activation 0 fire-emergency: f-1 (run)J FIRE 1 fire-emergency: f-1 CLIPS> (agenda)J CLIPS> Число, следующее за символом FIRE, показывает, сколько правил было запущено со времени выдачи команды run. Например, если бы после правила fire — emergency было запущено другое правило, то ему бы предшествовало обозначение "FIRE 2". После вывода порядкового номера запуска выводится имя правила, а затем отображаются индексы фактов, согласованных с шаблонами этого правила. Следует отметить, что отслеживание активизации не вызывает отображения сообщений при запуске правили удалении в связи с этим из рабочего списка правил. Существует возможность отслеживать только конкретные правила и активизации, задавая одно или несколько имен правил в конце команды watch. Например, после выдачи команды (watch activations fire — emergency) отображаются только сообщения об активизации, касающиеся правила f ire-emergency. Если осуществляется отслеживание статистических данных (с помощью параметра statistics), то система CLIPS в конце каждого прогона программы. Команды, применяемые для манипулирования конструкциями 581 выполняемого после выдачи команды выводит информационные сообщения, подобные приведенным ниже. CLIPS> (unwatch all)J CLIPS> (reset)J CLIPS> (watch statistics)J CLIPS> (assert (emergency (type fire)))J CLIPS> (run)J 1 rules fired Run time is 0.02 seconds 50.0 rules per second 3 mean number of facts (3 maximum) 1 mean number of instances (1 maximum) 1 mean number of activations (1 maximum) CLIPS> (unwatch statistics)J CLIPS> 7.13 Команды, применяемые для манипулирования конструкциями Отображение списка элементов указанной конструкции Для отображения текущего списка правил, сопровождаемых системой CLIPS, используется команда list-defrules. Аналогичным образом команды list-deftem- Таким образом, если происходит отслеживание статистики, то после выполнения команды run выводятся шесть наборов статистических данных. Вначале отображается общее количество активизированных правил, количество времени в секундах, затраченного на запуск правили среднее количество правил, запускаемых в секунду (результат деления первого статистического показателя на второй. Кроме того, для каждого цикла исполнения программы система CLIPS сохраняет статистические данные о количестве фактов, активизаций и экземпляров. Среднее количество фактов рассчитывается как сумма общего количества фактов в списке фактов после запуска каждого правила, деленное на количество запущенных правил. Число в круглых скобках, за которым следует слово показывает наибольшее количество фактов, содержавшихся в списке фактов, относящееся к запуску любого отдельного правила. Аналогичным образом, количества, обозначенные в статистических данных об активизациях как mean и показывают среднее количество активизаций в расчете на запуск каждого правила и наибольшее количество активизированных правил в рабочем списке правил, относящееся к запуску любого отдельного правила. Значения mean и maximum, относящиеся к экземплярам, показывают информацию о конструкциях языка COOL. 582 Глава 7. Введение в CLIPS plates и list-deffacts могут применяться соответственно для отображения текущего списка конструкций deftemplate или текущего списка конструкций de f f acts. Эти команды имеют следующий синтаксис (list-defrules) (list-deftemplates) (list-deffacts) Ниже приведен пример применения этих команда а total of 3 deftemplates. CLIPS>(list- deffacts)J initial-fact For а total of 1 deffacts ° CLIPS> Отображение текстового представления указанного элемента конструкции (ppdeffacts "An example rule" (emergency (type fire)) => (assert (response Для отображения текстовых представлений конструкций de f rule, de f template и de ЙЙас1я применяются соответственно команда ppdefrule (pretty print de Й, команда ppdeftemplate (pretty print de Й) и команда ppdeffacts (pretty print deЙЙас1я), которые имеют следующий синтаксис. Команды, применяемые для манипулирования конструкциями 583 (action activate-sprinkler-system)))) CLIPS> (ppdeftemplate response)J (deftemplate MAIN::response (slot action)) CLIPS> (ppdeffacts initial-fact)J CLIPS> (deffacts start-fact (start-fact))J CLIPS> (ppdeffacts start-fact)J (deffacts MAIN::start- fact (start-fact)) CLIPS> Символ MAIN::, предшествующий каждому имени конструкции, обозначает модуль, в который помещена эта конструкция. Модули предоставляют механизм секционирования базы знаний и рассматриваются более подробно в главе 9. Обратите внимание на то, что конструкция def facts с именем initial — fact не имеет текстового представления (поскольку создается системой автоматически. С другой стороны, конструкция def facts с именем start — fact, введенная в программу, имеет текстовое представление. Удаление указанного элемента конструкции Для удаления конструкции de f rule, de f template или de f f acts используются соответственно команда undefrule, команда undeftemplate и команда undeffacts, которые имеют следующий синтаксис (undefrule удалены наряду с любыми другими конструкциями, определяемыми пользователем. А если Каждая команда принимает единственный параметр, который задает имя конструкции def rule, def template или def facts, подлежащей удалению, например, как показано ниже. CLIPS> (undeffacts start-fact)J CLIPS> (list-deffacts)J initial-fact For а total of 1 deffacts. CLIPS> (undefrule fire-emergency)J CLIPS> (list-defrules)J Глава 7. Введение в CLIPS 584 Удаление всех конструкций из среды CLIPS (очистка среды) Для удаления всей информации, содержащейся в среде CLIPS, может применяться команда Эта команда удаляет все конструкции, содержащиеся в настоящее время в системе CLIPS, а также все факты из списка фактов. Синтаксис команды clear такой (clear) После очистки среды CLIPS команда clear добавляет конструкцию deffacts с именем initial — йас к среде CLIPS, как показано ниже. после этого будет выполнена команда reset, ток списку фактов не добавится факт (initial-fact). Если в качестве параметра любой из команд удаления конструкций указывается символ *, то удаляются все конструкции соответствующего типа. Например, команда ( unde f rule * ) удаляет все конструкции de f Символ * может также использоваться в команде retract для удаления всех фактов. Конструкции, на которые имеется ссылка в других конструкциях, не могут быть удалены до тех пор, пока не произошло удаление ссылающихся на них конструкций. Как показывает приведенный ниже диалог, конструкция бей1етр1а1е с именем initial — fact не может быть удалена до тех пор, пока не удалены конструкция def facts с именем initial — fact, факт (initial — fact) и конструкция de f rule с именем example (в которой используется применяемый по умолчанию шаблон initial — fact). CLIPS> (defrule example >)J CLIPS> (undeftemplate initial-fact)J [PRNTUTIL4] Unable to delete deftemplate initial-fact ° CLIPS> (undeffacts initial-fact)J CLIPS> (undeftemplate initial-fact)J [PRNTUTIL4] Unable to delete deftemplate initial-fact. CLIPS> (undefrule example)J CLIPS> (undeftemplate initial-fact)J [PRNTUTIL4] Unable to delete deftemplate initial-fact. CLIPS> (retract *)J CLIPS> (undeftemplate initial-fact)J CLIPS> 7.14. Команда printout 585 CLIPS> (list-deffacts)J CLIPS> (list- deftemplates)J emergency response start-fact For а total of 3 deftemplates. CLIPS> (clear)J CLIPS> (list-deffacts)J initial-fact For а total of 1 deffacts. CLIPS> (Е -deftemplates)J initial-fact For а total of 1 deftemplate. CLIPS> 7.14 Команда printout Правая часть правил может использоваться не только для ввода фактов в список фактов, но и для вывода информации. Для этого служит команда printout, которая имеет следующий синтаксис (printout *) (defrule fire-emergency (emergency (type fire)) — > (printout t "Activate the sprinkler system" crlf)) Очень важно задать букву t после имени команды printout, поскольку этот параметр показывает назначение вывода. Такое назначение принято также называть логическим именем устройства. В данном случае логическое имя t сообщает системе CLIPS, что вывод должен быть направленна стандартное устройство вывода компьютера (обычно таковым является терминал. Этологическое имя может быть переопределено таким образом, чтобы стандартным устройством вывода стало нечто иное, допустим, модем или принтер. Понятие логических имен будет подробно рассматриваться в разделе 8.6. В этом определении параметр — name> показывает назначение вывода команды printout, а параметр * содержит от нуля и больше элементов, которые должны быть выведены с помощью указанной команды. Применение команды printout демонстрируется на примере следующего правила Глава 7. Введение в CLIPS Параметры, которые следуют за логическим именем, представляют собой элементы данных, подлежащих выводу с помощью команды printout. В данном случае на терминал должна быть выведена следующая строка без окружающих ее кавычек "Activate the sprinkler system" В команде printout ключевое слово crlf трактуется особым образом. Применение этого ключевого слова приводит к выводу знаков возврата каретки и перевода строки, благодаря чему внешний вид выходных данных улучшается в результате применения форматирования с разбивкой на строки. Использование нескольких правил До сих пор в этой главе рассматривались исключительно программы простейшего типа, состоящие лишь из одного правила. Но экспертная система, которая включает только одно правило, вряд ли может принести значительную пользу. Практически применимые экспертные системы могут состоять из сотен или тысяч правил. В частности, экспертная система текущего контроля за промышленной установкой кроме правила fire — emergency может включать правило для таких критических ситуаций, в которых произошло наводнение. Итак, дополним множество правил, которое теперь должно выглядеть следующим образом (defrule fire-emergency (emergency (type fire)) — > (printout t "Activate the sprinkler system" crlf)) (defrule flood-emergency (emergency (type flood)) — > (printout t "Shut down electrical equipment" crlf)) После ввода этих правил в систему CLIPS введение факта (emergency (type fire) а затем выдача команды run приводят к формированию вывода "Activate the sprinkler system" (Активизировать спринклерную систему. А ввод факта (emergency (type flood) ) и выдача команды run приводят к получению вывода "Shut down the electrical equipment" (Отключить электрическое оборудование. Использование нескольких правил 587 Отражение в правиле свойств реального мира Правила с несколькими шаблонами Большинство эвристик, применяемых на практике, являются слишком сложными для того, чтобы их можно было выразить с помощью правил, имеющих только один шаблон. Например, решение активизировать спринклерную систему при обнаружении пожара любого типа может оказаться не только ошибочным, но и опасным. Пожары, в которых происходит горение таких обычных сгораемых материалов, как бумага, древесина и ткань (пожары категории А, могут быть потушены с помощью воды или огнетушителей на основе воды. А пожары, которые охватывают легко воспламеняемые и горючие жидкости, консистентные смазки и подобные материалы (пожары категории В) необходимо гасить другим способом, например, с помощью углекислотного огнетушителя. Для представле- Если бы приходилось иметь дело только с такими двумя чрезвычайными ситуациями, как пожары и наводнения, то приведенных выше правил было бы достаточно. Но реальный мир не так прост. Например, не все пожары могут быть потушены с помощью воды. Для тушения некоторых пожаров требуются химические огнетушители. Кроме того, необходимо предусмотреть действия, осуществляемые в том случае, если при пожаре, допустим, выделяются ядовитые газы или происходят взрывы. Следует ли известить внешнее пожарное отделение, а не только собственное подразделение пожарной охраны Имеет ли значение тона каком этаже здания происходит пожар Ведь ввод в действие водяной спринклерной системы на втором этаже может вызвать повреждения под действием воды и на втором, и на первом этажах. К тому же может потребоваться отключить подачу электропитания к оборудованию на обоих этажах. А пожар, происходящий на первом этаже, может потребовать отключения электропитания, поступающего к оборудованию, только на первом этаже. С другой стороны, если здание подвергается воздействию наводнения, то имеются ливнем водонепроницаемые двери, которые можно закрыть, чтобы предотвратить ущерб А какие действия необходимо предпринять в случае обнаружения незаконного вторжения в помещение промышленной установки? Наконец, как проверить, всели варианты были учтены, после того как эти ситуации найдут свое отражение в правилах К сожалению, ответ на этот вопрос всегда отрицателен. В реальном мире события очень редко развиваются в соответствии с заранее продуманным сценарием. К тому же задача отражения в экспертной системе всех относящихся к делу знаний может оказаться весьма трудной. В наилучшем случае существует возможность определить лишь наиболее важные чрезвычайные ситуации и предусмотреть правила, позволяющие экспертной системе распознать такое положение, когда она неспособна справиться с критической ситуацией Глава 7. Введение в CLIPS ния таких условий могут применяться правила больше чем с одним шаблоном, например, как показано ниже. (deftemplate extinguisher-system (slot type) (slot status)) (defrule А (emergency (type А) (extinguisher-system (type water-sprinkler) (status off)) => (printout t "Activate water sprinkler" crlf)) (defrule В (emergency (type В (type carbon-dioxide) (status off)) > (printout t "Use carbon dioxide extinguisher" crlf)) Оба этих правила имеют два шаблона. Первый шаблон определяет, существует ли критическая ситуация, связанная с пожаром, и относится ли пожар к категории А или к категории В. Второй шаблон определяет, включена ли соответствующая система пожаротушения. Для решения задачи отключения средств пожаротушения могут быть введены дополнительные правила (например, если уже включена водяная спринклерная система, но возник пожар категории В, то систему необходимо отключить; еще один вариант состоит в том, что все средства пожаротушения должны быть отключены после того, как пожар будет ликвидирован. А для определения того, приводит ли воспламенение какого-то конкретного горючего материала к развитию пожара категории А или категории В, могут быть введены другие дополнительные правила. В любое правило может быть помещено любое количество шаблонов. Но следует учитывать важное условие, что правило помещается в рабочий список правил, только если имеющиеся факты удовлетворяют всем шаблонам. Ограничение этого типа принято называть условным элементом and. В условном элементе and неявно содержатся шаблоны всех правил, поэтому правило не активизируется, если факты удовлетворяют только одному из шаблонов. В системе должны появиться все необходимые факты, и только после этого удовлетворяется левая часть какого-то правила, которое помещается в рабочий список правил 7.16. Команда set — break б Команда set-break В языке предусмотрена команда отладки, называемая командой setbreak, которая позволяет останавливать исполнение программы перед тем, как произойдет запуск любого правила из указанной группы правил. Правило, которое останавливает исполнение прежде, чем будет запущено, называется точкой останова. Команда set — break имеет следующий синтаксис (defrule first — > (assert (fire second))) (defrule second (fire second) — > (assert (fire third))) (defrule third (fire third) =>) Следующий пример диалогового выполнения команд показывает, как исполняются правила, для которых не заданы какие-либо точки останова CLIPS> (Match rules)J CLIPS> (reset)J CLIPS> (run)J FIRE 1 first: f-0 FIRE 2 second: f-1 FIRE 3 third: f-2 CLIPS> В данном случае после выдачи команды run последовательно происходит запуск всех трех правил. А в следующем примере диалогового выполнения команд демонстрируется использование команды set — break для останова выполнения (set-break second)J CLIPS> (set-break third)J CLIPS> (reset)J CLIPS> (run)J FIRE 1 first: f — 0 590 Глава 7. Введение в CLIPS Breaking on rule second CLIPS> (run)J FIRE 1 second: f-1 Breaking on rule third CLIPS> (run)J FIRE 1 third: f 2 CLIPS> (show-breaks) Для удаления точек останова может использоваться команда remove-break. Эта команда имеет такой синтаксис (remove-break [ который содержит имя файла, подлежащего загрузке. При условии, что правила и конструкции de f template, описывающие чрезвычайную ситуацию, хранятся в файле "fire. clp" на гибком диске персонального компьютера IBM, следующая команда загрузит эти конструкции в систему CLIPS: (load "В) В данном случае выполнение команд останавливается прежде, чем будет разрешен запуск правили. Обратите внимание на то, что после выдачи команды run должно быть запущено по меньшей мере одно правило, и только после этого прекращается выполнение в точке останова. Например, после останова выполнения правила second повторная выдача команды run больше не приводит к останову выполнения. Для вывода списка всех точек останова может применяться команда show- breaks, которая имеет следующий синтаксис 7.17. Загрузка и сохранение конструкций Безусловно, формат спецификации имени файла зависит от используемой операционной системы, поэтому данный пример должен рассматриваться только в качестве общего руководства. В процессе загрузки может возникнуть проблема, связанная с тем, что в некоторых операционных системах в качестве разделителя компонентов имени пути к каталогу используется обратная косая черта. А поскольку в системе CLIPS обратная косая черта интерпретируется как знак переключения на другой режим обработки, то для представления в строке единственной обратной косой черты необходимо использовать две обратные косые черты. Например, обычно имя пути записывается примерно таким образом В Но, чтобы сохранить знаки обратной косой черты, это имя пути необходимо записать, как показано в следующем примере команды (В) Не все конструкции должны обязательно храниться в единственном файле. Все конструкции программы можно распределить по нескольким файлами загружать с использованием ряда команд load. Если вовремя загрузки файла ошибки не возникают, то команда load возвращает символ TRUE (подробные сведения о возвращаемых значениях приведены в главе 8). В противном случае эта команда возвращает символ FALSE. Отслеживание операций компиляции Приведенные здесь сообщения показывают, что загружены две конструкции бей1етр1а1е (emergency и response), а вслед за ними загружено правило fire- emergency. Строка "+j", находящаяся в конце сообщения "Defining defrule" (Определение конструкции представляет собой поступающую из системы информацию о внутренней структуре компилируемых правил. Эта информация может оказаться полезной при настройке программы Если предусмотрено отслеживание операций компиляции (применяемое по умолчанию, то команда load после загрузки каждой конструкции выводит информационное сообщение, в котором содержится имя конструкции. Например, предположим, что непосредственно перед этим произошел запуск системы CLIPS и осуществляется ввод следующих команд CLIPS> (load "fire.clp")J Defining deftemplate: emergency Defining deftemplate: response Defining defrule: fire-emergency +j TRUE CLIPS> 592 Глава 7. Введение в CLIPS Сохранение конструкций в файле В языке CLIPS предусмотрена также команда, противоположная по своему назначению команде load. Команда save предоставляет возможность сохранить в файле на диске множество конструкций, хранящихся в системе Синтаксис команды save приведен ниже. (save Например, команда, которая сохраняет конструкции правил борьбы согнем в файле fire. clp на гибком диске В, имеет такой вид (save "В) Команда save сохраняет в указанном файле все конструкции, заданные в системе Возможность сохранить в файле только указанные конструкции отсутствует. Обычно если для создания и модификации конструкций используется редактор, тонет необходимости применять команду save, поскольку конструкции сохраняются входе работы с редактором. Но иногда бывает удобно вводить конструкции непосредственно в приглашении CLIPS, а затем сохранять их в файле. 7.18 Комментирование конструкций В программу CLIPS рекомендуется включать комментарии. Иногда при попытке понять назначение конструкций возникают сложности, поэтому для предоставления читателю пояснений, касающихся назначения конструкций, могут применяться комментарии. Кроме того, комментарии используются для качественного документирования программ и являются полезными при изучении длинных программ. и будет рассматриваться более подробно в главе 9, в которой речь идет об эффективности. Если же отслеживание операций компиляции не предусмотрено, то система CLIPS выводит по одному знаку в расчете на каждую загруженную конструкцию обозначает конструкции de f rules; о — конструкции de f template; $— конструкции de f f acts, например, как показано ниже. CLIPS> (clear)J CLIPS> (unlatch compilations)J CLIPS> (load fire.clp)J о о* о о TRUE CLIPS> 593 7.19. Переменные Комментарием в языке CLIPS является любой текст, который начинается сточки с запятой и заканчивается знаком возврата каретки. Ниже приведен пример применения комментариев в программе f ire. ° *********************************** I ° * * 1 ° * * I ;* Programmer: G. D. Riley * ° * * I ;* Title: The Fire Program * ° * * 1 ;* Date: 05/17/04 * ° * * I ° *********************************** I Конструкции deftemplate (deftemplate emergency "template №1" (slot type)) ; Тип чрезвычайной ситуации (deftemplate response "template ¹2" (slot type)) ; Способ реагирования на чрезвычайную ситуацию Назначение этого правила состоит в активизации ;спринклерной систеыы, если возник пожар (defrule fire-emergency "An example rule" ; IF Чрезвычайная ситуация, связанная с возникновением пожара (emergency (type fire)) Стрелка THEN Активизировать спринклерную систеыу (assert (response (action activate-sprinkler- system)))) 7.19 Переменные В языке CLIPS, как ив других языках программирования, для хранения значений можно воспользоваться переменными. Переменные в языке всегда записываются с применением синтаксиса, предусматривающего использование вопросительного знака, за которым следует имя символического поля. Имена переменных должны соответствовать требованиям к синтаксису символов, не считая Загрузка этих конструкций в систему CLIPS и последующий структурированный вывод показывает, что в программе CLIPS уничтожаются все комментарии, начинающиеся сточки с запятой. Единственным сохранившимся комментарием является тот, который задан в кавычках после имени конструкции Глава 7. Введение в CLIPS того исключения, что они должны начинаться с буквы. Требования к хорошему стилю программирования диктуют, чтобы переменным присваивались осмысленные имена. Некоторые примеры переменных приведены ниже. ?speed ?sensor ?value ?noun ?color Между вопросительным знаком и именем символического поляне должно быть пробелов. Как будет описано позже, сам вопросительный знак имеет собственное назначение. Переменные используются в левой части правила для хранения значений слотов, которые в дальнейшем могут сравниваться с другими значениями в левой части правила или применяться в правой части правила. Для описания операции присваивания значения переменной и полученного при этом результата используются термины связывать и связанный. Один из общепринятых способов использования переменных состоит в том, что с переменной в левой части правила связывается значение, а затем это значение применяется в правой части правила, как показано ниже. CLIPS> (clear)J CLIPS> (deftemplate person (slot name) (slot eyes) (slot Ьа1х)) 1 CLIPS> (бейги1е 21пб- blue-eyes (person (name ?name) (eyes blue)) > (рг1п:она t паве " has blue eyes." crlf) ) J CLIPS> (deffacts people (person (name Jane) (eyes blue) (Ьаiх red)) (person (name Joe) (eyes green) (hair brown)) (person (name Jack) (eyes blue) (hair black)) (person (name Jeff) (eyes green) (hair brown)))J CLIPS> (reset)J 7.20. Многократное использование переменных 595 CLIPS> (run)J Jack has blue eyes. Jane has blue eyes. CLIPS> В данном случае и Джейн, и Джек имеют синие глаза, поэтому правило f ind — blue — eyes активизируется дважды, по одному разу для каждого из фактов, описывающих Джейн и Джека. После запуска правила слот пате проверяется на наличие факта, активизировавшего запускаемое в текущий момент правило, после чего это значение используется в операторе printout. Если в правой части правила применяется ссылка на переменную, а в левой части этого правила не происходит связывание переменной, то система CLIPS выводит следующее сообщение об ошибке (предполагается, что несвязанной была переменная х [PRCCODE3] Undefined variable x referenced in RHS of defrule. 7.20 Многократное использование переменных Конструкция de f template с именем find указывает цвет глаз это значение задается с помощью слота eyes. В таком случае с использованием правила Переменные с одними тем же именем, которые используются в нескольких местах левой части правила, обладают одним важными полезным свойством. После того как переменная будет впервые связана со значением, это значение остается в правиле неизменным. Другие вхождения одной и той же переменной должны согласовываться стем же значением, которое было впервые присвоено переменной. Поэтому вместо записи отдельного правила, в котором выполняется только поиск людей с синими глазами, можно вставить в список фактов такой факт, который указывает конкретный искомый цвет глаз, например, как показано ниже (undefrule *)J CLIPS> (deftemplate find (slot eyes)) 1 CLIPS> (defrule find-eyes (find (eyes ?eyes)) (person (name ?name) (eyes ?eyes)) (printout t ?name " has " ?eyes " eyes." crlf)) Глава 7. Введение в CLIPS 596 Обратите внимание на то, что после ввода факта ( f ind (eyes purple) ) не происходит запуск каких-либо правил, поскольку отсутствуют факты person со значением purple в слоте eyes. 7.21 Адреса Фактов Операции извлечения, модификации и дублирования фактов являются широко применяемыми и обычно осуществляются в правой части правила, а не на верхнем уровне. В данной главе уже было показано, как выполняются эти операции с фактами в приглашении верхнего уровня с использованием индексов фактов. Но прежде чем появится возможность выполнять манипуляции с фактом из правой части правила, необходимо предусмотреть определенный способ задания факта, который согласуется с конкретным шаблоном. Для достижения этой цели можно связать некоторую переменную с адресом факта, относящимся к тому факту, который согласуется с шаблоном левой части правила с помощью операции связывания с шаблоном, < —. После связывания эту переменную можно использовать в командах retract, modify или duplicate вместо индекса факта. Например, следующий диалог показывает, как обновить значения слота конструкции de f template из правой части правила CLIPS> (clear)J CLIPS> f ind — eyes может осуществляться выборка значения из слота eyes конструкции de f template с именем find, а затем поиск всех фактов person, для которых значение слота eyes является таким же, какое было связано с переменной eyes. В следующем диалоге показано как применяется этот прием CLIPS> (reset)J CLIPS> (assert (find (eyes blue)))J (х1лп) Jeff has green eyes. Усе has green eyes. CLIPS> (assert (find (eyes purple)))J 7.21. Адреса фактов 597 (deftemplate person (slot name) (slot address))J CLIPS> (deftemplate moved (slot name) (slot address))J CLIPS> (defrule process-moved-information ?f1 <- (moved (паве) (address 7асИхевв)) 7f2 <- (person (паве паве) => (retract 7f1) (modify 7f2 (address 7асЫгезв))) 1 CLIPS> (deffacts ехавр1е (person (name "John Hill" ) (address "25 Mulberry Lane" )) (moved (name "John Hill" ) (address "37 Cherry Lane")))J CLIPS> (reset)J CLIPS> (watch rules)J CLIPS> (watch facts)J CLIPS> (run)J FIRE 1 process-moved-information: f-2,f-1 < f-2 (moved (name "John Hill" ) (address "37 Cherry Lane" )) с f-1 (person (name "John Hill" ) (address "25 Mulberry Lane" )) > f-3 (person (name "John Hill" ) (address "37 Cherry Lane" )) CLIPS> В данном примере используются две конструкции de f template. Конструкция deftemplate с именем person применяется для хранения информации о некотором лице, в этом случае только об имении адресе этого лица. Существует также возможность хранить другую информацию, такую как возраст или цвет глаз. А конструкция de f template с именем moved используется для указания на то, что адрес лица изменился. Новый адрес задается в слоте address. 598 Глава 7. Введение в CLIPS CLIPS> (defrule process-moved- information (moved (name 7name) (address ?address)) ?f2 <- (person (name ?name)) ') (modify 7f2 (address ?address)))J CLIPS> (unwatch facts)J CLIPS> (unwatch rules)J CLIPS> (reset)J CLIPS> (watch facts)J CLIPS> (watch rules)J CLIPS> (watch activations)J CLIPS> (run 3)J FIRE 1 process-moved-information: f- 2,f-1 < f-1 (person (name "John Hill" ) (address "25 Mulberry Lane" )) > f-3 (person (name "John Hill" ) (address "37 Cherry Lane" )) > Activation О process-moved-information: f-2,f-3 FIRE 2 process- moved-information: f-2,f-3 < f-3 (person (name "John Hill" ) (address "37 Cherry Lane" )) (person (name "John Hill" ) > f — 4 Первый шаблон в правиле process — moved — information определяет, требуется ли выполнить обработку, связанную со сменой адреса, а второй шаблон применяется для поиска факта для которого потребуется изменить информацию об адресе. Адрес факта, относящийся к факту moved, связывается с переменной ? f 1 таким образом, что этот факт можно легко извлечь, приступая к осуществлению изменения. Адрес факта, относящийся к факту person, связывается с переменной ? й2, которая в дальнейшем используется в правой части правила для модификации значения слота address. Обратите внимание на то, что могут одновременно использоваться переменные, связанные со значением в факте, и переменные, связанные с адресом факта, относящимся к некоторому факту. Кроме того, значение переменной ?address может все еще применяться в правой части правила даже для извлечения факта, из которого было получено указанное значение. Для того чтобы правило действовало должным образом, важно предусмотреть извлечение факта moved из правой части правила process — moved — in f ormation. Обратите внимание на то, что происходит в следующем примере после удаления команды retract: 7.22. Однозначные подстановочные символы 599 (address "37 Cherry Lane" )) > Activation 0 process-moved-information: f-2,f-4 FIRE 3 process — moved — information: f — 2,f — 4 < f-4 (person (name "John Hill" ) (address "37 Cherry Lane" )) > f-5 (person (name "John Hill" ) (address "37 Cherry Lane" )) > Activation 0 process- moved-information: f-2,f-5 CLIPS> Программа входит в бесконечный цикл, поскольку в ней вводится новый факт person после модификации факта, связанного с переменной ? f2, в результате чего повторно активизируется правило process — moved — information. Напомним, что команда modi йу рассматривается как команда retract, за которой следует команда assert. А поскольку в команде run было указано, что должен быть произведен запуск только трех правил, программа останавливается именно после этого. Если же в команде run не был бы задан такой лимитирующий параметр, то программа проходила бы по циклу бесконечно. Единственный способ остановить бесконечный цикл, подобный этому, состоит в прерывании работы системы CLIPS с помощью комбинации клавиш (deffacts some-people (person (name John Q. Public) (social- security-number 483-98-9083)) (person (name Jack R. Иногда возникает необходимость проверить наличие некоторого поля в слоте без фактического присваивания значения переменной. Такая возможность особенно полезна при работе с многозначными слотами. Например, предположим, что необходимо вывести номер карточки социального обеспечения для каждого человека с указанной фамилией. Ниже показаны конструкция de f template, используемая для описания каждого человека конструкция de f facts, в которой заранее заданы сведения о некоторых людях а также правило, с помощью которого осуществляется вывод номера карточки социального обеспечения каждого человека с указанной фамилией Глава 7. Введение в CLIPS (social-security-number 483-98- |