Здавалка
Главная | Обратная связь

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 Все права принадлежат авторам размещенных материалов.