Единое окно доступа к образовательным ресурсам

Разработка интеллектуальных информационных систем с использованием CLIPS: Методические указания

Голосов: 2

Приведено описание основных конструкций языка представления знаний CLIPS. Рассмотрены конкретные примеры разработки интеллектуальных систем. Предназначены для студентов 4 курса дневного отделения специальности 080801 "Прикладная информатика в экономике".

Приведенный ниже текст получен путем автоматического извлечения из оригинального PDF-документа и предназначен для предварительного просмотра.
Изображения (картинки, формулы, графики) отсутствуют.
        Министерство образования и науки Российской Федерации

ГОУ ВПО "Тамбовский государственный технический университет"




  РАЗРАБОТКА ИНТЕЛЛЕКТУАЛЬНЫХ
    ИНФОРМАЦИОННЫХ СИСТЕМ
     С ИСПОЛЬЗОВАНИЕМ CLIPS


Методические указания к практическим и лабораторным работам

для студентов 4 курса дневного отделения специальности 080801




                          Тамбов

                     Издательство ТГТУ
                           2007


УДК 004.8
ББК    813
    Д996


                                                         Р е це н зе н т
                                    Доктор физико-математических наук, профессор
                                                    С.М. Дзюба


                                                       С о с т ав ит е ль
                                                        В.Н. Дякин


Д996 Разработка интеллектуальных информационных систем с использованием CLIPS : методические указания к практи-
    ческим и лабораторным работам / сост. В.Н. Дякин. – Тамбов : Изд-во Тамб. гос. техн. ун-та, 2007. – 32 с. – 100 экз.


       Приведено описание основных конструкций языка представления знаний CLIPS. Рассмотрены конкретные примеры разработки
    интеллектуальных
    систем.
       Предназначены для студентов 4 курса дневного отделения специальности 080801 "Прикладная информатика в экономике".

                                                                УДК 004.8
                                                                ББК    813




                          ГОУ ВПО "Тамбовский государственный
                            технический университет" (ТГТУ), 2007



                                                      Учебное издание



                         РАЗРАБОТКА ИНТЕЛЛЕКТУАЛЬНЫХ
                           ИНФОРМАЦИОННЫХ СИСТЕМ
                            С ИСПОЛЬЗОВАНИЕМ CLIPS
                                        Методические указания к практическим и
                                               лабораторным работам

                                         Составитель ДЯКИН Вадим Николаевич

                                            Редактор Т.М. Глинкина
                                   Компьютерное макетирование Е.В. Кораблево й


                                                 Подписано в печать 06.06.07
                                Формат 60 × 84/16. 1,86 усл. печ. л. Тираж 100 экз. Заказ № 399

                                           Издательско-полиграфический центр
                                  Тамбовского государственного технического университета
                                           392000, Тамбов, Советская, 106, к. 14


РАЗРАБОТКА ИНТЕЛЛЕКТУАЛЬНЫХ
  ИНФОРМАЦИОННЫХ СИСТЕМ
   С ИСПОЛЬЗОВАНИЕМ CLIPS




       • ИЗДАТЕЛЬСТВО ТГТУ •


                                                         ВВЕДЕНИЕ
      Предметом изучения дисциплины "Интеллектуальные информационные системы" является исследование методик и ин-
струментальных средств разработки информационных систем с элементами искусственного интеллекта. Наиболее распро-
страненным типом таких систем являются так называемые экспертные системы.
      Предлагается использовать для разработки экспертных систем язык представления знаний CLIPS. Первоначально аб-
бревиатура CLIPS была названием языка – С Language Integrated Production System (язык С, интегрированный с продукцион-
ными системами), удобного для разработки баз знаний и макетов экспертных систем. CLIPS начал разрабатываться в косми-
ческом центре NASA в 1984 г. Теперь CLIPS представляет собой современный инструмент, предназначенный для создания
экспертных систем (expert system tool). CLIPS состоит из интерактивной среды – экспертной оболочки со своим способом
представления знаний, гибкого и мощного языка и нескольких вспомогательных инструментов. Сейчас, благодаря доброй
воле своих создателей, CLIPS является абсолютно свободно распространяемым программным продуктом. Всем желающим
доступен как сам CLIPS последней версии, так и его исходные коды. Официальный сайт CLIPS располагается по адресу:
http://www.ghg.net/clips/CLIPS.html. Этот сайт поможет получить как сам CLIPS, так и всевозможный материал для его изуче-
ния и освоения (документацию, примеры, советы специалистов, исходные коды и многое другое).
      Благодаря тому, что CLIPS является свободно распространяемым программным продуктом с доступными исходными
