Пролог - часть 2

Материал из DOM

Перейти к: навигация, поиск

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

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

Персонаж Характеристики
Буратино
Пол: мужской
Нос: длинный
Характер: вредный
Головной убор: красный колпак
Хвост: нет
Мальвина
Пол: женский
Нос: короткий
Характер: надоедливый
Головной убор: белые банты
Хвост: нет
Пьеро
Пол: мужской
Нос: заплаканный
Характер: психически-неуравновешеный
Головной убор: белая треуголка
Золотая Рыбка
Пол: женский
Характер: непредсказуемый
Головной убор: золотая корона
Одежда: чешуя
Размеры: 10-15 см.
Хвост: есть
Щелкунчик
Пол: мужской
Характер: бесстрашный
Одежда: отсутствует
Зубы: большие


Затем мы должны накопленные от экспертов знания представить в определенной форме, которую будет понимать машина вывода пролога: здесь перед нами две альтернативы:

Прежде всего, разработаем систему на продукционных правилах (под продукционным правилом понимают запись: “если X1, X2, .. Xn то Y”):

database характеристики
 база_да (string)
 база_нет (string)
domains
 ИмяПерсонажа, Характеристика = string
predicates
 nondeterm правило (ИмяПерсонажа)  - (i) (o) 
 determ да (Характеристика)  - (i)  
 determ нет (Характеристика)  - (i)  
 determ спросить (Характеристика) - (i)
 determ запомнить_ответ (Характеристика, char) - (i, i)
clauses
 
 правило ("Буратино"):-
  да ("пол мужской"),
  да ("характер вредный"),
  да ("головной убор в виде колпака"),
  нет ("хвост есть").
 
 правило ("Мальвина"):-
  да ("пол женский"),
  да ("характер надоедливый"),
  да ("головной убор в виде белых бантов"),
  нет ("хвост есть").
 
 правило ("Пьеро"):-
  да ("пол мужской"),
  да ("характер неустойчивый"),
  да ("головной убор в белой треуголки"),
  нет ("хвост есть").
 
 правило ("ЗолотаяРыбка"):-
  да ("пол женский"),
  да ("характер непредсказуемый"),
  да ("головной убор в виде золотой короны"),
  да ("хвост есть"),
  да ("размеры: 10-15 см").
 
 правило ("Щелкунчик"):-
  да ("пол мужской"),
  да ("характер бесстрашный"),
  нет ("одежда хоть какая-нибудь"),
  да ("зубы большие").
 
 
 да (Вопрос) :-
  база_да (Вопрос),!.
 да (Вопрос) :-
  база_нет (Вопрос),!, fail.
 
 да (Вопрос):-
  спросить (Вопрос),!, да (Вопрос).
 
 нет (Вопрос) :-
  база_нет (Вопрос),!.
 нет (Вопрос) :-
  база_да (Вопрос),!, fail.
 нет (Вопрос):-
  спросить (Вопрос),!, нет (Вопрос).
 
 спросить (Вопрос):-
  write ("Скажите: ", Вопрос, " это правда или нет (y/n)"), nl,
  readchar (Answer),
 
  запомнить_ответ (Вопрос, Answer).
 запомнить_ответ (Вопрос, Ответ) :-
  Ответ =  'y',
  asserta (база_да(Вопрос)),!.
 
 запомнить_ответ (Вопрос, Ответ) :-
  asserta (база_нет(Вопрос)),!.
 
goal
 
 правило (КтоЭтоТакой).

А вот пример диалога с пользователем:

Скажите: пол мужской это правда или нет (y/n) Скажите: характер вредный это правда или нет (y/n) Скажите: головной убор в виде колпака это правда или нет (y/n) Скажите: хвост есть это правда или нет (y/n) КтоЭтоТакой=Буратино Скажите: пол женский это правда или нет (y/n) Скажите: характер неустойчивый это правда или нет (y/n) Скажите: характер бесстрашный это правда или нет (y/n) Скажите: одежда хоть какая-нибудь это правда или нет (y/n) 1 Solution


Второй способ создания экспертной системы называется «на фактах». Примерный код такой экспертной системы приводится ниже:

database  - характеристики
 база_да (string)
 база_нет (string)
domains
 ИмяПерсонажа, Характеристика = string
 ilist = integer*
predicates
 nondeterm условие(integer , Характеристика, ilist)
 nondeterm факт (integer , string)
 nondeterm проверить (ilist)
 
 determ да (Характеристика)  - (i)  
 determ нет (Характеристика)  - (i)  
 determ спросить (Характеристика) - (i)
 determ запомнить_ответ (Характеристика, char) - (i, i)
 
clauses
 
 факт (1, "пол мужской").
 факт (2, "пол женский").
 факт (3, "характер вредный").
 факт (4, "головной убор в виде колпака").
 факт (5, "хвост есть").
 факт (6, "характер надоедливый").
 факт (7, "головной убор в виде белых бантов").
 факт (8, "характер неустойчивый").
 факт (9, "головной убор в виде белой треуголки").
 факт (10, "характер непредсказуемый").
 факт (11, "головной убор в виде золотой короны").
 факт (12, "размеры: 10-15 см").
 факт (13, "характер бесстрашный").
 факт (14, "одежда вообще есть хоть какая-нибудь").
 факт (15, "зубы большие").
 
 условие (1, "Буратино", [1, 3, 4, -5]).
 условие (2, "Мальвина", [-1, 6, 7, -5]).
 условие (3, "Пьеро", [1, 8, 9, -5]).
 условие (4, "ЗолотаяРыбка", [-1, 10, 11, 5]). 
 условие (5, "Щелкунчик", [1, 13, -14, -5, 15]). 
 проверить ([Голова|Хвост]):-
   Голова > 0,!,
   факт (Голова, Название),
   да(Название),
   проверить(Хвост).
 проверить ([Голова|Хвост]):-
   Голова < 0,!,
   Голова1 = -Голова,
   факт (Голова1, Название),
   нет(Название),
   проверить(Хвост).
 
 
 проверить ([]):-!.  
 да (Вопрос) :-
  база_да (Вопрос),!.
 да (Вопрос) :-
  база_нет (Вопрос),!, fail.
 да (Вопрос):-
  спросить (Вопрос),!, да (Вопрос).
 
нет (Вопрос) :-
  база_нет (Вопрос),!.
 нет (Вопрос) :-
  база_да (Вопрос),!, fail.
 нет (Вопрос):-
  спросить (Вопрос),!, нет (Вопрос).
 
 спросить (Вопрос):-
  write ("Скажите: ", Вопрос, " это правда или нет (y/n)"), nl,
  readchar (Answer),
  запомнить_ответ (Вопрос, Answer).
 
 запомнить_ответ (Вопрос, Ответ) :-
  Ответ =  'y',
  asserta (база_да(Вопрос)),!.
 
 запомнить_ответ (Вопрос, Ответ) :-
  asserta (база_нет(Вопрос)),!.
 
 
 goal
  условие (_, X, Y),
 
  write ("Есть идея, что это ", X, " давайте проверим:"),nl,
  проверить (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

Subscribe Now!

 

ObMachine projects & articles (java, flash, flex, php, ...)  -- black-zorro.com