Реализация экспертной системы на языке
Рефераты >> Программирование и компьютеры >> Реализация экспертной системы на языке

Реализация экспертной системы на языке Пролог

Рассмотрим два варианта реализации ЗС, один из которых основан на продукционной модели представления знаний, а другой - на фреймовой модели.

1. Представление знаний правилами

В качестве примера выберем задачу диагностики. Пусть, требуется установить причину неисправности электрической плиты, оборудованной нагревательным элементом, контрольной лампочкой и выключателем. Плита подключена к источнику напряжения с помощью электрического кабеля, который обеспечивает передачу тока. Набор правил "неисправность-причина" представим в виде графа (рисунок 1).

Простейший способ построения ЗС на Прологе - использование механизма поиска решений, заложенного в Пролог-системе. Для этого представим правила в виде предикатов языка Пролог:

/* структура правила: причина:- неисправность */

нагреватель(неисправен):-лампа(светится), плита(холодная). /* г1 */

вьыключатель(не_включен):-тока(нет). /* г2 */

напряжения(нет):- тока(нет). /* гЗ */

тока(нет):- плита(холодная), лампа(не_светится). /* г4 */

лампа(неисправна):-лампа(не_светится), плита(горячая). /* г5 */

Рисунок 1 - Сеть вывода

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

/* вариант 1 */

лампа(не_светится). /*фактьґ/ плита(холодная).

причина(нагреватель(неисправен)). /*гипотезы*/

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

причина(напряжения(нет)).

причина(лампа(неисправна)).

найти(Х): - причина(Х), саІІ(Х). /*проверка гипотез*/

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

? - найти(Х).

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

X = выключатель(не_включен); X = напряжения(нет).

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

/* вариант 2 */

лампа(не_светится): - спроси('Ламла не светится ?').

плита(холодная): - спроси('Плита холодная ?').

лампа(светится): - спроси('Лампа светится ?').

плита(горячая): - спроси('Плита горячая ?').

спроси(Вопрос): - white(Вопрос), read('да').

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

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

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

Для представления правил в такой форме определим операторы:

определить_операторы: - ор(920, хfу, и),

ор(950, хfу, то),

ор(960, fx, если),

ор(970, хfх,':').

? - определить_операторы.

С помощью введенных операторов правило 1 представляется структурой, изображенной на рисунке 2.

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

правило 2: если тока(нет) то выключатель(не_включен).

правило 3: если тока(нет) то напряжения(нет).

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

правило 5: если лампа(не_светится) и плита(горячая) то лампа(не_исправна).

Рисунок 2 - Структура, соответствующая правилу

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

Имя_факта: Факт.

Тогда в соответствии с введенными правилами база данных возможных причин неисправности (гипотез) запишется в виде:

h1 : причина(нагреватель(неисправен)).

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

hЗ : причина(напряжения(нет)).

h4: причина(лампа(неисправна))

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

h1 : признак(лампа(светится)).

h2 : признак(плита(холодная)).

hЗ : признак(лампа(не_светится)).

h4 : признак(плита(горячая)).

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

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

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

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

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

/* вариант 1 */

найти(Н): - Факт : Н. % случай 1

найти(Н): - Правило : если Н1 то Н, найти(Н1). % случай2

найти(Н1 и Н2): - найти(Н1), найти(Н2). % случай З

найти(Н): - запрашиваемая(Н), % случай 4

сообщено(Н, да). % вопрос уже был

найти(Н): - запрашиваемая(Н),% случай 4


Страница: