- •Оглавление
- •Предисловие
- •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
- •Литература и Интернет-ресурсы
1. ОБЩИЕ СВЕДЕНИЯ О ЯЗЫКЕ И СРЕДЕ РАЗРАБОТКИ CLIPS
1.1.Системы продукций и CLIPS
Внастоящее время разработаны десятки моделей представления знаний для различных предметных областей. Наиболее распространенной является продукционная модель, которая основана на правилах и позволяет знания представить конструкциями вида
ЕСЛИ <условие(антецедент)>, ТО <действие(консеквент)>.
Под условием понимается некоторое предложение-образец, по которому осуществляется поиск в базе знаний, а под действием – набор действий, выполняемых при успешном исходе поиска. Внутри консеквента могут также генерироваться и добавляться в базу новые факты, которые были получены в результате вычислений или взаимодействия с пользователем.
Механизм вывода в таких моделях чаще всего использует либо прямую цепочку рассуждений (от данных к поиску цели), либо обратную (от цели для ее подтверждения – к данным). Данные – это исходные факты, которые хранятся в базе фактов, и на основании которых запускается машина вывода или интерпретатор правил, перебирающий правила из продукционной базы знаний. Продукционная модель часто применяется в промышленных экспертных системах, привлекая разработчиков своей наглядностью, высокой модульностью, легкостью внесения дополнений и изменений и простотой механизма логического вывода. Одним из языков построения экспертных систем основанных на продукционной модели представления знаний является среда языка CLIPS.
Прототип языка CLIPS был разработан в 1985 г. в космическом центре NASA. Изначально аббревиатура расшифровывалась как «С Language Integrated Production System» (язык С, интегрированный с продукционными системами). С момента разработки он был неоднократно модернизирован, введены процедурные и объектно-ориентированные парадигмы, введена поддержка модульной структуры программ и многое другое.
На текущий момент CLIPS является мощным инструментом создания экспертных систем, распространяется бесплатно и доступен его исходный код. С домашней страница проекта, которая в Интернет находится по
5
адресу http://sourceforge.net/projects/clipsrules/files/CLIPS/, можно свободно загрузить текущую версию среды разработки. Язык CLIPS и его среда разработки хорошо документированы (рис. 1.1). Суммарный объем технических описаний приближается к тысяче pdf-страниц.
http://sourceforge.net/projects/clipsrules/files/CLIPS/
http://clipsrules.sourceforge.net/OnlineDocs.html
Рис.1.1. Домашняя страница CLIPS и ресурс его документации.
Одной из последних является версия CLIPS 6.30, которая позволяет интегрировать CLIPS с Java. В этом релизе возможности CLIPS Java Native Interface (CLIPSJNI) демонстрируются рядом примеров, которые используют CLIPS совместно со Swing, которая представляет собой библиотеку создания графического интерфейса для программ на языке Java. Swing был разработан компанией Sun Microsystems и содержит ряд графических компонентов (Swing widgets), таких как кнопки, поля ввода, таблицы и т. д
После того, как архив CLIPSJNI будет распакован, проект будет иметь следующую структуру директориев:
CLIPSJNI examples
AnimalDemo resources
AutoDemo resources
SudokuDemo resources
WineDemo resources
java-src CLIPSJNI
library-src
6
Демонстрационные программы могут быть свободно запущены под ОС Windows 7 or Mac OS X. Для этого следует открыть командную строку и, с помощью команд cd, установить в качестве текущего директорий
...CLIPSJNI/examples/<имя папки примера>
Чтобы запустить демонстрационный пример, например Sudoku, следует в командной строке ввести следующую команду:
[Путь]>java -cp .;../../CLIPSJNI.jar -Djava.library.path=../.. SudokuDemo
Для запуска других демонстративных примеров следует перейти в папку этого примера и ввести аналогичную команду, заменив SudokuDemo
на WineDemo AutoDemo или AnimalDemo, соответственно. Если все сделано верно, то на экране появятся окна, аналогичные приведенным на рис. 1.2.
Рис.1.2. Окна демонстрационных примеров CLIPSJNI.
Но видя эти графические окна, но скрытые от пользователя алгоритмы работы, встает вопрос, а где же эти системы продукций о которых шла речь выше. Не торопитесь с выводами, а войдите в любую папку с примерами, и вы там найдете файлы с расширением *.clp. Эти файлы могут быть открыты в любом текстовом редакторе и представляют собой описание задачи на языке CLIPS. Именно эти файлы и обрабатывает ядро CLIPS.
1.2.Основы работы в консоли CLIPSJNI
Врассматриваемом релизе CLIPSJNI доступ к ядру системы CLIPS и его машине вывода можно выполнить только в консольной реализации.
7
Чтобы запустить текстовую консоль CLIPS следует, находясь в базовом директории релиза CLIPSJNI ввести в командной строке Windows команду, которая имеет вид:
java -cp CLIPSJNI.jar CLIPSJNI.Environment
После ее выполнения откроется текстовая консоль CLIPS, где будет указана версия используемого вами продукта и выведена системная подсказка CLIPS>, которая сигнализируют о том, что среда CLIPS успешно загружена и можно вводить любые команды, которые соответствуют синтаксису и семантики CLIPS, и могут быть им интерпретированы. Для того чтобы убедиться в этом можно после системной подсказки ввести
(printout t ”Hello, world” crlf)
и нажать Enter. В ответ на это CLIPS вызывает встроенную функцию printout с ключом t, которая выводит на стандартное устройство вывода (монитор) текст, заключенный в кавычки (рис. 1.3). Набор символов crlf соответствует переводу строки и возврату в начало строки.
Рис.1.3. Результат запуска CLIPS и выполнения функции printout.
Однако вводить в консоли строчку за строчкой процесс довольно нудный, утомительный, да и ошибок при вводе может быть множество. Естественно, что такая мощная среда как CLIPS предоставляет возможность объединять отдельные программные конструкции и структуры в программные файлы. Эти файлы должны в своем имени иметь расширение *.CLP.
Выполним рассмотренный выше пример, но только в его программной реализации. Для этого сформулируем правило: ”Если произошла начальная инициализация, то надо вывести на экран текст 'Hello, world'”. Для записи этого правила в виде программного кода следует:
•открыть любой текстовой редактор,
•используя внешние круглые скобки, определить (defrule) это правило под именем my-first-rule,
•отделить его левую часть от правой части символом =>,
•описать содержание обоих частей правила на языке CLIPS,
•сохранить нижеприведенный код в файле под именем _pr0.clp в рабочей папке диска.
8
(defrule my-first-rule
;левая часть правила - <условие>
(initial-fact) =>
;правая часть правила - <действие>
(printout t crlf "HELLO WORLD!" crlf crlf)
)
Текст после точки с запятой «;» – это комментарий и системой не обрабатывается. Для запуска этой программы в среде CLIPS надо перейти в консоль, выполнить команду (clear) для очистки рабочей памяти системы, команду (load ”имя_загружаемого_файла”) для загрузки программного файла в память системы и команду (run) для запуска программы на выполнение. Все команды следует вводить в круглых скобках. Они в языке CLIPS выполняют роль ограничителей его конструкций. Протокол выполнения команд и результат работы программы представлен на рис. 1.4.
Рис.1.4. Программа и протокол ее загрузки и выполнения.
Рождение языка CLIPS относится к 1984 году, когда в Отделе искусственного интеллекта Центра космических исследований NASA начались работы по созданию компьютерных программ, моделирующих человека-эксперта во время мониторинга и диагностики космических систем и комплексов различного назначения. Особенность CLIPS состоит в том, что он имеет встроенный механизм вывода на продукционной базе знаний. Эту его особенность рассмотрим на небольшом примере. Пусть описание простой предметной области состоит всего из двух предложений:
Программист изучает CLIPS. |
(Programmer studies CLIPS) |
CLIPS используется в ЭС. (CLIPS is used in expert systems)
Но даже человеку, который не знаком ни с CLIPS, ни с экспертными системами, но обладающему простой жизненной практикой и интеллектом становится ясно, что
Программист разрабатывает ЭС.
(Programmer developing an expert system).
9
Этот вывод следует из того, что любой человек понимает, что если ктото (X) изучает что-то (Y), а это что-то (Y) в чем-то (Z) используется, то этот кто-то (X) интересуется этим чем-то (Z) или работает с ним. Изложенные знания можно формализовать в виде продукционного (эвристического) правила
ЕСЛИ |
|
X studies Y |
;(изучает) |
И |
|
Y is used in Z |
;(используется в) |
ТО |
|
X developing an Z |
;(разрабатывает) |
Но если удалось знания о предметной области формализовать в виде системы продукций, то имеется возможность перенести их в базу знаний CLIPS и просить делать заключения уже его механизм вывода. Рассмотренный пример может быть реализован в виде приведенной ниже программы, которую следует сохранить в виде файла _pr1.clp.
;---Program #1---
(deffacts myfacts
(The Programmer studies CLIPS)
(The CLIPS is used in expert system)
)
(defrule my-rule (The ?x studies ?y)
(The ?y is used in $?z) =>
(printout t crlf)
(printout t "My conclusion is: " ?x " developing an " $?z)
(printout t crlf crlf)
)
Однако если эту программу запустить на выполнение, используя ту же последовательность команд, что и ранее, то результат будет нулевой. Это связано с тем, что в данной программе нет правил, которые сработали бы при начальной инициализации. В ней всего одно правило и активизируется оно тогда, когда в рабочей области будет набор фактов, определенных в deffacts, но это возможно только при выполнении команды (reset).
После того, как будут выполнены команды (clear), (load), (reset) и (run), CLIPS на основе имеющихся фактов делает заключение, что “Программист разрабатывает ЭС” (рис. 1.5). Делая этот, на первый взгляд очевидный вывод, система CLIPS доказывает работоспособность встроенного в нее механизма вывода, а также достаточно верное описание
10
предметной области при формировании продукционной базы знаний. Правда в этом случае база знаний состоит всего из двух фактов и одного правила. Но это всего лишь первый простой пример.
Рис.1.5. Протокол загрузки и выполнения программы _pr1.clp.
В CLIPS существует ряд команд, которые отражают текущее состояние рабочей памяти среды. Полезными являются (facts) и (rules). Используя их можно ответить на вопрос о том, что делает команда (reset) и почему ее выполнение было необходимо для работы нашей программы (рис. 1.6).
Рис.1.6. Состояния рабочей области фактов до и после команды (reset).
В процессе работы мы уже использовали ряд команд управления средой CLIPS. Общее число таких команд более двух десятков, но наиболее часто используемыми являются:
load – загрузка конструкторов из текстового файла,
load+ – то же, но без отображения трассировочной информации, batch – загрузка и выполнение текстового файла команд CLIPS, reset – сброс рабочей памяти системы CLIPS,
clear – очистка рабочей памяти системы,
run – выполнение загруженных конструкторов,
save – сохранение созданных конструкторов в текстовый файл, exit – выход из CLIPS.
11
Обратим внимание на команду batch, которая позволяет загрузить и выполнить файл, составленный из команд среды CLIPS. Этот файл является аналогом *.bat и *.cmd файлов, выполняемых в среде DOS и Windows, но только по отношению к среде CLIPS.
Во всех предыдущих примерах до момента запуска любой программы на выполнение необходимо было выполнить одни и те же действия, связанные с очисткой рабочей памяти, загрузкой программного файла, инициализацией среды. Только выполнив все эти действия, можно запускать программу на выполнение. Освободиться от рутинного ввода команд с клавиатуры можно, если создать текстовый файл вида:
(clear)
(load* "d:\\ucheba\\clips_work\\_pr1.clp") (reset)
(run)
В нем будет указана та последовательность выполнения команд CLIPS, которая необходима для выполнения конкретной программы. Надо помнить, что CLIPS, в отличие от стандарта Windows, для разграничения уровней директориев использует либо обратные слеши, либо двойные прямые слеши. Окончив ввод, надо сохранить файл в рабочем каталога диска под именем, например, start_pr1.bat. Для запуска любого командного файла используют команду (batch <полное_имя_командного_файла>). Результат ее ввода и протокол выполнения командного файла приведен на рис. 1.7.
Рис.1.7. Протокол выполнения двух версий командного файла.
Из рис. 1.7 видно, что результат работы программы точно такой же, как и в примере, который был рассмотрен ранее. Кроме этого на этом рисунке приведены два протокола выполнения командного файла с командами load
12
