Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Еремеев А.П., Чибизова Н.В. Методическое пособие по курсу «Экспертные системы».doc
Скачиваний:
117
Добавлен:
02.05.2014
Размер:
1.32 Mб
Скачать
      1. Правила и функции

Один из первичных методов представления знаний в CLIPS – правило. Правила определяют набор действий, которые будут выполнены для данной ситуации. Разработчик ЭС определяет набор правил, которые в совокупности используются для решения проблемы. Правило состоит из предусловия и следствия.

Предусловие правила – это левая сторона (LHS) правила. Предусловие правила – набор условий (состояний или условных элементов), которые должны выполниться для того, чтобы правило можно было активизировать.

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

CLIPS также поддерживает процедурную парадигму для представления знаний, как и обычный язык C. Deffunctions и универсальные функции позволяют пользователю определять новые выполняемые элементы CLIPS. Эти новые функции могут вызываться точно так же, как встроенные функции CLIPS. Обработчики сообщений позволяют пользователю определить поведение объектов, задавая их ответ на сообщения. Deffunctions, универсальные функции и обработчики сообщения – это процедурные части, код которых определяется пользователем.

Правила

В языке CLIPS правила имеют следующий формат:

(defrule <имя правила>

<необязательный комментарий>

<необязательное объявление>

<предпосылка 1>

...

<предпосылка m>

=>

<действие 1>

...

<действие n>)

Например:

(defrule chores

«Things to do on Sunday»

(salience 10)

(today is Sunday)

(weather is warm)

=>

(assert (wash car))

(assert (chop wood))

Chores — произвольно выбранное имя правила, предпосылками в условной части правила являются: (today is Sunday) и (weather is warm). Предпосылки сопоставляются интерпретатором с базой фактов и действия, перечисленные в выполняемой части правила (она начинается после пары символов =>) вставят в базу два факта (wash car) и (chop wood) в случае, если правило будет активизировано.

«Things to do on Sunday» – комментарий, который поясняет для чего это правило нужно.

(salience 10) – указывает на степень важности правила. Пусть, например, в программе имеется другое правило с параметром (salience 100), тогда при прочих равных оно имеет наибольшее предпочтение. Параметру salience может быть присвоено любое целочисленное значение в диапазоне [-10000, 10000]. Если параметр salience в определении правила опущен, ему по умолчанию присваивается значение 0.

Переопределение существующего defrule удаляет предыдущий defrule с тем же самым именем, даже если новое определение содержит ошибки.

Обычно в определении правила присутствуют и переменные. Если, например, правило:

(defrule pick-a-chore

«Allocating chores to days»

(today is ?day)

(chore is ?job)

=>

(assert (do ?job on ?day))

будет сопоставлено с фактами (today is Sunday) и (chore is carwash), то в случае активизации оно включит в базу новый факт (do carwash on Sunday).

С подробностями выполнения процесса сопоставления в интерпретаторе CLIS можно познакомиться в Руководстве пользователя, а здесь только отметим, что выражение (do carwash on Sunday) будет сопоставлено с любым из представленных ниже образцов:

(do ? ? Sunday)

(do ? on ?)

(do ? on ?when)

(do $?)

(do $? Sunday)

(do ?chore $?when)

Необходимо помнить, что префикс $? является признаком сегментной переменной, которая связана с сегментом списка. Например, в приведенном выше примере переменная $? будет связана с (on Sunday).

Если за префиксами ? и $? не следует имя переменной, они рассматриваются, как универсальные символы подстановки, которым соответственно может быть сопоставлен любой элемент или сегмент списка.

Определения функций

В языке CLIPS функции конструируются примерно так же, как в языке LISP. Существенное отличие состоит в том, что переменные должны иметь префикс, как это показано в приведенном ниже определении:

(deffunction hypotenuse (?a ?b) (sqrt ( + (* ?a ?a) (* ?b ?b))))

Формат определения функции в CLIPS следующий:

(deffunction <имя функций (<аргумент> ... <аргумент>)

<выражение>

...

<выражение>)

Функция возвращает результат последнего выражения в списке. Иногда выполнение функции имеет побочные эффекты, как в приведенном ниже примере.

(deffunction init (?day)

(reset)

(assert (today is ?day))

)

В результате после запуска функции на выполнение командой CLIPS> (init Sunday)

будет выполнена команда reset и, следовательно, очищена база фактов, а затем будет включен новый факт (today is Sunday).

Для запуска программы на CLIPS используется команда run.