Else (assert (dlina_shei korotkaya))))
Лабораторная работа № 5. Построение экспертной системы на основе продукционного подхода к представлению знаний
Цель: формирование у студентов целостного понимания особенностей построения экспертной системы на основе продукционного подхода к представлению знаний, ознакомление студентов с основными правилами сохранения и загрузки файла экспертной системы в оболочку, формирование прочных навыков разработки экспертных систем на языке CLIPS.
Упражнение 1. Разработка классифицирующей экспертной системы Написать код экспертной системы, соответствующей следующей семантической сети:
; =============================================================== ; Пример экспертной системы на языке CLIPS ; ; Приведенная ниже экспертная система способна классифицировать животных по различным признакам ; ; =============================================================== ; =============================================================== ; Вспомогательные функции ; =============================================================== ; ----------------------------------------------------------------------------------------------------------- ; Функция ask-question задает пользователю вопрос, полученный в переменной ?question, и получает от пользователя ответ, принадлежащий списку допустимых ответов, заданному в $?allowed-values (deffunction ask-question (?question $?allowed-values) (printout t ?question) (bind ?answer (read)) (if (lexemep ?answer) Then (bind ?answer (lowcase ?answer))) (while (not (member ?answer ?allowed-values)) do (printout t ?question) (bind ?answer (read)) (if (lexemep ?answer) Then (bind ?answer (lowcase ?answer)))) ?answer) ; ---------------------------------------------------------------------------------------------------------- ; Функция yes-or-no-p задает пользователю вопрос, полученный в переменной ?question, и получает от пользователя ответ yes (y) или ; no (n). В случае положительного ответа функция возвращает значение TRUE,иначе – FALSE (deffunction yes-or-no-p (?question) (bind ?response (ask-question ?question yes no y n)) (if (or (eq ?response yes) (eq ?response y)) Then TRUE Else FALSE)) ; ============================================================== ; Диагностические правила ; ============================================================== ; ---------------------------------------------------------------------------------------------------------- ; Правило razmer_zivotnogo позволяет установить размер животного, которое может быть: ; маленьким (razmer malenkiy) ; большим (razmer bolchoy) (defrule razmer_zivotnogo (not (razmer ?)) (not (repair ?)) => (if (yes-or-no-p "Zivotnoe nebolchogo razmera (yes/no)? ") Then (assert (razmer malenkiy)) Else (assert (razmer bolchoy))) ) ; ---------------------------------------------------------------------------------------------------------- Правило pisk_zivotnogo определяет, издает ли животное писк. Так, животное может: ; пищать (pisk da) ; издавать звуки, не похожие на писк (pisk net) ; По ответам пользователя определяется, является животное мышью или белкой. В случае, если животное небольшое, не пищит и у него большой пушистый хвост, пользователю выдается информация: ; Перед вами - белка (Pered vami - belka.") ;При появлении данной рекомендации выполнение диагностических правил прекращается (defrule pisk_zivotnogo (razmer malenkiy) (not (pisk ?)) (not (repair ?)) => (if (yes-or-no-p "Zivotnoe izdaet pisk (yes/no)? ") Then ; Животное пищит (assert (pisk da)) (assert (repair "Pered vami - mish.")) Else ; Животное не пищит (assert (pisk net)) (assert (repair "Pered vami - belka."))) ) ; ---------------------------------------------------------------------------------------------------------- ; Правило dlina_shei_zivotnogo позволяет установить длину шеи животного, которая может быть: ; нормальной (dlina_shei korotkaya) ; длинной (dlina_shei dlinnaya) ; При этом, если животное большое и имеет длинную шею пользователю выдается информация: ; Перед вами - жираф (repair "Pered vami - ziraf."). ; При появлении данной рекомендации выполнение диагностических правил прекращается (defrule dlina_shei_zivotnogo (razmer bolchoy) (not (dlina_shei ?)) (not (repair ?)) => (if (yes-or-no-p "U zivotnogo dlinaya sheya (yes/no)? ") Then (assert (dlina_shei dlinnaya)) (assert (repair " Pered vami - ziraf.")) else (assert (dlina_shei korotkaya)))) ; ---------------------------------------------------------------------------------------------------------- ; Правило hobot позволяет установить, есть ли у животного хобот: ; у животного хобот есть (nalithie_hobota da) ; у животного хобота нет (nalithie_hobota net) ; При этом, если животное большое, с хоботом, не имеет длинной шеи пользователю выдается информация: ; Перед вами - слон (repair "Pered vami - slon."). ;При появлении данной рекомендации выполнение диагностических правил прекращается (defrule hobot (razmer bolchoy) (dlina_shei korotkaya) (not (nalithie_hobota ?)) (not (repair ?)) => (if (yes-or-no-p "U zivotnogo est' hobot (yes/no)? ") Then (assert (nalithie_hobota da)) (assert (repair " Pered vami -slon."))) Else (assert (nalithie_hobota net)) (assert (kupanie lubit)) (assert (kupanie ne_lubit)))) ; ---------------------------------------------------------------------------------------------------------- ; Правило voda позволяет установить отношение животного к купанию. Так животное может: ; любить находиться в воде (kupanie lyubit) ; у животного хобота нет (kupanie ne_lyubit) ; В случае, если животное большое, без хобота, любит находиться в воде, шея у него короткая, пользователю выдается информация: ; Перед вами - гиппопотам (repair "Pered vami - gippopotam."). В случае, если животное большое, без хобота, не любит находиться в воде, шея у него короткая, пользователю выдается информация: ; Перед вами - носорог (repair "Pered vami - nosorog."). ; При появлении данных рекомендаций выполнение диагностических правил прекращается (defrule voda (razmer bolchoy) (nalithie_hobota net) (dlina_shei korotkaya) (not (repair ?)) => (if (yes-or-no-p "Zivotnoe s udovolstviem nahoditsya v vode (yes/no)? ") Then (assert (repair " Pered vami - gippopotam.")) Else (assert (repair " Pered vami - nosorog.")))) ; ============================================================== ; Запуск и завершение ; ============================================================== ;Правило no-repairsзапускается, если ни одно из диагностических правил не способно определить вид животного. Правило корректно прерывает выполнение экспертной системы и предлагает более тщательно рассмотреть животное. (defrule no-repairs "" (declare (salience -10)) (not (repair ?)) => (assert (repair "Rassmotrite zivotnoe bolee tshatelno eshe raz."))) ;----------------------------------------------------------------------------------------------------------- ;Правило print-repairвыводит на экран диагностическое сообщение об определении типа животного (defrule print-repair "" (declare (salience 10)) (repair ?item) => (printout t crlf crlf) (printout t "Suggested Repair:") (printout t crlf crlf) (format t " %s%n%n%n" ?item)) ; ---------------------------------------------------------------------------------------------------------- ;Правило system-bannerвыводит на экран название экспертной системы при каждом новом запуске (defrule system-banner "" (declare (salience 10)) ; при каждом новом запуске => (printout t crlf crlf) (printout t "***********************" crlf) (printout t "Kakoe zivotnoe pered vami" crlf ) (printout t "***********************" crlf) (printout t crlf crlf)) ; ============================================================== ©2015 arhivinfo.ru Все права принадлежат авторам размещенных материалов.
|