Листинг экспертной системы, базирующейся на фактах



 

 

/* Программа: Эксперт по породам собак                                    */

/* Пример экспертной системы, базирующейся на логике        */

Domains

conditions = integer *  

history     = integer *

Database

/* Предикаты базы данных    */

rule(integer, symbol,symbol, conditions)

cond(integer, symbol)

yes(integer)

no(integer)

Predicates

/* Предикаты системы пользовательского интерфейса */

do_expert_job

do_consulting

goes(symbol)

clear

/* Предикаты механизма вывода    */

go(history, symbol)

check(integer, history, conditions)

Inpo(history, integer, integer, symbol)

do_answer(history, integer, symbol,integer, integer)

Goal

do_expert_job.

Clauses

/* База знаний (БЗ)      */

rule(1,      "Собака", "Короткошерстная собака", [1]).

rule(2,      "Собака", "Длинношерстная собака ", [2]).

rule(3,      "Короткошерстная собака","Английский бульдог",[3,5,7]).

rule(4,      "Короткошерстная собака","Гончая", [3,6,7]).

rule(5,      "Короткошерстная собака","Немецкий Дог", [5,6,7,8]).

rule(6,      "Короткошерстная собака","Американский фоксхаунд", 

                                                                                             [4,6,7]).

rule(7,      "Длинношерстная собака ", "Кокер спаниель", [3,5,6,7]).

rule(8,      "Длинношерстная собака ", "Ирландский Сеттер", [4,6]).

rule(9, "Длинношерстная собака ", "Колли", [4,5,7]).

rule(10, "Длинношерстная собака ", "Сенбернар", [5,7,8]).

 

cond(1,"Короткошерстная").

cond(2,"Длинношерстная").

cond(3,"Высота в холке не более 57 см").

cond(4,"Высота в холке не более 77 см ").

cond(5,"Низко посаженный хвост").

cond(6,    "Длинные уши").

cond(7,    "Дружелюбный характер").

cond(8,    "Вес более 45 кг").

/* Система пользовательского интерфейса */

do_expert_job :–

makewindow(1,7,7,"ЭКСПЕРТ ПО ПОРОДАМ СОБАК", 0, 0, 25, 80),

do_consulting, nl, nl, nl, nl, write("Нажмите любую клавишу"),

readchar(_), exit.

                           

do_consulting :–goes(Mygoal),go([],Mygoal),!.

do_consulting :­­–nl, write("Извините, я не смогу Вам помочь") ,clear.

do_consulting.

 

goes(Mygoal) :– clear,clearwindow, nl, nl,nl,nl,

          write("ДОБРО ПОЖАЛОВАТЬ"),nl, nl, nl,

          write("Проводится идентификация породы"),nl,

          write("Для того, чтобы начать процесс идентификации,"),nl,

          write("введите слово 'Собака'. "), nl, nl, readln(Mygoal),!.

              

inpo(HISTORY,RNO,BNO,TEXT) :–write("?:– ",TEXT," ? "),

                        makewindow(2,7,7,"Для ответа на вопрос",10,54,7,35),

                        write("введите 1, если Ваш ответ 'да' ,"),

                        write("введите 2, если Ваш ответ 'нет' ,"),

                        write("введите 0, для выхода из системы"),nl,

                        readint(RESPONSE),

                        clearwindow,shiftwindow(1),

                        do_answer(HISTORY,RNO,TEXT,BNO,RESPONSE).

/*    Механизм вывода */

go(HISTORY, Mygoal) :–rule(RNO,Mygoal,NY,COND),

                 check(RNO,HISTORY,COND),!,

                 go([RNO|HISTORY],NY).

go(_,Mygoal) :–not(rule(_,Mygoal,_,_)),!,                    

          nl,write("Вероятно Ваша собака – ",Mygoal,"."), nl, nl, nl.

 

check(RNO,HISTORY,[BNO|REST]) :­– 

                                 yes(BNO),!,check(RNO,HISTORY,REST).

check(_,_,[BNO|_]) :– no(BNO),!,fail.

check(RNO,HISTORY,[BNO|REST]) :–cond(BNO,TEXT),

                                 inpo(HISTORY,RNO,BNO,TEXT),

                                 check(RNO,HISTORY,REST).

check(_,_,[]).

 

do_answer(_,_,_,_,0):– exit.

do_answer(_,_,_,BNO,1) :–assert(yes(BNO)),write(yes),nl.

do_answer(_,_,_,BNO,2) :–assert(no(BNO)),write(no),nl,fail.

 

clear :– retract(yes(_)),retract(no(_)),fail,!.

clear.

/*    Конец программы */

Выбор типа ЭС

 

Программы для выбора породы собаки, приведенные выше, используются для иллюстрации методов построения системы, базирующейся на правилах, и системы, базирующейся на фактах. Таким образом, есть возможность сравнить два различных подхода при работе с одними и теми же данными и сделать некоторые важные выводы.

Итак, если экспертная система, которую Вы хотите сделать, в конечном счете может содержать сотни продукционных правил, то трудно определить эффект от добавления дополнительных правил. В Турбо-Прологе продукционные правила помещаются в программу, и, следовательно, размеры программы увеличиваются по мере добавле­ния правил. Размеры памяти, в конце концов, ограничивают число правил. В этом случае использование системы на правилах стано­вится проблематичным. В то же время, в системе, базирующейся на логике, где база знаний может находиться в файле на диске, ограничения на размеры базы знаний не накладываются. Поэтому система, осно­ванная на логике, в этом случае предпочтительнее.

Если же Ваша экспертная система будет содержать не более нескольких сотен правил, использование системы, базирующейся на правилах более предпочтительно. В силу того, что продукционные правила почти не зависят друг от друга, создание и тестирование такой экспертной системы проще. Просто осуществляется и измене­ние правил с целью изучить эффект, вызванный таким изменением. В системах же, базирующихся на фактах, изменение параметров внутри базы знаний должно производится с большей осторожностью, так как изменения менее заметны, а результат может быть разруши­тельным и восстановление затруднительным.

Если быстрота является главным требованием к разрабатывае­мой экспертной системе, то можно выбрать либо систе­му на фактах, полностью находящуюся в оперативной памяти, либо систему, базирующуюся на правилах. Обе будут работать хорошо. Если, од­нако, экспертная система должна содержать большую базу знаний, то у разработчика имеется единственный вариант – система на фактах, находящаяся на диске.

 


Дата добавления: 2018-11-24; просмотров: 676; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!