Добавил:
natribu.org Все что нашел в интернете скидываю сюда Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Точно Не проект 2 / Не books / Источник_1

.pdf
Скачиваний:
10
Добавлен:
01.02.2024
Размер:
20.67 Mб
Скачать

400

Глава 7

 

 

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

Реализуем метаинтерпретатор в виде предиката найти(Н), где Н – возможная гипотеза, которую требуется подтвердить или опровергнуть. При этом возможны четыре случая:

1)гипотеза Н подтверждается фактом, уже известным системе;

2)гипотеза Н соответствует следствию одного из правил, тогда для подтверждения гипотезы необходимо доказать справедливость предпосылок правила;

3)гипотеза Н, доказываемая на некотором шаге вывода, представляет собой конъюнкцию условий правила, т.е. Н1 и Н2, тогда необходимо доказать достижимость конъюнкции подцелей: найти(Н1) и найти(Н2);

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

Для того чтобы исключить повтор вопросов, ответы пользователя будем запоминать в базе данных в виде фактов сообщено(Факт, ‘да|нет’). Запоминание соответствующих фактов в базе данных будем выполнять с помощью предиката assert. Гипотезы, относительно которых можно задавать вопросы, определяются с помощью предиката запрашиваемая(Н). Такие гипотезы сопоставимы с признаками. С учетом сказанного, метаинтерпретатор опишется следующей совокупностью правил языка Пролог:

/*

обратный вывод */

 

 

/*

вариант 1 */

 

 

найти(Н): – Факт : Н.

% случай 1

найти(Н): – Правило : если Н1 то Н, найти(Н1).

% случай2

найти(Н1 и Н2): – найти(Н1), найти(Н2).

% случай 3

найти(Н): – запрашиваемая(Н),

% случай 4

 

сообщено(Н, да).

% вопрос уже был

найти(Н): – запрашиваемая(Н),

% случай 4

 

not сообщено(Н, _ ),

% вопроса не было

 

спроси(Н).

 

 

запрашиваемая(Н): – Факт : признак(Н).

 

 

спроси(Н): – nl, write(H), write(‘?’),

%

вопрос

 

read(O), ответ(H, O).

 

 

ответ(Н, да): – assert(сообщено(Н, да)), !.

%

добавить в БД

ответ(Н, no): – assert(сообщено(Н, нет)), !, fail.

%

ответ

ответ(Н, _ ): – write(‘правильный ответ: да, нет’),

 

 

спроси(Н).

%

повторить вопрос

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

Экспертные системы

401

 

 

/* ЭС для решения задачи диагностики */ инициализация: – retractall(сообщено( _,_ )).

диагностика(Н):– инициализация, Факт : причина(Н), найти(Н).

Дальнейшее совершенствование разработанной программы связано с включением возможности ответов на вопросы типа “почему?” и “как?”. Возможный сценарий диалога с ЭС при ответе на вопрос “почему?” приведен в таблице 7.1.

Таблица 7.1 – Ответы на вопросы “почему?”

 

 

Ответ или

Вопрос или ответ системы

 

вопрос поль-

 

 

зователя

лампа(светится)?

 

нет

плита(холодная)?

 

почему

пытаюсь доказать тока(нет) с помощью правила: пра-

 

вило 4

 

 

плита(холодная)?

 

почему

пытаюсь доказать выключатель(не_включен) с

помо-

 

щью правила: правило 2

 

 

плита(холодная)?

 

почему

Моя гипотеза: выключатель(не_включен)

 

 

плита(холодная)?

 

почему

Вы задаете слишком много вопросов

 

 

Плита(холодная)?

 

да

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

найти(Н, [Н]).

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

402

Глава 7

 

 

/* вариант 2 */ найти(Н, Стек): – Факт : Н.

найти(Н, Стек): – Правило: если Н1 то Н, найти(Н1, [Правило | Стек]).

найти(Н1 и Н2, Стек): – найти(Н1, Стек), найти(Н2, Стек). найти(Н, Стек): – запрашиваемая(Н), сообщено(Н, да). найти(Н, Стек): – запрашиваемая(Н), not сообщено(Н, _ ),

