Логическое программирование на Пролог. Часть 2

February 2, 2007

Пример экспертных систем про сказки народов мира



В качестве пример создадим экспертную систему «СказкиНародовМира» - данная система может быть использована как наглядное пособие при опознании различных героев различных сказок. (грубо говоря вы называете характеристики внешнего вида и поведения героев а экспертная система сообщает кто это может быть). Прежде всего, мы определим возможные виды сущностей: ими будут следующие персонажи: Буратино, Мальвина, Пьеро, ЗолотаяРыбка, Щелкунчик. Соответствие между персонажами и их характеристиками можно представить в следующей таблице:
Персонаж Характеристики
Буратино Пол: мужской Нос: длинный Характер: вредный Головной убор: красный колпак Хвост: нет
Мальвина Пол: женский Нос: короткий Характер: надоедливый Головной убор: белые банты Хвост: нет
Пьеро Пол: мужской Нос: заплаканный Характер: психически-неуравновешеный Головной убор: белая треуголка
Золотая Рыбка Пол: женский Характер: непредсказуемый Головной убор: золотая корона Одежда: чешуя Размеры: 10-15 см. Хвост: есть
Щелкунчик Пол: мужской Характер: бесстрашный Одежда: отсутствует Зубы: большие
Затем мы должны накопленные от экспертов знания представить в определенной форме, которую будет понимать машина вывода пролога: здесь перед нами две альтернативы:

Прежде всего, разработаем систему на продукционных правилах (под продукционным правилом понимают запись: “если X1, X2, .. Xn то Y”):
  1. database характеристики
  2.  база_да (string)
  3.  база_нет (string)
  4. domains
  5.  ИмяПерсонажа, Характеристика = string
  6. predicates
  7.  nondeterm правило (ИмяПерсонажа)  - (i) (o) 
  8.  determ да (Характеристика)  - (i)  
  9.  determ нет (Характеристика)  - (i)  
  10.  determ спросить (Характеристика) - (i)
  11.  determ запомнить_ответ (Характеристика, char) - (i, i)
  12. clauses
  13.  
  14.  правило ("Буратино"):-
  15.   да ("пол мужской"),
  16.   да ("характер вредный"),
  17.   да ("головной убор в виде колпака"),
  18.   нет ("хвост есть").
  19.  
  20.  правило ("Мальвина"):-
  21.   да ("пол женский"),
  22.   да ("характер надоедливый"),
  23.   да ("головной убор в виде белых бантов"),
  24.   нет ("хвост есть").
  25.  
  26.  правило ("Пьеро"):-
  27.   да ("пол мужской"),
  28.   да ("характер неустойчивый"),
  29.   да ("головной убор в белой треуголки"),
  30.   нет ("хвост есть").
  31.  
  32.  правило ("ЗолотаяРыбка"):-
  33.   да ("пол женский"),
  34.   да ("характер непредсказуемый"),
  35.   да ("головной убор в виде золотой короны"),
  36.   да ("хвост есть"),
  37.   да ("размеры: 10-15 см").
  38.  
  39.  правило ("Щелкунчик"):-
  40.   да ("пол мужской"),
  41.   да ("характер бесстрашный"),
  42.   нет ("одежда хоть какая-нибудь"),
  43.   да ("зубы большие").
  44.  
  45.  
  46.  да (Вопрос) :-
  47.   база_да (Вопрос),!.
  48.  да (Вопрос) :-
  49.   база_нет (Вопрос),!, fail.
  50.  
  51.  да (Вопрос):-
  52.   спросить (Вопрос),!, да (Вопрос).
  53.  
  54.  нет (Вопрос) :-
  55.   база_нет (Вопрос),!.
  56.  нет (Вопрос) :-
  57.   база_да (Вопрос),!, fail.
  58.  нет (Вопрос):-
  59.   спросить (Вопрос),!, нет (Вопрос).
  60.  
  61.  спросить (Вопрос):-
  62.   write ("Скажите: ", Вопрос, " это правда или нет (y/n)"), nl,
  63.   readchar (Answer),
  64.  
  65.   запомнить_ответ (Вопрос, Answer).
  66.  запомнить_ответ (Вопрос, Ответ) :-
  67.   Ответ =  'y',
  68.   asserta (база_да(Вопрос)),!.
  69.  
  70.  запомнить_ответ (Вопрос, Ответ) :-
  71.   asserta (база_нет(Вопрос)),!.
  72.  
  73. goal
  74.  
  75.  правило (КтоЭтоТакой).
