А.2.3. Наблюдение за процессом интерпретации
Министерство общего и профессионального образования Российской Федерации Кубанский Государственный Технологический Университет Курсовая работа на тему: ПРОГРАММИРОВАНИЕ НА ЯЗЫКЕ 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 будет связана с (on Sunday) Если за префиксами? и $? не следует имя переменой, они рассматриваются как универсальные символы подстановки, которым соответственно может быть сопоставлен любой элемент или сегмент списка.
А.2.3. Наблюдение за процессом интерпретации
Теперь на простом примере познакомимся с возможностями, которые предоставляет среда разработки CLIPS в части отладки программы, состоящей из правил и фактов. Введите в текстовый файл правило, а затем загрузите этот файл в среду CLIPS.
(defrule start (initial-fact) => (printout t “hello, world” crlf) )
Выполните команду reset. Для этого введите эту команду в командной строке интерпретатора CLIPS> (reset) Либо выберите в меню команду Execution=>Reset, либо нажмите <CTRL+U> (последних два варианта возможны в версии, которая работает под Windows). Затем запустите интерпретатор. Для этого введите эту команду run в командную строку интерпретатора CLIPS> (run) Либо выберите в меню команду Execution=>Run, либо нажмите <CTRL+R> (последних два варианта возможны в версии, которая работает под 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).
Воспользуйтесь поиском по сайту: ©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...
|