Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
LabES.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
675.33 Кб
Скачать

11. Проектирование и реализация системы, базирующейся на правилах

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

Теперь можно разработать структурную схему, чтобы зафиксировать организацию программных модулей и правил. Рис.4 показывает результирующую структурную схему. На рис. 4 можно видеть, что главным модулем (или целью) является run. Модули ask(X,Y) (спроси) и remember(X,Y,Reply) (запомни) управляют потоком данных от пользователя. Другие модули обновляют рабочие данные и выдают результаты консульта­ции.

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

Рис.4. Структурная диаграмма для экспертной системы «Животные»

Все вместе - это следующие декларации:

database

xpositive(symbol,symbol)

xnegative(symbo1,symbo1)

predicates

run

ask(symbol,symbol)

animal_is(symbol)

it_is(symbol)

positive(symbo1,symbo1)

negative(symbo1,symbo1)

remember(symbo1,symbo1,symbo1)

clear_facts

Предикаты базы данных xpositive и xnegative используются для хранения утвердительных и отрицательных ответов пользователя. Первые четыре пре­диката нужны для взаимодействия с пользователем, а остальные шесть - для механизма вывода.

Должны быть составлены семь продукционных правил: по одному для каждого вида. Каждое правило должно идентифицировать вид по при­знаку принадлежности к группе млекопитающих или птиц, а для млекопитающих так же – к группе плотоядных или травоядных. Как следует из данных и показано на древовидной структуре, это - главные подкатегории (см. рис. 3). Здесь идентификацию производит правило it_is. Затем правило positive идентифицирует характеристики животного в каж­дом отдельном случае. И it_is, и positive используются механизмом вывода.

Механизм вывода должен иметь правила для управления данными, вво­димыми пользователем, чтобы сопоставлять их с продукционными правилами и сохранять "трассу" (или запоминать) отрицательных и утвердительных от­ветов. Правила positive и negative используются для сопоставления данных пользователя с данными в продукционных правилах. Правило remember (за­поминание) производит добавление утверждений с ответами «да» и «нет», которые могут использоваться при сопоставлении с образцом:

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,yes) :-

asserta(xpositive(X,Y)). remember(X,Y,no) :-

asserta(xnegative(X,Y)), fail.

clear_facts :-

retract(xpositive(_,_)), fail.

clear_facts :-

retract(xnegative(_,_)), fail.

Назначение системы пользовательского интерфейса (СПИ) - связать вво­димые пользователем данные с системой логического вывода. Связь осуществ­ляет главный модуль run. Модуль ask(X,Y) (спроси) запрашива­ет данные у пользователя и сохраняет ответы в базе знаний.

run:- animal_is(X),!,

write("\n Ваше животное - ",X),

nl,nl,clear_facts.

run:-write("\n Невозможно определить "),

write("какое животное Вы имеете в виду. \n\n"),clear_facts.

ask(X,Y):-

write(X," оно ",Y,"?\n"),

readln(Reply),

remember(X,Y,Reply).

Консультирующий модуль run имеет две альтернативные формы. Первая взаимодействует с меха­низмом вывода; если результат цикла «распознавание – действие» - положитель­ный, то результат сообщается пользователю. Вторая форма сообщает о нега­тивном результате.

Построим экспертную систему, способную определить одного из 7 животных, которых загадал пользователь. Она будет задавать вопросы, делая выводы из полученных ответов. Типичный диалог с этой системой имеет вид:

Goal: run

имеет ли шерсть?

да

Ест ли мясо?

да

Желтовато-коричн. цвета?

да

Имеет ли темные пятна?

да

Ваше животное - гепард!

Нашим первым шагом будет создание базы знаний, структура которой представлена на рис.3. Можно добавлять факты в нашу базу данных с помощью стандартного предиката asserta.

asserta(xpositive(“имеет”, “черные полосы”))

Для этого xpositive должен быть объявлен в начале программы в секции database:

domains

...

database

xpositive(symbol,symbol)

predicates

...

clauses

...

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

xpositive(symbol,symbol)

xnegative(symbol,symbol)

Связь между предикатами xpositive и positive устанавливается первым правилом для предиката positive

positive(X,Y) if xpositive(X,Y),!.

Другими словами предикат xpositive базы данных эквивалентен предикату positive. Также имеем аналогичные правила для negative:

negative(X,Y) if xnegative(X,Y),!.

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

positive(X,Y) if

not(xnegative(X,Y)) and ask(X,Y,yes).

Второе правило для предиката negative аналогично

negative(X,Y) if

not(xpositive(X,Y)) and ask(X,Y,no).

Предикат ask задает вопрос и запоминает ответ. Для начала работы программы нужно задать цель run.

Предикат clear_facts удаляет факты, которые мы, возможно, добавим в базу данных в процессе работы.

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

/**********Экспертная система «Животные»*********************/

database

xpositive(symbol,symbol)

xnegative(symbol,symbol)

predicates

run

animal_is(symbol)

it_is(symbol)

positive(symbol,symbol)

negative(symbol,symbol)

clear_facts

remember(symbol,symbol,symbol)

ask(symbol,symbol)

clauses

/***********************Оболочка ********************************/

run:- animal_is(X),!,

write("\n Ваше животное - ",X),

nl,nl,clear_facts.

run:-write("\n Невозможно определить "),

write("какое животное Вы имеете в виду. \n\n"),clear_facts.

positive(X,Y) if xpositive(X,Y),!.

positive(X,Y) if not(xnegative(X,Y)) and ask(X,Y).

negative(X,Y) if xnegative(X,Y),!.

negative(X,Y) if not(xpositive(X,Y)) and ask(X,Y).

ask(X,Y):-

write(X," оно ",Y,"?\n"),

readln(Reply),

remember(X,Y,Reply).

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.

clear_facts:-write("\n\n Нажмите пробел, чтобы выйти из программы."), readchar(_).

/************** База знаний************************************/

animal_is("гепард") if

it_is("млекопитающее") and

it_is("плотоядное") and

positive("имеет","рыжевато-коричневый цвет") and

positive("имеет","темные пятна").

animal_is("тигр") if

it_is("млекопитающее") and

it_is("плотоядное") and

positive("имеет","рыжевато-коричневый цвет") and

positive("имеет","темные полосы").

animal_is("жираф") if

it_is("травоядное") and

positive("имеет","длинную шею") and

positive("имеет","длинные ноги") and

positive("имеет","темные пятна").

animal_is("зебра") if

it_is("травоядное") and

positive("имеет","черные полосы").

animal_is("пингвин") if

it_is("птица") and

positive(" ","не летает") and

positive(" ","плавает") and

positive("имеет","черный и белый цвета").

animal_is("страус") if

it_is("птица") and

positive(" ","не летает") and

positive("имеет","длинную шею") and

positive("имеет","длинные ноги") and

positive("имеет","черный и белый цвета").

animal_is("альбатрос") if

it_is("птица") and

positive(" ","летает хорошо").

it_is("млекопитающее") if

positive("имеет","шерсть").

it_is("млекопитающее") if

positive(" ","дает молоко").

it_is("птица") if

positive("имеет","перья").

it_is("птица") if

positive(" ","летает") and

positive(" ","кладет яйца").

it_is("плотоядное") if

positive(" ","ест мясо").

it_is("плотоядное") if

positive("имеет","острые зубы") and

positive("имеет","лапы") and

positive("имеет","глаза спереди").

it_is("травоядное") if

it_is("млекопитающее") and

positive("имеет","копыта").

it_is("травоядное") if

it_is("млекопитающее") and

positive(" ","жует жвачку").

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]