Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь КАТЕГОРИИ: АрхеологияБиология Генетика География Информатика История Логика Маркетинг Математика Менеджмент Механика Педагогика Религия Социология Технологии Физика Философия Финансы Химия Экология ТОП 10 на сайте Приготовление дезинфицирующих растворов различной концентрацииТехника нижней прямой подачи мяча. Франко-прусская война (причины и последствия) Организация работы процедурного кабинета Смысловое и механическое запоминание, их место и роль в усвоении знаний Коммуникативные барьеры и пути их преодоления Обработка изделий медицинского назначения многократного применения Образцы текста публицистического стиля Четыре типа изменения баланса Задачи с ответами для Всероссийской олимпиады по праву Мы поможем в написании ваших работ! ЗНАЕТЕ ЛИ ВЫ?
Влияние общества на человека
Приготовление дезинфицирующих растворов различной концентрации Практические работы по географии для 6 класса Организация работы процедурного кабинета Изменения в неживой природе осенью Уборка процедурного кабинета Сольфеджио. Все правила по сольфеджио Балочные системы. Определение реакций опор и моментов защемления |
Определение 1.2.2. Представление вещественного числаСтр 1 из 18Следующая ⇒
Тема 1. Знакомство с CLIPS Синтаксис определений В качестве базового синтаксиса для определения конструкций языка используется стандартная БНФ-нотация. Ниже приведены правила, используемые для построения определений. Слово или выражение, заключенное в угловые скобки, называется нетерминальным символом (например, <string>). Нетерминальный символ требует дальнейшего определения. Слова или выражения, не заключенные в угловые скобки, называются терминальными символами, и представляют синтаксис описываемой конструкции языка CLIPS. Терминальные символы (особенно круглые скобки) должны вводиться в командную строку именно так, как показано в определении. Если за нетерминальным символом следует символ *, то это означает, что в данном месте может находиться список из нуля или более элементов этого типа. Если же за нетерминальным символом следует +, то в данном месте может находиться список из одного или более элементов этого типа. Символы * и +, встречающиеся сами по себе (не следующие после нетерминальных символов), являются терминальными. Многоточие, как горизонтальное, так и вертикальное, также используется для отображения списка из одного или более элементов. Элементы, заключенные в квадратные скобки (например, [<комментарии>]), являются необязательными элементами, которые могут входить в определение. Вертикальная черта, разделяющая два или более элемента определения, указывает на то, что в конструкции необходимо использовать один из перечисленных элементов. Символ::= используется для обозначения необходимости замены некоторого нетерминального символа. Например, определение: <lexeme>::= <symbol> I <string> обозначает, что нетерминальный символ <lexeme>, встречающийся в некотором определении, должен быть заменен либо на символ <symbol>, либо на символ <string>. Пробелы, символы табуляции, переходы на другую строку используются только для логического разделения элементов определения и игнорируются CLIPS (кроме строк, заключенных в двойные кавычки).
Основные элементы языка Три основные группы элементов, предназначенных для написания программ: – примитивные типы данных; – функции, использующиеся для обработки данных; – конструкторы, предназначенные для создания таких структур языка, как факты, правила, классы и т. д.
Типы данных CLIPS поддерживает 8 примитивных типов данных: float, integer, symbol, string, external-address, fact-address, instance-name, instance-address. Для хранения численной информации предназначаются типы float и integer, для символической — symbol и string. Число в CLIPS может состоять только из символов цифр (0—9), десятичной точки (.), знака (+ или -) и экспоненциального символа (е) с соответствующим знаком, в случае представления числа в экспоненциальной форме. Ниже приведены примеры допустимых в CLIPS представлений целых и вещественных типов: Пример 1.2.1. Представление чисел в CLIPS Целые: 237 15 +12 -32 Вещественные: 237еЗ 15.09 +12.0 -32.3е-7 Определение целого значения можно представить таким образом: Определение 1.2.1. Представление целого числа <целое> ::= [+ | -] <цифра>+ <цифра> ::= 0 | 1 │ 2 | 3 | 4 │ 5 │ 6 | 7 | 8 | 9 Вещественное значение имеет следующий синтаксис: Замечание Значения типов float и integer являются частным случаем значения типа symbol. Другими словами, они удовлетворяют всем ограничениям, налагаемым на значение типа symbol. Ниже приведены несколько примеров значений типа symbol: Пример 1.2.2. Допустимые значения типа symbol foo Hello B76-HI bad_value 127A 456-93-039 @+=-% 2each Значение типа, string представляет собой строку символов, заключенную в двойные кавычки. Символ двойных кавычек также может быть включен в строку. Для этого перед символом " необходимо поставить символ обратной косой черты (\). Для включения в строку символа обратной косой черты необходимо использовать два последовательных символа \. Примеры допустимых значений string приведены ниже: Пример 1.2.3. Допустимые значения типа string "foo" "a and b" "1 number" "a\”quote" Замечание Значение "abcd" типа string не эквивалентно значению abcd типа symbol. Несмотря на то, что они состоят из идентичных символов, они относятся к разным типам. Место для хранения значения одного из примитивных типов в CLIPS называется полем или простым полем. Константа представляет собой неизменяемое простое поле, заданное последовательностью символов (с помощью констант нельзя задавать значения типов external-address, fact-address и instance-address — значения этих типов могут быть получены только с помощью вызовов соответствующих функций и должны храниться в переменных). Последовательность из 0 или более простых полей образует составное поле. Для вывода составного поля на экран CLIPS группирует данные такого поля с помощью круглых скобок. Несколько примеров составных полей приведено ниже:
Пример 1.2.4. Составные поля (a) (1 bar foo) () (х 3.0 "red" 567) Замечание Составное поле (а) не эквивалентно простому полю а. Составные значения создаются либо вызовом функций, возвращающих составные значения, либо с помощью специального группового аргумента в конструкторах функций, методов или обработчиков сообщений, либо в результате выполнения процесса сопоставления образцов в правилах. Переменной является значение некоторого типа, сохраненное в простом или составном поле и имеющее некоторое имя. Переменные используются В конструкторах CLIPS (в частности в defrule, deffunction, defmethod и defmessage-handier).
Функции Функцией в CLIPS называется часть кода, имеющая имя и возвращающая полезный результат или выполняющая полезные действия (например, отображение информации на экране). В дальнейшем в книге функциями будут называться, как правило, только функции, возвращающие результат. Функции, не возвращающие результат и выполняющие некоторую полезную работу, как правило, называются командами. CLIPS оперирует с несколькими типами функций — определенные пользова телем внешние функции, системные (внутренние) функции, функции, определенные в среде CLIPS с помощью конструктора deffunction, родовые функции. Определенные пользователем внешние функции и системные функции создаются на внешних языках программирования (например, С), и затем подключаются к CLIPS на этапе компилирования или функционирования среды. Системные функции созданы разработчиками среды CLIPS. Конструктор deffunction позволяет пользователям определять новые функции непосредственно в CLIPS. Функции, созданные таким образом, действуют так же, как внешние или системные функции CLIPS, за исключением того, что вместо непосредственного выполнения (как, например, в случае вызова определенной пользователем внешней функции) вызов такой функции обрабатывается встроенным интерпретатором языка CLIPS. Родовые функции определяются с помощью конструкторов defgeneric и defmethod. Родовые функции позволяют выполнять различные действия, в зависимости от набора аргументов, заданных при вызове функции. Таким образом, функция перегружается различными реализациями (подобный механизм перегрузки функций можно встретить, например, в языке C++). Вызов функций в CLIPS имеет префиксную нотацию — аргументы функции всегда следуют после имени функции. При вызове имя функции вместе со всеми аргументами заключается в круглые скобки. Аргументы отделяются друг от друга, по крайней мере, одним пробелом. Аргументами функций могут быть переменные примитивных типов, константы или вызовы других функций. Ниже приведены примеры использования функций + (арифметическое сложение) и * (арифметическое умножение):
Пример 1.3.1. Использование функций + и * (+345) (* 5 6.0 2) (+ 3 (* 8 9) 4) (* 8 (+3 (* 2 3 4) 9) (* 3 4)) Выражением в CLIPS называется неименованный отрезок кода, вызывающий функции с некоторым набором аргументов. Фактически предыдущий пример состоит из четырех выражений.
Тема 2. факты Факты Факты — одна из основных форм представления информации в CLIPS. Факты являются фундаментальным понятием теории экспертных систем и предназначены для использования в правилах системы. Каждый факт представляет фрагмент данных, помещенных в текущий список фактов системы (рабочую память). Факт может быть добавлен в текущий список фактов системы (с помощью команды assert), удален из него (команда retract), изменен (modify) или продублирован (duplicate) пользователем, в процессе интерактивной работы в системе, либо из программы. Количество фактов, которые может содержать список фактов, а также количество информации, содержащейся в каждом факте, ограничено только свободной памятью вашего компьютера. Некоторые команды, такие как retract, modify или duplicate, требуют в качестве параметра некоторого уже существующего факта. После создания (или изменения) факт получает уникальный индекс, называемый индек сом факта (fact-index). Индекс фактов начинаются с 0 и увеличивается на 1 при каждом добавлении или изменении факта. При выполнении команды reset или clear текущий индекс фактов обнуляется. Для определения конкретного факта с помощью типа fact-address необходимо получить соответствующее значение от функции, возвращающей значение данного типа (например, assert, modify или duplicate), или некоторого правила. Для удобства отображения фактов в CLIPS используется понятие идентифи катора факта. Идентификатор факта состоит из символа f, следующего за ним знака - и индекса факта. Например, идентификатор f-10 ссылается на факт с индексом 10. Для хранения фактов используется один из двух следующих форматов: упорядоченные факты и неупорядоченные факты или шаблоны. Упорядоченные факты Упорядоченный факт состоит из значения типа symbol и следующей за ним последовательности из нуля или более значений типа symbol. Факт заключается в круглые скобки, а значения в последовательности отделяются друг от друга пробелами. Первое поле упорядоченного факта определяет так называемое отношение, или связь факта. Например, факт (father-of jack bill) показывает, что отцом Джека является Билл. Ниже приведено несколько примеров упорядоченных фактов:
Пример 2.1.1. Упорядоченные факты (the pump is on) (altitude is 10000 feet) (grocery-list bread milk eggs) Поля в упорядоченном факте могут хранить данные любого примитивного типа CLIPS, за исключением первого поля, тип которого должен быть symbol. Следующие слова зарезервированы и не могут быть использованы в качестве первого поля: test, and, or, not, declare, logical, object, exist и forall. Неупорядоченные факты Так как упорядоченный факт хранит информацию, используя строго заданные позиции данных, то для доступа к необходимой информации пользователь должен знать не только какие данные сохранены в факте, но и какое поле содержит эти данные. Неупорядоченные факты (или шаблоны) предоставляют пользователю возможность задавать абстрактную структуру факта путем назначения имени каждому полю. Для создания шаблонов, которые впоследствии будут применяться для доступа к полям факта по имени, используется конструктор deftemplate. Конструктор deftemplate, по сути, аналогичен определениям записей или структур в таких языках программирования, как Pascal или С. Конструктор deftemplate задает имя шаблона и определяет последовательность из нуля или более полей неупорядоченного факта, называемых сло тами. Слот состоит из имени, заданного значением типа symbol, и следующим за ним списка полей. Как и факт, слот с обеих сторон ограничивается круглыми скобками. В отличие от упорядоченных фактов слот неупорядоченного факта может жестко определять тип своих значений. Кроме того, слоту могут быть заданы значения по умолчанию. Замечание Слоты не могут быть использованы в упорядоченных фактах, а в неупорядоченных файлах, в свою очередь, нельзя ссылаться на данные, используя порядок слотов. CLIPS отличает неупорядоченные факты от упорядоченных по первому полю факта. Первое поле фактов любого типа должно быть значением типа symbol. Если это значение соответствует имени некоторого шаблона, то факт является неупорядоченным. Как и упорядоченные факты, неупорядоченные ограничиваются скобками. Пример 2.1.2. Неупорядоченные факты (client (name "Joe Brown") (id X9345A)) (point-mass (x-velocity 100) (y-velocity -200)) (class (teacher "Martha Jones") (#-students 30) (Room "37A")) (grocery-list (#-of-items 3) (items bread milk eggs)) Замечание Порядок слотов в неупорядоченном факте не важен. Например, все приведенные ниже факты считаются идентичными: (class (teacher "Martha Jones") (#-students 30) (Room "37A")) (class (#-students 30) (teacher "Martha Jones") (Room "37A")) (class (Room "37A") (#-students 30) (teacher "Martha Jones")) В отличие от фактов, приведенных выше, упорядоченные факты из следующего примера не являются идентичными: (class "Martha Jones" 30 "37А") (class 30 "Martha Jones" "37A") (class "37A" 30 "Martha Jones") Очевидными преимуществами применения шаблонов являются более высокая читабельность и независимость слотов от порядка их определения. Так же как и упорядоченные факты, шаблоны можно добавлять в список фактов и удалять из него. Кроме того, существует возможность модификации и дублирования шаблонов.
Инициализация фактов Конструктор deffacts позволяет создавать набор фактов, инициализирующий базу знаний CLIPS, при каждой очистке системы. При выполнении команды reset текущий список фактов CLIPS очищается, а затем в него добавляются все факты, заданные конструкторами deffacts. CLIPS содержит один предопределенный системный конструктор deffacts, который выполняет добавление в систему факта initial-fact.
Работа с фактами Конструктор deftemplate Для создания неупорядоченных фактов в CLIPS предусмотрен специальный конструктор deftemplate. Его использование приводит к появлению в текущей базе знаний системы информации о шаблоне факта, с помощью которого в систему в дальнейшем можно будет добавлять факты, соответствующие данному шаблону. Таким образом, конструктор deftemplate аналогичен операторам record и struct таких процедурных языков программирования как Pascal или С. Пример 2.2.1. Применение конструктора deftemplate (deftemplate MyObject (slot name) (slot location) (slot weight) (multislot contents)) Рис. 2.2.1. Использование конструктораdeftemplate Подобная реакция среды говорит об удачном добавлении определения шаблона в систему. Переопределение уже существующего шаблона приводит к исключению предыдущего определения. Шаблон не может быть переопределен до тех пор, пока он используется (например, фактом или правилом). Шаблон может иметь любое количество простых или составных слотов. CLIPS отличает простые и составные слоты в шаблоне. Например, будет ошибкой сохранять значение составного слота в простой слот. Пример 2.2.2. Применение конструктора deftemplate (deftemplate MyObject "Template for storage name and location" ; Slots for storage name and location (slot name);slot for name of object (slot location); slot for location of object Комментарии " Template for storage name and location " сохранены в памяти системы и отображаются вместе с определением шаблона.
Рис. 2.2.2. Использование комментариев в конструкторе deftemplate Помимо ключевого слова slot, определяющего простой слот, допустимо также применение ключевого слова multisiot, для определения составного слота. Простой слот, или слот, предназначен для хранения единицы информации одного из примитивных типов данных CLIPS. Составной слот способен хранить список подобных единиц информации неограниченного объема. Для доступа к конкретным данным, хранящимся в составном слоте, используются специальные групповые символы и функции, примеры и правила использования которых будут приведены ниже. При создании шаблона с помощью конструктора deftemplate каждому полю можно назначать определенные атрибуты, задающие значения по умолчанию или ограничения на значение слота. Рассмотрим эти атрибуты подробней. <Атрибут-значение-по-умолчанию> определяет значение, которое будет использовано в случае, если при создании факта не задано конкретное значение слота. В CLIPS существует два способа определения значения по умолчанию, поэтому в конструкторе deftemplate предусмотрено два различных атрибута, задающих значения по умолчанию: default и default-dynamic. Атрибут default определяет статическое значение по умолчанию. С его помощью задается выражение, которое вычисляется один раз при конструировании шаблона. Результат вычислений сохраняется вместе с шаблоном. Этот результат присваивается соответствующему слоту в момент объявления нового факта. В случае если в качестве значения по умолчанию используется ключевое слово?derive, то это значение будет извлекаться из ограничений, заданных для данного слота. По умолчанию для всех слотов установлен атрибут default?DERIVE. В случае если в место выражения для значения по умолчанию используется ключевое слово?none, то значение поля обязательно должно быть явно задано в момент выполнения операции добавления факта. Добавление факта без определения значений полей с атрибутом default?none вызовет ошибку. Атрибут default-dynamic предназначен для установки динамического значения по умолчанию. Этот атрибут определяет выражение, которое вычисляется всякий раз при добавлении факта по данному шаблону. Результат вычислений присваивается соответствующему слоту. Простой слот может иметь только одно значение по умолчанию. У составного слота может быть определено любое количество значений по умолчанию (количество значений по умолчанию должно соответствовать количеству данных, сохраняемых в составном слоте). Ниже приведен пример использования атрибута, устанавливающего значение по умолчанию: Пример 2.2.3. Использование атрибутов значения по умолчанию (deftemplate foo (slot w (default?NONE)) (slot x (default?DERIVE)) (slot у (default (gensym*))) (slot z (default-dynamic (gensym*)))) Статическая проверка выполняется во время использования определения шаблона некоторой командой или конструктором. Например, для записи значений в слоты шаблона. Иначе говоря, статическая проверка выполняется до запуска программы. При несоответствии используемых значений с установленными ограничениями пользователю выводится соответствующее предупреждение об ошибке. Ссылка на индекс факта в командах на изменение значения факта или его дублирование не связывает факт с соответствующим шаблоном явно. Это делает статическую проверку неоднозначной. Поэтому в командах, использующих индекс факта, статическая проверка не выполняется. Помимо статической, CLIPS также поддерживает динамическую проверку ограничений. Если режим динамической проверки ограничений включен, го все новые факты, созданные с использованием некоторого шаблона и имеющие определенные значения, проверяются в момент их добавления в список фактов. Конструктор deffacts Помимо конструктора deftemplates, CLIPS предоставляет конструктор deffacts, также предназначенный для работы с фактами. Данный конструктор позволяет определять список фактов, которые будут автоматически добавляться всякий раз после выполнения команды reset, очищающей текущий список фактов. Факты, добавленные с помощью конструктора deffacts, могут использоваться и удаляться так же, как и любые другие факты, добавленные в базу знаний пользователем или программой, с помощью команды assert. Пример 2.2.4. Использование конструктора deffacts (deffacts startup "Refrigerator Status" (refrigerator light on) (refrigerator door open) (refrigerator temp (+ 5 10 15)) Третий факт содержит выражение, в данном примере сумму трех констант, но в качестве выражения, инициализирующего значение факта, могут использоваться и более сложные выражения, например, вызовы функций CLIPS или функций, определенных пользователем.] Рис. 1.2.3. Просмотр процесса добавления файлов
Функция assert Функция assert позволяет добавлять факты в список фактов текущей базы знаний. Каждым вызовом этой функции можно добавить произвольное число фактов. Пример 2.2.5. Использование функции assert (clear) (assert (color red)) (assert (color blue) (value (+ 3 4))) (deftemplate status (slot temp) (slot pressure (default low))) (assert (status (temp high))) Команда clear очищает текущий список фактов (а также все определенные конструкторы, которые уже были и еще будет рассмотрены ниже). В отличие от reset, команда clear не добавляет в список фактов initial-fact. Рис. 2.2.4. Добавление фактов При инициализации факта value использовалось выражение, а слот pressure неупорядоченного факта status получил значение по умолчанию low. По умолчанию CLIPS не позволяет добавлять в список фактов два одинаковых факта. Например, попытка добавить два факта color red приведет к ошибке и функция assert вернет значение false. Функция retract Для удаления фактов из текущего списка фактов в системе CLIPS предусмотрена функция retract. Каждым вызовом этой функции можно удалить произвольное число фактов. Удаление некоторого факта может стать причиной удаления других фактов, которые логически связаны с удаляемым. Пример 2.2.6. Добавление фактов (assert (а) (b) (с) (d) (e) (f)) Пример 2.2.7. Удаление фактов (retract 0 (+ 0 2) (+022)) Эта команда удалит все факты с четными индексами, используя индекс факта непосредственно (первый аргумент) и выражение, которое вычисляет индекс факта (второй и третий аргумент). Рис. 2.2.5. Результат добавления и удаления фактов В случае, если факт с указанным индексом не будет найден, CLIPS выдаст соответствующее сообщение об ошибке. Выполните команду: Пример 2.2.8. Удаление всех фактов (retract *) После выполнения данной команды список фактов будет очищен полностью. Необходимо заметить, что функция retract не оказывает никакого воздействия на индекс следующих добавленных фактов, т. е. этот индекс не обнуляется. Если после удаления всех введенных фактов добавить в систему какой-нибудь факт, то он получит индекс f-б, несмотря на то, что список фактов в данный момент пуст. Функция modify Используя функции assert и retract, можно выполнять большинство необходимых для функционирования правил действий. В том числе и изменения существующего факта. Например, если в список фактов ранее был добавлен факт (temperature is low), который получил индекс 0, то изменить его значение можно, например, следующим образом: Пример 2.2.9. Изменение существующего факта (clear) (assert (temperature is low)) (retract 0) (assert (temperature is high)) Для изменения упорядоченных фактов доступен только этот способ. Для упрощения операции изменения неупорядоченных фактов CLIPS предоставляет функцию modify, которая позволяет изменять значения слотов таких фактов. Modify просто упрощает процесс изменения факта, но ее внутренняя реализация эквивалентна вызовам пар функций retract и assert. За один вызов modify позволяет изменять только один факт. В случае удачного выполнения функция возвращает новый индекс модифицированного факта. Если в процессе выполнения произошла какая-либо ошибка, то пользователю выводится соответствующее предупреждение и функция возвращает значение FALSE. Пример 2.2.10. Изменение существующего неупорядоченного факта (deftemplate temperature (slot value)) (assert (temperature (value low))) (modify 0 (value high)) Рис. 2.2.6. Результат изменения существующего неупорядоченного факта Обратите внимание на движение фактов в базе знаний CLIPS при выполнении функции modify — сначала удаляется старый факт с индексом f-o, a затем добавляется новый факт с индексом f-1, идентичный предыдущему, но с новым значением заданного слота. Если в шаблоне заданного факта отсутствует слот, значение которого требуется изменить, CLIPS выведет соответствующее сообщение об ошибке. Если заданный факт отсутствует в списке фактов, пользователь также получит соответствующее предупреждение. Функция duplicate Помимо функции modify, в CLIPS существует еще одна очень полезная функция, упрощающая работу с фактами, — функция duplicate. Эта функция создает новый неупорядоченный факт заданного шаблона и копирует в него определенную пользователем группу полей уже существующего факта того же шаблона. По действиям, которые выполняет функция duplicate, аналогична modify, за исключением того, что она не удаляет старый факт из списка фактов. Одним вызовом функции duplicate можно создать одну копию некоторого заданного факта. Как и функция modify, duplicate, в случае удачного выполнения, возвращает индекс нового факта, а в случае неудачи — значение false. Пример 2.2.11. Создание копии существующего неупорядоченного факта (deftemplate car (slot name) (slot producer) (slot type) (slot max-speed)) (assert (car (name scorpio) (producer ford) (type sedan) (max-speed 180))) (duplicate 0 (type off-road) (max-speed 130)) В приведенном примере определяется шаблон, описывающий свойства автомобиля, и добавляется факт — автомобиль Ford Scorpio с типом кузова седан и максимальной скоростью 180 (км/ч). После этого с помощью функции duplicate добавляется факт с информацией об еще одном автомобиле с похожими характеристиками — это внедорожник Ford Scorpio с максимальной скоростью 130 (км/ч). Duplicate просто облегчает нам жизнь, избавляя от излишнего ввода значений данных совпадающих слотов. В случае, если добавляемый с помощью duplicate факт уже присутствует в списке фактов, будет выдана соответствующая информация об ошибке и возвращено значение false. Факт при этом добавлен не будет.
ГЛАВА 6. Правила.
CLIPS поддерживает эвристическую и процедурную парадигму представления знаний. Для представления знаний в процедурной парадигме CLIPS предоставляет такие механизмы, как глобальные переменные, функции и родовые функции, речь о которых пойдет в гл. 7, 8 и 10 соответственно. В этой главе мы рассмотрим такой способ представления знаний, как правила. Правила в CLIPS служат для представления эвристик или так называемых "эмпирических правил", которые определяют набор действий, выполняемых при возникновении некоторой ситуации. Разработчик экспертной системы определяет набор правил, которые вместе работают над решением некоторой задачи. Правила состоят из предпосылок и бедствия. Предпосылки называются также ЕСЛИ-частъю правила, левой частью правила или LHS правила (left-hand side of rule). Следствие называется ТО-частью правила, правой частью правила или RHS правила (right-hand side of rule). Предпосылки правила представляют собой набор условий (или условных элементов), которые должны удовлетвориться, для того чтобы правило выполнилось. Предпосылки правил удовлетворяются в зависимости от наличия или отсутствия некоторых заданных фактов в списке фактов (о котором было рассказано в предыдущей главе) или некоторых созданных объектов, являющихся экземплярами классов, определенных пользователем (о которых будет рассказано в гл. 11). Один из наиболее распространенных типов условных выражений в CLIPS — образцы (patterns). Образцы состоят из набора ограничений, которые используются для определения того, удовлетворяет ли некоторый факт или объект условному элементу. Другими словами, образец задает некоторую маску для фактов или объектов. Процесс сопоставления образцов фактам или объектам называется процессом сопоставления образцов (pattern-matching). CLIPS предоставляет механизм, называемый ме ханизмом логического вывода (inference engine), который автоматически сопоставляет образцы с текущим списком фактов и определенными объектами в поисках правил, которые применимы в данный момент. Следствие правила представляется набором некоторых действий, которые необходимо выполнить, в случае если правило применимо к текущей ситуации. Таким образом, действия, заданные вследствие правила, выполняются по команде механизма логического вывода, если все предпосылки правила удовлетворены. В случае если в данный момент применимо более одного правила, механизм логического вывода использует так называемую страте гию разрешения конфликтов (conflict resolution strategy), которая определяет, какое именно правило будет выполнено. После этого CLIPS выполняет действия, описанные вследствие выбранного правила (которые могут оказать влияние на список применимых правил), и приступает к выбору следующего правила. Этот процесс продолжается до тех пор, пока список применимых правил не опустеет. Чтобы лучше понять сущность правил в CLIPS, их можно представить в виде оператора if-then, используемого в процедурных языках программирования, например, таких как Ada или С. Однако условия выражения if-then в процедурных языках вычисляются только тогда, когда поток управления программы непосредственно попадает на данное выражение путем последовательного перебора выражений и операторов, составляющих программу. В CLIPS, в отличие от этого, механизм логического вывода создает и постоянно модифицирует список правил, условия которых в данный момент удовлетворены. Эти правила запускаются на выполнение механизмом логического вывода. С этой стороны правила похожи на обработчики сообщений, присутствующие в таких языках программирования, как, например, Ada или Smalltalk. Без правил не обойдется ни одна экспертная система, так что правила и язык их представления в экспертной системе можно смело назвать самой важной частью любой экспертной оболочки. Успех экспертной системы во многом определяется тем, насколько удачен способ представления знаний в виде правил, и насколько хорошо им владеет разработчик экспертной системы. Вся данная глава посвящена правилам, их синтаксису и способам построения, их функционированию и назначению, а также приемам их применения. 6.1. Создание правил. Конструктор defrule Для добавления новых правил в базу знаний CLIPS предоставляет специальный конструктор defrule. В общем виде синтаксис данного конструктора можно представить следующим образом: Свойства правил Для более полного понимания материала, изложенного далее в этой главе, необходимо разобраться с таким понятием, как свойства правил. Свойства правил позволяют задавать характеристики правил до описания левой части правила, как было в разд. 6.1. Для задания свойства правила используется ключевое слово declare. Одно правило может иметь только одно определение свойства, заданное с помощью declare. Замечание Каждый метод вычисления приоритета содержит в себе предыдущий (т. е. если приоритет вычисляется на каждом шаге основного цикла выполнения правил, то он также вычисляется и при активации правила, а так же при его добавлении в систему). 6.3.2. Свойство auto - focus Свойство auto-focus позволяет автоматически выполняться команде focus (о которой будет рассказано в гл. 12) при каждой активации правила. Если свойство auto-focus установлено в значение true, то команда focus в модуле, в котором определено данное правило, автоматически выполняется всякий раз при активации правила. Если свойству auto-focus присвоено значение false, то при активации правила не происходит никаких действий. По умолчанию это свойство установлено в false. Стратегия глубины Только что активированное правило помещается выше всех правил с таким же приоритетом. Например, допустим, что факт-А активировал правило-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. Пример 6.2. Вычисление определенности правила (defrule example (item?х?у?х) (test (and (numberp?x) (>?х (+ 10?у)) (<?х 100))) =>) И сравнение заранее связанной переменной?х с константой, и вызовы функций numberp, < и > добавляют единицу к определенности правила. В итоге получаем определенность, равную 5. Вызовы функций and и + не увеличивают определенность правила. Стратегия усложнения Между правилами с одинаковым приоритетом, только что активированные правила размещаются выше всех активированных правил с равной или меньшей определенностью. Стратегия LEX Между правилами с одинаковым приоритетом только что активированные правила размещаются с использованием одноименной стратегии, впервые использованной в системе OPS5. Для определения места активированного правила в плане решения задачи используется "новизна" образца, который активировал правило. CLIPS маркирует каждый факт или объект временным тегом для отображения относительной новизны каждого факта или объекта в системе. Образцы, ассоциированные с каждой активацией правила, сортируются по убыванию тегов для определения местоположения правила. Активация правила, выполненная более новыми образцами, располагается перед активацией, осуществленной более поздними образцами. Для определения порядка размещения двух активаций правил, поодиночке сравниваются отсортированные временные теги для этих двух активаций, начиная с наибольшего временного тега. Сравнение продолжается до тех пор, пока не останется одна активация с наибольшим временным тегом. Эта активация размещается выше всех остальных в плане решения задачи. Если активация некоторого правила выполнена большим числом образцов, чем активация другого правила и все сравниваемые временные теги одинаковы, то активация с большим числом временных тегов помещает перед активацией с меньшим. Если две активации имеют одинаковое количество временных тегов и их значения равны, то правило с большей определенностью (см. разд. 6.4.3) помещается перед активацией с меньшей. В отличие от системы OPS5, условный элемент not в CLIPS имеет псевдовременной тег, который также используется в данной стратегии разрешения конфликтов. Временной тег условного элемента not всегда меньше, чем временной тег образца. В качестве примера рассмотрим следующие шесть активаций правил, приведенные в LEX-порядке (запятая в конце строки активации означает наличие логического элемента not). Учтите, что временные теги фактов не обязательно равны индексу, но если индекс факта больше, то больше
|
|||||||||
Последнее изменение этой страницы: 2021-03-10; просмотров: 105; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.21.93.168 (0.163 с.) |