Программирование на языке CLIPS
Программирование на языке CLIPS
Министерство общего и профессионального образования
Российской Федерации
Кубанский Государственный Технологический Университет
Курсовая работа на тему:
ПРОГРАММИРОВАНИЕ НА ЯЗЫКЕ 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))
CLIPS> (assert (weather is warm))
Для лучшего восприятия теста Приложения мы в дальнейшем будем
выделять текст, вводимый пользователем, полужирным щрифтом, а запросы и
ответы интерпретатора – обычным моноширинным шрифтом.
Для вывода списка фактов, имеющихся в базе, используется команда
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
(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 будет связана с
(on Sunday)
Если за префиксами ? и $? не следует имя переменой , они
рассматриваются как универсальные символы подстановки, которым
соответственно может быть сопоставлен любой элемент или сегмент списка.
А.2.3. Наблюдение за процессом интерпретации
Теперь на простом примере познакомимся с возможностями, которые
предоставляет среда разработки CLIPS в части отладки программы, состоящей
из правил и фактов. Введите в текстовый файл правило, а затем загрузите
этот файл в среду CLIPS.
(defrule start
(initial-fact)
=>
(printout t “hello, world” crlf)
)
Выполните команду reset. Для этого введите эту команду в командной
строке интерпретатора
CLIPS> (reset)
Либо выберите в меню команду Execution=>Reset, либо нажмите
(последних два варианта возможны в версии, которая работает под Windows).
Затем запустите интерпретатор. Для этого введите эту команду run в
командную строку интерпретатора
CLIPS> (run)
Либо выберите в меню команду Execution=>Run, либо нажмите
(последних два варианта возможны в версии, которая работает под Windows).
В ответ программа должна вывести сообщение hello, world, знакомое
всем программистам мира. Для повторного запуска программы повторите команды
reset и run.
Если в меню Execution=>Watch ранее был установлен флажок Rules или
перед запуском программы на выполнение вы ввели в командную стоку команду
watch rules, то на экране появиться результат транссировки процесса
выполнения
CLIPS> (run)
FIRE 1 start: f-0
hello, world
В этом сообщении в строке, начинающейся с FIRE, выведена информация
об активизированном правиле: start – это имя правила, а f-0 – имя факта,
который «удовлетворил» условие в этом правиле. Команда watch позволяет
организовать несколько разных режимов трассировки, с деталями которых вы
можете познакомиться в Руководстве пользователя. Если перед запуском
программы вы ввели
CLIPS> (dribble-on “dribble.dp”)
TRUE
То выведенный протокол трассировки будет сохранен в файле
dribble.clp. Сохранение протокола прекратится после ввода команда
CLIPS> (dribble-off)
TRUE
Это очень удобная опция, особенно на этапе освоения языка.
А.2.4. Использование шаблонов
Для определения фактов можно использовать не только списочные
структуры, но и шаблоны, которые напоминают простые записи. (Шаблоны в
CLIPS не имеют ничего общего с шаблонами C++.) Шаблон выглядит примерно
так:
(deftemplate student “a student record”
(slot name (type STRING))
(slot age (type NUMBER) (default 18))
)
Каждое определение шаблона состоит из произвольного имени шаблона,
необязательного комментария и некоторого количества определений слотов.
Слот включает поле данных, например name, и тип данных, например STRING.
Можно указать и значение по умолчанию, как в приведенном выше примере.
Если в программу включено приведенное выше определение шаблона, то
выражение
(deffacts students
(student (name fred))
(student (name freda) (age 19))
)
приведет к тому, что в базу фактов после выполнения команды reset
будет добавлено
(student (name fred) (age 18))
(student (name freda) (age 19))
А.2.5. Определение функций
В языке CLIPS функции конструируются примерно так же, как в языке
LIPS. Существенное отличие состоит в том, что переменные должны иметь
префикс ?, как это показано в приведенном ниже определении.
(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).
А.3. ОБЪЕКТНО-ОРИЕНТИРОВАННЫЕ СРЕДСТВА В CLIPS
Использование объектно-ориентированных средств в CLIPS позволяет
значительно упростить программирование правил, поскольку для обновления
данных можно применять механизм передачи и обработки сообщений методами
классов. В этом разделе мы продемонстрируем, как это делается на примере,
который моделирует правила обращения с полуавтоматическим пистолетом.
Первым делом определим класс pistol, в котором будут перечислены
свойства, необходимые для моделирования.
(defclass pistol
(is-a USER)
Страницы: 1, 2, 3, 4, 5, 6, 7, 8
|