- •Оглавление
- •Предисловие
- •1. Общие сведения о языке и среде разработки CLIPS
- •1.1. Системы продукций и CLIPS
- •1.2. Основы работы в консоли CLIPSJNI
- •1.3. Основы работы в среде CLIPSWin
- •1.4. Механизмы представления знаний в CLIPS
- •1.5. Пример разработки БЗ и работы с ней в среде CLIPS
- •1.6. Пример использования эвристического механизма представления знаний совместно с процедурным
- •2. Основные конструкции языка CLIPS
- •2.1. Примитивные типы данных языка CLIPS
- •2.2. Особенности вызова функций в языке CLIPS
- •2.3. Факты в языке CLIPS
- •2.3.1. Позиционные факты
- •2.3.2. Непозиционные факты
- •2.4. Операции над фактами
- •2.5. Правила в языке CLIPS
- •2.5.1. Объявление и добавление новых правил
- •2.5.2. Один из подходов к разрешению конфликтов
- •2.6. Групповые символы для простых и составных полей
- •2.7. Переменные в CLIPS
- •2.8. Глобальные переменные
- •2.9. Пользовательские функции
- •3. Примеры построения простых интеллектуальных систем
- •3.1. Разработка простейшей экспертной системы
- •3.2. Пример решения задач на планирование
- •3.2.1. Программа ”Робот и ящик”
- •3.2.2. Запуск и трассировка программы ”Робот и ящик”
- •3.3. Пример использования ООП в CLIPS.
- •Приложение 2. Использование образцов в правилах.
- •Приложение 3. Стратегии разрешения конфликтов
- •Приложение 4. Работа с модулями в CLIPS
- •Литература и Интернет-ресурсы
и load*. Из их сравнения видно, что во втором случае отключается вывод на дисплей результатов трассировки загрузки программного файла.
Из приведенных примеров должны быть понятны те задачи, которые будут возникать у разработчика даже простейших экспертных систем. Первая из них связана с моделированием предметной области. А для этого необходимо иметь представление о языке CLIPS, его возможностях c точки зрения данных и структур, которыми он оперирует, а также используемых им подходов к программированию.
Вторая из задач связана с проектированием пользовательского интерфейса разрабатываемых экспертных систем, так называемых программ-оболочек. Создание таких программ, использующих возможности CLIPS, выходит за рамки рассматриваемого нами материала. Желающие использовать эту возможность CLIPS могут обратиться к
"CLIPS Reference Manual, Volume II, Advanced Programming Guide ".
1.3. Основы работы в среде CLIPSWin
Что касается первой задачи, то на начальном этапе знакомства с CLIPS удобнее использовать одну из его интегрированных сред. Это могут быть либо CLIPS_6.30_Beta_Windows_Application_Installer_R3.msi, либо даже clipswin_executable_6241 или _624. Уровень, излагаемого далее материала позволяет использовать любую из этих версий. После инсталляции и запуска (ver.6.30), а в некоторых релизах и только запуска программы CLIPSWin.exe на выполнения на экране появляется окно оболочки CLIPS, аналогичное тому, что представлено на рис. 1.8.
Рис.1.8. Интегрированная оболочка системы CLIPSWin.
Дочернее окно оболочки Dialog Window представляет собой консоль CLIPS. Например, написав после приглашения (printout t “Hello world” crlf) и нажав Enter, мы заставим CLIPS выполнить функцию вывода на экран текста в кавычках и символов возврата в начальную позицию новой строки. Для создания и редактирования программных файлов в оболочке предусмотрен свой текстовый редактор. Для того чтобы начать писать программу на языке CLIPS нужно создать новый файл путем выбора пункта меню File –> New.
13
Рис.1.9. Создание нового программного файла.
Для того чтобы программный код был загружен в среду выполнения CLIPS достаточно активировать окно редактора и в основном меню выбрать Buffer –> Load Buffer. Если требуется загрузить только часть введенного программного кода, то в этом случае надо выделить только эту часть текста и нажать комбинацию Ctrl-M или выбрать пункт меню Buffer – Load Selection. Следует особо отметить, что сохранение файла при этом не обязательно. После этого можно ввести команды (reset) и (run). Причем возможен ввод этих команд как вручную в консоли Dialog Windows, так и с помощь меню Execution. Проверив работоспособность программного фрагмента или всего программного кода, его можно сохранить в файл с помощью File –> Save As.
При работе с уже существующим программным файлом возможно два подхода. Если нужен предварительный просмотр файла или его изменение, то используют File –> Open и файл помещается в окно редактора, где выполняются необходимые действия, после чего он загружается в буфер (Loading Selection) и запускается на выполнение (рис. 1.10).
Рис.1.10. Открытие, загрузка и выполнение уже существующего файла.
Если имеется работоспособный программный файл, то для его загрузки используют File –> Load, а затем (reset) и (run) в консоли. Еще проще дело
14
обстоит при наличии настроенного командного файла, который загружают, используя опции File –> Load Batch … . Например, при использовании ранее уже созданного командного файла с именем start_pr1.bat программа сразу будет запущена и выдаст на экран результат консультации
Рис.1.11. Открытие, загрузка и выполнение уже существующего файла.
Переходя к более подробному знакомству непосредственно с языком CLIPS, следует отметить, что программы на нем принципиально отличаются от программы на классических языках программирования. Запуск программы на CLIPS фактически означает запуск механизма логического вывода, основанного на имеющих в системе правилах, которые в свою очередь основаны на фактах. В общем случае простейшая программа на CLIPS состоит из набора правил и функций, манипулирующих фактами, о которых речь пойдет немного позже.
1.4. Механизмы представления знаний в CLIPS
Система CLIPS располагает тремя механизмами представления знаний: процедурным, эвристическим и объектно-ориентированным. Основной и отличительной особенностью CLIPS являются конструкторы для создания баз знаний (БЗ), к числу которых относятся:
•defrule – определение правил;
•deffacts – определение фактов;
•deftemplate – определение шаблона факта;
•defglobal – определение глобальных переменных;
•deffunction – определение функций;
•defmodule – определение модулей (совокупности правил);
•defclass – определение классов;
•defintances – определение объектов по шаблону, заданному defclass;
•defmessagehandler – определение сообщений для объектов;
•defgeneric – создание заголовка родовой функции;
•defmethod – определение метода родовой функции.
15
Процедурный механизм позволяет пользователю на основе встроенных в язык функций разрабатывать или конструировать новые функции, которые выполняют некоторые полезные действия или возвращают некоторые значения. В этом смысле CLIPS напоминает С, С++ или Pascal. Для создания пользовательских функций используется конструктор deffunction, который имеет следующий синтаксис:
(deffunction имя_функции
[необязательный комментарий] (список формальных параметров) (действие_1)
. . . . . .
(действие_N))
Например, для вычисления сопротивления на основе закона Ома можно определить функцию om(u,i), которая возвращает целую часть частного от деления переменной u на переменную i:
(deffunction om (?u ?i)
(div ?u ?i))
Обратите внимание, что в CLIPS имя переменной начинается с символа “?”, что для вызова функции, в данном случае встроенной функции деления нацело div, используется префиксная нотация и что вся конструкция представляет собой список, состоящий из четырех полей. Так что у CLIPS ноги растут не только из С (см. расшифровку аббревиатуры), но и из LISP.
Говоря о процедурном подходе надо отметить, что CLIPS поддерживает следующие процедурные функции, реализующие возможности ветвления, организации циклов в программах и т.п.:
if |
оператор ветвления |
while |
цикл с предусловием; |
loop-for-count |
итеративный цикл; |
prong |
объединение действий в одной логической команде; |
return |
прерывание функции, цикла, правила и т.д.: |
break |
то же, что и return, но без возвращения параметров; |
switch |
оператор множественного ветвления; |
bind |
создание и связывание переменных. |
Эвристический механизм представления знаний в CLIPS реализуется при помощи правил в форме
ЕСЛИ условие_1 И ... И условие_n удовлетворяются, ТО
ВЫПОЛНИТЬ действие_1 и ... и действие_n.
Список условий называется левой частью правила (Left-Hand Side или LHS). Список действий называется правой частью правила (Right-Hand Side
16
или RHS). Возможность применения конкретного правила определяется возможностью удовлетворить все условия, сформулированные в его LHS. Удовлетворение или неудача происходит в момент сопоставления условий с так называемыми фактами, которые образуют не что иное, как базу данных. В CLIPS такая база данных может представлять некоторую предметную область, исходное или текущее состояние какой–либо проблемы, может моделировать в пространстве или во времени поведение какой–либо системы или любой сущности, которую можно описать посредством множества записей в виде списков.
Существует несколько способов создания базы данных, одним из которых является использование конструктора deffacts, который имеет следующий синтаксис:
(deffacts имя_базы_данных [необязательный комментарий] (факт_1)
. . . . .
(факт_N))
Каждый факт в базе данных представляет собой запись в виде списка. Список может содержать одно или несколько полей, принимающих либо символьные, либо числовые значения. Список также может быть пустым. Конструкторы не возвращают никаких значений, в отличие от функций, например:
(deftemplate person (slot name)
(slot age) (multislot friends)
)
(deffacts people
(person (name Joe) (age 20) (friends Nick Sue) ) (person (name Nick)(age 23) )
(person (name Sue) (age 22) )
)
Если каждое условие в LHS находит себя среди фактов, то происходит удовлетворение, активизация правила и выполнение всех действий, записанных в его RHS. В противном случае правило не активизируется.
Работа правила очень напоминает условный оператор If–Then, присутствующий во многих процедурных языках программирования. Принципиальная разница в том, что оператор If–Then выполнится в любом случае, когда до него дойдет очередь в программе.
Что касается правила, то интерпретатор CLIPS еще подумает, выполнять правило или нет. Так, при старте программы, содержащей множество фактов и правил, интерпретатор CLIPS запускает машину
17
логического вывода, которая выясняет, какие из правил можно активизировать. Это выполняется циклически, причем каждый цикл состоит из трех шагов:
1.сопоставление фактов и правил;
2.выбор правила, подлежащего активизации;
3.выполнение действий, предписанных правилом.
Таким образом, правила, взаимодействующие с базой данных в виде фактов, вносят в нее функциональность и образуют вместе с ней базу знаний. Для создания правила используется конструктор defrule, который имеет следующий синтаксис:
(defrule имя_правила
[необязательный комментарий] [необязательное объявление] (условие_1)
. . . . . .
(условие_M)
=>
(действие_1)
. . . . . .
(действие_N))
Следует обратить внимание, что LHS отделяется от RHS комбинацией символов “=>” и что количество условий и действий в правиле в общем случае не совпадает.
Наряду с эвристическим и процедурным подходами, средства CLIPS позволяют применять и объектно–ориентированный подход к организации знаний. Для представления данных в CLIPS, кроме фактов, используются также экземпляры (или объекты), которые создаются на основе классов,
определяемых с помощью языка COOL (Clips Object Oriented Language).
Так же как структура фактов создается с использованием конструкции deftemplate, структура экземпляров задается с применением конструктора defclass. COOL поддерживает множественное наследование. Это означает, что некоторый класс может обладать всеми свойствами указанного одного или более суперкласса. Для установления линейного порядка наследования свойств классов при множественном наследовании COOL использует список предшествования классов (class precedence list), построенный с использованием иерархии наследования.
CLIPS также поддерживает возможность динамического связывания, реализуемую с помощью функции send, предназначенной для посылки сообщений объекту. Вызов этой функции осуществляется именно в процессе выполнения программы, таким образом, определение обработчика выполняющегося в тот или иной момент также происходит в процессе выполнения программы. Например, функция send может получать в качестве параметра переменную, которая в разные моменты времени
18
