Я довольно много читал про Отрицание по ошибке в Prolog, где Prolog, чтобы доказать, что \+Goal
имеет место, пытается доказать, что Goal
терпит неудачу.
Это тесно связано с CWA (предположение о близком мире), где, например, если мы запрашиваем \+P(a)
(где P
- предикат арности 1), и у нас нет подсказок, которые приводят к доказательству P(a)
Предполагается, что Пролог (из-за CWA), что not P(a)
удерживает, поэтому \+P(a)
успешно.
Из того, что я искал, это способ решения классической логической слабости, когда, если бы мы не имели представления о P(a)
, мы не могли бы ответить, выполняется ли \+P(a)
.
То, что описано выше, было способом введения немонотонных рассуждений в Пролог. Более того, интересно то, что Кларк доказал, что отрицание по ошибке совместимо / похоже с классическим отрицанием только для основных предложений. Я понимаю, что например:
X=1, \+X==1.
: должен возвращать false в Прологе (и в классической логике).
\+X==1, X=1.
: должен возвращать false в классической логике, но успешно в Прологе, поскольку время проверки NF X
не привязано, это отличается от классической чистой логики.
\+X==1.
: не должен давать никакого ответа в классической логике до тех пор, пока X
не будет привязан, но в Прологе он возвращает false (возможно, чтобы сломать слабость классической логики), и это не то же самое / совместимо с чистой логикой.
Моя попытка состояла в том, чтобы смоделировать классическое отрицание, благодаря предложениям @ false в комментариях текущая реализация:
\\+(Goal) :- when(ground(Goal), \+Goal).
Некоторое тестирование:
?- \\+(X==1).
when(ground(X), \+X==1).
?- X=1, \\+(X==1).
false.
?- \\+(X==1), X=1.
false.
Мой вопрос:
Правильно ли вышесказанное толкование классического отрицания? (Есть ли какие-нибудь очевидные угловые случаи, которые он пропускает? Также меня беспокоит Logic Purity при использовании when/2
, можно ли предположить, что вышесказанное чисто ??).
ground/2
действительно не имеет значения. - person false   schedule 09.12.2017ground/2
должно быть константой "истина". Нет ситуации, когда это ложно. - person false   schedule 09.12.2017\\+(Goal) :- when(ground(Goal), \+Goal).
??? - person coder   schedule 09.12.2017\\+( [] = [X|Xs])
, которая не является заземленной, поэтому вы никогда не получите ответа, аdif([], [X|Xs])
просто добьетесь успеха. - person false   schedule 09.12.2017