Скачиваний:
74
Добавлен:
17.06.2016
Размер:
58.26 Кб
Скачать

Санкт-Петербургский государственный электротехнический университет «ЛЭТИ»

имени В. И. Ульянова(Ленина)

Открытый факультет

Кафедра Автоматизированных Систем Обработки Информации и Управления

Лабораторная работа №6

по дисциплине: «Проектирование систем искусственного интеллекта»

Выполнил: ст. гр. 0851

Карелина Л.А

Проверил:

Соничев А.В.

Санкт-Петербург

2015

Разработка экспертных систем, базирующихся на логике

Цели работы:

  1. Изучение структуры экспертных систем, базирующихся на логике.

  2. Построение простейшей экспертной системы, базирующейся на логике.

Задание к лабораторной работе

  1. Провести тестирование программы LAB6.PRO.

  2. Изменить программу LAB6.PRO так, чтобы она обеспечивала распознавание животных в соответствии с правилами, приведенными в приложении 2.

Порядок выполнения задания

  1. Загрузить Турбо-Пролог.

  2. Загрузить программу LAB6.PRO и убедиться в правильности ее работы.

  3. Внести требуемые изменения.

Содержание отчета

Отчет должен содержать полученный текст программы и результаты ее работы.

Текст программы:

/*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.

Результат работы

Соседние файлы в папке Пролог лабы