Скажем, у меня есть следующая теория:
a(X) :- \+ b(X).
b(X) :- \+ c(X).
c(a).
Он просто говорит истина, что, конечно, правильно, a(X)
истинно, потому что нет b(X)
(с отрицанием как конечный отказ). Поскольку есть только b(X)
, если нет c(X)
, а у нас есть c(a)
, можно утверждать, что это правда. Однако мне было интересно, почему Пролог не дает ответа X = a
? Скажем, например, я ввожу некоторую семантику:
noOrphan(X) :- \+ orphan(X).
orphan(X) :- \+ parent(_,X).
parent(david,michael).
Конечно, если я запрошу noOrphan(michael)
, это приведет к true
и noOrphan(david)
в false
(поскольку я не определил родителя для david
)., Но мне было интересно, почему нет упреждающего способа определить, какие люди (michael
, david
,. ..) принадлежат noOrphan/1
отношению?
Это, вероятно, является результатом механизма обратного отслеживания Prolog, но Prolog может поддерживать состояние, которое проверяет, выполняется ли поиск в положительном направлении (0,2,4, ...) в глубоком отрицании или в отрицательном направлении (1,3 , 5, ...) отрицания глубокие.
\+
основан на двух предположениях: отрицание как конечный отказ и допущение замкнутого мира. Однако, насколько мне известно, привязка по-прежнему действует при обоих предположениях ... - person Willem Van Onsem   schedule 15.10.2013\+
, а такжеnot
не означаютnot
как в логике, а просто недоказуемо (под cwa). В этом смысл отрицания как неудачи в SLD. - person rano   schedule 16.10.2013