Отрицаемые цели

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