Пролог - часть 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! |
|
