Создание экспертных систем средствами Пролога

Автор работы: Пользователь скрыл имя, 10 Апреля 2014 в 14:01, лабораторная работа

Краткое описание

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

Вложенные файлы: 1 файл

Создание экспертных систем средствами ПРОЛОГа.doc

— 58.00 Кб (Скачать файл)

Создание экспертных систем средствами ПРОЛОГа

Экспертные системы (ЭС) - это сложные программные комплексы, аккумулирующие знания специалистов в конкретных предметных областях и тиражирующие этот эмпирический опыт для консультаций менее квалифицированных пользователей.

Построим небольшую экспертную систему, которая будет определять одну из нескольких рыб по признакам, указанным пользователем. Система будет задавать вопросы и строить логические выводы на основе полученных ответов.

Типичный диалог экспертной системы с пользователем может выглядеть следующим образом (рис.27):

рис.27. Диалог экспертной системы с пользователем

 

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

  • базу знаний;
  • механизм вывода;
  • пользовательский интерфейс.

Разработку любой ЭС следует начать с исследования предметной области. Пусть на основе бесед с экспертом были получены следующие эмпирические правила:

1) ЕСЛИ

это отряд карпообразные и

И

у рыбы желто-золотистый окрас

И

губы с 4 усиками

ТО

это сазан

2) ЕСЛИ

это отряд карпообразные

И

у рыбы плавники с розовыми перьями

это плотва

3) ЕСЛИ

спинной плавник узкий

И

у рыбы желто-золотистый окрас

И

это отряд карпообразные

это лещ

4) ЕСЛИ

у рыбы нет зубов

И

одиночный спинной лучевой плавник

И

это костная рыба

И

это пресноводная рыба

это отряд карпообразные

5) ЕСЛИ

у рыбы есть костный скелет

ИЛИ

у рыбы есть жаберные крышки

это костная рыба

6) ЕСЛИ

рыба плавает в озерах

ИЛИ

рыба плавает в реках

ТО

это пресноводная рыба

Для создания базы знаний используем предикаты:

fish(symbol)

otrajd(symbol)

vid(symbol)

priznak(symbol)

Базу знаний будут составлять следующие правила:

fish("это сазан"):-

         otrajd("отряд карпообразные"),

         priznak("губы с 4 усиками").

fish("это плотва"):-

         otrajd("отряд карпообразные"),

         priznak("плавники с розовыми перьями").

fish("это лещ"):-

         otrajd("отряд карпообразные"),

         priznak("у рыбы желто-золотистый  окрас"),

         priznak("у рыбы спинной плавник  узкий").

Необходимо предусмотреть, что искомой рыбы в базе знаний нет:       

fish("Данной  рыбы в базе знаний не обнаружено").

otrajd("отряд  карпообразные"):-

         vid("пресноводная рыба"),

         vid("костная рыба"),

         priznak("одиночный спинной лучевой  плавник"),

         priznak("у рыбы нет зубов").

vid("костная  рыба"):-

         priznak("у рыбы есть жаберные  крышки");

         priznak("у рыбы есть костный  скелет").

vid("пресноводная  рыба"):-

         priznak("рыба плавает в реках  или озерах").

Для хранения информации, полученной от пользователя, используются предикаты yes и no, составляющие внутреннюю базу фактов. Предикат yes служит для хранения фактов, соответствующих положительному ответу, а предикат no – для хранения отрицательных ответов. Т.е. предикат yes утверждает наличие какого-либо признака у рыбы, а no – отсутствие указанного признака. Эти предикаты объявляются в разделе внутренней базы фактов:

global facts

yes (symbol)

no  (symbol)

Добавить новые факты во внутреннюю базу можно  с помощью правила add_to_database, состоящего из двух частей. Первая часть добавляет факты, соответствующие положительному ответу (с клавиатуры вводится ‘y’). Вторая часть правила добавляет факты, указывающие на отсутствие данного признака у рыбы.

add_to_database (Y,'y') :- assertz (yes (Y)).

add_to_database (Y,'n') :- assertz (no (Y)),fail.

Необходимо предусмотреть очистку внутренней базы фактов. Для этого создадим правило:

clear_from_database :- retract(yes(_)),fail.

clear_from_database :- retract(no(_)),fail.

Для проверки наличия  у рыбы определенного признака создадим правило priznak (Y):

priznak (Y) :-  yes (Y),!.

