Встроенные предикаты. Поиск на Прологе

Отрицание как неудача

Рассмотрим  пример. Пусть некоторая Мэри любит всех животных.

Это записывается:   likes(mary,X):-annimal(X).

Мэри не любит змей:

likes(mary,X):-snake(X),!,fail.

fail - специальная цель, встроенный предикат,
который всегда терпит неудачу.

Решение можно записать в виде одного правила, используя  дизъюнкцию целей:

likes(mary,X):-snake(X),!,fail; annimal(X).

Рассмотрим другой пример.

Отношение different(X,Y) будет истина, если X и Y различны.

different(X,X):-!,fail. или different(X,Y):-X=Y,!,fail. different(X,Y).
     
     

Если X и Y сопоставимы, то цель different терпит неудачу.
Иначе X и Y различны, и цель different успешна.

Или в одном предложении

different(X,Y):-X=Y,!,fail;true.


Здесь true - встроенный педикат, который всегда истина.

И в том и другом случае более удобно указывать, что отношение истинно, если цель ложна. Для этой цели используется предикат not.

not(Goal). -истина, если Goal -ложь, и наоборот not(Goal) ложно, если Goal успешна.
Это можно записать в виде:

not(Goal):-Goal,!,fail;true.


Запись аналогична сделанным ранее и поэтому последние примеры можно переписать следующим образом:

likes(mary,X):-annimal(X),not(snake(X)).
или
different(X,Y):-not(X=Y).

Использование not требует осторожности. Рассмотрим пример:

r(a).
g(b).
p(X):-not(r(X)).

?-g(X),p(X).
yes
?-p(X),g(X).
no

 

 














Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: