Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Программы классификации 49 9 Программа классифи...doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
944.13 Кб
Скачать

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

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

xpositive (verb, attribute)

xnegative (verb, attribute).

Можно просмотреть протокол диалога после его окончания, если сохранить содержимое динамической памяти под каким-либо именем. Команда сохранения, например, может иметь вид: save(“mybd”).

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

3.9.2. Программы классификации с прямой цепочкой рассуждений.

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

Животные классифицированы в различные категории, имеющие характерные черты: млекопитающие, хищники, копытные и т.д. Одна категория переходит в другую при выполнении некоторых условий. Например, категория «хищник» переходит в категорию «гепард», если выполняются условия: «животное имеет рыжий цвет", "имеет животное темные пятна».

Знания в этой системе представляют собой правила, имеющие вид:

rule( N, CAT1, CAT2, COND ).

Здесь N - порядковый номер правила,

CAT1 - выражение, стоящее в левой части правила и характеризующее признак класса (подкласса и т.д.), к которому относится данное правило;

CAT2 - содержание правила в правой части, содержащее вывод из этого правила;

COND - список номеров условий, определяющих правило.

Условие имеет вид:

cond( N, CONDTEXT ),

где N - номер условия,

CONDTEXT - текст условия.

Таким образом, база знаний рассматриваемой экспертной системы следующая:

rule( 1, "хищник", "гепард", [ 1, 2 ] )

rule( 2, "хищник", "тигр", [ 1, 3 ] )

rule( 3, "копытное", "жираф", [ 5, 4, 2 ] )

rule( 4, "копытное", "зебра", [ 3 ])

rule( 5, "птица", "страус", [5, 7 ] )

rule( 6, "птица", "пингвин", [ 9, 7 ] )

rule( 7, "птица", "альбатрос", [ 10 ] )

rule( 8, "животное", "млекопитающее", [ 11,12 ] )

rule( 9, "животное", "птица", [ 8, 13 ] )

rule( 10, "млекопитающее", "хищник", [ 14, 15, 16 ] )

rule( 11, "млекопитающее", "копытное", [ 17, 18 ] )

cond( 1, "оно имеет рыжий цвет" )

cond( 2, "оно имеет темные пятна" )

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

cond( 4, "оно имеет длинную шею" )

ond( 5, "оно имеет длинные ноги" )

cond( 6, "оно летает" )

cond( 7, "оно имеет черный и белый цвет" )

cond( 8, "оно имеет перья" )

cond( 9, "оно плавает" )

cond( 10, "оно летает хорошо" )

cond( 11, "оно имеет шерсть" )

cond( 12, "оно кормит детенышей молоком" )

cond( 13, "оно откладывает яйца" )

cond( 14, "оно ест мясо" )

cond( 15, "оно имеет когти" )

cond( 16, "оно имеет острые зубы" )

cond( 17, "оно жует жвачку" )

cond( 18, "оно имеет копыта" )

Легко видеть, что такой способ представления знаний реализует конструкцию вида ЕСЛИ-ТО:

если САТ1 отвечает условиям СOND, то САТ1 есть САТ2. С другой стороны, отношение rule очень похоже на продукционное правило, дополненное списком истинности применения продукции. Продукционное правило позволяет использовать рекурсивный механизм продвижения по дереву, что и используется в настоящей реализации.

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

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

yes(N) или no(N),

где N - номер условия, являющегося первым аргументом предиката cond.

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

go( _ , Mygoal ):- /*Цель достигнута */

not(rule( _ , Mygoal, _ , _ )),

write( "Отгаданное животное: ",Mygoal ).

go( HISTORY, Mygoal ):-

rule( RNO, Mygoal, NY, COND ),

check( RNO, HISTORY, COND ),

go( [ RNO | HISTORY ], NY ).

Первое правило предиката go является базовым для рекурсии, оно соответствует достижению конечной вершины (в базе данных нет правила rule, где конечная вершина дерева стоит вторым аргументом). Если конечная вершина не достигнута, работает рекурсивное правило предиката go. Выбирается очередное правило rule из базы данных.

Предикат check, входящий во второе правило предиката go, производит проверку списка условий COND на достоверность, т.е. выполняет поиск уже имеющихся фактов, относящихся к данным условиям. Если ответ на эти условия имеется в базе данных в виде фактов yes(BNO) или no(BNO), проверка на этом заканчивается. В случае, если требуемые факты не обнаружены, определяется запрос пользователю с помощью предиката inpq. Если проверка check заканчивается ложно, то выбирается следующее правило из базы знаний. Если же проверка успешна, номер правила присоединяется к списку успешных правил HISTORY, по которому можно восстановить историю поиска, а текущей целью становится третий аргумент правила rule, что означает переход к следующему уровню дерева:

check( RNO, HISTORY, [ BNO | REST ] ) :- yes( BNO ), !, % Ответ “yes” обнаружен

check( RNO, HISTORY, REST ).

check( _ , _ , [ BNO | _ ] ) :- no( BNO ), !, fail. % Ответ “no” обнаружен

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

cond( BNO, TEXT_COND ),

inpq( HISTORY, RNO, BNO, TEXT_COND ),

check( RNO, HISTORY, REST ).

check( _ , _ , [ ] ).

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

inpq( HISTORY, RNO, BNO, TEXT_COND ) :-

write( "Это правда, что ", TEXT_COND),

readln( ANS ),

do_answer( HISTORY, RNO, TEXT_COND, BNO, ANS ).

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

do_answer( _ , _ , _ , BNO, “yes” ) :- assert( yes( BNO )), write( yes ), !. % Ответ “yes”

do_answer( _ , _ , _ , BNO, “no” ) :- assert( no( BNO )), write(no), !, fail. % Ответ “no”

do_answer( HISTORY, RNO, TEXT_COND, BNO, “why” ) :- !, % Ответ “why”

rule( RNO, Mygoal1, Mygoal2, _ ),

sub_cat(Mygoal1,Mygoal2,Lstr),

concat("I try to show that: ",Lstr,Lstr1),

concat(Lstr1,"\nBy using rule number ",Ls1),

str_int(Str_num,RNO),

concat(Ls1,Str_num,Ans),

show_rule(RNO,Lls1),

concat(Ans,Lls1,Ans1),

report(HISTORY,Sng),

concat(Ans1,Sng,Answ),

display(Answ),

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

Вдумчивый читатель мог заметить, что программа отличается от предыдущей по своим возможностям, а именно: список условий содержит только позитивные признаки. Преодолеть этот недостаток можно, по-видимому, разными способами: либо внести отрицание на уровне строковых констант («оно не летает»), либо дополнить отношение rule еще одним аргументом – списком негативных признаков, что является более грамотным.

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

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

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

1. Уровень воды в водоеме. Если уровень воды высок, то существует угроза наводнения. Уровень воды также может повышаться за счет стоков дождя и талого снега.

2. Дождь. Если ожидаются обильные дожи и уровень воды высок, то есть вероятность наводнения.

3. Температура. Если предсказана теплая погода и с гор в реку стаяло много снега, то есть опасность наводнения.

4. Снег. В расчет принимается количество снега в горах.

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

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

Как и ранее, представим базу знаний в виде дерева решений, а затем преобразуем его в правила вида ЕСЛИ-ТО. Дерево решений представлено на рис. 3….

Рис. 3. Дерево решений для системы прогнозирования наводнений

Для каждого пути можно записать правило. Совокупность всех правил составит базу знаний.

ЕСЛИ НЕ (уровень воды высокий)

И НЕ (дождь обильный)

ТО прогноз = не беспокоиться

ЕСЛИ НЕ (уровень воды высокий)

И дождь обильный

И снегу много

И температура высокая

ТО прогноз = усилить внимание

ЕСЛИ НЕ (уровень воды высокий)

И дождь обильный

И снегу много

И НЕ (температура высокая)

ТО прогноз = не беспокоиться

ЕСЛИ НЕ (уровень воды высокий)

И дождь обильный

И НЕ (снегу много)

ТО прогноз = не беспокоиться

ЕСЛИ уровень воды высокий

И дождь обильный

ТО прогноз = эвакуировать

ЕСЛИ уровень воды высокий

И НЕ (дождь обильный)

И снегу много

И температура высокая

ТО прогноз = эвакуировать

ЕСЛИ уровень воды высокий

И НЕ (дождь обильный)

И снегу много

И НЕ (температура высокая)

ТО прогноз = усилить внимание

ЕСЛИ уровень воды высокий

И НЕ (дождь обильный)

И НЕ (снегу много)

И НЕ (температура высокая)

ТО прогноз = не беспокоиться

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

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

start :- proverka,

prognoz( P ),

write( “Наш прогноз - ”, P ).

Предикат proverka состоит из четырех тестов, каждый из которых соответствует проверке одного из перечисленных факторов:

proverka :- test1( F1 ), % Уровень воды

test2( F1, F2 ), % Дождь

test3( F1, F2, F3 ), % Снег

test4( F1, F2, F3, _ ). % Температура

proverka.

В ходе диалога переменные F1, F2, F3 могут принимать одно из двух значений: «y» или «n». Прямой вывод будет направляться этими значениями, причем ответы, полученные из предыдущего теста, будут использоваться как входные для последующих тестов. Приведем цепочки вывода:

test1( ‘y’ ) :- it_is( “уровень воды высокий” ). % Проверка продолжится

test1( ‘n’ ). % Проверка продолжится

test2( ‘y’, ‘y’ ) :- it_is( “дождь обильный” ),

assert( prognoz( “эвакуировать” )). % Конец ветви

test2( ‘y’, ‘n’ ).

test2( ‘n’, ‘y’ ) :- it_is( “дождь обильный” ).

test2( ‘n’, ‘n’ ) :- assert( prognoz( “не беспокоиться” )).

test3( ‘y’, ’n’, ‘y’ ) :- it_is( “снегу много”).

test3( ‘y’, ’n’, ‘n’ ) :- assert( prognoz( “не беспокоиться” )).

test3( ‘n’, ’y’, ‘y’ ) :- it_is( “снегу много”).

test3( ‘n’, ’y’, ‘n’ ) :- assert( prognoz( “не беспокоиться” )).

test4( ‘y’, ‘n’, ‘y’ ,’y’ ) :- it_is( “температура высокая”),

assert( prognoz( “эвакуировать” )).

test4( ‘y’, ‘n’, ‘y’ ,’n’ ) :- assert( prognoz( “усилить внимание” ).

test4( ‘n’, ‘y’, ‘y’ ,’y’ ) :- it_is( “температура высокая”),

assert( prognoz( “усилить внимание” )).

test4( ‘n’, ‘y’, ‘y’ ,’n’ ) :- assert( prognoz( “не беспокоиться” ).