priznak (Y) :-  not(no (Y)),

                question (Y).

Формулировка вопроса, ввод ответа и сохранение соответствующего правила осуществляется с помощью правил:

answer :- fish(X),!,nl,

              save("BF1.dbf"),

              write (" Ответ: ",X,"."),nl.

question(Y) :-

 write ("Вoпрос:    ",Y,"?(y/n) "),

     otvet(X),

     write(X),nl,

     add_to_database (Y,X).

otvet(C):-readchar(C).

И, наконец, правило begin, запускающее сеанс консультации:

begin :- write ("Ответьте на вопросы :"),nl,nl,

     answer,

     clear_from_database,

     nl,nl,nl,nl,

     exit.

Полный листинг программы выглядит следующим образом:

GLOBAL FACTS

yes (symbol)

no  (symbol)

PREDICATES

fish(symbol)

otrajd(symbol)

vid(symbol)

begin

answer

question(symbol)

add_to_database(symbol,char)

otvet(char)

clear_from_database

priznak(symbol)

GOAL

begin.

CLAUSES

begin :-

write ("Ответьте на вопросы :"),nl,nl,

answer,

clear_from_database,

nl,nl,nl,nl,

exit.

answer :-

fish(X),!,nl,

save("BF1.dbf"),

write (" Ответ: ",X,"."),nl.

question(Y) :-

   write ("Вoпрос:    ",Y,"? "),

otvet(X),

write(X),nl,

add_to_database (Y,X).

otvet(C):-

readchar(C).

priznak (Y) :-

yes (Y),!.

priznak (Y) :-

not( no (Y)),

question (Y).

add_to_database (Y,'y') :-

assertz (yes (Y)).

add_to_database (Y,'n') :-

assertz (no (Y)),fail.

    clear_from_database :- retract (yes(_)),fail.

clear_from_database :- retract (no(_)),fail.

fish("это сазан"):-

otrajd("отряд  карпообразные"),

priznak("губы с 4 усиками").

fish("это плотва"):-

otrajd("отряд  карпообразные"),

priznak("плавники  с розовыми перьями").

fish("это лещ"):-

otrajd("отряд  карпообразные"),

priznak("у рыбы  желто-золотистый окрас"),

priznak("у рыбы  спинной плавник узкий").

fish("Данной рыбы в базе знаний не обнаружено").

otrajd("отряд  карпообразные"):-

vid("пресноводная  рыба"),

vid("костная  рыба"),

priznak("одиночный  спинной лучевой плавник"),

priznak("у рыбы  нет зубов").

vid("костная  рыба"):-

priznak("у рыбы  есть жаберные крышки");

priznak("у рыбы  есть костный скелет").

vid("пресноводная  рыба"):-

priznak(«рыба плавает  в реках или озерах»).

ЗАДАНИЕ ДЛЯ САМОСТОЯТЕЛЬНОЙ РАБОТЫ

1. Реализуйте данную программу в среде Visual Prolog и протестируйте ее.

2. Расширьте  базу знаний экспертной системы, добавив следующие правила:

1) ЕСЛИ

у рыбы есть электрические органы

    И

это отряд скаты

    TО

это электрический скат

2) ЕСЛИ

   у рыбы на хвосте ядовитый шип

     И

это отряд скаты

    TО

это скат-хвостокол

3) ЕСЛИ

у рыбы серо-коричневый окрас

    И

у рыбы коническая морда

    И

это отряд акулы

    TО

это гиганская акула

4) ЕСЛИ

это отряд акулы

   И

рыба нападает на людей

   И

у рыбы молотообразная морда

   TО

это рыба молот

5) ЕСЛИ

у рыбы нет хвостового плавника

    И

у рыбы тонкий длинный хвост

    И

это хрящевая рыба

    И

это морская рыба

   TО

это отряд скаты

6) ЕСЛИ

это морская рыба

    И

это хрящевая рыба

   И

плавники не гибкие

   И

хвост ассиметричный

   TО

это отряд акулы

7) ЕСЛИ

у рыбы нет плавательного пузыря

     ИЛИ

у рыбы есть хрящевый скелет

     ТО

это хрящевая рыба

8) ЕСЛИ

рыба плавает в морях

    ТО

это морская рыба

3. Протестируйте полученную экспертную  систему.

 


Информация о работе Создание экспертных систем средствами Пролога