Отрицание как неудача
Рассмотрим пример. Пусть некоторая Мэри любит всех животных.
Это записывается: 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