спроси(Н, Стек).

В связи с необходимостью ввода вопроса “почему?” в предикаты спроси и ответ добавляется дополнительный аргумент:

спроси(Н, Стек): – nl, write(H), write(‘?’), read(O), ответ(Н, О, Стек).

ответ(Н, да, Стек): – assert(сообщено(Н, да)), !. ответ(Н, нет, Стек): – assert(сообщено(Н, нет)), !.

ответ(Н, почему, [ ]): – !, nl, write(‘Вы задаете слишком много вопросов’), спроси(Н, [ ]).

ответ(Н, почему, [Н]): – !, nl, write(‘моя гипотеза :’), write(H), спроси(Н, [ ]).

ответ(Н, почему, [Правило | Стек]): – !, Правило : если Н1 то Н,

nl, write(‘пытаюсь доказать’), write(H),

nl, write(‘с помощью правила : ’), write(Правило),

спроси(Н, Стек).

ответ(Н, _ , Стек): – write(‘правильный ответ : да, нет, почему’), спроси(Н, Стек).

Формирование ответа на вопрос “как?” требует дополнительных изменений предиката найти. При ответе на вопрос “как?” система должна, по сути, построить дерево вывода. Например, если пользователя интересует, как была подтверждена гипотеза выключатель(не_включен), то система должна обеспечить отображение дерева вывода, изображенного на рисунке

7.6.

Такое дерево можно представить в форме вложенных правил, условия и заключения которых конкретизированы:

правило 2 : если

правило 4 : если сообщено(плита(холодная)) и сообщено(лампа(не_светится))

то тока(нет) то выключатель(не_включен).

Экспертные системы

403

 

 

выключатель(не_включен)

правило 2

тока(нет)

правило 4

И

плита(холодная) лампа(не_светится)

Рисунок 7.6 – Дерево вывода

Пусть Д обозначает дерево вывода целевого утверждения Н. Тогда построение дерева вывода выполним на основе следующих правил:

1)если сообщено(Н), то Д = сообщено(Н);

2)если имеется Факт : Н, то Д = Факт : Н;

3)если имеется правило Правило : если Н1 то Н, и если Д1 – дерево выво-

да для Н1, то Д = Правило : если Д1 то Н;

4)если доказывается гипотеза Н = Н1 и Н2, то дерево вывода Д = Дерево1 и Дерево2, где Дерево1 – дерево вывода гипотезы Н1, а Де-

рево2 – гипотезы Н2.

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

найти(Н, Стек, Дерево).

Воспользовавшись введенными выше правилами построения дерева вывода, получим:

/* правило1 */ найти(Н, Стек, сообщено(Н)):– сообщено(Н, да).

найти(Н, Стек, сообщено(Н)):– запрашиваемая(Н), not сообщено(Н, _), спроси(Н, Стек).

/* правило2 */ найти(Н, Стек, Факт : Н):– Факт : Н.

/* правило3 */ найти(Н, Стек, Правило : если Д1 то Н):–

Правило : если Н1 то Н, Найти(Н1, [Правило|Стек], Д1).

404

Глава 7

 

 

/* правило4 */ найти(Н1 и Н2, Стек, Дерево1 и Дерево2):–

найти(Н1, Стек, Дерево1), найти(Н2, Стек, Дерево2).

Теперь можно будет выяснять у системы, как было получено то или иное заключение. Чтобы реализовать эту возможность, введем предикат как(Н, Дерево), где Н – интересующее пользователя заключение, а Дерево

– дерево вывода заключения, формируемое предикатом найти. Определяя предикат как(Н, Дерево), учтем два случая:

% Дерево можно построить как(Н, Дерево):– как1(Н, Дерево), !.

% Дерево нельзя построить

как(Н, _):– nl, write(Н), write( ‘не доказано’).

Здесь предикат как1(Н, Дерево) определяется с помощью правил, аналогичных правилам, используемых в определении предиката найти:

как1(Н, сообщено(Н)):– !,

/* правило1 */

nl, write(Н), write( ‘было введено’).

 

