Экспертная система (Цветы) - Prolog

Узнай цену своей работы

Формулировка задачи:

Помогите разобраться...Есть экспертная система, не знаю как она работает. Как вводить запросы? Объяснииитее.... Оболочка экспертной системы
Листинг программы
  1. % ----------------Engine------------------
  2. :-multifile system/1, askable/1, clause_cf/3, explainThis/1.
  3. :-dynamic untrue/1, askable/1, clause_cf/3, explainThis/1.
  4.  
  5. %---------------Load base-----------------
  6. load:- consult('BaseKnowledge1').
  7. % ----------------Start-------------------
  8. loadexpert:-
  9. load,
  10. write('----------------------------------------------------------------------------------------'),nl,
  11. write('Введите цель | : '), read(X),
  12. expert(X),fail.
  13. expert(X):-
  14. solve(X,[],C,Proof),nl,
  15. write('----------------------------------------------------------------------------------------'),nl,
  16. write('Доказано '),write(X),
  17. write(' с уверенностью '),write(C),nl,
  18. write('Объясняем вывод:'),nl,
  19. interpret(Proof),
  20. write('----------------------------------------------------------------------------------------'),nl.
  21.  
  22. expert(X):-
  23. \+solve(X,[],_,_), nl,
  24. write('Ну я даже не знаю, что сказать:)'),fail.
  25. solve(true,_,1,true):-!.
  26. solve((A,B),Rules,C,(ProofA,ProofB)):-!,
  27. solve(A,Rules,C1,ProofA),
  28. solve(B,Rules,C2,ProofB),
  29. C is min(C1,C2).
  30. solve(not(A),_,1,'не доказуемо'(A)):-!,
  31. not(solve(A,_,_,_)).
  32. solve(A,Rules,C,(A:-Proof)):-
  33. not(system(A)),
  34. clause(A,B),
  35. solve(B,[rule(A,B)|Rules],C,Proof).
  36. solve(A,Rules,C,(A:-Proof)):-
  37. not(system(A)),
  38. clause_cf(A,B,C1),
  39. solve(B,[rule(A,B)|Rules],C2,Proof),
  40. C is C1*C2.
  41. solve(A,_,1,(A:-true)):-
  42. system(A),
  43. A.
  44. solve(A,Rules,C,Proof):-
  45. askable(A),
  46. \+known(A),
  47. ask(A,Answer),
  48. respond(Answer,A,Rules,C,Proof).
  49. % ----------------System-------------------
  50. system(is(_,_)).
  51. system(_=_).
  52. system(_<_).
  53. system(_>_).
  54. system(write(_)).
  55. system(nl).
  56. % ------------------Ask--------------------
  57. ask(A,Answer):-
  58. display_query(A),
  59. read(Answer).
  60. % ----------------Respond------------------
  61. respond(yes,A,_,1,(A:-true)):-
  62. assert(A).
  63. respond(no,A,_,0,_):-
  64. assert(untrue(A)),fail.
  65.  
  66. respond(why,A,Rules,C,_):-
  67. var(Rules),!,
  68. write('хочу использовать ложность'),
  69. write(A),nl,
  70. ask(A,Answer),
  71. respond(Answer,A,[],C,_).
  72. respond(why,A,[Rule|Rules],C,_):-
  73. write('хочу воспользоваться правилом:'),
  74. display_rule(Rule),
  75. ask(A,Answer),
  76. respond(Answer,A,Rules,C,_).
  77. respond(why,A,[],C,_):-
  78. write('<==возможности объяснения исчерпаны'),nl,
  79. ask(A,Answer),
  80. respond(Answer,A,[],C,_).
  81. respond(C,A,_,C,(A:-true)):-
  82. number(C),C>0, %C=\=1,
  83. assert(clause_cf(A,true,C)).
  84. %respond(1,A,_,1,(A:-true)):-
  85. % assert(A).
  86. respond(0,A,_,0,_):-
  87. assert(untrue(A)),fail.
  88. % ----------------Known-------------------
  89. %known(A):-
  90. % clause_cf(A,'как было сказано',_),!.
  91. known(A):-
  92. clause_cf(A,true,_),!.
  93. known(A):-A,!.
  94. known(A):-
  95. untrue(A).
  96. % -----------Display_query----------------
  97. display_query(A):-
  98. write(A),
  99. write('?').
  100. % -----------Display_rule-----------------
  101. display_rule(rule(A,B)):-
  102. nl,write('Если '),
  103. write_conjunction(B),
  104. write(' то '),
  105. write(A),nl.
  106. % ---------Write_conjunction--------------
  107. write_conjunction((A,B)):-
  108. !,write(A),write(' и '),
  109. write_conjunction(B).
  110. write_conjunction(A):-
  111. write(A),nl.
  112. % -----------Interpret--------------------
  113. interpret((ProofA,ProofB)):-!,
  114. interpret(ProofA),
  115. interpret(ProofB).
  116. interpret((member(_,_):-true)):-!.
  117. interpret((A:-true)):-!,nl,
  118. write(A),write('<= как было сказано'),nl.
  119. interpret('не доказуемо'(A)):-!,
  120. nl,write(A),write('<= не доказуемо'),nl.
  121. interpret(Proof):-
  122. fact(Proof,Fact),
  123. explainFact(Fact).
  124. interpret(Proof):-
  125. rule(Proof,Head,Body,Proof1),
  126. explainRule(Head,Body),
  127. interpret(Proof1).
  128. % -------------Fact----------------------
  129. fact((Fact:-true),Fact).
  130. %fact((Fact:-'как было сказано'),Fact).
  131. % -------------Rule----------------------
  132. rule((Goal:-Proof),Goal,Body,Proof):-
  133. not(Proof=true),
  134. extract_body(Proof,Body).
  135. % ------------Extract_body---------------
  136. extract_body((ProofA,ProofB),(BodyA,BodyB)):-
  137. !,
  138. extract_body(ProofA,BodyA),
  139. extract_body(ProofB,BodyB).
  140. extract_body((Goal:-_),Goal).
  141. extract_body('не доказуемо'(B),not(B)).
  142. %-------------ExplainRule----------------
  143. explainRule(Head,Body):-
  144. explainThis(Head),!, % Объяснять ли вывод предиката
  145. nl,write(Head),
  146. write(' доказано с использованием правила '),
  147. display_rule(rule(Head,Body)).
  148. explainRule(_,_).
  149. % ------------ExplainFact----------------
  150. explainFact(Fact):- % Объяснять ли вывод факта
  151. explainThis(Fact),!,
  152. nl,write(Fact),write('-это факт'),nl.
  153. explainFact(_).
База знаний "Цветы"
Листинг программы
  1. % база знаний - "Цветы"
  2. :- op(100,xfx,['- это','имеет','является']).
  3. :- dynamic 'имеет'/2.
  4.  
  5. clause_cf(
  6. X '- это' 'кактус',
  7. (X 'является' 'колючим цветком',
  8. X 'имеет' 'зеленый цвет',
  9. not(X 'имеет' 'стебель')),
  10. 0.9).
  11. clause_cf(
  12. X '- это' 'роза',
  13. (X 'является' 'колючим цветком',
  14. X 'имеет' 'стебель',
  15. X 'имеет' 'красивые лепестки'),
  16. 0.9).
  17. clause_cf(
  18. X '- это' 'лечебная ромашка',
  19. (not(X 'является' 'колючим цветком'),
  20. X 'имеет' 'белые лепестки',
  21. X 'имеет' 'лечебные свойства'),
  22. 0.8).
  23. clause_cf(
  24. X '- это' 'полевая ромашка',
  25. (not(X 'является' 'колючим цветком'),
  26. X 'имеет' 'белые лепестки',
  27. not(X 'имеет' 'лечебные свойства')),
  28. 0.8).
  29. X '- это' 'пион':-
  30. not(X 'является' 'колючим цветком'),
  31. X 'имеет' 'большие лепестки'.
  32. X '- это' 'тюльпан':-
  33. not(X 'является' 'колючим цветком'),
  34. X 'имеет' 'красивый бутон'.
  35. X 'является' 'колючим цветком':-
  36. X 'является' 'цветком',
  37. X 'имеет' 'колючки'.
  38. X 'является' 'колючим цветком':-
  39. X 'является' 'цветком',
  40. X 'имеет' 'шипы'.
  41. X 'является' 'цветком':-
  42. X 'имеет' 'стебель',
  43. X 'имеет' 'лепестки'.
  44. X 'является' 'цветком':-
  45. not(X 'имеет' 'стебель'),
  46. X 'имеет' 'колючки'.
  47. askable(_ 'имеет' _).
  48. flower(X,Y):-
  49. member(Y,['кактус','роза','лечебная ромашка','полевая ромашка','пион','тюльпан']),
  50. X '- это' Y.
  51. system(member(_,_)).
  52. explainThis('- это'(_,_)).
  53. explainThis('является'(_,_)).
  54. explainThis('имеет'(_,_)).

Решение задачи: «Экспертная система (Цветы)»

textual
Листинг программы
  1. ?- loadexpert.
  2. % BaseKnowledge1 compiled 0.01 sec, 280 bytes
  3. ----------------------------------------------------------------------------------------
  4. Введите цель | : ромашка имеет стебель.
  5. ромашка имеет стебель?yes.
  6.  
  7. ----------------------------------------------------------------------------------------
  8. Доказано ромашка имеет стебель с уверенностью 1
  9. Объясняем вывод:
  10.  
  11. ромашка имеет стебель<= как было сказано
  12. ----------------------------------------------------------------------------------------
  13. false.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

5   голосов , оценка 3.6 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы