not(P) :- P, !, fail ; true.
лучше записать как
not(P) :- (P, !, fail) ; true.
или даже, разбив "или" ;
на отдельные предложения:
not(P) :- call(P), !, fail.
not(P).
Таким образом, вы можете указать not(P)
if:
- Если вам удастся доказать
P
(вызов P
), тогда - Подтвердите это решение с помощью
!
(без повторных попыток) - А затем
fail
, так что false
является результатом успешного доказательства P
- В качестве альтернативы, если вы не были в состоянии доказать
P
, скажем, вам это удалось.
Таким образом, not(P)
на самом деле следует читать как "Нет положительного доказательства P".
Это сильный намек что мы на самом деле не имеем дело с классической логикой c здесь, несмотря на то, что постоянно повторяется.
См .:
https://en.wikipedia.org/wiki/Negation_as_failure
и бумага 1978 года
https://www.doc.ic.ac.uk/~klc/neg.html