Практическая работа №1
«Знакомство с CLIPS - инструментальной системой для создания экспертных систем»
Темы 1,2,3
Цель: изучить принцип создания самой простой экспертной системы.
Теоия:
Под экспертной системой (ЭС) понимают набор программ, выполняющий функции эксперта при решении задач из некоторой предметной области. ЭС выдают советы, проводят анализ, дают консультации, ставят диагноз.
Главным достоинством ЭС, определяющим сравнительно высокий интерес к ним как к методам искусственного интеллекта, является возможность накопления знаний и сохранение их длительное время. В отличии от человека к любой информации ЭС подходят объективно, что улучшает качество проводимой экспертизы. При решении задач, требующих обработки большого объема знаний, возможность возникновения ошибки при переборе очень мала.
Язык CLIPS
CLIPS (C Language Integrated Production System) начала разрабатываться в космическом центре Джонсона NASA в 1984 году.
CLIPS включает в язык представления порождающих правил и язык описания процедур.
Основными компонентами языка описания правил являются база фактов (fact base) и база правил (rule base). На них возлагаются следующие функции:
- база фактов представляет исходное состояние проблемы;
- база правил содержит операторы, которые преобразуют состояние проблемы, приводя его к решению.
Машина логического вывода CLIPS сопоставляет эти факты и правила и выясняет, какие из правил можно активизировать. Это выполняется циклически, причем каждый цикл состоит из трех шагов:
(1) сопоставление фактов и правил;
(2) выбор правила, подлежащего активизации;
(3) выполнение действий, предписанных правилом.
Факты
Сразу после запуска CLIPS-приложения на выполнение на экране появится приглашение, извещающее пользователя, что он работает с интерпретатором.
CLIPS>
В режиме интерпретатора пользователь может использовать множество команд. Факты можно включить в базу фактов прямо из командной строки с помощью команды assert, например:
CLIPS> (assert (today is Sunday))
<Fact-0>
CLIPS> (assert (weather is warm))
<Fact-l>
Для лучшего восприятия текста Приложения мы в дальнейшем будем выделять текст, вводимый пользователем, полужирным шрифтом, а запросы и ответы интерпретатора — обычным моноширинным шрифтом.
Для вывода списка фактов, имеющихся в базе, используется команда facts:
CLIPS> (facts)
f-0 (today is Sunday)
f-1 (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), а за ним следуют элементы списка, причем их количество не ограничивается. Этот массив фактов можно затем удалить из базы командой undef facts.
CLIPS> (undeffacts today)
Выражение def facts можно вводить и в командную строку интерпретатора, но лучше записать его в текстовый файл с помощью редактора CLIPS или любого другого текстового редактора. Загрузить этот файл в дальнейшем можно с помощью команды в меню File либо из командной строки.
CLIPS> (load "my file")
Однако после загрузки файла факты не передаются сразу же в базу фактов CLIPS. Команда deffacts просто указывает интерпретатору, что существует массив today, который содержит множество фактов. Собственно загрузка выполняется командой reset.
CLIPS> (reset)
Команда reset сначала очищает базу фактов, а затем включает в нее факты из всех ранее загруженных массивов. Она также добавляет в базу единственный системно определенный факт:
f-0 (initial-fact)
Это делается по умолчанию, поскольку иногда имеет смысл включить в программу правило start rule, которое может быть сопоставлено с этим фактом и позволит выполнить какие-либо нестандартные инициализирующие операции. Однако включать такое правило в программу или нет — дело программиста.
Можно проследить, как выполняется команда reset, если перед выполнением приведенных выше команд установить режим слежения среды разработки. Для этого нужно вызвать команду Watch из меню Execution и установить в ней флажок Facts.
В языке CLIPS правила имеют следующий формат:
(defrule <имя правила>
< необязательный комментарий >
< необязательное объявление >
< предпосылка_1 >
< предпосылка_т > =>
< действие_1 >
< предпосылка_п > )
Например:
(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 может быть присвоено любое целочисленное значение в диапазоне [-10 000, 10 000]. Если параметр 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),
который сопоставляется с любым из представленных ниже образцов
(do ? ? Sunday)
(do ? on ?)
(do ? on ?when)
(do $?)
(do $? Sunday)
(do ?chore $?when)
Учтите, что префикс $? является признаком сегментной переменной, которая будет связана с сегментом списка. Например, в приведенном выше примере переменная $?when будет связана с
(on Sunday)
Если за префиксами ? и $? не следует имя переменной, они рассматриваются как универсальные символы подстановки, которым соответственно может быть сопоставлен любой элемент или сегмент списка.
Наблюдение за процессом интерпретации
Теперь на простом примере познакомимся с возможностями, которые предоставляет среда разработки CLIPS в части отладки программы, состоящей из правил и фактов. Введите в текстовый файл правило, а затем загрузите этот файл в среду CLIPS.
(defrule start
(initial-fact)
(printout t "hello, world" crlf) )
Выполните команду reset. Для этого либо введите эту команду в командной строке интерпретатора
CLIPS> (reset)
либо выберите в меню команду Execution => Reset, либо нажмите <CTRL+U> (последних два варианта возможны в версии, которая работает под Windows).
Затем запустите интерпретатор. Для этого либо введите эту команду run в командную строку интерпретатора
CLIPS> (run)
либо выберите в меню команду ExecutionORun, либо нажмите <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.dp. Сохранение протокола прекратится после ввода команды
CLIPS> (dribble-off)
TRUE
Это очень удобная опция, особенно на этапе освоения языка.
Определение функций
В языке CLIPS функции конструируются примерно так же, как в языке LISP (см. главу 4). Существенное отличие состоит в том, что переменные должны иметь префикс ?, как это показано в приведенном ниже определении.
(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).
Пример функции:
(deffunction factorial (?a)
(if (or (not (integerp ? a)) (< ?a 0)) then
(printout t "Factorial Error!" crlf)
else
(if (= ?a 0) then
1
else
(*? a (factorial ($-$ ? a1))))))
Правила в CLIPS состоят из предпосылок и следствия. Предпосылки также называют ЕСЛИ-частью правила, левой частью правила или LHS правила (left-hand side of rule). Следствие называют ТО-частью правила, правой частью правила или RHS правила (right-hand side of rule).
Пример правила представлен ниже:
(deftemplate data (slot x) (slot y))
(defrule twice
(data (x ? x) (y =(*2 ? x)))
)
(assert (data (x2) (y4)); f-0
(data (x3) (y9))); f-1
CLIPS поддерживает следующие типы данных: integer, float, string, symbol, external-address, fact-address, instance-name, instance-address.
Пример integer: |
594 |
23 |
+51 |
?17 |
Пример float: |
594e2 |
23.45 |
+51.0 |
?17.5e?5 |
String — это строка символов, заключенная в двойные кавычки.
Пример string: "expert", "Phil Blake", "состояние $-0$", "quote=\"
CLIPS поддерживает следующие процедурные функции , реализующие возможности ветвления, организации циклов в программах и т.,п.:
If |
оператор ветвления; |
While |
цикл с предусловием; |
loop-for-count |
итеративный цикл; |
prong |
объединение действий в одной логической команде; |
prong$ |
выполнение набора действий над каждым элементом поля; |
return |
прерывание функции, цикла, правила и т.д.; |
break |
то же, что и return, но без возвращения параметров; |
switch |
оператор множественного ветвления; |
bind |
создание и связывание переменных. |
Функции ввода-вывода следующие:
open |
открытие файла (виды доступа r, w, r+, a, wb), |
close |
закрытие файла, |
printout |
вывод информации на заданное устройство, |
read |
ввод данных с заданного устройства, |
readline |
ввод строки с заданного устройства, |
format |
форматированный вывод на заданное устройство, |
rename |
переименование файла, |
remove |
удаление файла. |
Среди двух десятков команд CLIPS следует назвать основные команды при работе со средой CLIPS:
load |
загрузка конструкторов из текстового файла, |
|
|
reset |
сброс рабочей памяти системы CLIPS, |
clear |
очистка рабочей памяти системы, |
run |
выполнение загруженных конструкторов, |
save |
сохранение созданных конструкторов в текстовый файл, |
exit |
выход из CLIPS. |
|
|
Пример запуска программы и ведения отчета по выполняемым операциям:
(dribble-on mab.txt)
(watch all)
(load mab.clp)
(reset)
(run)
(dribble-off)
Пример1: Перевести утверждение в правило
(A) Если температура пациента высока, и пациент покрыт красной сыпью, то печатать, что диагноз - корь.
(a) If a patient's temperature is high and the patient is covered with red sores, then print out that the diagnosis is measles.
(deffacts symptomps
(patient's temperature is high)
(patient is covered with red sores)
)
(defrule diagnos
(patient's temperature is high)
(patient is covered with red sores)
=>
(printout t "The diagnosis is measles" crlf)
)
Пример2: Написать программу с многократными правилами, которое будет по цвету выводить время года
Белый – зима, Красный – Лето, Зеленый – весна, Желтый – Осень
Цвет вводится с клавиатуры
(deffacts year
(white is winter)
(red is summer)
(green is spring)
(yellow is )
)
(defrule entercolor
(initial-fact)
=>
(printout t "What does color? Enter color: ")
(bind ?color (read))
(assert (color is ?color))
)
(defrule animal
?f1 <- (color is ?color)
(?time is ?color)
=>
(printout t "This time is " ?time crlf)
(retract ?f1)
)
Пример3: Написать программу, в которой правила выполняются последовательно.
Реализовать алгоритм приготовления чая, с конце вывести сообщение "Чай готов"
(deffacts ingridients
(You have cup)
(You have tea)
(You have sugar)
(You have water )
)
(defrule podogr_water
(salience 100)
(You have water)
=>
(assert (You podogr water))
)
(defrule tea_in_cup
(salience 10)
(You have cup)
(You have tea)
=>
(assert (You put tea in cup))
)
(defrule tea_in_cup
(You put tea in cup)
(You have sugar)
=>
(assert (You put sugar in cup))
)
(defrule water_in_cup
(You put sugar in cup)
(You podogr water)
=>
(assert (You put water in cup))
)
(defrule ready
(You put water in cup)
=>
(printout t "Tea is ready!!!" crlf)
)
Задание:
Задание 1: Перевести утверждение в правило и выполнить его в Clips. Утверждение выбрать согласно варианту.
Задание 2: Написать программу, в которой правила выполняются последовательно. Программа реализовывает алгоритм согласно варианту.
Задание 3: Написать программу с многократными правилами и вводом с клавиатуры (согласно варианту). Суть программы сводится в следующем:
- определить начальную базу фактов;
- определит правила для принятия решения;
- запросить у пользователя сведения о каком – то объекте или событие;
- вывести на экран решение, что это за объект или какое действие выполнить пользователю.
Варианты:
(Номер варианта равен номеру по списку)
|
Вариант 1 |
Задание 1 |
Если у транспортного средства 4 колеса и оно запрягается в лошадь, то вывести на печать, что это телега. |
Задание 2 |
Алгоритм заправки автомобиля |
Задание 3 |
Идентификация типа транспортного средства (велосипед, мотоцикл, мотороллер, телега, карета, автобус, грузовик, легковые: пикап, седан, хэтчбек, кабриолет и т.д.). |
|
Вариант 2 |
Задание 1 |
Если клиент хочет ухаживать за деревьями и есть свежие фрукты, то вывести на печать – он хочет провести летний отдых в саду. |
Задание 2 |
Алгоритм посадки саженцев |
Задание 3 |
Где клиент хочет провести летний отдых (дома, в саду, в пешем походе, в местном санатории, на Черном море, на Средиземном море, в круизе на теплоходе, на горном курорте, в африканских странах и т.д.) |
|
Вариант 3 |
Задание 1 |
Если вы хотите не тратиться на расходные материалы для принтера и печатаете много листов, то вывести на печать – покупайте лазерный принтер |
Задание 2 |
Алгоритм заправки струйного принтера |
Задание 3 |
Выбор принтера для покупки (матричного, струйного, лазерного или МФУ). |
|
Вариант 4 |
Задание 1 |
Если у клиента мало денег и он очень мало стирает, то вывести на печать – покупайте малютку - механическую |
Задание 2 |
Алгоритм использования машинки автомат |
Задание 3 |
Выбор стиральной машины (малютка - механическая, автомат: разные объемы загрузки, функции выполнения, горизонтальная или вертикальная загрузка) |
|
Вариант 5 |
Задание 1 |
Если клиент не очень голоден и хочет потанцевать, то вывести на печать – ужинать в клубе |
Задание 2 |
Алгоритм посещения кафе |
Задание 3 |
Где клиенту лучше поужинать вечером? (дома, у друзей, в столовой, в кафе, в ресторане, в клубе). |
|
Вариант 6 |
Задание 1 |
Если у клиента много денег и он хочет высокое качество, то вывести на печать – покупай плазменный телевизор с большой диагональю |
Задание 2 |
Алгоритм настройки телевизора |
Задание 3 |
Выбор телевизора для дома (диагональ, тип, цена, марка и т.д.). |
|
Вариант 7 |
Задание 1 |
Если у клиента нет семьи и ему важна близость к природе, то вывести на печать – покупайте небольшой домик за городом |
Задание 2 |
Алгоритм ремонта квартиры |
Задание 3 |
Какую квартиру лучше купить клиенту? (цена, площадь, престижность района, экологическая ситуация в районе, транспорт, тип дома и т.д.). |
|
Вариант 8 |
Задание 1 |
Если этот овощ красного цвета и немного кислый, то это томат. |
Задание 2 |
Алгоритм выращивания какого-нибудь садового растения |
Задание 3 |
Выполнить идентификацию садовых растений на участке (огурцы, томаты, лук, яблоня, вишня, смородина, крыжовник и т.д.). |
|
Вариант 9 |
Задание 1 |
Если работа клиента связана с командировками и он должен обрабатывать большой объем информации, то вывести на печать – купите ноутбук с большой емкостью винчестера |
Задание 2 |
Алгоритм работы с ноутбуком |
Задание 3 |
Выбор компьютера (настольный или ноутбук, объем ОП и винчестера, видеокарта, звуковая карта, модем и т.д.). |
|
Вариант 10 |
Задание 1 |
|
Задание 2 |
|
Задание 3 |
Идентификация типа личности (сангвиник, холерик, флегматик) |
|
Вариант 11 |
Задание 1 |
Можно выбрать свою тематику и привязать к ней три задания, например: анализ квадратного уравнения, анализ покупки валюты и т.д. |
Задание 2 |
Задание 3 |
Отчет:
Распечатать текст программы для каждого задания с комментариями (обязательно) и протокол выполнения программы.
|