Обратный логический вывод

На примере базы знаний (см. рис. 15.2) формирование рассуждений в стиле об­ратного логического вывода может осуществляться следующим образом. Работа по поиску причин появления воды на полу начинается с выдвижения гипотезы (например, ieak_in_kitchen - утечка в кухне), после этого цепочка рассуждений в сети логического вывода формируется в обратном направлении. Для подтверждения этой гипотезы необходимо, чтобы утверждения prcblem_in_kitchen (неисправность в кухне) и no_Mater_from_outaide (вода не поступает снаружи) были истинными. Первое из них подтверждается после проверки того, что на поду в гостиной есть во­да, а в ванной — нет. Последнее утверждение можно проверить, убедившись в том, что окно закрыто.

Такой стиль формирования рассуждений называется обратным логическим выво­дом, поскольку в ходе него цепочка правил прослеживается в обратном направлении, от гипотезы (leak:_in_kitchen) к наблюдаемым фактам (hall_wet - вода в гости­ной — и т.д.). Такую процедуру можно запрограммировать на языке Prolog очень легко, поскольку она фактически соответствует собственному, встроенному стилю формирования рассуждений языка Prolog. Проще всего можно определить правила базы знаний как правила Prolog следующим образом:

leak in bathroom :- 4 Утечка в ванной

hall_wet, % Вода в гостиной

kitchen_dry. % В кухне сухо

prablem_in_kitchea : - % Неисправность г кухне


Глава 15. Представление знаний и экспертные системы



hallwet, % Вода в гостиной

bathroom dry. % В венной сухо

no_water_from_outside r- % Вода не поступает снаружи
window_closed % Окно закрыто

no_rain. % Дождя нет

leak in kitchen :- % Утечка в кухне

Problem_in_kitchen, % Неисправность в кухне no_water_from_outside. % Вода не поступает снаружи

Наблюдаемые фактические сведения могут быть заданы как факты Prolog сле­дующим образом:

hall wet. % Вода в гостиной

bathroom_dry. % В ванной сухо

window_closed, % Окно закрыто

После этого проверку гипотез можно осуществлять, задавая вопросы примерно ' таким образом:

? - leak_in_kitchen. % Утечка в кухне

yes

Но использование для представления правил собственного синтаксиса языка Prolog, как в приведенных выше примерах, имеет определенные недостатки, которые описаны ниже.

1. Этот синтаксис может оказаться не самым подходящим дляпользователя, не­знакомого с языком Prolog; например, может потребоваться, чтобы специалист в проблемной области имел возможность читать правила, задавать новые пра­вила и изменять существующие.

2. При такой организации работы база знаний становится синтаксически не от­личимой от остальной программы; может потребоваться проведение более яв­ного различия между базой знаний и остальной частью программы.

Проще всего приспособить синтаксис экспертных правил к нашему вкусу, ис­пользуя операторную запись языка Prolog. Например, можно выбрать способ исполь­зования логических конструкций "if, "then", "and" и "or" как операторов, объяв­ленных соответствующим образом, как показано ниже.

op ( Жxfx, "t ) hen) .

:- 5!300, %, and).

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

if

hall_wet and kitchen_dry

then

leak_inJbathroom,

if

hall wet and bathroom dry

then

problem_in_kitchen.

if

window_closed or no_rain then

no water from outside.

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

332 Часть II. Применение языка Prolog в области искусственного интеллекта


factC hall_wet) .

f act ( bathrDDm dry).

fact( window_closed) .

Безусловно, теперь потребуется новый интерпретатор для правил, заданных с по­мощью нового синтаксиса. Такой интерпретатор можно определить как следующую процедуру: is_tro*H Р)

Здесь высказывание Р можно либо найти в процедуре fact, либо вывести с по­мощью правил. Новый интерпретатор правил приведен в листинге 15.4. Следует от­метить, что в нем все еще осуществляется обратный логический вывод в форме поис­ка в глубину. Но теперь этот интерпретатор можно вызвать на выполнение с помо­щью такого вопроса:

?- is_true( leak_in_kitchen). yes

Листинг15.4. Интерпретатор обратного логического вывода для правил вывода

Простой интерпретатор обратного логического вывода для правил вывода

:- ор( 800, fie, if).

:- opt 700, xfx, then) .

;- op( 300, xfy, or) .

: - opt 200, Kty, and) .

IS true ( P) :-"fact(P).

'"if"Condition then P, % Подходящее правило/

±s_true< Condition). % условие которого является истинным

is_true( Pi and P2) :-

io££i P2).

is_true( PI or P2) :-is_true( Pi)

is_true( P2).

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