кодами, в последнее время было выпущено множество программ и библиотек, усовершенствующих и дополняющих воз-
можности CLIPS. Некоторые из этих продуктов являются собственностью выпустивших их компаний и предназначены для
внутреннего использования или коммерческого распространения, другие, как и сам CLIPS, распространяются свободно. В
качестве самых известных примеров подобных проектов можно привести DLL/OCX-библиотеку, позволяющую использо-
вать механизм логического вывода CLIPS в ваших приложениях, Fuzzy CLIPS. CLIPS++, CLIPS code generator.
      Таким образом, возникает возможность применять конструкции CLIPS в приложениях, разработанных в других про-
граммных средах, таких как Visual Studio.
      Для получения практических навыков работы с CLIPS студентам предлагается выполнить две лабораторные работы. В
первой должны быть использованы базовые конструкции исходного CLIPS для разработки прототипа экспертной системы.
Во второй для реализации прототипа системы следует применять объектно-ориентированное расширение CLIPS под назва-
нием COOL.
                                  ОПИСАНИЕ ОСНОВНЫХ КОНСТРУКЦИЙ ЯЗЫКА
                                    ПРЕДСТАВЛЕНИЯ ЗНАНИЙ CLIPS ВЕРСИИ 6.22
     Экспертные системы, созданные с помощью CLIPS, могут быть запущены тремя основными способами:
     − вводом соответствующих команд и конструкторов языка непосредственно в среду CLIPS;
     − использованием интерактивного оконного интерфейса CLIPS (например для версий Windows или Macintosh);
     − с помощью программ-оболочек, реализующих свой интерфейс общения с пользователем и использующих механизмы
представления знаний и логического вывода CLIPS.
     Windows-версия среды CLIPS полностью совместима с базовой спецификацией языка. Ввод команд осуществляется не-
посредственно в главное окно CLIPS. Однако по сравнению с базовой Windows-версия предоставляет множество дополни-
тельных визуальных инструментов (например, менеджеры фактов или правил), значительно облегчающих жизнь разработ-
чика экспертных систем.
     Отличительной особенностью CLIPS являются конструкторы для создания баз знаний (БЗ):
                              defrule            – определение правил;
                              deffacts           – определение фактов;
                              deftemplate        – определение шаблона факта;
                              defglobal          – определение глобальных переменных;
                              deffunction        – определение функций;
                              defmodule          – определение модулей (совокупности правил);
                              defclass           – определение классов;
                              defintances        – определение объектов по шаблону, заданному
                                                   defclass;
                              defmessagehandler – определение сообщений для объектов;
                              defgeneric         – создание заголовка родовой функции;
                              defmethod          – определение метода родовой функции.
     CLIPS поддерживает следующие типы данных: integer, float, string, symbol, external-address, fact-address, instance-name,
instance-address.

    Пример integer:                  594,                23,               +51,                 −17.
                                          2
    Пример float:                    594e ,              23.45,            +51.0,               −17.5e−5.
    String – это строка символов, заключенная в двойные кавычки.
    Пример string: "expert", "Phil Blake", "состояние $-0$", "quote=\".


      Факты – одна из основных форм представления данных в CLIPS (существует также возможность представления данных
в виде объектов и глобальных переменных, но об этом речь пойдет позже). Каждый факт представляет собой определенный
набор данных, сохраняемый в текущем списке фактов – рабочей памяти системы. Список фактов представляет собой уни-
версальное хранилище фактов и является частью базы знаний. Объем списка фактов ограничен только памятью вашего ком-
пьютера. Список фактов хранится в оперативной памяти компьютера, но CLIPS предоставляет возможность сохранять теку-
щий список в файл и загружать список из ранее сохраненного файла.
      В системе CLIPS фактом является список неделимых (или атомарных) значений примитивных типов данных. CLIPS
поддерживает два типа фактов – упорядоченные факты (ordered facts) и неупорядоченные факты или шаблоны (non-ordered
facts или template facts). Ссылаться на данные, содержащиеся в факте, можно либо используя строго заданную позицию зна-
чения в списке данных для упорядоченных фактов, либо указывая имя значения для шаблонов. Упорядоченные факты состо-
ят из поля, обязательно являющегося данным типа symbol и следующей за ним, возможно пустой, последовательности по-
лей, разделенных пробелами. Ограничением факта служат круглые скобки:
    (поле_типа_symbol [поле]*)
     Так как упорядоченный факт для представления информации использует строго заданные позиции данных, то для дос-
тупа к ней пользователь должен знать, не только какие данные сохранены в факте, но и какое поле содержит эти данные.
Неупорядоченные факты (или шаблоны) предоставляют пользователю возможность задавать абстрактную структуру факта
путем назначения имени каждому полю. Для создания шаблонов, которые впоследствии будут применяться для доступа к
полям факта по имени, используется конструктор deftemplate. Конструктор deftemplate аналогичен определениям записей
или структур в таких языках программирования, как Pascal или С.
     Конструктор deftemplate задает имя шаблона и определяет последовательность из нуля или более полей неупорядочен-
ного факта, называемых также слотами. Слот состоит из имени, заданного значением типа symbol, и следующего за ним,
возможно пустого, списка полей. Как и факт, слот с обеих сторон ограничивается круглыми скобками. В отличие от упоря-
доченных фактов слот неупорядоченного факта может жестко определять тип своих значений. Кроме того, слоту могут быть
заданы значения по умолчанию. Синтаксис данного конструктора следующий:
                          (deftemplate <имя-шаблона> [<комментарии>] [<оперделение-слота>*])
     Помимо фактов, CLIPS предоставляет еще один способ представления данных – глобальные переменные (globals). В
отличие от переменных, связанных со своим значением в левой части правила, глобальная переменная доступна везде после
своего создания (а не только в правиле, в котором она получила свое значение). Глобальные переменные CLIPS подобны
глобальным переменным в процедурных языках программирования, таких как С или ADA. Однако, в отличие от переменных
большинства процедурных языков программирования, глобальные переменные в CLIPS слабо типизированы. Фактически
переменная может принимать значение любого примитивного типа CLIPS при каждом новом присваивании значения.
     С помощью конструктора defglobal в среде CLIPS могут быть объявлены глобальные переменные и присвоены их на-
чальные значения.
    (defglobal [<имя-модуля>] <определение-переменной>*)
    <определение-переменной> ::= <имя-переменной> = <выражение>
    <имя-переменной> ::= ?*<эначение-типа-symbol>*
     CLIPS позволяет использовать произвольное количество конструкторов defglobal. Необязательный параметр <имя-
модуля> указывает модуль, в котором должны быть определены конструируемые переменные. Если имя модуля не задано,
то переменные будут помещены в текущий модуль.
     Глобальные переменные применяются в любом месте, где могут быть использованы переменные, созданные в левой
части правил с некоторыми исключениями. Во-первых, глобальные переменные не могут использоваться как параметры в
конструкторах deffunction, defmethod или обработчиках сообщений. Во-вторых, глобальные переменные не могут использо-
ваться для получения новых значений в левой части правил.
    Неверно: (defrule example (fact ?*x*) =>).
    Верно: (defrule example (fact ?y & :(> ?y ?*x*)) =>)
    П р и м е р 1.
    (defglobal
    ?*x* = 3
    ?*y* = ?*x*
    ?*z* = (+ ?*x* ?*y*)
    ?*q* = (create$ a b c))
    После выполнения данного конструктора в CLIPS появятся 4 глобальные переменные: х, у, z и q. Переменной х при-
сваивается целое значение 3. Переменной у – значение, сохраненное в глобальной переменной х (т.е. 3). Переменной z –
сумма значений х и у (т.е. 6).
    Обратите внимание, что переменная у не является указателем на переменную x, просто их значения в данный момент
совпадают. Если изменить значение х, значения переменных у и z, несмотря ни на что, останутся равными 3 и 6 соответст-
венно.
    Добавьте еще один конструктор defglobal, объявляющий переменные вещественного и текстового типа, а также пере-
менную со значением типа symbol.
    (defglobal
    ?*d* = 7.8
    ?*e* = "string"


    ?*f* = symbol)
     При выполнении команды reset все глобальные переменные получают начальные значения, определенные в конструк-
торе.
     Команда ppdefglobal выводит в диалоговое окно системы определение заданной глобальной переменной.
     Имя глобальной переменной должно быть задано без вопросительного знака и символов *, т.е. name для переменной
?*name*.
     Команда list-defglobals предназначена для отображения в диалоговом окне списка имен всех определенных в системе гло-
бальных переменных.
    (list-defglobals [<имя-модуля>])
    Если необязательный параметр <имя-модуля> не указан, то данная команда выводит имена глобальных переменных,
определенных в текущем модуле. Если параметр содержит имя конкретного модуля, команда list-defglobal выводит список
переменных, определенных в заданном модуле. Допускается использование символа *. В этом случае команда выведет в
диалоговое окно имена всех глобальных переменные, определенных во всех модулях системы.
    Команда show-defglobals, в отличие от команды list-defglobals, выводит в диалоговое окно CLIPS не только имена гло-
бальных переменных, но и их значения. В остальном эти две команды практически идентичны.
    (show-defglobals [ <имя-модуля> ])
    Команда undefglobal предназначена для удаления определенных пользователем глобальных переменных.
    (undefglobal <имя-глобальной-переменной>)
     В качестве параметра <имя-глобальной-переменной> допускается использование символа *. В этом случае команда по-
пытается удалить все определенные пользователем глобальные переменные. Если глобальная переменная указана, например,
в определении функции, удаление этой переменной закончится неудачей.
     Существуют похожие функции для стандартных операций с конструкторами различных типов (не только для defglobal).
      (bind <имя-переменной> <выражение>*)
      Параметр выражения является необязательным. Если он не задан, то переменной будет установлено начальное значе-
ние, заданное в конструкторе defglobal. В случае, если выражение было задано, то его значение будет вычислено и результат
присвоен переменной. Если было задано несколько выражений, все они будут вычислены, из их результатов будет составле-
но составное поле, которое будет присвоено глобальной переменной.
      Функция bind возвращает значение false в случае, если переменной по какой-то причине не было присвоено никакого
значения. В противном случае функция возвращает значение, присвоенное переменной.
      Поскольку переменные в CLIPS слабо типизированы, типы значений, присваиваемые одной и той же переменной, в
разные моменты времени могут не совпадать.
      CLIPS поддерживает эвристическую и процедурную парадигму представления знаний. Для представления знаний в
процедурной парадигме CLIPS предоставляет такие механизмы, как глобальные переменные, функции и родовые функции.
Кроме того, существует такой способ представления знаний, как правила. Правила в CLIPS служат для представления эври-
стик или так называемых "эмпирических правил" действий при возникновении некоторой ситуации. Разработчик экспертной
системы определяет набор правил, которые вместе работают над решением некоторой задачи. Правила состоят из предпосы-
лок и следствия. Предпосылки называются также ЕСЛИ-частью правила, левой частью правила или LHS правила (left-hand
side of rule). Следствие называется ТО-частью правила, правой частью правила или RHS правила (right-hand side of rule).
      Предпосылки правила представляют собой набор условий (или условных элементов), которые должны удовлетвориться
для того, чтобы правило выполнилось. Предпосылки правил удовлетворяются в зависимости от наличия или отсутствия не-
которых заданных фактов в списке фактов или некоторых созданных объектов, являющихся экземплярами классов, опреде-
ленных пользователем. Один из наиболее распространенных типов условных выражений в CLIPS – образцы (patterns). Об-
разцы состоят из набора ограничений, которые используются для определения того, удовлетворяет ли некоторый факт или
объект условному элементу. Другими словами, образец задает некоторую маску для фактов или объектов. Процесс сопос-
тавления образцов фактам или объектам называется процессом сопоставления образцов (pattern-matching). CLIPS предостав-
ляет механизм, называемый механизмом логического вывода (inference engine), который автоматически сопоставляет образ-
цы с текущим списком фактов и определенными объектами в поисках правил, которые применимы в данный момент.
      Следствие правила представляется набором некоторых действий, которые необходимо выполнить в случае, если прави-
ло применимо к текущей ситуации. Таким образом, действия, заданные вследствие правила, выполняются по команде меха-
низма логического вывода, если все предпосылки правила удовлетворены. В случае, если в данный момент применимо более
одного правила, механизм логического вывода использует так называемую стратегию разрешения конфликтов (conflict reso-
lution strategy), которая определяет, какое именно правило будет выполнено. После этого CLIPS выполняет действия, опи-
санные вследствие выбранного правила (которые могут оказать влияние на список применимых правил), и приступает к вы-
бору следующего правила. Этот процесс продолжается до тех пор, пока список применимых правил не опустеет.
      Чтобы лучше понять сущность правил в CLIPS, их можно представить в виде оператора IF-THEN, используемого в
процедурных языках программирования, например, таких как Ada или С. Однако условия выражения IF-THEN в процедур-
ных языках вычисляются тогда, когда поток управления программой непосредственно попадает на данное выражение путем
последовательного перебора выражений и операторов, составляющих программу. В CLIPS, в отличии от этого, механизм
логического вывода создает и постоянно модифицирует список правил, условия которых в данный момент удовлетворены.
Эти правила запускаются на выполнение механизмом логического вывода. С этой стороны правила похожи на обработчики
сообщений, присутствующие в таких языках программирования, как, например, Ada или SmallTalk.


     Для добавления новых правил в базу знаний CLIPS предоставляет специальный конструктор defrule. В общем виде син-
таксис данного конструктора можно представить следующим образом:
    (defrule
    <имя-правила>
    [<комментарии>]
    [<определение-свойства-правила>]
    <предпосылки> ; левая часть правила
    =>
    <следствие> ; правая часть правила
    )
      Имя правила должно быть значением типа symbol. В качестве имени правила нельзя использовать зарезервированные
слова CLIPS, которые были перечислены ранее. Определение правила может содержать объявление свойств правила, кото-
рое следует непосредственно после имени правила и комментариев.
      В справочной системе и документации по CLIPS для обозначения предпосылок правила чаще всего используется тер-
мин "LHS of rule", а для обозначения следствия – "RHS of rule", поэтому в дальнейшем мы будем использовать аналогичную
терминологию – левая и правая часть правила.
      Левая часть правила задается набором условных элементов, который обычно состоит из условий, примененных к неко-
торым образцам. Заданный набор образцов используется системой для сопоставления с имеющимися фактами и объектами.
Все условия в левой части правила объединяются с помощью неявного логического оператора and. Правая часть правила
содержит список действий, выполняемых при активизации правила механизмом логического вывода. Для разделения правой
и левой части правил используется символ →. Правило не имеет ограничений на количество условных элементов или дейст-
вий. Единственным ограничением является свободная память вашего компьютера. Действия правила выполняются последо-
вательно, но тогда и только тогда, когда все условные элементы в левой части этого правила удовлетворены.
      Если в левой части правила не указан ни один условный элемент, CLIPS автоматически подставляет условие образец initial-
fact или initial-object.
      После того как в систему добавлены все необходимые правила и приготовлены начальные списки фактов и объектов,
CLIPS готов выполнять правила. В традиционных языках программирования точка входа, точка остановки и последователь-
ность вычислений явно определяются программистом. В CLIPS поток исполнения программы совершенно не требует ясного
определения. Знания (правила) и данные (факты и объекты) разделены, и механизм логического вывода, предоставляемый
CLIPS, применяет данные к знаниям, формируя список применимых правил, после чего последовательно выполняет их. Этот
процесс называется основным циклом выполнения правил (basic cycle of rule execution). Рассмотрим последовательность
действий (шагов), выполняемых системой CLIPS в этом цикле в момент выполнения нашей программы:
      1. Если был достигнут предел выполнения правил или не был установлен текущий фокус, выполнение прерывается. В
противном случае для выполнения выбирается первое правила модуля, на котором был установлен фокус. Если в текущем
плане выполнения нет удовлетворенных правил, то фокус перемещается по стеку фокусов и устанавливается на следующий
модуль в списке. Если стек фокусов пуст, выполнение прекращается. Иначе шаг 1 выполняется еще один раз.
      2. Выполнение действий, описанных в правой части выбранного правила. Использование функции return может менять
положение фокуса в стеке фокусов. Число запусков данного правила увеличивается на единицу для определения предела
выполнения правила.
      3. В результате выполнения шага 2 некоторые правила могут быть активированы или дезактивированы. Активирован-
ные правила (т.е. правила, условия которых удовлетворяются в данный момент) помещаются в план решения задачи модуля,
в котором они определены. Размещение в плане определяется приоритетом правила (salience) и текущей стратегией разре-
шения конфликтов (эти понятия будут описаны ниже). Дезактивированные правила удаляются из текущего плана решения
задачи. Если для правила установлен режим просмотра активаций, то пользователь получит соответствующее информацион-
ное сообщение при каждой активации или дезактивации правила (режим просмотра активаций можно установить с помощью
диалогового окна Watch options. Для этого выберите пункт Watch в меню Execution и установите флажок Activations).
      4. Если установлен режим динамического приоритета (dynamic salience), то для всех правил из текущего плана реше-
ния задачи вычисляются новые значения приоритета. После этого цикл повторяется с шага 1.
      Свойства правил позволяют задавать характеристики правил до описания левой части правила. Для задания свойства
правила используется ключевое слово declare. Однако правило может иметь только одно определение свойства, заданное с
помощью declare.
    <определение-свойства-правила> :: = (declare <свойство-правила>)
    <свойство-правила> :: = (salience <целочисленное выражение> ) | (auto-focus TRUE | FALSE)
     Свойство правила salience позволяет пользователю назначать приоритет для своих правил. Объявляемый приоритет
должен быть выражением, имеющим целочисленное значение из диапазона от –10 000 до +10 000. Выражение, представ-
ляющее приоритет правила, может использовать глобальные переменные и функции. Однако старайтесь не указывать в
этом выражении функций, имеющих побочное действие. В случае, если приоритет правила явно не задан, ему присваива-
ется значение по умолчанию, т.е. 0.
     Значение приоритета может быть вычислено в одном из трех случаев: при добавлении нового правила, при активации
