Цель работы:
Создание программной экспертной системы в среде Visual Prolog.
Работа приведена в качестве примера.
Не высылайте ее в таком виде, вам ее не зачтут!
Краткое описание предметной области:
Предметная область: кулинария.
Данная предметная область содержит информацию по различным блюдам, например, из каких продуктов они готовятся, к каким видам относятся, какой консистенции должны быть и в каком состоянии подаваться.
Цель создания системы:
Используя данную экспертную систему, пользователь может определить блюдо по его характеристикам. Также систему можно использовать с целью выбора определенного блюда для приготовления, исходя из предпочтений пользователя или наличия тех или иных продуктов.
Формальное описание предметной области:
Правило 1.
ЕСЛИ блюдо должно подаваться горячим/теплым
И это блюдо жидкое,
ТО это первое блюдо.
Правило 2.
ЕСЛИ блюдо должно подаваться горячим/теплым
И это блюдо быстрого приготовления,
ТО это блюдо – фастфуд.
Правило 3.
ЕСЛИ блюдо должно подаваться горячим/теплым,
ТО это второе блюдо (“горячее”).
Правило 4.
ЕСЛИ блюдо легкое,
ТО это блюдо – салат.
Правило 5.
ЕСЛИ блюдо сладкое,
ТО это блюдо – десерт.
Правило 6.
ЕСЛИ блюдо – первое
И из мяса
И с тестом
И с картофелем
И с яйцом
И кисловатое,
ТО это суп щавелевый с галушками.
Правило 7.
ЕСЛИ блюдо – первое
И из мяса
И с картофелем
И с солеными огурцами
И кисловатое,
ТО это рассольник.
Правило 8.
ЕСЛИ блюдо – первое
И из мяса
И с картофелем
И с капустой,
ТО это борщ.
Правило 9.
ЕСЛИ блюдо – первое
И из курицы
И с картофелем
И с лапшой,
ТО это куриный суп.
Правило 10.
ЕСЛИ блюдо – первое
И из мясного фарша
И с картофелем
И с лапшой,
ТО это суп с фрикадельками.
Правило 11.
ЕСЛИ блюдо – первое
И из молока
И с лапшой,
ТО это молочный суп.
Правило 12.
ЕСЛИ блюдо – первое
И из рыбы
И с картофелем,
ТО это уха.
Правило 13.
ЕСЛИ блюдо – второе
И из мясного фарша
И с картофелем
И традиционное,
ТО это пюре с котлетой.
Правило 14.
ЕСЛИ блюдо – второе
И из мясного фарша
И с рисом
И с капустой,
ТО это голубцы.
Правило 15.
ЕСЛИ блюдо – второе
И из мяса
И с рисом,
ТО это плов.
Правило 16.
ЕСЛИ блюдо – второе
И из мясного фарша
И из теста
И на пару,
ТО это манты.
Правило 17.
ЕСЛИ блюдо – второе
И из мясного фарша
И из теста,
ТО это пельмени.
Правило 18.
ЕСЛИ блюдо – второе
И из мяса
И с картофелем
И с сыром
И с майонезом,
ТО это мясо по-французски.
Правило 19.
ЕСЛИ блюдо – второе
И из рыбы
И с начинкой,
ТО это рыба фаршированная.
Правило 20.
ЕСЛИ блюдо – фастфуд
И из теста
И с помидорами
И с колбасой
И с сыром
И с оливками,
ТО это пицца.
Правило 21.
ЕСЛИ блюдо – фастфуд
И из теста
И с колбасой
И с сыром
И с майонезом,
ТО это бутерброд.
Правило 22.
ЕСЛИ блюдо – салат
И из мяса
И с картофелем
И с солеными огурцами
И с яйцом
И с майонезом
И традиционное,
ТО это зимний.
Правило 23.
ЕСЛИ блюдо – салат
И с помидорами
И со свежими огурцами
И с сыром
И с оливками
И с майонезом,
ТО это греческий.
Правило 24.
ЕСЛИ блюдо – салат
И из мяса
И с морковью
И кисловатое,
ТО это хе.
Правило 25.
ЕСЛИ блюдо – салат
И с картофелем
И с яйцом
И с сыром
И с майонезом
И с гранатами,
ТО это красная шапочка.
Правило 26.
ЕСЛИ блюдо – салат
И с помидорами
И со свежими огурцами
И с майонезом,
ТО это летний.
Правило 27.
ЕСЛИ блюдо – салат
И из курицы
И с картофелем
И с солеными огурцами
И с яйцом
И с майонезом
И с сыром,
ТО это нежность.
Правило 28.
ЕСЛИ блюдо – десерт
И из теста
И из молока
И с начинкой,
ТО это блин сладкий.
Правило 29.
ЕСЛИ блюдо – десерт
И из теста
И из молока,
ТО это блин.
Правило 30.
ЕСЛИ блюдо – десерт
И с начинкой
И с шоколадом,
ТО это шоколадные конфеты.
Правило 31.
ЕСЛИ блюдо – десерт
И с начинкой
И из теста,
ТО это торт.
Правило 32.
ЕСЛИ блюдо – десерт
И с начинкой
И из молока
И очень холодное,
ТО это мороженое.
Правило 33.
ЕСЛИ блюдо – десерт
И с шоколадом
И из молока
И очень холодное,
ТО это мороженое.
Правило 34.
ЕСЛИ блюдо – десерт
И из молока
И очень холодное,
ТО это мороженое.
Правило 35.
ЕСЛИ блюдо – десерт
И из молока,
ТО это молочный коктейль.
Пример работы системы.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
1. ?- retractall(_), recognition("блюдо"). Блюдо должно подаваться горячим/теплым? y блюдо жидкое? y это более всего похоже на блюдо – первое (правило 1) из мяса? n из курицы? y с лапшой? y с картофелем? y это более всего похоже на первое – куриный суп (правило 9) yes |
Пример показывает полное распознавание блюда.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
2. ?- retractall(_), recognition("блюдо"). Блюдо должно подаваться горячим/теплым? n блюдо легкое? y это более всего похоже на блюдо - салат (правило 4) из мяса? n с помидорами? n с картофелем? y с яйцом? y с сыром? y с майонезом? y с гранатами? y это более всего похоже на салат – красная шапочка (правило 25) yes |
Листинг программы на языке Visial Prolog:
1 2 3 4 5 6 7 8 9 10 11 12 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 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 |
domains str=string. int=integer. intlist=integer*. predicates nondeterm rule(int,str,str,intlist). nondeterm complete(int). nondeterm recognition(str). nondeterm discover(intlist). nondeterm ask(int). facts fact(int,str). clauses rule(1,"блюдо","первое",[1,2]). rule(2,"блюдо","фастфуд",[1,3]). rule(3,"блюдо","второе",[1]). rule(4,"блюдо","салат",[4]). rule(5,"блюдо","десерт",[5]). rule(6,"первое","суп щавелевый с галушками",[6,10,12,18,27]). rule(7,"первое","рассольник",[6,12,16,27]). rule(8,"первое","борщ",[6,12,14]). rule(9,"первое","куриный суп",[7,11,12]). rule(10,"первое","суп с фрикадельками",[8,11,12]). rule(11,"первое","молочный суп",[11,26]). rule(12,"первое","уха",[9,12]). rule(13,"второе","пюре с котлетой",[8,12,29]). rule(14,"второе","голубцы",[8,13,14]). rule(15,"второе","плов",[6,13]). rule(16,"второе","манты",[8,10,28]). rule(17,"второе","пельмени",[8,10]). rule(18,"второе","мясо по-французски",[6,12,20,22]). rule(19,"второе","рыба фаршированная",[9,24]). rule(20,"фастфуд","пицца",[10,15,17,20,21]). rule(21,"фастфуд","бутерброд",[10,17,20,22]). rule(22,"салат","зимний",[6,12,16,18,22,29]). rule(23,"салат","греческий",[15,16,20,21,22]). rule(24,"салат","хе",[6,19,27]). rule(25,"салат","красная шапочка",[12,18,20,22,23]). rule(26,"салат","летний",[15,16,22]). rule(27,"салат","нежность",[7,12,16,18,20,22]). rule(28,"десерт","блин сладкий",[10,24,26]). rule(29,"десерт","блин",[10,26]). rule(30,"десерт","шоколадные конфеты",[24,25]). rule(31,"десерт","торт",[10,24]). rule(32,"десерт","мороженое",[26,24,30]). rule(33,"десерт","мороженое",[26,25,30]). rule(34,"десерт","мороженое",[26,30]). rule(35,"десерт","молочный коктейль",[26]). ask(X):-fact(X,"y"),!. ask(X):-fact(X,"n"),!,fail. ask(1):-write("блюдо должно подаваться горячим/теплым ?"),!,complete(1). ask(2):-write("блюдо жидкое?"),!,complete(2). ask(3):-write("блюдо быстрого приготовления?"),!,complete(3). ask(4):-write("блюдо легкое?"),!,complete(4). ask(5):-write("блюдо сладкое?"),!,complete(5). ask(6):-write("из мяса?"),!,complete(6). ask(7):-write("из курицы?"),!,complete(7). ask(8):-write("из мясного фарша?"),!,complete(8). ask(9):-write("из рыбы?"),!,complete(9). ask(10):-write("с тестом / из теста?"),!,complete(10). ask(11):-write("с лапшой?"),!,complete(11). ask(12):-write("с картофелем?"),!,complete(12). ask(13):-write("с рисом?"),!,complete(13). ask(14):-write("с капустой?"),!,complete(14). ask(15):-write("с помидорами?"),!,complete(15). ask(16):-write("с солеными/свежими огурцами?"),!,complete(16). ask(17):-write("с колбасой?"),!,complete(17). ask(18):-write("с яйцом?"),!,complete(18). ask(19):-write("с морковью?"),!,complete(19). ask(20):-write("с сыром?"),!,complete(20). ask(21):-write("с оливками?"),!,complete(21). ask(22):-write("с майонезом?"),!,complete(22). ask(23):-write("с гранатами?"),!,complete(23). ask(24):-write("с начинкой?"),!,complete(24). ask(25):-write("с шоколадом?"),!,complete(25). ask(26):-write("из молока?"),!,complete(26). ask(27):-write("кисловатое?"),!,complete(27). ask(28):-write("на пару?"),!,complete(28). ask(29):-write("традиционное?"),!,complete(29). ask(30):-write("очень холодное?"),!,complete(30). recognition(X):- rule(N, X, Y, Z), discover(Z), !, write(" это более всего похоже на ", X, " - ", Y, " (правило ", N,")"), nl, recognition(Y). recognition("блюдо"):- write("это блюдо системе не известно!"),nl,!. recognition("первое"):- write("это блюдо системе не известно, но его состав очень оригинален!"),nl,!. recognition("второе"):- write("это блюдо системе не известно, но его состав очень оригинален!"),nl,!. recognition("фастфуд"):- write("это блюдо системе не известно!"),nl,!. recognition("салат"):- write("это блюдо системе не известно, но его состав очень оригинален!"),nl,!. recognition("десерт"):- write("это блюдо системе не известно!"),nl,!. recognition(_). discover([]). discover([X|Y]):- ask(X), discover(Y). complete(X):- nl, readln(Y), assert(fact(X, Y)), Y="y". goal retractall(_), recognition("блюдо"). |
почему то выдает ошибку е150 у в начале строки nondeterm rule(int,str,str,intlist).
я не в курсе, это было так давно ….
возможно у вас gui компилятор, нужно DOSовский