Скажите: пол мужской это правда или нет (y/n) Скажите: характер вредный это правда или нет (y/n) Скажите: головной убор в виде колпака это правда или нет (y/n) Скажите: хвост есть это правда или нет (y/n) КтоЭтоТакой=Буратино Скажите: пол женский это правда или нет (y/n) Скажите: характер неустойчивый это правда или нет (y/n) Скажите: характер бесстрашный это правда или нет (y/n) Скажите: одежда хоть какая-нибудь это правда или нет (y/n) 1 Solution
« Логическое программирование на Пролог. Часть 1 | Логическое программирование на Пролог. Часть 3 » |
Логическое программирование на Пролог. Часть 2
Пример экспертных систем про сказки народов мира
В качестве пример создадим экспертную систему «СказкиНародовМира» - данная система может быть использована как наглядное пособие при опознании различных героев различных сказок. (грубо говоря вы называете характеристики внешнего вида и поведения героев а экспертная система сообщает кто это может быть). Прежде всего, мы определим возможные виды сущностей: ими будут следующие персонажи: Буратино, Мальвина, Пьеро, ЗолотаяРыбка, Щелкунчик. Соответствие между персонажами и их характеристиками можно представить в следующей таблице:
Персонаж | Характеристики |
---|---|
Буратино | Пол: мужской Нос: длинный Характер: вредный Головной убор: красный колпак Хвост: нет |
Мальвина | Пол: женский Нос: короткий Характер: надоедливый Головной убор: белые банты Хвост: нет |
Пьеро | Пол: мужской Нос: заплаканный Характер: психически-неуравновешеный Головной убор: белая треуголка |
Золотая Рыбка | Пол: женский Характер: непредсказуемый Головной убор: золотая корона Одежда: чешуя Размеры: 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
правило (КтоЭтоТакой).
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
« Логическое программирование на Пролог. Часть 1 | Логическое программирование на Пролог. Часть 3 » |