Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

10545

.pdf
Скачиваний:
1
Добавлен:
25.11.2023
Размер:
6.75 Mб
Скачать

09.04.01-УММ-М.1.2.5-ПИС-ЛК07-Применение оболочки для создания экспертных систем CLIPS 6.31

Факт может описываться индексом или адресом. Всякий раз, когда факт добавляется (изменяется), ему присваивается уникальный целочисленный индекс. Индексы фактов начинаются с нуля и для каждого нового или измененного факта увеличиваются на единицу. Каждый раз после выполнения команд reset и clear выделение индексов начинается с нуля. Команда reset добавляет в список фактов initialfact. Факт также может задаваться при помощи адреса. Адрес факта может быть получен путем сохранения возвращаемого значения команд, которые возвращают в качестве результата адрес факта (таких как assert, modify и duplicate), или путем связывания переменной с адресом факта в левой части правила.

Идентификатор факта - это короткая запись для отображения факта на экране. Она состоит из символа f и записанного через тире индекса факта. Например, запись f-10 служит для обозначения факта с индексом 10. Существует два формата представления фактов:

1.Позиционный.

2.Непозиционный (шаблонный – фреймовый).

Позиционные факты в общем виде представляются:

<позиционный_факт>::=(данные_типа_symbol [поле]*).

Позиционные факты состоят из выражения типа symbol, за которым следует последовательность (возможно пустая) из полей, разделенных пробелом.

Вся запись заключается в скобки.

Первое поле (Symbol) определяет отношение или связь, которая применяется к оставшимся полям.

Примеры:

(altitude is 1000 feet)

(grocery – list bread mink eggs) (schoolboys is Bob Mike)

Следующие символьные выражения зарезервированы и не могут быть использованы как первое поле позиционного факта: test, and, or, not, declare, logical, object, exists, forall.

Для обращения к информации в позиционном факте пользователь должен знать, не только какие данные в нем, но и в каком поле они хранятся.

Непозиционные факты (шаблонные) факты дают возможность пользователю абстрагироваться от структуры факта, задавая имена каждому из полей факта, называемых слотами Для задания шаблона, который затем может использоваться при доступе к полям по именам, используется конструкция deftemplate . Эта конструкция подобна структуре или записи в языках программирования С и Паскаль. Как и факт, слот с обеих сторон ограничивается круглыми скобками.

В общем виде конструктор Deftemplate имеет вид:

(Def template <name> [“комментарий”] <определение слота>*)

< определение слота>::=(slot <имя_слота> [(<тип_поля>) (<значение по умолчанию>)])

<тип поля>::=(type <стандартный тип >) <значение по умолчанию>::=(default <значение>)

Все имена шаблонов и слотов имеют тип symbol. Пример:

09.04.01-УММ-М.1.2.5-ПИС-ЛК07-Применение оболочки для создания экспертных систем CLIPS 6.31

(deftemplate student “student record” (slot name (type string))

(slot age (type integer) (default 18)))

Приведем примеры фактов, созданных по этому шаблону:

(student (name “Fred”)

(student (name “Din”) (age 19))

В первом факте возраст будет задан по умолчанию, равным 18.

Как и все конструкторы CLIPS, конструктор Deftemplate не возвращает никакого значения. Для просмотра всех определенных в текущей базе знаний шаблонов можно воспользоваться командой get-deftemplate-list или специальным инструментом Deftemplate Manager (Менеджер шаблонов). Для запуска менеджера шаблонов воспользуйтесь меню Browse и выберите пункт Deftemplate Manager.

Менеджер шаблонов позволяет в отдельном окне просматривать список всех шаблонов, доступных в текущей базе знаний; выводить в главное окно среды определение выбранного шаблона с помощью команды Pprint; удалять выбранный шаблон с помощью команды Remove.

Система CLIPS различает шаблонные от позиционных фактов по первому полю факта. Первое поле любого факта является значением типа symbol. Если это значение соответствует имени некоторого шаблона, то факт – шаблонный (непозиционный). Порядок слотов в непозиционных слотах значения не имеет.

Примеры:

(client (name “Brown”) (id x9334A))

(point –mass (x-velocity 100) (y-velocity-200))

(class (teacher “Martina Jones”) (#-students 30) (room “37”))

Непозиционные факты удобны для описания стереотипных ситуаций.

3.2 Манипуляция над фактами

Факты могут задаваться с помощью конструктора deffacts, который позволяет определить список из любого количества любых фактов и присвоить ему имя. Список фактов будет автоматически добавляться всякий раз после выполнения команды reset, очищающий текущий список фактов. Кроме того, по этой команде в список фактов заносится исходный факт (initial-fact). Этот факт включается в список фактов всегда с идентификатором f-0.

В общем виде конструктор deffacts имеет вид:

(def facts < имя-набора фактов> [“комментарий”] (факт*))

Имя набора фактов должно быть значением типа symbol.

Можно определить с помощью конструктора deffacts множество исходных или априорных фактов. Факты могут быть позиционные и непозиционные.

Примеры конструктора deffacts:

1.(deffacts walk “Some facts about walking” (status walking)

(sun is shine) (walk-sing walk))

2. (deffacts students

09.04.01-УММ-М.1.2.5-ПИС-ЛК07-Применение оболочки для создания экспертных систем CLIPS 6.31

(student (name “Fred”)) (student (name “Din”) (age 19))

(class is 14B ))

3. (deffacts startup “Refrigerator status” (refrigerator light on)

(refrigerator door open) (refrigerator temp (+5 10 15)))

В первом примере walk

- имя набора фактов, далее следует в кавычках

необязательный комментарий, затем в скобках – отдельные факты.

Набор фактов, определенных конструкцией deffacts можно удалить командой undeffacts: (undeffacts < имя-набора фактов> )

Например, команда (undeffacts walk ) удалит весь набор фактов из примера 1. Проверить работу конструктора deffacts можно воспользовавшись диалогом Watch Options, выбрав пункт Watch меню Execution. В диалогом окне Watch Options

включите режим просмотра изменения списка фактов, поставив галочку в поле Facts. CLIPS предоставляет также визуальный инструмент для манипуляции с определенными в данный момент конструкторами deffacts – Deffacts Manager. Для запуска Deffacts Manager воспользуйтесь меню Browse и выберите пункт Deffacts Manager.

Факты могут добавляться к списку фактов (с помощью команды assert), удаляться из него (с помощью команды retract), изменяться (с помощью команды modify) и дублироваться (с помощью команды duplicate) самим пользователем или программой. Добавить факты в список фактов текущей базы фактов можно также с помощью команды assert. Приведем общий вид команды:

(assert <факт>*) Пример: (assert (cat is gray) (value(+7 8)))

В случае удачного добавления фактов в базу данных, функция возвращает индекс последнего добавленного факта. Если во время добавления произошла ошибка, то команда прекращает свою работу и возвращает значение false. Слотам непозиционных фактов, значения которых не заданы, будут присвоены значения по умолчанию.

Удаление факта выполняется командой refract: (retract <определение-факта>* | *)

<определение-факта>::=<переменная, связанная с адресом с помощью правила>|<индекс факта без префикса f> .

*-удаляются все факты из списка фактов. Примеры: (refract 2) – удаляется факт с индексом 2.

(refract *) – удаляются все факты из базы фактов. (refract 0 (+ 2 2) ) - удаляются факты с индексами 0 и 4.

Непозиционные факты можно изменять с помощью команды modify:

(modify <определение-факта><новое-значение-слота>*)

Аргументом <определение-факта> может быть либо переменная, связанная с адресом с помощью правила, либо индекс факта без префикса f, например, 3 для факта с индексом f-3. После определения факта следует список из одного или более новых значений слотов указанного шаблона.

Пример изменения существующего непозиционного факта:

09.04.01-УММ-М.1.2.5-ПИС-ЛК07-Применение оболочки для создания экспертных систем CLIPS 6.31

(deftemplate temp (slot value)) (assert (temp (value low))) (modify 0 (value high))

Функция duplicate создает новый непозиционный факт заданного шаблона и копирует в него определенную пользователем группу полей уже существующего факта того же шаблона. По действиям, которые выполняет функция duplicate, она аналогична modify, за исключением того, что duplicate не удаляет старый факт из списка фактов. Синтаксис команды duplicate:

(duplicate <определение-факта><новое-значение-слота>*)

Значение аргументов здесь те же самые, что и для команды modify. Пример создания копии существующего непозиционного факта:

(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 км/час.

Наполнение списка фактов в CLIPS довольно кропотливое и длительное занятие, поэтому система предоставляет команды сохранения и загрузки списка фактов в файл – save-facts и load-facts соответственно.

Синтаксис команды save-facts:

(save-facts <имя-файла>[ < границы-видимости > <список шаблонов>]) < границы-видимости >::=visible | local

Команда save-facts сохраняет факты из текущего списка фактов в текстовый файл. На каждый файл отводится одна строчка. Непозиционные факты сохраняются вместе с именами слотов. По умолчанию аргумент <границы-видимости> принимает значение local, т.е. сохраняются факты только из текущего модуля.

Пример использования функции save-facts: (clear)

(deftemplate t (slot a) (slot b))

(assert ( t (a 1) (b 2)))

09.04.01-УММ-М.1.2.5-ПИС-ЛК07-Применение оболочки для создания экспертных систем CLIPS 6.31

(save-facts f1 t)

Синтаксис команды load-facts: ( load-facts <имя-файла>)

4.Правила

4.1Общая структура правила

Одним из основных методов представления знаний в СLIPS являются правила. Правила используются для представления эвристик, определяющих ряд действий, которые необходимо выполнить в определенной ситуации. Разработчик экспертной системы определяет совокупность правил, которые используются для решения проблемы. Правило состоит из двух частей: антицедента (условия), который является аналогом условия в If-then операторе и записывается слева, и консеквента (заключения), который является аналогом then части этого оператора и записывается

справа.

Левая часть правила представляет собой ряд условий (условных элементов-УЕ), которые должны выполняться, чтобы правило было применимо. В СLIPS принято считать, что условие выполняется, если соответствующий ему факт присутствует в списке фактов. Одним из типов условных элементов может быть образец. Образцы состоят из набора ограничений, которые используются для описания того, какие факты удовлетворяют условию, определяемому образцом. Процесс сопоставления фактов и образцов выполняется блоком вывода СLIPS , который автоматически сопоставляет образцы, исходя из текущего состояния списка фактов, и определяет, какие из правил являются применимыми. Если все условия правила выполняются, то оно активируется и помещается в список активированных правил.

Правая часть правила представляет собой совокупность действий, которые должны быть выполнены, если правило применимо. Действия, описанные в применимых правилах, выполняются тогда, когда блок вывода СLIPS получает команду начать выполнение применимых правил. Если существует множество применимых правил, то для того, чтобы выбрать правило, действия которого должны быть выполнены, блок вывода использует стратегию разрешения конфликтов. Действия, описанные в выбранном правиле, выполняются (при этом список применимых правил может измениться), а затем блок вывода выбирает другое правило и т.д. Этот процесс продолжается до тех пор, пока не остается ни одного применимого правила, т.е. пока список активированных правил не окажется пуст.

Во многом правила похожи на операторы типа If-then процедурных языков программирования. Однако условие If-then оператора в процедурном языке проверяется только тогда, когда программа передает ему управление. С правилами ситуация иная. Блок вывода постоянно отслеживает все правила, условия которых выполняются, и, таким образом, правило может быть выполнено в любой момент, как только оно становится применимым. В этом смысле правила подобны обработчикам исключительных ситуаций в процедурных языках.

Для определения правил используется конструктор defrule: (defrule <имя-правила> [“ комментарий"]

[ <определение-свойства-правила>] [<предпосылки>] ; левая часть правила

=>

09.04.01-УММ-М.1.2.5-ПИС-ЛК07-Применение оболочки для создания экспертных систем CLIPS 6.31

<следствие>

; правая часть правила

Имя правила должно

быть значением типа symbol, в качестве имени нельзя

использовать зарезервированные слова.

<определение-свойства-правила>::=(declare <свойство-правила>) <свойтсво-правила>::=(Salience<целочисленное_выражение>)|(auto-focus true |false)

Целочисленное выражение свойства Salience задает приоритет, его значение находится в интервале -10000…10000, свойство влияет на стратегию разрешения конфликта. По умолчанию принимается значение 0. Свойство auto-focus позволяет автоматически выполняться команде focus, передающей управление модулю, из которого извлечено данное правило, при каждой активации правила. Если свойство auto-focus установлено в значение true , то команда focus в модуле, в котором определено данное правило, автоматически выполняется при каждой активации правила, в противном случае никаких действий не производится. По умолчанию принимается значение false.

Пример правила:

(defrule vacation

(work done)

; 1 посылка

(money plenty)

; 2 посылка

(reservations made)

; 3 посылка

=>

; заключение или действие – вывод сообщения.

(printout t “Let’s go!” crlf))

CLIPS предоставляет также

визуальный инструмент для манипуляции с

определенными в данный момент конструкторами defrule Defrule Manager. Для запуска Defrule Manager воспользуйтесь меню Browse и выберите пункт Defrule Manager.

Пример правила системы MYSIN, записанного на языке СLIPS:

(defrule diagnosis

(patient (name Jones) (organism organism-1)) ;если у пациента Джона обнаружен организм-1

(organism

(name organism-1)

(morphology rod) ; и организм-1 имеет форму ;

 

; палочки и

 

 

 

 

(aerobicity

aerobic))

;является

аэробным

(воздушная

среда

; способствует его росту)

 

 

 

 

=>

 

 

; то добавить факт, что с уверенностью ;0.8

(assert (organism (name organism-1)

этот

 

 

 

 

 

(identify enterobacteriaceae)

; микроорганизм относится к классу

 

(confidence 0.8)))

 

; enterobacteriaceae

 

 

4.2 Переменные

Как и в других языках программирования, в СLIPS для хранения значений используются переменные. В отличие от фактов, которые являются статическими, или неизменными, содержание переменной динамично и изменяется по мере того, как изменяется присвоенное ей значение.

09.04.01-УММ-М.1.2.5-ПИС-ЛК07-Применение оболочки для создания экспертных систем CLIPS 6.31

Идентификатор переменной всегда начинается с вопросительного знака, за которым следует ее имя. В общем случае формат переменной выглядит следующим образом: ?<имя-переменной > Примеры переменных:

?х ?sensor ?noun ?соlоr

Имя переменной имеет тип symbol. Перед использованием переменной ей необходимо присвоить значение. Все переменные могут быть локальными или глобальными. Все переменные, кроме глобальных, считаются локальными и могут использоваться только в рамках описания конструктора. К этим локальным переменным можно обращаться внутри описания, но они не определены вне него.

Глобальные переменные определены внутри модуля и задаются с помощью конструктора:

(defglobal [<имя-модуля>] <определениепеременной>* ) <определение-переменной>::= <имя-переменной>=<выражение> <имя_переменной>::=? Значение-типа-symbol

Пример:

(defglobal ?y=5 ?color=red)

К глобальной переменной можно обратиться в любом месте, и ее значение остается независимым от других конструкций. Глобальные переменные CLIPS подобны глобальным переменным в процедурных языках программирования, но они значительно слабее типизированы (на них не налагается ограничения хранения данных только одного типа).

Чаще всего локальные переменные описываются и получают значения в левой части правила. Например:

(defrule make-quack (quack-sound ?sound) =>

(assert (sound is ?sound) ))

Получив значение, переменная сохраняет его неизменным при использовании как в левой, так и в правой части правила, если только это значение не изменяется в правой части при помощи функции bind.

Пример использования функции bind:

(defrule addition (numbers ?х ?у) =>

(assert (answer (+ ?х ?у) ) )

(bind ?answer (+ ?х ?у) )

(printout t "answer is " ?answer crlf) )

Кроме значения самого факта, переменной может быть присвоено значение адреса факта. Это может оказаться удобным при необходимости манипулировать фактами непосредственно из правила. Для такого присвоения используется комбинация "<-". Следующий пример иллюстрирует присвоение переменной значения адреса факта и ее последующее использование:

(defrule get-married ?duck <- (bachelor Dopey)

=> (retract ?duck) )

09.04.01-УММ-М.1.2.5-ПИС-ЛК07-Применение оболочки для создания экспертных систем CLIPS 6.31

Пример правила системы MYSIN, записанного на языке СLIPS с использованием переменных:

(defrule diagnosis

 

;если у пациента ?pat обнаружен

организм

;

?org и этот организм имеет форму

(patient (name ?pat) (organism ?org))

палочки и

 

;является аэробным (воздушная среда

(organism (name ?org) (morphology

rod)

(aerobicity aerobic))

 

; способствует его росту)

=>

(assert (organism (name ?org)

; то добавить факт, что с уверенностью 0.8 этот

(identify enterobacteriaceae)

; микроорганизм ?org относится к классу

(confidence 0.8)))

; enterobacteriaceae

4.3 Условные элементы в левой части правила

Левая часть правила задается набором УЕ, который обычно состоит из условий, примененных к некоторым образцам. Заданный набор образцов используется системой для сопоставления с имеющимися фактами и объектами. Все условия в левой части правила объединяются с помощью неявного логического оператора and. Если левая часть правила пуста, то для его активации необходимо наличие в списке фактов исходного факта (initial-fact). Такие безусловные правила часто используются для того, чтобы инициировать работу программы. Поэтому перед запуском таких программ необходимо произвести сброс состояния среды СLIPS командой (reset). Синтаксис условных элементов:

<условный-элемент>::=<образец-УЕ> | <not-УЕ> | <and-УЕ> | <or-УЕ> | <logical-УЕ > | <testУЕ > | <existsУЕ > | <forallУЕ >

Образец-УЕ как бы определяет маску, которой должны соответствовать данные, и состоит из списка ограничений полей, групповых символов (?, $) и переменных. Условный элемент test имеет следующий синтаксис:

<testУЕ >::=(test <вызов функции>).

Функция проверки условия test представляет собой мощное средство, при помощи которого можно сравнивать числа, переменные и строки в левой части правила. Она записывается точно так же, как и образцы. Правило может выполниться только тогда, когда наряду с совпадением всех образцов, записанных в левой части правила, справедливо и условие, описываемое в test.

Функция test имеет следующий синтаксис:

(test (аргумент-сравнения аргумент-1 аргумент-2)) ,

где аргумент-сравнения - это тот параметр, по которому сравниваются два следующих аргумента. В CLIPS существует ряд предопределенных аргументов сравнения:

Аргумент сравнения

Значение

eq

равно (сравнивает тип и значение)

neq

неравно

=

равно (сравнивает только значение)

09.04.01-УММ-М.1.2.5-ПИС-ЛК07-Применение оболочки для создания экспертных систем CLIPS 6.31

Аргумент сравнения

Значение

<>

неравно

>

больше

>=

больше или равно

<

меньше

<=

меньше или равно

Все аргументы, кроме eq и neq, используются только для сравнения чисел. При интерпретации выражения сравнения считается, что аргумент-1 стоит слева от аргумента-сравнения, а аргумент-2 - справа.

Пример применения функции test:

(defrule example (data ?x) (data ?y)

(test (>= (abs (- ?y ?x)) 3)) => )

Условный элемент not имеет следующий синтаксис:

<not-УЕ>::=(not <УЕ>)

Этот элемент проверяет отсутствие факта в списке фактов. Условный элемент or имеет следующий синтаксис:

<orУЕ>::=(or <УЕ>*)

Пример применения УЕ or:

(defrule system-fault (error-status unknown)

(or (temp high ) (valve broken) (pump off))

=>

(printout t “System has a fault” crlf))

УЕ or позволяет активировать правило любым из условных элементов, объединенных с помощью or.

Синтаксис всех остальных элементов подобный синтаксису УЕ or.

5. Дополнительные средства CLIPS

CLIPS предоставляет ряд дополнительных средств, необходимых при написании программ. Основными из них являются:

ограничения на значения полей;

использование функций в правилах;

использование процедурных знаний. Рассмотрим каждое из этих средств по очереди.

5.1 Ограничения на значения полей

09.04.01-УММ-М.1.2.5-ПИС-ЛК07-Применение оболочки для создания экспертных систем CLIPS 6.31

Использование ограничений на значения полей позволяет ограничить значения, принимаемые образцами в левой части правила.

Рассмотрим три вида ограничений: ~ , | и &.

Ограничение первого типа действует на следующее прямо за ним значение и говорит о том, что поле не может принимать это значение. Например:

(defrule walk (light ~ green)

=>

(printout t " Don’t walk” crlf) )

Ограничение второго типа указывает на то, что поле может принимать одно из следующих значений. Например:

(defrule cautious

(light yellow | blinking-yellow)

=>

(printout t "Be cautious” crlf) )

Ограничение третьего типа используется только вместе с ограничениями первых двух типов и указывает на то, что должны удовлетворяться оба соединяемых при его помощи ограничения. Например:

(defrule cautious

(light ?color & yellow | blinking-yellow)

=>

(printout t "Be cautious because light is” ?color crlf) )

5.2 Использование функций

Функции могут использоваться и в левой, и в правой части правила. Например:

(defrule addition (numbers ?х ?у) =>

(assert (answer (+ ?х ?у) ) ) )

При использовании функции в левой части правила перед ней должен стоять знак " = ", показывающий CLIPS, что следующее выражение необходимо вычислить, а не использовать буквально. Например:

(defrule addition (numbers ?х ?у)

(stock ?ID = (sqrt (+ (** ?x 2) (** ?Y 2)))) =>

(printout t "stock ID = “ ?ID crlf) )

Конструктор deffunction позволяет пользователю создавать свои функции непосредственно в среде CLIPS. Способ вызова функции, определенной пользователем эквивалентен способу вызова внутренних функций CLIPS. Вызов функции осуществляется по имени, за которым следует список необходимых аргументов, отделенных одним или большим числом пробелов. Синтаксис конструктора deffunction:

( deffunction <имя-функции> [“комментарий”] <обязательныепараметры>

[<групповой-параметр>] < действия >)

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]