Отрицаемые цели
На первый взгляд кажется, что вполне можно разрешить использовать отрицание в левых частях лравил, а следовательно, и в вопросах, которые проверяются процедурой 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. Но необходимо соблюдать осторожность: если текущая цель согласуется с предыдущей целью, такую ситуацию нельзя рассматривать как цикл, при условии, что текущая цель является более общей, чем предыдущая.