Поможем написать учебную работу
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
по курсу «Системы Искусственного Интеллекта»
Исполнитель,
студ. гр. ИУ 6-71 ___________ Д.Ю. Моисеев
студ. гр. ИУ 6-71 ___________ Ф.М. Карасев
Преподаватель,
___________ Е.К. Пугачев
2007
Задание:
17 |
5 |
Механизм логического вывода. |
Тема 5. Консультирующая экспертная система для выбора породы собаки.
Основными входными фактами (данными) являются:
шерсть (длинная, короткая);
окрас (черная, белая и т.п.);
рост;
хвост (низкопосаженный и т.п.);
уши (длинные, короткие и т.п.);
характер;
вес;
для каких целей.
Например,
Английский бульдог (короткая шерсть, рост меньше 22 дюймов, низкопосаженный хвост, хороший характер и т.д.);
Гончая (короткая шерсть, рост меньше 22 дюймов, длинные уши, хороший характер и т.д.);
Дог (короткая шерсть, рост меньше 30 дюймов, длинные уши, хороший характер, вес более 100 фунтов и т.д.);
Американская гончая (короткая шерсть, низкопосаженный хвост, длинные уши, хороший характер и т.д.);
Коккер-спаниэль (длинная шерсть, рост меньше 22 дюймов, низкопосаженный хвост, длинные уши, хороший характер и т.д.);
Ирландский сеттер (длинная шерсть, рост меньше 30 дюймов, длинные уши и т.д.);
Колли (длинная шерсть, рост меньше 22 дюймов, , низкопосаженный хвост, хороший характер и т.д.);
Сенбернар (длинная шерсть, низкопосаженный хвост, хороший характер, вес более 100 фунтов и т.д.) и т.д.
В качестве модели представления данных была выбрана продукционная модель.
В данной модели использовались правила (продукции) следующего вида:
R is <i,P,AB>,
где R знак правила;
I имя правила;
Р условие применимости ядра продукции;
АВ ядро продукции.
В данном конкретном случае:
i:
Р:
AB:
В1 - N=1
B2 N=2
B3 N=3
B4 Порода=Породаrulej
Текст программы:
Domains
i=integer
s=string
list=integer*
Database-f
wopr(i,s)
tail(i,s)
ears(i,s)
coat(i,s)
color(i,s)
cher(i,s)
zel(i,s)
Database-rul
rule(i,i,list,i,list,list,list,s)
Database
act_rule(s)
tail_act(i)
ears_act(i)
coat_act(i)
color_act(i)
cher_act(i)
zel_act(i)
size(i)
quit
buf(i,s)
facts(s)
Predicates
start
rost(i,i)
interface
wout(i)
in_facts(i)
formact (i)
asform(i,s)
repeat
zak
outzakl
readmy(s)
anedit(i,s,s)
analiz(i,i,i,i,i,i,i)
in_list(i,list)
compi(i,i)
compl(list,i)
Goal
start.
Clauses
start:-makewindow(1,1,7,"ЭС определения породы собак (Выход-Esc...)",0,0,25,80),
makewindow(2,27,47,"Перечислите возможные ответы",5,10,15,59),
interface.
interface:-retractall(_),wout(1),not(quit),
formact(1),repeat, zak, fail.
interface:-quit, cursor(5,10), write("Работа завершена..."),
readchar(_), removewindow, removewindow,exit.
interface:-interface.
/* Интерфейс с пользователем */
wout(K):-wopr(K,S),makewindow(3,54,27,S,10,14,4,50),in_facts(K),
not(quit),K1=K+1,removewindow,wout(K1),!.
wout(K):-quit,removewindow,!.
wout(K).
in_facts(K):-readmy(S),assert(buf(K,S)),!.
readmy(S):-editmsg("",Sout,"F10 - ввод вопроса Esc - отказ","","",0,"",U),
anedit(U,Sout,S).
anedit(U,Sout,S):-U=0,S=Sout,!.
anedit(U,Sout,S):-U=1,S="",assert(quit),!.
/* Логический вывод */
formact(N):-buf(N,S),asform(N,S),N1=N+1,
formact(N1),fail.
formact(N).
asform(N,S):-N=1,tail(M,S),not(tail_act(M)),
assert(tail_act(M)),fail.
asform(N,S):-N=1,not(tail(_,S)),assert(tail_act(-1)),fail.
asform(N,S):-N=2,ears(M,S),not(ears_act(M)),
assert(ears_act(M)),fail.
asform(N,S):-N=2,not(ears(_,S)),assert(ears_act(-1)),fail.
asform(N,S):-N=3,coat(M,S),not(coat_act(M)),
assert(coat_act(M)),fail.
asform(N,S):-N=3,not(coat(_,S)),assert(coat_act(-1)),fail.
asform(N,S):-N=4,color(M,S),not(color_act(M)),
assert(color_act(M)),fail.
asform(N,S):-N=4,not(color(_,S)),assert(color_act(-1)),fail.
asform(N,S):-N=5,S<>"",str_int(S,M),rost(M,K),
not(size(K)),assert(size(K)),fail.
asform(N,S):-N=5,S="",assert(size(-1)),fail.
asform(N,S):-N=6,cher(M,S),not(cher_act(M)),
assert(cher_act(M)),fail.
asform(N,S):-N=6,not(cher(_,S)),assert(cher_act(-1)),fail.
asform(N,S):-N=7,zel(M,S),not(zel_act(M)),
assert(zel_act(M)),fail.
asform(N,S):-N=7,not(zel(_,S)),assert(zel_act(-1)),fail.
asform(N,S).
repeat:-tail_act(T),ears_act(E),coat_act(C),
color_act(Clr),size(S),cher_act(Ch),
zel_act(Z),analiz(T,E,C,Clr,S,Ch,Z),!.
repeat.
analiz(T,E,C,Clr,S,Ch,Z):-
rule(T1,E1,C_l,S1,Ch_l,Clr_l,Z_l,Prd),
compi(T1,T),compi(E1,E),compl(C_l,C),
compi(S1,S),compl(Ch_l,Ch),
compl(Clr_l,Clr),compl(Z_l,Z),
not(act_rule(Prd)),assert(act_rule(Prd)),fail.
analiz(T,E,C,Clr,S,Ch,Z).
compi(A,B):-B<>-1,A=B.
compi(A,B):-B=-1.
compi(A,B):-fail.
compl(L1,A):-A<>-1,in_list(A,L1).
compl(L1,A):-A=-1.
compl(L1,A):-fail.
in_list(M,[A|B]):-M=A,!.
in_list(M,[A|B]):-not(B=[]),in_list(M,B).
zak:-act_rule(_),
makewindow(4,32,47,"Выводы:",3,4,17,70),
outzakl, readchar(_),removewindow,!.
zak:-not(act_rule(_)),
makewindow(4,32,47,"Извините!",3,4,17,70),
cursor(5,10),write("Трудно что-нибудь вывести по данным фактам."),
readchar(_),removewindow,!.
zak.
outzakl:-act_rule(S),write(S),nl,fail.
outzakl.
/* Вопросник*/
wopr(1,"Какой хвост?").
wopr(2,"Какие уши?").
wopr(3,"Какая шерсть?").
wopr(4,"Окрас шерсти?").
wopr(5,"Рост (см):").
wopr(6,"Характер?").
wopr(7,"Для какой цели?").
/* База фактов интерфейса с пользователем */
tail(1,"маленький"). tail(1,"короткий").
tail(2,"средний"). tail(2,"небольшой").
tail(3,"длинный"). tail(3,"большой").
ears(1,"короткие"). ears(1,"маленькие").
ears(2,"средние"). ears(2,"небольшие").
ears(3,"длинные"). ears(3,"большие").
coat(1,"короткая").
coat(2,"средняя").
coat(3,"длинная").
color(1,"черный"). color(2,"белый").
color(3,"рыжий"). color(4,"оранжевый").
color(5,"коричневый").
color(6,"серый"). color(7,"кремовый").
color(8,"бурый"). color(9,"золотистый").
cher(1,"миролюбивый"). cher(2,"не агрессивный").
cher(3,"добродушный"). cher(4,"дружелюбный").
cher(5,"не нервный"). cher(6,"грубый").
cher(7,"агрессивный"). cher(8,"внимательный").
cher(9,"верный"). cher(10,"игривый").
cher(11,"уравновешенный"). cher(12,"спокойный").
cher(13,"рассудительный"). cher(14,"подвижный").
cher(15,"уверенный"). cher(16,"привязчивый").
cher(17,"преданный"). cher(18,"любящий").
zel(1,"охота"). zel(1,"для охоты").
zel(2,"перевозка"). zel(2,"для перевозки").
zel(3,"служебная"). zel(3,"для службы").
zel(4,"сторожевая"). zel(4,"для охраны").
zel(5,"ищейка"). zel(5,"для розыска").
zel(6,"спасатель"). zel(6,"для спасения").
zel(7,"проводник"). zel(7,"поводырь").
/* База фактов заключений */
rost(S,N):-S>=0,S<=40,N=1,!.
rost(S,N):-S>40,S<=60,N=2,!.
rost(S,N):-N=3,!.
rost(S,N).
rule(3,3,[1],1,[1,2],[1,2,3],[1],"Гончая").
rule(2,2,[3],2,[3,4],[1,4,5],[1],"Легавая").
rule(2,3,[1],1,[2,4,5],[1,3,5],[1],"Такса").
rule(3,1,[3],3,[6,7],[1,2,6],[1],"Борзая").
rule(3,1,[2],2,[3,4,8],[2,7],[2],"Самоед").
rule(3,2,[2],3,[4,9,10],[1,5,6],[2],"Маламут").
rule(3,2,[2],3,[11,12,13],[1,3,8],[3,6,7],"Немецкая овчарка").
rule(3,2,[1],3,[9,14],[1,3,6],[4],"Кане-руссо").
rule(3,2,[1,3],3,[12,15],[1,2,3,6],[4],"Среднеазиатская овчарка").
rule(3,3,[1],1,[1,2,16],[1,2,3],[5],"Бассет").
rule(2,2,[2],2,[12,17,18],[1,6],[5],"Шнауцер").
rule(3,2,[3],2,[2,4],[1,8,9],[7],"Колли").