правила и на каждом шаге основного цикла выполнения правил. Два последних варианта называются динамическим приори-
тетом (dynamic salience). По умолчанию значение приоритета вычисляется только во время добавления правила. Для измене-
ния этой установки можно использовать команду set-salience-evaluation.
     Каждый метод вычисления приоритета содержит в себе предыдущий (т.е. если приоритет вычисляется на каждом шаге
основного цикла выполнения правил, то он вычисляется и при активации правила, а также при его добавлении в систему).


      Свойство auto-focus позволяет автоматически выполняться команде focus при каждой активации правила.
      План решения задачи – это список всех правил, имеющих удовлетворенные условия при некотором, текущем состоянии
списка фактов и объектов (которые еще не были выполнены). Каждый модуль имеет свой собственный план решения задачи.
Выполнение плана подобно стеку (верхнее правило плана всегда будет выполнено первым). Когда активируется новое пра-
вило, оно размещается в плане решения задачи, руководствуясь следующими факторами:
      1. Только активированное правило помещается выше всех правил с меньшим приоритетом и ниже всех правил с боль-
шим приоритетом.
      2. Среди правил с одинаковым приоритетом используется текущая стратегия разрешения конфликтов для определения
размещения среди других правил с одинаковым приоритетом.
      3. Если правило активировано вместе с несколькими другими правилами, добавлением или исключением некоторого
факта и с помощью шагов 1 и 2 нельзя определить порядок правила в плане решения задачи, то правило произвольным обра-
зом упорядочивается вместе с другими правилами, которые были активированы. Заметьте, что в этом случае порядок, в ко-
тором правила были добавлены в систему, оказывает произвольный эффект на разрешение конфликта (который в высшей
степени зависит от текущей реализации правил).
      CLIPS поддерживает семь различных стратегий разрешения конфликтов: стратегия глубины (depth strategy), стратегия
ширины (breadth strategy), стратегия упрощения (simplicity strategy), стратегия усложнения (complexity strategy), LEX (LEX
strategy), MEA (MEA strategy) и случайная стратегия (random strategy). По умолчанию в CLIPS установлена стратегия глуби-
ны. Текущая стратегия может быть установлена командой set-strategy (которая переупорядочит текущий план решения зада-
чи, базируясь на новой стратегии).
      • Стратегия глубины. Только что активированное правило помещается выше всех правил с таким же приоритетом. На-
пример, допустим, что факт – А активировал правила 1 и 2 и факт Б активировал правило 3 и правило 4, тогда, если факт А
добавлен перед фактом Б, в плане решения задачи правила 3 и 4 будут располагаться выше, чем правила 1 и 2. Однако пози-
ция правила 1 относительно правила 2 и правила 3 относительно правила 4 будет произвольной.
      • Стратегия ширины. Только что активированное правило помещается ниже всех правил с таким же приоритетом. Например,
допустим, что факт А активировал правила 1 и 2 и факт Б активировал правила 3 и 4, тогда, если факт А добавлен перед фак-
том В, в плане решения задачи правила 1 и 2 будут располагаться выше, чем правила 3 и 4. Однако позиция правила 1 отно-
сительно правила 2 и правила 3 относительно правила 4 будет произвольной.
      • Стратегия упрощения. Между всеми правилами с одинаковым приоритетом только что активированные правила раз-
мещаются выше всех активированных правил с равной или большей определенностью (specificity). Определенность правила
вычисляется по числу сопоставлений, которые нужно сделать в левой части правила. Каждое сопоставление с константой
или заранее связанной с фактом переменной добавляет к определенности единицу. Каждый вызов функции в левой части
правила, являющийся частью условных элементов : , = или test, также добавляет к определенности единицу. Логические
функции and, or и not не увеличивают определенность правила, но их аргументы могут это сделать. Вызовы функций, сде-
ланные внутри функций, не увеличивают определенность правила. Например, следующее правило имеет определенность,
равную 5.
    (defrule example
    (item ?x ?y ?x)
    (test (and (numberp ?x) (> ?x (+ 10 ?y)) (< ?x 100)))
    => )
     Сравнение заранее связанной переменной >x с константой и вызовы функций numberp, < и > добавляют единицу к оп-
ределенности правила. В итоге получаем определенность, равную 5. Вызовы функций and и + не увеличивают определен-
ность правила.
     • Стратегия усложнения. Между правилами с одинаковым приоритетом только что активированные правила размеща-
ются выше всех активированных правил с равной или меньшей определенностью.
     • Стратегия LEX. Между правилами с одинаковым приоритетом только что активированные правила размещаются с
