Создание экспертной системы продукционного типа. Модифицирование программы GENI

Страницы работы

Содержание работы

Создание экспертной системы продукционного типа

Задание – вспомогательное. Исследовать работу программы GENI, сначала с базой правил, хранящейся в файле   GENI.GNI, затем с базой знаний, хранящейся в файле VACATION.GNI. В первом случае путем последовательного задания уточняющих вопросов программа угадывает задуманное животное. Во втором случае программа распознает место отдыха, о котором Вы мечтаете, также предварительно задав серию вопросов.

Задание основное. Модифицировать программу 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")

Похожие материалы

Информация о работе

Тип:
Расчетно-графические работы
Размер файла:
43 Kb
Скачали:
0