Обратный логический вывод
На примере базы знаний (см. рис. 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.