Непонимание возможного определения не в прологе - PullRequest
0 голосов
/ 08 февраля 2020

Начал читать вводную книгу по Прологу и натолкнулся на возможное определение предиката , а не :

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

Как я понимаю, после оценки P! Оператор зафиксирует свои решения и добьется успеха. Позже он потерпит неудачу . то, что смущает меня, является; разделение предиката true : почему это не делает достижение родительских целей? В какой момент происходит отрицание P?

1 Ответ

0 голосов
/ 10 февраля 2020
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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...