Я читал довольно много о Prolog Negation by Failure, где Prolog для доказательства того, что \+Goal
содержит попытки доказать, что Goal
терпит неудачу.
Это сильно связано с CWA (близкое мировое предположение), где, например, если мы запрашиваем \+P(a)
(где P
- предикат arity 1), и мы не имеем никаких подсказок, которые приводят к доказать P(a)
Prolog предполагает (из-за CWA), что not P(a)
выполняется так, что \+P(a)
преуспевает.
Из того, что я искал, это способ решить слабость классической логики, если бы мы не имели понятия о P(a)
, тогда мы не могли бы ответить, существует ли \+P(a)
.
То, что описано выше, способ введения в Prolog немонотонных рассуждений. Более того, интересная часть состоит в том, что Clark доказал, что Negation by Failure совместим/аналогично с классическим отрицанием только для основных предложений. Я понимаю это, например:
X=1, \+X==1.
: должен возвращать false в Prolog (и в классической логике).
\+X==1, X=1.
: должен возвращать false в классической логике, но он преуспевает в Prolog с тех пор, пока NF не рассматривается. X не связан, это отличается от классической Pure Logic.
\+X==1.
: не должен давать никакого ответа в классической логике до тех пор, пока X не будет связан, но в Prolog он возвращает false (возможно, чтобы нарушить слабость классической логики), и это не то же самое/совместимо с чистой логикой.
Моя попытка состояла в том, чтобы моделировать классическое отрицание, благодаря @false предложениям в комментариях, текущая реализация:
\\+(Goal) :- when(ground(Goal), \+Goal).
Некоторые тесты:
?- \\+(X==1).
when(ground(X), \+X==1).
?- X=1, \\+(X==1).
false.
?- \\+(X==1), X=1.
false.
Мой вопрос:
Является ли приведенная выше правильная интерпретация классического отрицания? (Есть ли какие-либо очевидные угловые случаи, которые он пропускает? Также я обеспокоен логикой Purity при использовании, когда /2, можно ли предположить, что вышеописанное чисто?).