Пролог лабы / Лаб6
.docxСанкт-Петербургский государственный электротехнический университет «ЛЭТИ»
имени В. И. Ульянова(Ленина)
Открытый факультет
Кафедра Автоматизированных Систем Обработки Информации и Управления
Лабораторная работа №6
по дисциплине: «Проектирование систем искусственного интеллекта»
Выполнил: ст. гр. 0851
Карелина Л.А
Проверил:
Соничев А.В.
Санкт-Петербург
2015
Разработка экспертных систем, базирующихся на логике
Цели работы:
-
Изучение структуры экспертных систем, базирующихся на логике.
-
Построение простейшей экспертной системы, базирующейся на логике.
Задание к лабораторной работе
-
Провести тестирование программы LAB6.PRO.
-
Изменить программу LAB6.PRO так, чтобы она обеспечивала распознавание животных в соответствии с правилами, приведенными в приложении 2.
Порядок выполнения задания
-
Загрузить Турбо-Пролог.
-
Загрузить программу LAB6.PRO и убедиться в правильности ее работы.
-
Внести требуемые изменения.
Содержание отчета
Отчет должен содержать полученный текст программы и результаты ее работы.
Текст программы:
/*trace*/
domains
conditions = bno*
history = rno*
rno,bno,fno = integer
category = symbol
database
/* Предикаты БД */
rule(rno,category,category,conditions,conditions)
cond(bno,string)
yes(bno)
no(bno)
topic(string)
predicates
/* Предикаты user-interface */
repeat
do_expert_job
show_menu
do_consulting
process(integer)
info
goes(category)
listopt
erase
clear
eval_reply(char)
/* Предикаты механизма ввода */
go(history,category)
check(rno,history,conditions)
ncheck(conditions) % check if history contains incompatible conditions
notes(bno)
inpo(history,rno,bno,string)
do_answer(history,rno,string,bno,integer)
do_quiz(string)
processGoal(string)
goal
do_expert_job.
clauses
repeat.
repeat :- repeat.
/* База знаний */
topic("animal").
topic("млекопитающее").
topic("птица").
topic("хищник").
topic("парнокопытное").
topic("непарнокопытное").
topic("насекомое").
topic("кошачьи").
topic("жвачное").
rule(1,"animal","млекопитающее",[1],[]).
rule(2,"animal","птица", [3],[]).
rule(3,"млекопитающее","хищник",[5],[]).
rule(4,"хищник","кошачьи",[4,6,7,8],[]).
rule(5,"млекопитающее","парнокопытное",[9,10],[5]).
rule(6,"млекопитающее","непарнокопытное",[9],[5,10]).
rule(7,"парнокопытное","жвачное",[11],[]).
rule(9,"кошачьи","гепард", [12,13],[]).
rule(10,"кошачьи","тигр", [12,14],[]).
rule(11,"жвачное","жираф", [15,16,13],[]).
rule(12,"непарнокопытное","зебра", [14],[]).
rule(13,"птица","альбатрос", [20,21],[]).
rule(14,"птица","страус", [15,16,22],[20,21]).
rule(15,"птица","пингвин", [21,22],[20,15,16]).
rule(16,"насекомое","бабочка", [23,29],[]).
rule(18,"насекомое","жук", [25,29],[23]).
rule(19,"animal","насекомое", [26,27,28],[]).
rule(23,"хищник","дельфин", [35],[4,6,7,8]).
rule(22,"бабочка","махаон", [31,32,34],[]).
rule(22,"бабочка","лимонница", [31,32,33],[]).
cond(1,"Дает молоко").
cond(3,"Имеет перья").
cond(4,"Глаза смотрят вперед").
cond(5,"Плотоядный").
cond(6,"Имеет волосяной покров").
cond(7,"Имеет округлую голову").
cond(8,"Имеет когти").
cond(9,"Имеет копыта").
cond(10,"Имеет четное число пальцев").
cond(11,"Жует жвачку").
cond(12,"Жёлто-коричневого цвета").
cond(13,"Имеет темные пятна").
cond(14,"Имеет темные полосы").
cond(15,"Имеет длинную шею").
cond(16,"Имеет длинные ноги").
cond(20,"Может летать").
cond(21,"Может плавать").
cond(22,"Имеет черно-белую окраску").
cond(23, "Имеет чешуйки на крыльях").
cond(25, "Имеет жесткие крылья").
cond(26, "Имеет фасеточные глаза").
cond(27, "Имеет усики").
cond(28, "Имеет маленький размер").
cond(29, "Имеет шесть ног").
cond(31, "Имеет желтые крылья").
cond(32, "Имеет черные круглые пятна").
cond(33, "Имеет красные пятна").
cond(34, "Имеет <хвостики> на крыльях").
cond(35, "Имеет плавники").
/* User-interface */
do_expert_job :-
makewindow(1,112,7,"ANIMAL EXPERT SYSTEM",0,0,25,80),
show_menu,
nl,write(" Press space bar. "),
readchar(_),
exit.
show_menu :-
repeat,
clearwindow,
cursor(1,1),
nl,write("*********************************************"),
nl,write(" WELCOME TO AN ANIMAL EXPERT SYSTEM "),
nl,write("* *"),
nl,write("* 1. Консультация *"),
nl,write("* *"),
nl,write("* *"),
nl,write("* 2. Выход из системы *"),
nl,write("* *"),
nl,write("*********************************************"),
nl,write(" "),
nl,write("Пожалуйста введите ваш выбор: 1 или 2: "),
readint(Choice),
process(Choice),
fail.
process(1) :-
do_consulting.
process(2) :-
removewindow,
exit.
do_consulting :-
goes(Mygoal),
processGoal(Mygoal), !.
do_consulting.
processGoal("?") :-
info, !.
processGoal(Val) :-
do_quiz(Val), !.
do_quiz(Val) :-
retractall(yes(_)),
retractall(no(_)),
go([], Val),!.
do_quiz(Val) :-
nl,
write("Извините, ничем не могу помочь!"),
readchar(_),
fail.
do_quiz(Val).
goes(Mygoal) :-
clear,
clearwindow,nl,nl,
write(" "),nl,
nl,write("*********************************************"),
nl,write(" WELCOME TO AN ANIMAL EXPERT SYSTEM "),
nl,write(" "),
nl,write(" Для начала определения типа животного "),
nl,write(" введите слово (animal) "),
nl,write(" Если вы хотите увидеть все типы животных "),
nl,write(" введите вопросительный знак (?) "),
nl,write("*********************************************"),
nl,
readln(Mygoal).
info :-
clearwindow,
write("Ответ из КБС."),nl,
listopt,nl,
write("Нажмите любую клавишу."),
readchar(_),
clearwindow,!.
listopt :-
write("Типы животных: "),nl,nl,
topic(Animal),
write(" ",Animal),nl,
fail.
listopt.
inpo(History,Rno,Bno,Text) :-
write("Вопрос:- ",Text, " ? "),
makewindow(2,7,7,"Ответ",10,54,7,22),
write("Нажмите 1, если 'да'"),nl,
write("Нажмите 2, если'нет'"),nl,
readint(Response),
clearwindow,
removewindow,
shiftwindow(1),
do_answer(Histiry,Rno,Text,Bno,Response).
eval_reply('y') :-
write(" Ура! Угадали!").
eval_reply('n') :-
write(" Извините, ничем не могу помочь.").
eval_reply(_) :- eval_reply('n').
go(_,Mygoal) :-
not(rule(_,Mygoal,_,_,_)),!,nl,
write(" Это может быть ",Mygoal,"."),nl,
write(" Это то животное? (y/n) "),nl,
readchar(R),
eval_reply(R),nl,
readchar(_).
/* Механизм ввода*/
go(History, Mygoal) :-
rule(Rno,Mygoal,Ny,Cond, NCond),
ncheck(NCond),
check(Rno,History,Cond),
!,
go([Rno|History],Ny).
ncheck([Bno|Rest]) :-
yes(Bno),
!,
fail.
ncheck([Bno|Rest]) :-
not(yes(Bno)),
!,
ncheck(Rest).
ncheck([]).
check(Rno,History,[Bno|Rest]) :-
yes(Bno),!,
check(Rno,History,Rest).
check(_,_,[Bno|_]) :- no(Bno),!,fail.
check(Rno,History,[Bno|Rest]) :-
cond(Bno,Ncond),
fronttoken(Ncond,"not",Cond),
frontchar(Cond,_,Cond),
cond(Bno1,Cond),
notes(Bno1),!,
check(Rno,History,Rest).
check(_,_,[Bno|_]) :-
cond(Bno,Cond),
fronttoken(Ncond,"not",Cond),
frontchar(Cond,_,Cond),
cond(Bno1,Cond),
yes(Bno1),!,
fail.
check(Rno,History,[Bno|Rest]) :-
cond(Bno,Text),
inpo(History,Rno,Bno,Text),
check(Rno,History,Rest).
check(_,_,[]).
notes(Bno) :- no(Bno),!.
notes(Bno) :- not(yes(Bno)),!.
do_answer([],_,_,_,0) :- exit.
do_answer([],_,_,Bno,1) :-
assert(yes(Bno)),
shiftwindow(1),
write(yes),nl.
do_answer(_,_,_,Bno,2) :-
assert(no(Bno)),
write(no),nl,
fail.
erase :- retract(_),fail.
erase.
clear :-
retract(yes(_)),
retract(no(_)),
fail,!.
clear.
Результат работы