применением одноименной стратегии, впервые использованной в системе OPSS. Для определения места активированного
правила в плане решения задачи используется "новизна" образца, который активировал правило. CLIPS маркирует каждый
факт или объект временным тегом для отображения относительной новизны каждого факта или объекта в системе. Образцы,
ассоциированные с каждой активацией правила, сортируются по убыванию тегов для определения местоположения правила.
Активация правила, выполненная более новыми образцами, располагается перед активацией, осуществленной более поздни-
ми образцами. Для определения порядка размещения двух активаций правил, поодиночке сравниваются отсортированные
временные теги для этих двух активаций, начиная с наибольшего временного тега. Сравнение продолжается до тех пор, пока
не остается одна активация с наибольшим временным тегом. Эта активация размещается выше всех остальных в плане ре-
шения задачи.
     Если активация некоторого правила выполнена большим числом образцов, чем активация другого правила, и все срав-
ниваемые временные теги одинаковы, то активация другого с большим числом временных тегов помещается перед актива-
цией с меньшим. Если две активации имеют одинаковое количество временных тегов и их значения равны, то правило с
большей определенностью помещается перед активацией с меньшей. В отличие от системы OPSS, условный элемент not в
CLIPS имеет псевдовременной тег, который также используется в данной стратегии разрешения конфликтов. Временной тег
условного элемента not всегда меньше, чем временной тег образца.
     В качестве примера рассмотрим следующие шесть активаций правил, приведенные в LEX-порядке (запятая в конце
строки активации означает наличие логического элемента not). Учтите, что временные теги фактов не обязательно равны
индексу, но если индекс факта больше, то больше и его временной тег. Для данного примера примем, что временные теги
равны индексам.


    rule-6: f-1, f-4
    rule-5: f-1, f-2, f-3,
    rule-1: f-1, f-2, f-3
    rule-2: f-3, f-1
    rule-4: f-1, f-2,
    rule-3: f-2, f-1
    Далее показаны те же активации с индексами фактов в том порядке, в котором они сравниваются стратегией LEX.
    rule-6: f-4, f-1
    rule-5: f-3, f-2, f-1,
    rule-1: f-3, f-2, f-1
    rule-2: f-3, f-1
    rule-4: f-2, f-1,
    rule-3: f-2, f-1
     • Стратегия MEA. Между правилами с одинаковым приоритетом только что активированные правила размещаются с
использованием одноименной стратегии, впервые использованной в системе OPSS. Основное отличие стратегии MEA от
LEX в том, что в стратегии MEA не производится сортировка образцов, активировавших правило. Сравниваются только
временные теги первых образцов двух активаций. Активация с большим тегом помещается в план решения задачи перед
активацией с меньшим. Если обе активации имеют одинаковые временные теги, ассоциированные с первым образцом, то для
определения размещения активации в плане решения задачи используется стратегия LEX. Как и в стратегии LEX, условный
элемент not имеет псевдовременной тег.
     В качестве примера рассмотрим следующие шесть активаций, приведенные в MEA-порядке (запятая на конце актива-
ции означает наличие логического элемента not).
    rule-2: f-3, f-1
    rule-3: f-2, f-1
    rule-6: f-1, f-4
    rule-5: f-1, f-2, f-3,
    rule-1: f-1, f-2, f-3
    rule-4: f-1, f-2,
     • Случайная стратегия. Каждой активации назначается случайное число, которое используется для определения место-
положения среди активаций с одинаковым приоритетом. Это случайное число сохраняется при смене стратегий, таким обра-
зом, тот же порядок воспроизводится при следующей установке случайной стратегии (среди активаций в плане решения за-
дачи, когда стратегия заменена на исходную).
     Для описания функций пользователя служит следующий конструктор.
    (deffunction <имя-функции>
    [<комментарии>] <обязательные-параметры>
    [<групповой-параметр>] <действия>)
    <обязательные-параметры> ::= <выражение-простое-поле>
    <групповой-параметр> : := <выражение-составное-поле>
     Синтаксис конструктора deffunction включает в себя 5 элементов:
     − имя функции;
     − необязательные комментарии;
     − список из нуля или более параметров;
     − необязательный символ групповых параметров для указания того, что функция может иметь переменное число аргу-
ментов;
     − последовательность действий или выражений, которые будут выполнены (вычислены) по порядку в момент вызова
функции.
     В зависимости от того, задан ли групповой параметр, функция, созданная конструктором, может принимать точное
число параметров или число параметров не меньшее, чем некоторое заданное. Обязательные параметры определяют мини-
мальное число аргументов, которое должно быть передано функции при ее вызове. В действиях функции можно ссылаться
на каждый из этих параметров как на обычные переменные, содержащие простые значения. Если был задан групповой пара-
метр, то функция может принимать любое количество аргументов большее или равное минимальному числу. Если группо-
вой параметр не задан, то функция может принимать число аргументов точно равное числу обязательных параметров. Все
аргументы функции, которые не соответствуют обязательным параметрам, группируются в одно значение составного поля.
Ссылаться на это значение можно, используя символ группового параметра. Для работы с групповым параметром могут ис-
пользоваться стандартные функции CLIPS, предназначенные для работы с составными полями, такие как length и nth. Опре-
деление функции может содержать только один групповой параметр.
    CLIPS>
    (deffunction print-args (?a ?b $?c)
    (printout t ?a " " ?b " and " (length ?c) " extras: " ?c
    crlf))
    CLIPS> (print-args 1 2)
    1 2 and 0 extras: ()


    CLIPS> (print-args a b c d)
    a b and 2 extras: (c d)
    CLIPS> (print-args a)
    [ARGACCESS4] Function print-args expected at least 2 argument(s)
    CLIPS>
     В данном примере с помощью конструктора deffunction определяется функция print-args, которая принимает два обяза-
тельных параметра: ?а и ?b, и имеет групповой параметр $?с. Функция выводит на экран свои обязательные параметры, а
также число полей в составном параметре и его содержимое.
     При вызове функции интерпретатор CLIPS последовательно выполняет действия в порядке, заданном конструктором.
Функция возвращает значение, равное значению, которое вернуло последнее действие или вычисленное выражение. Если
последнее действие не вернуло никакого результата, то выполняемая функция также не вернет результата (как в приведен-
ном выше примере). Если функция не выполняет никаких действий, то возвращенное значение равно FALSE. В случае воз-
никновения ошибки при выполнении очередного действия выполнение функции будет прервано и возвращенным значением
также будет FALSE.
     Функции могут быть само- и взаимно рекурсивными. Саморекурсивная функция просто вызывает сама себя из списка
своих собственных действий. В качестве примера можно привести функцию, вычисляющую факториал.
    (deffuction factorial (?a)
     (if (or (not (integerp ?a)) (< ?a 0)) then
    (printout t "Factorial error! " crlf)
    else
       (if (= ?a 0) then 1 else
    (* ?a (factorial (- ?a 1))))))
    Взаимная рекурсия между двумя функциями требует предварительного объявления одной из этих функций. Для пред-
варительного объявлении функции в CLIPS используется конструктор deffunction с пустым списком действий. В следующем
примере функция foo предварительно объявлена и таким образом может быть вызвана из функции bar. Окончательная реали-
зация функции foo выполнена конструктором после объявления функции bar.
     (deffunction foo ())
    (deffunction bar () (foo))
    (deffunction foo () (bar))
    Команда ppdeffunction выводит определение заданной функции на экран.
    (ppdeffunction <имя-функции>)
    Команда list-deffunctions предназначена для отображения в диалоговом окне списка имен всех определенных в системе
функций.
    (list-deffunctions)
     Для удаления функций, определенных пользователем с помощью конструкторов deffunction, предназначена команда
undeffunction.
    (undeffunction <имя-функции>)
     В качестве параметра <имя-функции> возможно использование символа *. В этом случае команда попытается удалить
все определенные пользователем функции. Удаление функции закончится неудачей, если выбранная функция в данный мо-
мент используется или выполняется (например, правилом).
     CLIPS поддерживает следующие процедурные функции, реализующие возможности ветвления, организации циклов в
программах и т.п.:
                                 If               – оператор ветвления;
                                 While            – цикл с предусловием;
                                 loop-for-count   – итеративный цикл;
                                 prong            – объединение действий в одной логической команде;
                                 prong$           – выполнение набора действий над каждым элементом
                                                    поля;
                                 return           – прерывание функции, цикла, правила и т.д.;
                                 break            – то же, что и return, но без возвращения параметров;
                                 switch           – оператор множественного ветвления;
                                 bind             – создание и связывание переменных.

     Среди логических функций (возвращающих значения true или false) следует выделить такие группы:
     • функции булевой логики: and, or, not;
     • функции сравнения чисел: =, ≠, >, ≥, <, ≤;
     • предикативные функции для проверки принадлежности проверяемому типу: integerp, floatp, stringp, symbolp, pointerp
(относится ли аргумент к xternal-address), numberp (относится ли аргумент к integer или float), lexemerp (относится ли аргу-



    
Яндекс цитирования Яндекс.Метрика