А вот пример диалога с пользователем:
Скажите: пол мужской это правда или нет (y/n)
Скажите: характер вредный это правда или нет (y/n)
Скажите: головной убор в виде колпака это правда или нет (y/n)
Скажите: хвост есть это правда или нет (y/n)
КтоЭтоТакой=Буратино
Скажите: пол женский это правда или нет (y/n)
Скажите: характер неустойчивый это правда или нет (y/n)
Скажите: характер бесстрашный это правда или нет (y/n)
Скажите: одежда хоть какая-нибудь это правда или нет (y/n)
1 Solution
Второй способ создания экспертной системы называется «на фактах». Примерный код такой экспертной системы приводится ниже:
  1. database  - характеристики
  2.  база_да (string)
  3.  база_нет (string)
  4. domains
  5.  ИмяПерсонажа, Характеристика = string
  6.  ilist = integer*
  7. predicates
  8.  nondeterm условие(integer , Характеристика, ilist)
  9.  nondeterm факт (integer , string)
  10.  nondeterm проверить (ilist)
  11.  
  12.  determ да (Характеристика)  - (i)  
  13.  determ нет (Характеристика)  - (i)  
  14.  determ спросить (Характеристика) - (i)
  15.  determ запомнить_ответ (Характеристика, char) - (i, i)
  16.  
  17. clauses
  18.  
  19.  факт (1, "пол мужской").
  20.  факт (2, "пол женский").
  21.  факт (3, "характер вредный").
  22.  факт (4, "головной убор в виде колпака").
  23.  факт (5, "хвост есть").
  24.  факт (6, "характер надоедливый").
  25.  факт (7, "головной убор в виде белых бантов").
  26.  факт (8, "характер неустойчивый").
  27.  факт (9, "головной убор в виде белой треуголки").
  28.  факт (10, "характер непредсказуемый").
  29.  факт (11, "головной убор в виде золотой короны").
  30.  факт (12, "размеры: 10-15 см").
  31.  факт (13, "характер бесстрашный").
  32.  факт (14, "одежда вообще есть хоть какая-нибудь").
  33.  факт (15, "зубы большие").
  34.  
  35.  условие (1, "Буратино", [1, 3, 4, -5]).
  36.  условие (2, "Мальвина", [-1, 6, 7, -5]).
  37.  условие (3, "Пьеро", [1, 8, 9, -5]).
  38.  условие (4, "ЗолотаяРыбка", [-1, 10, 11, 5]). 
  39.  условие (5, "Щелкунчик", [1, 13, -14, -5, 15]). 
  40.  проверить ([Голова|Хвост]):-
  41.    Голова > 0,!,
  42.    факт (Голова, Название),
  43.    да(Название),
  44.    проверить(Хвост).
  45.  проверить ([Голова|Хвост]):-
  46.    Голова < 0,!,
  47.    Голова1 = -Голова,
  48.    факт (Голова1, Название),
  49.    нет(Название),
  50.    проверить(Хвост).
  51.  
  52.  
  53.  проверить ([]):-!.  
  54.  да (Вопрос) :-
  55.   база_да (Вопрос),!.
  56.  да (Вопрос) :-
  57.   база_нет (Вопрос),!, fail.
  58.  да (Вопрос):-
  59.   спросить (Вопрос),!, да (Вопрос).
  60.  
  61. нет (Вопрос) :-
  62.   база_нет (Вопрос),!.
  63.  нет (Вопрос) :-
  64.   база_да (Вопрос),!, fail.
  65.  нет (Вопрос):-
  66.   спросить (Вопрос),!, нет (Вопрос).
  67.  
  68.  спросить (Вопрос):-
  69.   write ("Скажите: ", Вопрос, " это правда или нет (y/n)"), nl,
  70.   readchar (Answer),
  71.   запомнить_ответ (Вопрос, Answer).
  72.  
  73.  запомнить_ответ (Вопрос, Ответ) :-
  74.   Ответ =  'y',
  75.   asserta (база_да(Вопрос)),!.
  76.  
  77.  запомнить_ответ (Вопрос, Ответ) :-
  78.   asserta (база_нет(Вопрос)),!.
  79.  
  80.  
  81.  goal
  82.   условие (_, X, Y),
  83.  
  84.   write ("Есть идея, что это ", X, " давайте проверим:"),nl,
  85.   проверить (Y), write ("Доказано, это ", X).
И результат работы данной программки
Есть идея, что это Буратино давайте проверим:
 Скажите: пол мужской это правда или нет (y/n)
 Скажите: характер вредный это правда или нет (y/n)
 Скажите: головной убор в виде колпака это правда или нет (y/n)
 Скажите: хвост есть это правда или нет (y/n)
 Доказано, это БуратиноX=Буратино, Y=[1,3,4,-5]
 Есть идея, что это Мальвина давайте проверим:
 Есть идея, что это Пьеро давайте проверим:
 Скажите: характер неустойчивый это правда или нет (y/n)
 Есть идея, что это ЗолотаяРыбка давайте проверим:
 Есть идея, что это Щелкунчик давайте проверим:
 Скажите: характер бесстрашный это правда или нет (y/n)
 Скажите: одежда вообще есть хоть какая-нибудь это правда или нет (y/n)
 Скажите: зубы большие это правда или нет (y/n)
 Доказано, это ЩелкунчикX=Щелкунчик, Y=[1,13,-14,-5,15]
 2 Solutions