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

5. Управление стратегией вывода в экспертных системах с помощью обратной цепочки рассуждений.

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

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

Проиллюстрируем обратный вывод на примере простой программы “Птица, зверь или рыба” (ПЗР). В этом гипотетическом примере пространство входных данных и пространство возможных решений невелики. Поэтому можно использовать обе стратегии.

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

Типичный диалог для программы:

Вопрос Ответ

У него есть волосы? Нет

Оно дает молоко? Нет

У него есть перья? Нет

У него есть клыки? Нет

Оно ест мясо? Да

Оно плавает? Да

У него есть щупальцы? Да

Задуманное животное - осьминог!

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

animal_is(penguin) :- it_is(bird),

negative(does, fly),

positive(does, swim),

positive(has, black_and_white_color).

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

Если располагать правила по-разному, то будут происходить различные диалоги, причем одни из них могут быть длиннее, другие короче. Важен порядок следования правил animal_is. Если речь идет о настоящей большой ЭС, то правила надо располагать таким образом, чтобы минимизировать количество задаваемых вопросов. Поэтому, если животное X – наиболее подходящий ответ, а животное Y - следующее по приоритету, то правило для определения животного X должно находиться в программе первым, а правило для определения животного Y - за ним.

Еще имеется одно правило, которое срабатывает, если ответ не получен: animals_is (uncnown).

Все правила animal_is поддерживаются соподчиненными правилами классификации животных.

Например:

it_is (mammal) : -

positive (has,hair),!.

it_is (mammal) : -

positive (does,give_milk),!. и др.

Эти правила читаются так: “Животное - млекопитающее, если оно имеет шерсть; животное - млекопитающее, если оно дает молоко.”

Правила positive и negative используются для проверки конкретных атрибутов животных, которые могут быть обнаружены в процессе диалога.

Рассмотрим более подробно задействованый в программе механизм вопросов-ответов. Прежде всего необходимо иметь факты, называемые xpositive и xnegative, которые становятся реальной формой ответно-вопросной информации, когда они поступают в базу данных. Они объявляются в разделе database.

database

xpositive (symbol,symbol)

xnegative (symbol,symbol)

Это обусловлено тем, что в Прологе допустимо помещать в базу данных в процессе выполнения программы только те предложения, которые представлены простыми фактами. Раздел Clauses для предикатов, объявленных в database, не должен содержать правил. Он может содержать только факты. Предикаты positive и negative не могут использоваться для этой цели, потому что есть правила, связанные с ними. Взаимосвязь между xpositive и positive определяется следующим образом:

positive(X,Y): - xpositive(X,Y),!.

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

negative(X,Y):-xnegative(X,Y),!

Для предиката positive предусмотрено ещё одно правило. Пользователь дает информацию о том, существует ли что-либо, противоречащее факту:

positive(X,Y): -

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

Для negative имеем, соответственно:

negative(X,Y): -

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

Предикат ask - задает вопрос и организует ответы, если ответ начинается с y - то это yes, если n - no.

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

Разберем структуру вопросов, порождаемых правилом ask. Программа задаёт вопросы следующего вида:

has it wings ? /*Есть ли у него крылья?*/

has it teeth ? /*Есть ли у него зубы?*/

does it bite? /*Кусается ли оно?*/

Все, что программа помещает в базу данных, всегда имеет вид пары, состоящей из глагола и атрибута, например xpositive (has,wings).

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

xpositive (verb,atribute);

xnegative (verb,atribute).

Для записи утверждений в базу данных используется встроенный предикат assertz. Для того, чтобы очистить базу данных от утверждений последнего диалога, которые могут повлиять на вывод в последующем, используют предикат clear_facts:

clear_facts:-

write("\n\n Please press the space bar to exit \n"),

retractall(_,dbasedom),readchar(_).

Или :

clear_facts:-

retract(xpositive(_,_),fail.

clear_facts:-

retract(xnegative(_,_),fail.

clear_facts:-

write("\n\n Please press the space bar to exit \n"),

readchar(_).

Таким образом, поступает приглашение прервать работу с программой. Для этого предлагается нажать клавишу пробел. При этом происходит очистка базы данных. С этой целью используются встроенные предикаты: retract(X) (удаляет утверждение из базы данных сопоставимое с X); retractall(X) (удаляет все утверждения сопоставимые с X).

И, наконец, для запуска программы (для описания цели) используется предикат run. Он описывается двумя правилами. Первое определяет животное, если хватает для этого информации. Второе правило срабатывает, если невозможно определить животное. Приведём полный текст программы:

database

xpositive(symbol, symbol)

xnegative(symbol, symbol)

predicates

animal_is(symbol)

it_is(symbol)

ask(symbol, symbol, symbol)

remember(symbol, symbol, symbol)

positive(symbol, symbol)

negative(symbol, symbol)

clear_facts

run

clauses

animal_is(cheetah) :- it_is(mammal),

it_is(carnivore),

positive(has, tawny_color),

positive(has, dark_spots).

animal_is(tiger) :- it_is(mammal),

it_is(carnivore),

positive(has, tawny_color),

positive(has, black_stripes).

animal_is(giraffe) :- it_is(ungulate),

positive(has, long_neck),

positive(has, long_legs),

positive(has, dark_spots).

animal_is(zebra) :- it_is(ungulate), positive(has,black_stripes).

animal_is(ostrich) :- it_is(bird),

negative(does, fly),

positive(has, long_neck),

positive(has, long_legs),

positive(has, black_and_white_color).

animal_is(penguin) :- it_is(bird),

negative(does, fly),

positive(does, swim),

positive(has, black_and_white_color).

animal_is(albatross) :-

it_is(bird), positive(does, fly_well).

it_is(mammal) :- positive(has, hair).

it_is(mammal) :- positive(does, give_milk).

it_is(bird) :- positive(has, feathers).

it_is(bird) :- positive(does, fly), positive(does,lay_eggs).

it_is(carnivore) :- positive(does, eat_meat).

it_is(carnivore) :- positive(has, pointed_teeth),

positive(has, claws),

positive(has, forward_eyes).

it_is(ungulate) :-

it_is(mammal), positive(has, hooves).

it_is(ungulate) :-

it_is(mammal), positive(does, chew_cud).

positive(X, Y) :- xpositive(X, Y), !.

positive(X, Y) :- not(xnegative(X, Y)),

ask(X, Y, yes).

negative(X, Y) :- xnegative(X, Y), !.

negative(X, Y) :- not(xpositive(X, Y)),

ask(X, Y, no).

ask(X, Y, yes) :-

!, write(X, " it ", Y, '\n'),

readln(Reply),

frontchar(Reply, 'y', _),

remember(X, Y, yes).

ask(X, Y, no) :-

!, write(X, " it ", Y, '\n'),

readln(Reply),

frontchar(Reply, 'n', _),

remember(X, Y, no).

remember(X, Y, yes) :- assertz(xpositive(X,Y)).

remember(X, Y, no) :- assertz(xnegative(X,Y)).

clear_facts :-

write("\n\nPlease press the space bar to exit\n"),

retractall(_, dbasedom), readchar(_).

run :-

animal_is(X), !,

write("\nYour animal may be a (an) ",X),

nl, nl, clear_facts.

run :-

write("\nUnable to determine what"),

write("your animal is.\n\n"), clear_facts.

Упражнения:

1.Укажите, что может потребоваться для добавления двух животных в прогрмму ПРЗ:

Верблюд, парнокопытное, с горбом

Единорог, парнокопытное, с одним рогом

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

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

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