Министерство общего и профессионального образования
Российской Федерации
Кубанский Государственный Технологический Университет
Курсовая работа на тему:
ПРОГРАММИРОВАНИЕ НА ЯЗЫКЕ CLIPS
Работу выполнил
студент группы 01-КТ-22 факультета КТАС Мариненко А. А.
Краснодар 2001
СОДЕРАЖНИЕ
· А.1. Краткая история CLIPS 3
· А.2. Правила и функции в CLIPS 3
· А.3. Обектно-ориентированные средства в CLIPS 10
· А.4. Задача «Правдолюбцы и лжецы» 15
· А.5 Стиль программирования на языке CLIPS 66
А.1. КРАТКАЯ ИСТОРИЯ CLIPS
Название языка CLIPS – аббревиатура от C Language Integrated Production System. Язык был разработан в центре космических исследований NASA
{NASA’s Johnson Space Center} в середине 1980-х годов и во многом сходен с языками , созданными на базе LIPS, в частности OPS5 и ART. Использование C в качестве языка реализации объясняется тем, что компилятор LISP не поддерживается частью распространенных платформ, а также сложностью интеграции LISP-кода в приложения, которые используют отличный от LIPS язык программирования. Хотя в то время на рынке уже появились программные средства для задач искусственного интеллекта, разработанные на языке C , специалисты из NASA решили создать такой продукт самостоятельно. Разработанная ими система в настоящее время доступна во всем мире, и нужно сказать, что по своим возможностям она не уступает множеству гораздо более дорогих коммерческих продуктов.
Первая версия представляет собой, по сути, интерпретатор порождающих правил. Процедурный язык и объективно-ориентированное расширение CLIPS Object-Oriented Language {COOL} были включены в этот программный продукт только в 1990-х годах. Существующая в настоящее время версия может эксплуатироваться на платформах UNIX, DOS, Windows и Macintosh. Она является хорошо документированным общедоступным программным продуктом и доступна по сети FTR с множества университетских сайтов. Исходный код программного пакета CLIPS распространяется совершенно свободно и его можно установить на любой платформе, поддерживающей стандартный компилятор языка C. Однако я бы рекомендовал пользоваться официальной версией для определенной платформы, поскольку такие версии оснащены пользовательским интерфейсом, включающим меню команд и встроенный редактор.
Это Приложение организовано следующим образом. В разделе А.2. рассмотрены основные функции языка, описание правил и процедурного языка. В разделе А.3. представлены методы работы с объектами и показано, как использовать их в сочетании с правилами и процедурами. В разделе А.4. описан пример, демонстрирующий некоторые приемы программирования правил, а в разделе А.5. резюмируются характеристики этого программного продукта и предлагаются темы для более углубленного изучения.
А.2. ПРАВИЛА И ФУНКЦИИ В CLIPS
CLIPS включает в язык представления порождающих правил и язык описания процедур. В этом разделе мы рассмотрим оба этих модуля, сопровождая описание отдельных функций примерами.
Основными компонентами языка описания правил являются база фактов (fact base) и база правил (rule base). На них возлагаются следующие функции:
- база фактов представляет собой исходное состояние проблемы;
- база правил содержит операторы , которые преобразуют состояние проблемы, приводя его к решению.
Машина логического вывода CLIPS сопоставляет эти факты и правила и выясняет, какие из правил можно активизировать. Это выполняется циклически, причем каждый цикл состоит из трех шагов:
(1) сопоставление фактов и правил;
(2) выбор правила, подлежащего активизации;
(3) выполнение действий, предписанных правилом.
Такой трехшаговый циклический процесс иногда называют «циклом распознование – действие»
А.2.1. Факты
Сразу после запуска CLIPS-приложения на выполнение на экране появится приглашение, извещающее пользователя , что он работает с интерпретатором.
CLIPS>
В режиме интерпретатора пользователь может использовать множество команд. Факты можно включить в базу фактов прямо из командной строки с помощью команды assert, например:
CLIPS> (assert (today is Sunday))
<Fact-0>
CLIPS> (assert (weather is warm))
<Fact-0>
Для лучшего восприятия теста Приложения мы в дальнейшем будем выделять текст, вводимый пользователем, полужирным щрифтом, а запросы и ответы интерпретатора – обычным моноширинным шрифтом.
Для вывода списка фактов, имеющихся в базе, используется команда facts:
CLIPS>(facts)
f-1 (today is Sunday)
f-2 (weather is warm)
В последних версиях CLIPS , в частности, в той, которая работает в операционной среде Windows, такие команды как facts, можно вызвать с помощью меню.
Для удаления фактов из базы используется команда retract.
CLIPS> (retract 1)
CLIPS> (facts)
f-0 (today is Sunday)
Эти же команды , assert и retract, используются в выполняемой части правил (заключении правила) и с их помощью выполняется программное изменение базы фактов. Часто приходится пользоваться и другой командой интерпретатора, clear, которая очищает базу фактов ( как правило, эта команда доступна в одном из выпадающих меню).
CLIPS> (clear)
CLIPS> (facts)
В тексте программы факты можно включать в базу не по одиночке, а целым массивом. Для этого в CLIPS имеется команда deffacts.
(deffacts today
(today is Sunday)
(weather is warm)
)
Выражение deffacts имеет формат , аналогичный выражениям в языке LISP. Выражение начинается с команды deffacts, затем приводится имя списка фактов, который программисти собирается определить ( в нашем примере – today), а за ним следуют элементы списка, причем их количество не ограничивается. Этот массив фактов можно затем удалить из базы командой undeffacts.
CLIPS> (undeffacts today)
Выражение deffacts можно вводить и в командную строку интерпретатора, но лучше записать его в текстовый файл с помощью редактора CLIPS или любого другого текстового редактора. Загрузить этот файл в дальнейшем можно с помощью команды в меню File либо из командной строки.
CLIPS> (load “my file”)
Однако после загрузки файла факты не передаются сразу же в базу фактов CLIPS. Команда deffacts просто указывает интерпретатору, что существует массив today, который содержит множество фактов. Собственно загрузка выполняется командой reset.
CLIPS> (reset)
Команда reset сначала очищает базу фактов , а затем включает в неё факты из всех раннее загруженных массивов. Она также добавляет в базу единственный системно определенный факт:
f-0 (initial-fact)
Это делается по умолчанию, поскольку иногда имеет смысл включить в программу правило start rule, которое может быть сопоставлено с этим фактом и позволит выполнить какие-либо нестандартные инициализирующие операции. Однако включать такое правило в программу или нет – дело программиста.
Можно проследить, как выполняется команда reset, если перед выполнением приведенных выше команд установить режим слежения среды разработки. Для этого нужно вызвать команду Watch из меню Execution и установить в ней флажок Facts.
А.2.2. Правила
В языке 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)
указывает на степень важности правила. Пусть например, в программе имеется другое правило
(defrule fun
“Better things to do on Sunday”
(salience 100)
(today is Sunday)
(weather is warm)
=>
(assert (drink beer))
(assert (play guitar))
)
Поскольку предпосылки обоих правил одинаковы, то при выполнении оговоренных условий они будут «конкурировать» за внимание интерпретатора. Предпочтение будет отдано правилу, у которого параметр salience имеет более высокое значение, в данном случае – правилу fun. Параметру salience может быть присвоено любое целочисленное значение в диапазоне [-10000, 10000]. Если параметр salience в определении правила опущен, ему по умолчанию присваивается значение 0.
Обычно в определении правила присутствуют и переменные. Если, например, правило
(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).
Аналогично, правило
(defrule drop-a-chore
“Allocating chores to days”
(today is ?day)
?chore <- (do ?job on ?day)
=>
(retract ?chore)
)
отменит выполнение работ по дому (a chore). Обратите внимание на то, что оба экземпляра переменной ?day должны получить одно и то же значение. Переменная ?chore в результате сопоставления должна получить ссылку на факт, который мы собираемся исключить из базы. Таким образом, если это правило будет сопоставлено с базой фактов, в которой содержатся
(today is Sunday)
(do carwash on Sunday)
то при активизации правила из базы будет удален факт
(do carwash on Sunday)
С подробностями выполнения процесса сосоставления в интерпретаторе CLIPS вы сможете познакомиться в Руководстве пользователя , а здесь только отметим, что факт
(do carwash on Sunday)
будет сопоставлен с любым из представленных ниже образцов
(do ? ? Sunday)
(do ? on ?)
(do ? on ?when)
(do $?)
(do $? Sunday)
(do ?chore $?when)
Учтите, что префикс $? является признаком сегментной переменной, которая будет связана с сегментом списка. Например, в приведенном выше примере переменная $?when будет связана с