Следующая программа (EXPERT 1. PRO) представляет собой
простейший пример в виде ЭС выбора породы собаки. Перед началом
написания ЭС следует определить структуру области приложения и
соответствующей ей базы знаний. Упрощенный вариант подобной
структуры для пород собак приведен на рис.2.
В ЭС будут использоваться следующие характеристики: длины
шерсти, рост, размер хвоста, размер ушей, вес, характер. Мно-
жество характеристик для каждой породы могут определять ее поло-
жение в древовидной структуре базы знаний.
Полный текст программы с поясняющими комментариями приво-
дится ниже.
/* Программа EXPERT1.PRO */
#M
database
xpositive(symbol,symbol)
xnegative(symbol,symbol)
predicates
do_expert_job
do_consulting
ask(symbol,symbol)
dog_is(symbol)
it_is(symbol)
positive(symbol,symbol)
negative(symbol,symbol)
remember(symbol,symbol,symbol)
clear_facts
goal
do_expert_job.
clauses
/*-------- Предикаты системы пользовательского интерфейса -------*/
do_expert_job :-
makewindow(1,$1A,$31,"ЭКСПЕРТНАЯ СИСТЕМА",1,16,22,58),
write("\t * * * * * * * * * * * * * * * * * * * *"),nl,
write("\t ОПРЕДЕЛЕНИЕ ПОРОДЫ СОБАКИ"),nl,nl,
write("\t Программа позволяет выбрать собаку"),nl,
write("\t интересующей Вас породы. На вопросы"),nl,
write("\t системы отвечайте 'да' или 'нет'."),nl,
write("\t * * * * * * * * * * * * * * * * * * * *"),
nl,nl,
do_consulting,
write("Нажмите пробел ..."),nl,
readchar(_),
removewindow,
exit.
do_consulting :-
dog_is(X),!,nl,
write(" Вам нужна собака породы ",X,"."),nl,
save("reply.dba"),
clear_facts.
do_consulting :-
nl,write(" Извините, я не могу вам помочь. В базе данных"),
nl,write(" нет породы, удовлетворяющей Вашим требованиям."),
save("reply.dba"),
clear_facts.
ask(X,Y) :-
write(" - ",X," она ",Y,"? "),
readln(Reply),
remember(X,Y,Reply).
/* МЕХАНИЗМ ВЫВОДА */
positive(X,Y) :-
xpositive(X,Y),!.
positive(X,Y) :-
not(negative(X,Y)),!,
ask(X,Y).
negative(X,Y) :-
xnegative(X,Y),!.
remember(X,Y,"да") :-
asserta(xpositive(X,Y)).
remember(X,Y,"нет") :-
asserta(xnegative(X,Y)),
fail.
clear_facts :-
retract(xpositive(_,_)),
fail.
clear_facts :-
retract(xnegative(_,_)),
fail.
include "dogs.rul" % ПРОДУКЦИОННЫЕ ПРАВИЛА #P
Для работы программы необходима база знаний, состоящая из правил,
хранимых в файле DOGS.RUL:
#M
CLAUSES
dog_is("АНГЛИЙСКИЙ БУЛЬДОГ") :-
it_is("короткошерстная порода"),
positive("имеет","рост менее 50 см"),
positive("имеет","короткий хвост"),
positive("имеет","добродушный характер"),!.
dog_is("ГОНЧАЯ") :-
it_is("короткошерстная порода"),
positive("имеет","рост менее 50 см"),
positive("имеет","длинные уши"),
positive("имеет","добродушный характер"),!.
dog_is("ДАТСКИЙ ДОГ") :-
it_is("короткошерстная порода"),
positive("имеет","короткий хвост"),
positive("имеет","добродушный характер"),
positive("имеет","вес более 50 кг"),!.
dog_is("ФОКСХАУНД") :-
it_is("короткошерстная порода"),
positive("имеет","рост менее 70 см"),
positive("имеет","длинные уши"),
positive("имеет","добродушный характер"),!.
dog_is("КОККЕР-СПАНИЭЛЬ") :-
it_is("длинношерстная порода"),
positive("имеет","рост менее 50 см"),
positive("имеет","короткий хвост"),
positive("имеет","длинные уши"),
positive("имеет","добродушный характер"),!.
dog_is("ИРЛАНДСКИЙ СЕТТЕР") :-
it_is("длинношерстная порода"),
positive("имеет","рост менее 70 см"),
positive("имеет","длинные уши"),!.
dog_is("КОЛЛИ") :-
it_is("длинношерстная порода"),
positive("имеет","рост менее 70 см"),
positive("имеет","короткий хвост"),
positive("имеет","добродушный характер"),!.
dog_is("СЕНБЕРНАР") :-
it_is("длинношерстная порода"),
positive("имеет","длинные уши"),
positive("имеет","добродушный характер"),
positive("имеет","вес более 50 кг"),!.
it_is("короткошерстная порода") :-
positive("имеет","короткую шерсть"),!.
it_is("длинношерстная порода") :-
positive("имеет","длинную шерсть"),!. #P
Цель программы экспертной системы EXPERT1.PRO определяется через
предикат do_exprt_job. Предикаты ask и remember осуществляют вза-
имодействие с пользователем, принимая и занося информацию об от-
ветах в динамическую базу данных. Предикаты БД xpositive
и xnegative используются для хранения ответов пользователя. Во-
семь продукционных правил dog_is(по одному для каждой породы)
хранят статическую информацию ЭС. На первом уровне древовидной
структуры БЗ классификация осуществляется при помощи предиката
it_is. Остальные предикаты обновляют данные и отображают процесс
консультации на экране дисплея.
|