как1(Н, Факт : Н):– !,

/* правило2 */

nl, write(Н), write( ‘является фактом’), write(Факт).

как1(Н, Правило : если _ то Н):– !,

/*правило3 */

nl, write(Н), write( ‘было доказано с помощью’),

Правило : если Н1 то Н, отобрази_правило(Правило : если Н1 то Н).

как1(Н, Правило : если Дерево ):–

/*правило4 */

как ( Н, Дерево).

 

как1(Н, Дерево1 и Дерево2 то _):–

/*правило5 */

как ( Н, Дерево1); как ( Н, Дерево2).

 

отобрази_правило(Правило : если Н1 то Н):–

 

nl, write(Правило), write( ‘:’),

 

nl, write(‘если’), write(Н1),

 

nl, write(‘то’), write(Н).

 

Вызов предиката как(Н,Дерево) будем выполнять из предиката

объясни(Дерево), после вызова предиката найти(Н, [Н], Дерево):

Экспертные системы

405

 

 

/* ЭС для решения задач диагностики*/ инициализация:– retractall(сообщено(_,_)). диагностика:– инициализация,

Факт : причина(Н), найти(Н, [Н], Дерево),

nl, nl, write( ‘решение:’), write(Н),

объясни(Дерево), возврат.

Здесь предикат объясни(Дерево) определяется так:

объясни(Дерево):–

nl, nl, write( ‘объяснить ? [цель/n]:’), read(Н), (Н\=no, !, как(Н, Дерево), объясни(Дерево)), !.

Предикат возврат обеспечивает доказательство альтернативных гипотез:

возврат:– nl, nl, write( ‘ следующее решение ?: ’), read(no).

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

?-диагностика. лампа(светится)? нет. плита(холодная)? да. лампа(не_светится)? да.

решение: выключатель(не_включен)

объяснить?[цель/n]: выключатель(не_включен).

выключатель(не_включен) было доказано с помощью правило 2: если тока(нет)

то выключатель(не_включен) объяснить?[цель/n]: тока(нет).

тока(нет) было доказано с помощью правило 4: если плита(холодная) и лампа(не_светится)

то тока(нет). объяснить?[цель/n]: плита(холодная). плита(холодная) было сообщено объяснить?[цель/n]: нет.

решение: напряжения(нет) объяснить?[цель/n]:нет. плита(горячая)? почему.

пытаюсь доказать лампа(не_исправна) с помощью правила: правило 5 плита(горячая)? нет.

нет.

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

406

Глава 7

 

 

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

Правило1: если лампа(светится) и плита(холодная)

то нагреватель(неисправен) cf 0.8.

Здесь cf – инфиксный оператор, посредством которого задается коэффициент уверенности. Оператор cf определяется с помощью директивы:

:– op(940, xfx, cf).

Для обработки коэффициентов уверенности, назначенных фактам и правилам, можно использовать модель, описанную в § 4.2.2.2.

7.6.2.Представление знаний фреймами

ВЭС, основанных на правилах, знания сосредоточены исключительно в базе правил, а база данных представляет собой пассивное множество фактов. Фреймовая модель представления знаний обеспечивает лучшую структурированность фактов, более экономное использование памяти, а также активизацию фактов. Характерными отличиями фреймовой модели представления знаний являются: наследование по иерархии фреймов, наличие присоединенных процедур, наличие значений по умолчанию и др. (см. §3.5)

Рассмотрим простейшие возможности представления экспертных знаний совокупностью фреймов. При этом фрейм будем представлять в виде объекта с множеством атрибутов (слотов):

объект

– атрибут1 : значение1

– атрибут2 : значение2

– …

– атрибут_n : значение_n.

Если рассматривать знаки “” и “:” как операторы языка Пролог (op(910, xfx,:), op(910, xfy, – – )), то такому описанию объекта будет соответствовать структура, изображенная на рисунке 7.7. Данная структура представляет терм языка Пролог (n = 3):

Экспертные системы

407

 

 

объект – – ((атр1 : з1) – – ((атр2 : з2) – – (атр3 : з3))).

_ _

 

 

_ _

объект

 

 

 

:

_ _

атр1 з1

_ _

:

атр2

 

з2

 

:

 

:

атр_n з_n

Рисунок 7.7 – Структура, соответствующая списку свойств

Доступ к значениям атрибутов объекта будем осуществлять с помощью предиката объект(О,А,З), где О – переменная, обозначающая объект; А – соответствующий атрибут объекта; З – значение атрибута. Предикат объект(О,А,З) определяется рекурсивно:

объект(О, А, З):– О – – Атрибуты,

 

поиск(А, З, Атрибуты),!.

 

поиск(А, З, А : З).

% утверждение 1

поиск(А, З, А : З – – Атрибуты1).

% утверждение 2

поиск(А, З, А1 : З1 – – Атрибуты1):–

% утверждение 3

поиск(А, З, Атрибуты1).

 

Здесь первое определение обеспечивает отделение имени объекта от его атрибутов с помощью оператора О – – Атрибуты. Переменная Атрибуты после выполнения данного оператора будет представлять правое поддерево древовидной структуры, изображенной на рисунке 7.7. Предикат

408

Глава 7

 

 

поиск(А, З, Атрибуты) осуществляет поиск значения атрибута А в поддереве Атрибуты. Поиск выполняется рекурсивно и основывается на утверждениях:

1)атрибут А со значением З входит в поддерево Атрибуты, если оно представлено элементарным поддеревом А : З;

2)атрибут А со значением З входит в поддерево Атрибуты, если его левое поддерево – элементарное поддерево А : З;

3)атрибут А со значением З входит в поддерево Атрибуты, если

указанные элементы входят в его правое поддерево, т.е. в

Атрибуты1.

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

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

Автомобиль

 

 

 

 

 

 

 

 

 

 

 

 

 

2,3

 

1

1

 

2,3

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

электрооборудование двигатель шасси температура

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

Рисунок 7.8 – Дерево диагностики автомобиля

В свою очередь, в состав шасси входят колеса и тормоза, а в состав электрооборудования – аккумулятор и стартер. Автомобиль неисправен, если неисправна одна из его составных частей. Аналогично любой агрегат автомобиля считается неисправным, если неисправен один из узлов агрегата. Например, шасси неисправно, если имеются проблемы с колесами или тормозами. Двигатель неисправен, если не отрегулированы клапаны или не поступает топливо (физическая обоснованность). В качестве эври-

Экспертные системы

409

 

 

стической причины неисправности автомобиля может выступать низкая температура (например, ниже –20о).

Представим вершины и листья дерева диагностики в виде следующей структуры:

объект

 

 

– – вопрос

:

Q

– – ответы

:

A

– – причины

:

R

– – объяснения :

E.

Здесь объект – имя, соответствующее вершине или листу дерева; Q – вопрос, задаваемый пользователю, относительно состояния объекта;

A = [1: A1, 2: A2, … ] – список возможных ответов; R – список возможных причин неисправности; E – текст, объясняющий причину неисправности. Список R может быть представлен в одной из форм:

R = [ i : Hi , j : Hj, … ] или

R = [H1, H2, … ].

Первая форма используется, когда Hi выступает в качестве возможного обоснования гипотезы H, в подтверждение которой был выбран ответ Аi из списка А. Вторая форма применяется, когда H1, H2, … являются возможными обоснованиями гипотезы H, но вопросы относительно H не формулировались.

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

Приведем примеры описаний некоторых объектов на языке Пролог:

/* база знаний */

автомобиль

– вопрос : ’Что случилось Вашим автомобилем?’

– ответы : [1 : ‘не заводится’, 2 : ‘не едет’, 3 : другое]

– причины : [1 : температура ,1 : электрооборудование, 2 : двигатель, 2 : шасси, 3 : двигатель, 3 : шасси].

температура

– вопрос : ’Температура ниже –20?о

– ответы : [1 : да, 2 : нет]

– причины : [1 : верно]

– объяснения : ’Низкая температура. Нагрейте двигатель’.

Соседние файлы в папке Не books