Создание программной экспертной системы в среде Visual Prolog.

Цель работы:
Создание программной экспертной системы в среде 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.
?- retractall(_), recognition("блюдо").
Блюдо должно подаваться горячим/теплым?
y
блюдо жидкое?
y
это более всего похоже на блюдо – первое (правило 1)
из мяса?
n
из курицы?
y
с лапшой?
y
с картофелем?
y
это более всего похоже на первое – куриный суп (правило 9)
yes

Пример показывает полное распознавание блюда.

2.
?- retractall(_), recognition("блюдо").
Блюдо должно подаваться горячим/теплым?
n
блюдо легкое?
y
это более всего похоже на блюдо - салат (правило 4)
из мяса?
n
с помидорами?
n
с картофелем?
y
с яйцом?
y
с сыром?
y
с майонезом?
y
с гранатами?
y
это более всего похоже на салат – красная шапочка (правило 25)
yes

Листинг программы на языке Visial Prolog:

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("блюдо").

2 комментария

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *