Определение 1.2.2. Представление вещественного числа 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Определение 1.2.2. Представление вещественного числа



Тема 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 с.)