На первый взгляд кажется, что вполне можно разрешить использовать отрицание в левых частях лравил, а следовательно, и в вопросах, которые проверяются процедурой explore. Прямолинейная попытка применения вопросов с отрицаниями может состоять в следующем:
explorer not Goal, Trace, Answer):-!,
explore (Goal, Trace, Answer.!),
invert (answer!. Answer). % Операция отрицания: истинностного значения
invert (Goal is true was Found, (not Goal) is false was Found). invert (Goal is false was Found, (not Goal) is true was Pound).
Такая попытка завершается успехом, только если цель Goal конкретизирована, а в ином случае возникают проблемы. Рассмотрим, в частности, следующий пример:?- expert.
Question, please:
not (X eats meat).
Any (more) solution to: Animal eats meat?
378 Часть II. Применение языка Prolog в области искусственного интеллекта
yes.
Animal = tiger.
После этого система выдает следующий ответ:
not [tiger cats meat) is false % высказывание not (tiger eats meat) ложно
Этот ответ не является удовлетворительным. Проблема заключается в том, что под рассматриваемым вопросом пользователи часто подразумевают совсем иное: not (X eats meat) * Найти такой объект х, который не питается мясом
Пользователь фактически хочет спросить: "Есть ли сведения о таком объекте X, что X не питается мясом?" Но способ, с помощью которого этот вопрос интерпретируется процедурой explore {в соответствии с ее определением), состоит в следующем.
1. Есть ли сведения о некотором объекте X, таком, что X питается мясом?
2. Да, мясом питается тигр.
3. Поэтому высказывание not (tiger eats meat) является ложным.
Короче говоря, в системе применяется следующая интерпретация этого вопроса: "Является ли истинным, что ни один объект X не ест мяса?" Поэтому система даст положительный ответ на этот вопрос лишь в том случае, если никто из известных ей объектов не питается мясом. Эту мысль можно выразить иначе: процедура explore отвечает на вопрос с отрицанием таким образом, как если бы к объекту X был применен квантор всеобщности:
для всех X является ли истинным высказывание not (X eats meat)? а не так, как если бы к объекту х был применен квантор существования, в чем состояло намерение пользователя, задающего вопрос с отрицанием: для некоторого X есть ли такой X, что истинно высказывание not (X eats meat)?
Если рассматриваемый вопрос является конкретизированным, то проблемы при его обработке не возникают. В противном случае правильная трактовка вопросов с отрицанием становится более сложной. Некоторые возможные варианты анализа этой проблемы описаны ниже.
Чтобы проверить истинность цели not Goal, выполнить проверку Goal, а затем:
• если Goal является ложной, топот. Goal истинна;
• если Goal' — решение Goal
• и Goal' является столь же общей, что и Goal,
• то not Goal ложна;
• если Goal' — решение Goal и
• Goal' является более конкретной, чем Goal,
• то мы не можем сказать ничего определенного о not Goal.
Этих сложностей можно избежать, разрешив использовать только конкретизированные отрицаемые цели. Такое требование часто можно осуществить с применением более правильных формулировок правил в базе знаний. В листинге 16.2 подобная задача решена с помощью следующей модификации правила определения неисправного прибора broken_rule:
broken_rule:: if on(Device) and
device (Device) and % Конкретизировать переменную Device not working." Device) and connected(Device, Fuse) and proved(intactf Fuse)) then proved! broken (Device)).
Условие
Глава 16. Командный интерпретатор экспертной системы
device(Device)
"защищает" стоящее за ним условие
not working; Device)
от использования в неконкретизированном виде.
Упражнение
16.1. База знаний может содержать циклы, как показано ниже.
rulel:.: if bottle empty then john drunk. 'i Если бутылка пуста, то Джон пьян гц1е2:: if Dohn_drunk then bottlejanpty. 'i Если Джон пьян, то бутылка пуста
При использовании такой базы знаний процедура explore может начать переходить по циклу между одними и теми же целями. Модифицируйте процедуру explore, чтобы предотвратить подобное зацикливание. Для этого можно применить трассировку Trace. Но необходимо соблюдать осторожность: если текущая цель согласуется с предыдущей целью, такую ситуацию нельзя рассматривать как цикл, при условии, что текущая цель является более общей, чем предыдущая.