
- •Основы программирования на языке искусственного интеллекта clips
- •230201 «Информационные системы и технологии» всех форм обучения
- •Введение
- •Основные элементы языка clips
- •Методика выполнения лабораторной работы №1 «Изучение работы Clips на базовых примерах»
- •Методика выполнения лабораторной работы №2 «Разработка демонстрационной экспертной системы»
- •Рекомендуемая литература
Основы программирования на языке искусственного интеллекта clips
МЕТОДИЧЕСКИЕ УКАЗАНИЯ
к выполнению лабораторных работ
по дисциплине «Интеллектуальные информационные системы» для студентов специальности
230201 «Информационные системы и технологии» всех форм обучения
Основы программирования на языке искусственного интеллекта Clips: метод. указания к выполнению лабораторных работ по дисциплине «Интеллектуальные информационные системы»
Рассмотрены основные понятия и необходимые сведения по программированию на языке искусственного интеллекта Clips, а также приведены задания для лабораторных работ, которые позволят получить практические навыки по разработке экспертных систем.
|
|
Введение
Язык искусственного интеллекта CLIPS (C Language Integrated Production System), разработанный в Центре космических исследований в середине 1980-х годов и во многом по своим возможностям сходный с языками, созданными на базе LISP и OPS5. Среда CLIPS предназначена для построения экспертных систем (ЭС). Она поддерживает три основных способа представления знаний:
– продукционные правила для представления эвристических, основанных на опыте знаний;
– функции для представления процедурных знаний;
– объектно-ориентированное программирование.
Основные элементы языка clips
Синтаксис языка CLIPS можно разбить на три основных группы элементов, предназначенных для написания программ:
– типы данных;
– функции, использующиеся для обработки данных;
– конструкторы, предназначенные для создания таких структур языка, как факты, правила, классы и т. д.
Представление базовых типов данных
В CLIPS поддерживаются восемь простейших типов данных:
– integer – целые числа (237, 15, +12, -32);
– float – числа с плавающей запятой (237e3, 15.09, +12.0, -32.3e-7);
– symbol – символьный тип (Любая последовательность символов, начинающаяся с отображаемого ASCII-символа и продолжающаяся до ограничителя. Ограничителем является любой неотображаемый символ (пробел, табуляция, возврат каретки, перевод строки), кавычка, открывающая и закрывающая скобки, амперсанд (&), вертикальная черта (|), знак «меньше» (<) и тильда (~).Точка с запятой (;) является символом начала комментариев и также может быть ограничителем. Значение типа symbol не может начинаться с символа ? или $?, но может содержать эти символы.);
– external-address – внешний адрес (Значение этого типа может быть создано только посредством вызова внешней функции.);
– fact-address – адрес факта (Оперировать с фактом можно, используя его адрес, который представлен значением данного типа.);
– instance-name – имя экземпляра (Данный тип предназначен для хранения значения имени объекта, который представляет собой экземпляр определенного пользователем класса. Для представления имени используется значение типа symbol, окруженное квадратными скобками ([ и ]).);
– instance-address – адрес экземпляра (Данный тип предназначен для хранения значения, представляющего адрес объекта. Значение этого типа может быть получено посредством вызова функции instance-address или в результате выполнения операции сопоставления образцов в правиле).
Функции, использующиеся для обработки данных
Функцией CLIPS называются предопределенные системные действия, обрабатывающие заданный набор аргументов и возвращающие некоторый результат (например, отображение информации на экране).
CLIPS предоставляет довольно большой набор функций среди которых всевозможные логические и математические функции, функции работы со строками и составными величинами, функции ввода/вывода, процедурные функции, функции для работы с методами родовых функций, функции, ориентированные на поддержку объектно-ориентированных возможностей, а также функции для работы с конструкторами deftemplate, deffacts, defrule, defglobal, deffunction, defgeneric, defmethod, defmodule.
Вызов функций в CLIPS имеет префиксную нотацию – аргументы функции всегда следуют после имени функции. При вызове имя функции вместе со всеми аргументами всегда заключается в круглые скобки. Аргументы отделяются друг от друга пробелом. Аргументами функций могут быть переменные примитивных типов, константы или вызовы других функций.
Логические функции, проверяющие отношение первого и остальных элементов: >, >=,<, <=, =, < > (неравно).
Функции булевой логики: and, or и not.
Математические функции: +, -, /, *, div (целочисленное деление), ** (вычисление степени числа), mod (остаток от деления), abs (абсолютное значение), max (максимальное числовое значение), min (минимальное числовое значение), sqrt (вычисление квадратного корня), exp (вычисление экспоненты), round (округление числа), log.
Тригонометрические функции: sin, cos, tan, cot, arctan, acos, atan и т.д.
Ниже приведены примеры использования некоторых функций:
(+ 3 (* 8 9) 4)
(* 8 (+3 (* 2 3 4) 9) (* 3 4))
(and (>= days 0) (< days 5)
Функции, не возвращающие результат и выполняющие некоторую полезную работу называются командами.
Наиболее часто используемыми командами в CLIPS являются:
сlear –предназначена для очистки рабочей памяти системы. Она удаляет все определенные в системе на текущий момент конструкторы и ассоциированные с ними данные.
exit –завершает сеанс работы пользователя с системой и закрывает CLIPS.
reset – предназначена для перезагрузки рабочей памяти системы. Она очищает текущий план решения задачи, удаляет все факты из списка фактов и объекты из списка объектов. Кроме того, она добавляет в систему предопределенный факт initial-fact, предопределенный объект initial-object и все факты, объекты и глобальные переменные, определенные пользователем с помощью конструкторов deffacts, definstances и defglobals.
Представление фактов и работа с ними
Факты являются одной из основных форм представления информации в CLIPS-системах и используются правилами для вывода новых фактов из имеющихся. Все текущие факты в CLIPS помещаются в список фактов (fact-list).
По формату представления в CLIPS выделяют два типа фактов: упорядоченные и неупорядоченные. Упорядоченный факт состоит из заключенной в скобки последовательности одного или более полей, разделенных пробелами. Поля в упорядоченном факте могут быть любыми простейшими типами данных (за исключением первого поля, которое должно быть символьного типа). Следующие слова зарезервированы и не могут быть использованы в качестве первого поля: test, and, or, not, declare, logical, object, exist и forall.
Первое поле упорядоченного факта специфицирует отношение, которое применяется к остальным полям факта. Например:
(высота 100);
(включен насос);
(однокурсники Иванов Петров Сидоров).
Неупорядоченные факты (или шаблоны) предоставляют пользователю возможность задавать абстрактную структуру факта путем назначения имени каждому полю. Неупорядоченные факты представляют собой список взаимосвязанных именованных полей, называемых слотами. Наличие имен полей позволяет осуществлять доступ к полям по именам, в отличие от упорядоченных фактов, где поля специфицируются своим местоположением в факте. Существует два типа слотов: одиночные и мультислоты. Одиночный слот содержит единственное поле, тогда как мультислот может содержать любое число полей. Слот состоит из имени, заданного значением типа symbol, и следующим за ним списка полей. Как и факт, слот с обеих сторон ограничивается круглыми скобками. В отличие от упорядоченных фактов слот неупорядоченного факта может жестко определять тип своих значений. Кроме того, слоту могут быть заданы значения по умолчанию. Очевидными преимуществами применения шаблонов являются более высокая читабельность и независимость слотов от порядка их определения.
CLIPS отличает неупорядоченные факты от упорядоченных по первому полю факта. Первое поле фактов любого типа должно быть значением типа symbol. Если это значение соответствует имени некоторого шаблона, то факт является неупорядоченным.
Для работы с фактами используются следующие команды:
assert – добавляет факт в список фактов;
retract – удаляет факт из списка;
modify – модифицирует список;
duplicate – дублирует факт.
Например команда
(assert (length 150) (width 15) (weight “big”))
добавляет в список фактов три факта, каждый из которых состоит из двух полей.
Эти команды могут использоваться в режиме взаимодействия с пользователем или при выполнении CLIPS-программы. Некоторые команды, такие как retract, modify и duplicate, требуют, чтобы факты были идентифицированы. Для этой цели используется либо индекс факта (fact-index), либо адрес факта (fact-address). Индекс факта – уникальный целочисленный индекс, приписываемый факту всякий раз, когда факт добавляется (или модифицируется). Индекс факты начинаются с нуля и увеличивается на 1 при каждом добавлении или изменении факта. Для удобства отображения фактов в CLIPS используется понятие идентификатора факта. Идентификатор факта (fact identifier) представляет собой краткую нотацию для отображения факта. Он состоит из символа “f”, за которым через тире следует индекс факта. Например, f-10 ссылается на факт с индексом 10. При выполнении команды reset или clear текущий индекс фактов обнуляется.
Конструктор deffacts, также предназначенный для работы с фактами. Данный конструктор позволяет определять список фактов, которые будут автоматически добавляться всякий раз после выполнения команды reset, очищающей текущий список фактов. Факты, добавленные с помощью конструктора deffacts, могут использоваться и удаляться так же, как и любые другие факты, добавленные в базу знаний пользователем или программой, с помощью команды assert.
Синтаксис конструкции deffacts:
(deffacts <имя_группы_фактов> ["<комментарий>"] <факт>),
где:
<имя_группы_фактов> – идентификатор символьного типа;
<комментарий> – необязательное поле комментария;
<факт> – произвольная последовательность фактов, записанных через разделитель.
Пример использования конструкции deffacts:
(deffacts startup "Refrigerator Status"
(refrigerator light on)
(refrigerator door open))
Добавление конструктора deffacts с именем уже существующего конструктора приведет к удалению предыдущего конструктора, даже если новый конструктор содержит ошибки. В среде CLIPS возможно наличие нескольких конструкций deffacts одновременно и любое число фактов в них. Конструктор deffacts позволяет создавать набор фактов, инициализирующий базу знаний CLIPS, при каждой очистке системы. При выполнении команды reset текущий список фактов CLIPS очищается, а затем в него добавляются все факты, заданные конструкторами deffacts. CLIPS содержит один предопределенный системный конструктор deffacts, который выполняет добавление в систему факта initial-fact.
Для создания неупорядоченных фактов в CLIPS предусмотрен специальный конструктор deftemplate. Его использование приводит к появлению в текущей базе знаний системы информации о шаблоне факта, с помощью которого в систему в дальнейшем можно будет добавлять факты, соответствующие данному шаблону.
Синтаксис конструкции deftemplate определен ниже:
(deftemplate <имя шаблона> [“<комментарий>”]
<определение слота-1>
. . .
<определение слота-N>)
Пример шаблона, содержащего три одиночных слота представлен ниже:
(deftemplate object “Шаблон объекта”
(slot name)
(slot location)
(slot weight))
Пример конкретного неупорядоченного факта на основе данного шаблона представлен ниже:
(object
(name table)
(location “room”)
(weight 15))
Так же как и упорядоченные факты, шаблоны можно добавлять в список фактов и удалять из него. Кроме того, существует возможность модификации и дублирования шаблонов.
Правила в CLIPS
Одним из основных методов представления знаний в CLIPS являются правила. Правила используются для представления эвристик, определяющих ряд действий, которые необходимо выполнить в определенной ситуации. Разработчик экспертной системы определяет совокупность правил, которые используются совместно для решения проблемы. Правило состоит из двух частей: антицедента (условия), который является аналогом условия в if-then операторе и записывается слева, и консеквента (действия), который является аналогом then части этого оператора и записывается справа.
Левая часть правила представляет собой ряд условий (условных элементов), которые должны выполняться, чтобы правило было применимо. В CLIPS принято считать, что условие выполняется, если соответствующий ему факт присутствует в списке фактов. Одним из типов условных элементов может быть образец. Образцы состоят из набора ограничений, которые используются для описания того, какие факты удовлетворяют условию, определяемому образцом. Процесс сопоставления фактов и образцов выполняется блоком вывода CLIPS, который автоматически сопоставляет образцы, исходя из текущего состояния списка фактов, и определяет, какие из правил являются применимыми. Если все условия правила выполняются, то оно активируется и помещается в список активированных правил.
Если левая часть правила пуста, то для его активации необходимо наличие в списке фактов исходного факта (initial-fact). Такие безусловные правила часто используются для того, чтобы инициировать работу программы. Поэтому перед запуском таких программ необходимо произвести сброс состояния среды CLIPS.
Правая часть правила представляет собой совокупность действий, которые должны быть выполнены, если правило применимо. Действия, описанные в применимых правилах, выполняются тогда, когда блок вывода CLIPS получает команду начать выполнение применимых правил. Если существует множество применимых правил, то для того, чтобы выбрать правило, действия которого должны быть выполнены, блок вывода использует стратегию разрешения конфликтов. Действия, описанные в выбранном правиле, выполняются (при этом список применимых правил может измениться), а затем блок вывода выбирает другое правило и т.д. Этот процесс продолжается до тех пор, пока не остается ни одного применимого правила, т.е. пока список активированных правил не окажется пуст.
Во многом правила похожи на операторы типа if-then процедурных языков программирования. Однако условие if-then оператора в процедурном языке проверяется только тогда, когда программа передает ему управление. С правилами ситуация иная. Блок вывода постоянно отслеживает все правила, условия которых выполняются, и, таким образом, правило может быть выполнено в любой момент, как только оно становится применимым.
Для задания правил используется конструкция defrule со следующим синтаксисом:
(defrule <имя_правила> ["<комментарий>"] [<определение-свойства правила>]
< условие>
=>
<действие>)
где:
<имя_правила> – идентификатор символьного типа, уникальный для данной группы правил;
<комментарий> – необязательное поле комментария;
<определение-свойства правила > – может содержать объявление свойств правила, которое следует непосредственно после имени правила и комментариев;
< условие > – Левая часть правила (антецедент) задается набором условных элементов, который обычно состоит из условий, примененных к некоторым образцам. Заданный набор образцов используется системой для сопоставления с имеющимися фактами и объектами. Все условия в левой части правила объединяются с помощью неявного логического оператора and;
<действие> – Правая часть правила (консеквент) содержит список действий, выполняемых при активизации правила механизмом логического вывода.
Для разделения правой и левой части правил используется символ =>. Правило не имеет ограничений на количество условных элементов или действий. Если в левой части правила не указан ни один условный элемент, CLIPS автоматически подставляет условие-образец initial-fact или initial-object. Таким образом, правило активизируется всякий раз при появлении в базе знаний факта initial-fact или объекта initial-object. Если в правой части правила не определено ни одно действие, правило может быть активировано и выполнено, но при этом ничего не произойдет.
Пример задания правила:
(defrule R1
(days 2)
(works 100)
=>
(printout t crlf "Свободного времени нет" crlf)
(assert (freetime "no"))).
Данное правило содержит в левой части два условных элемента (упорядоченных факта), а в правой – команду printout вывода сообщения и команду assert добавления нового факта. В команде printout: t – параметр определяющий стандартный режим вывода на экран, crlf –символ возврата курсора и перевода его на новую строку.
При реализации прямого вывода в продукционных базах знаний машина логических выводов сопоставляет левые части (антецеденты) правил с базой данных и помещает правила, антецеденты которых удовлетворяются, в агенду (конфликтное множество). Агенда представляет собой список всех правил, условия которых удовлетворяются, но которые еще не были выполнены.