Создание экспертной системы продукционного типа
1 Задание – вспомогательное. Исследовать работу программы GENI, сначала с базой правил, хранящейся в файле GENI.GNI, затем с базой знаний, хранящейся в файле VACATION.GNI. В первом случае путем последовательного задания уточняющих вопросов программа угадывает задуманное животное. Во втором случае программа распознает место отдыха, о котором Вы мечтаете, также предварительно задав серию вопросов.
2 Задание основное. Модифицировать программу GENI таким образом, чтобы она отвечала на вопросы темы РГР, выбранной студентом самостоятельно.
Программа GENI представляет собой простейшую реализацию оболочки экспертной системы продукционного типа, на основе которой в дальнейшем предполагается строить более сложную экспертную систему.
Программа ведет четкий и разумный диалог с пользователем, запрашивая у него необходимую иформацию, которой она пока не располагает.
База знаний этой системы состоит из фактов (FACT) и правил (RULE). Обратите внимание на реализованный в системе механизм объяснений.
При исследовании работы программы рекомендуется исследовать работу некоторых наиболее непонятных предикатов, задавая в секции Goal соответствующую данному предикату цель. Например, для понимания работы предиката reverse можно в разделе Goal задать цель reverse([2,5,8,4],Y) (закомментировав предварительно имеющуюся там цель).
Результатом выполнения данного задания должно явиться четкое понимание студентом работы данной программы и что изменится, если внести в программу те или иные коррективы (поэкспериментировать самостоятельно, объяснить изменение работы программы). Необходимо также нарисовать дерево вызова целей данной программы
Файл GENI.PRO
domains
CONDITIONS = CNO*
HISTORY = RNO*
RNO, CNO, FNO = INTEGER
CATEGORY = STRING
SLIST = STRING*
database - geni
rule(RNO,CATEGORY,CATEGORY,CONDITIONS)
cond(CNO,STRING)
topic(STRING maingoal,STRING purpose)
database - tmp
yes(CNO)
no(CNO)
fact(FNO,CATEGORY,CATEGORY)
predicates
evalans(char)
reverse(CONDITIONS,CONDITIONS)
reverse1(CONDITIONS,CONDITIONS,CONDITIONS)
% Inferences engine
nondeterm go(HISTORY,CATEGORY)
check(RNO,HISTORY,CONDITIONS)
notest(CNO)
% Helping predicates
inpq(HISTORY,RNO,CNO,STRING)
do_answer(HISTORY,RNO,STRING,CNO,INTEGER)
% Explanations
sub_cat(CATEGORY,CATEGORY,CATEGORY)
show_conditions(CONDITIONS,string)
show_rule(RNO,string)
report(HISTORY,string)
clauses
go(_,Mygoal):-
not(rule(_,Mygoal,_,_)),
!,
nl,
write("I think it is a(n): ",Mygoal),nl,nl,
write("I was right, wasn't I? (enter y or n)"),
readchar(Ans),
evalans(Ans),
!.
go(HISTORY,Mygoal):-
rule(RNO,Mygoal,NY,COND),
check(RNO,HISTORY,COND),
go([RNO|HISTORY],NY).
% Check the conditions for the Rule !
check(RNO,HISTORY,[CNO|REST]):-
yes(CNO),
!,
check(RNO,HISTORY,REST).
check(_,_,[CNO|_]):-
no(CNO),
!,
fail.
check(RNO,HISTORY,[CNO|REST]):-
cond(CNO,NCOND),
fronttoken(NCOND,"not",_COND),
frontchar(_COND,_,COND),
cond(CNO1,COND),
notest(CNO1),
!,
check(RNO,HISTORY,REST).
check(_,_, [CNO|_]):-
cond(CNO,NCOND),
fronttoken(NCOND,"not",_COND),
frontchar(_COND,_,COND),
cond(CNO1,COND),
yes(CNO1),
!,
fail.
check(RNO,HISTORY,[CNO|REST]):-
cond(CNO,TEXT),
!,
inpq(HISTORY,RNO,CNO,TEXT),
check(RNO,HISTORY,REST).
check(_,_,[]).
notest(CNO):-
no(CNO),
!.
notest(CNO):-
not(yes(CNO)),
!.
inpq(HISTORY,RNO,CNO,TEXT):-
write("Is it true that ",TEXT," (Yes/No/Why):"),
readchar(CH),
upper_lower(CH,CHOICE),
do_answer(HISTORY,RNO,TEXT,CNO,CHOICE).
do_answer(_,_,_,CNO,'y'):-
!,
assert(yes(CNO)),
write("Yes\n").
do_answer(_,_,_,CNO,'n'):-
!,
assert(no(CNO)),
write("No\n"),
fail.
do_answer(HISTORY,RNO,TEXT,CNO,'w'):-
!,
write("Why\n"),
rule(RNO,Mygoal1,Mygoal2,_),
!,
sub_cat(Mygoal1,Mygoal2,Lstr),
concat("I try to show that: ",Lstr,Lstr1),
concat(Lstr1,"\nBy using rule number ",Ls1),
str_int(Str_num,RNO),
concat(Ls1,Str_num,Ans),
show_rule(RNO,Lls1),
concat(Ans,Lls1,Ans1),
report(HISTORY,Sng),
concat(Ans1,Sng,Answ),
write(Answ),
nl,
inpq(HISTORY,RNO,CNO,TEXT).
do_answer(_,_,_,_,_):-
write("\nOK, we are Terminating\n"),
exit.
% List Rules / Explanation Mechanism
show_rule(RNO,Strg):-
rule(RNO,Mygoal1,Mygoal2,CONDINGELSER),
!,
str_int(RNO_str,RNO),
concat("\n Rule ",RNO_str,Ans),
concat(Ans,": ",Ans1),
sub_cat(Mygoal1,Mygoal2,Lstr),
concat(Ans1,Lstr,Ans2),
concat(Ans2,"\n if ",Ans3),
reverse(CONDINGELSER,CONILS),
show_conditions(CONILS,Con),
concat(Ans3,Con,Strg).
show_conditions([],"").
show_conditions([COND],Ans):-
cond(COND,Ans),
!.
show_conditions([COND|REST],Ans):-
cond(COND,Text),
!,
concat("\n and ",Text,Nstr),
show_conditions(REST,Next_ans),
concat(Next_ans,Nstr,Ans).
sub_cat(Mygoal1,Mygoal2,Lstr):-
format(LStr,"% is a %",MyGoal1,MyGoal2).
report([],"").
report([RNO|REST],Strg):-
rule(RNO,Mygoal1,Mygoal2,_),
!,
sub_cat(Mygoal1,Mygoal2,Lstr),
concat("\nI have shown that: ",Lstr,L1),
concat(L1,"\nBy using rule number ",L2),
str_int(Str_RNO,RNO),
concat(L2,Str_RNO,L3),
concat(L3,":\n ",L4),
show_rule(RNO,Str),
concat(L4,Str,L5),
report(REST,Next_strg),
concat(L5,Next_strg,Strg).
evalans('y'):-
!,
write("\nOf course, I am always right!").
evalans('n'):-
!,
write("\nyou're the boss\nUpdate my Knowledge Base!").
evalans(_):-
write("\nOK, we are Terminating\n").
reverse(X,Y):-
reverse1([],X,Y).
reverse1(Y,[],Y).
reverse1(X1,[U|X2],Y):-
reverse1([U|X1],X2,Y).
goal
% Chose knowledgebase
consult("c://vip52//examples//geni.gni",geni),
% consult("vacation.gni",geni),
topic(MAINGOAL,PURPOSE),
write(PURPOSE),nl,
go([],MAINGOAL);
write("\nSorry that one I did not know"),
nl.
Файл GENI.GNI
rule(1,"carnivore","cheetah",[1,2])
rule(2,"carnivore","tiger",[1,3])
rule(3,"ungulate","giraffe",[5,2])
rule(4,"ungulate","zebra",[3])
rule(5,"bird","ostrich",[6,5,7,8])
rule(6,"bird","penguin",[9,10,8])
rule(7,"bird","albatross",[11])
rule(8,"animal","mammal",[12,13])
rule(9,"animal","bird",[9,14])
rule(10,"mammal","carnivore",[15])
rule(11,"mammal","ungulate",[16])
cond(1,"it has tawny color")
cond(2,"it has dark spots")
cond(3,"it has black stripes")
cond(4,"it has long neck")
cond(5,"it has long legs")
cond(6,"it does fly")
cond(7,"it has a long neck")
cond(8,"it has a black and white color")
cond(9,"it has feathers")
cond(10,"it swims")
cond(11,"it does fly well")
cond(12,"it has hair")
cond(13,"it does give milk")
cond(14,"it lays eggs")
cond(15,"it eats meat")
cond(16,"it does chew cud")
topic("animal","I will try to guess which animal you are thinking of")
Файл VACATION.GNI.
cond(1,"it is warm")
cond(2,"it is adventurous")
cond(3,"it has beaches")
cond(4,"it is warm in the winter")
cond(5,"not it is inexpensive")
cond(6,"it has outdoor sports")
cond(7,"it has good food")
cond(8,"it is inexpensive")
cond(9,"it has gambling")
cond(10,"not it is warm in the winter")
cond(11,"it is dark in the winter")
cond(12,"it has long summer days")
cond(13,"not it is dark in the winter")
rule(1,"adventurous","Aspen, Colorado",[6,10,7,13])
rule(2,"adventurous","Anchorage, Alaska",[10,6,11,5,12,3])
rule(3,"warm","Las Vegas, Nevada",[8,9,4])
rule(4,"warm","Mazatlan, Mexico",[3,7,4,8])
rule(5,"warm","Maui, Hawaii",[3,4,5,6])
rule(6,"vacation","adventurous",[2])
rule(7,"vacation","warm",[1])
topic("vacation","I will try to guess which vacation you are thinking about")
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.