2013-02-05 109 views
5

假設我們有以下程序:Prolog的否定與邏輯否定

a(tom). 
v(pat). 

和查詢(返回FALSE):

\+ a(X), v(X). 

追查的時候,我可以看到X成爲實例湯姆,謂詞a(tom)成功,因此+ a(tom)失敗。

我看了一些教程,未(+)在序言只是測試,並不會導致實例化。

  1. 難道有人請澄清一下上述要點嗎?我可以看到實例。

  2. 我知道有沒有(否定爲失敗)和邏輯非之間的差異。你能否參考一篇很好的文章來解釋在哪些情況下他們的行爲是相同的,他們的行爲何時會有所不同?

回答

2

WRT點2,Wikipedia article似乎是一個很好的起點。

您已經體驗到NAF的理解可能會很困難。這部分可能是因爲(邏輯)否定它本來就很難,即使在簡單的比賽是謂詞演算定義(見例如Russel's paradox),以及部分是因爲Prolog的強大的變量是半球形,以保持實際的反例失敗,如果否定證明。看看你是否能理解forall/2的實際庫定義(請閱讀文檔,它的合成和有趣的),這是運行故障驅動迴路的首選方式:

%% forall(+Condition, +Action) 
% 
% True if Action if true for all variable bindings for which Condition 
% if true. 

forall(Cond, Action) :- 
    \+ (Cond, \+ Action). 

我記得我第一次看到它,它看起來像魔術......

編輯有關的教程,我發現,而「洞穴探險」我的鏈接集,好site通過JRFisher。它充滿了有趣的東西,只是可惜它在解釋中有點簡潔,要求學生用經常的行爲來回答自己。請參閱paragraph 2.5,致力於否定失敗。我想你也可以享受第3節。Prolog如何工作

2

好問題。

簡短的回答:您偶然發現了「掙扎」。

問題是,當施加到一個常量,其中包含沒有變量,即,接地 字面操作者\ +實施只能 。它無法爲變量生成綁定,但只有 測試子目標是成功還是失敗。因此,爲了保證合理的 對包含否定的程序的查詢的答案,必須允許否定 運算符僅應用於地面文字。如果它是 適用於非圓周文字,程序據說比目魚。 link

如果反轉查詢

v(X), \+ a(X).

你會得到正確的答案。一些實現或元解釋器檢測到陷入困境的目標並延遲它們直到所有的變量都被磨掉。

關於您的觀點1),您會看到NAF樹內的實例。發生什麼不應該影響外部變量(在本例中是v(X))。 Prolog通常採用天真的方式來避免效率低下。理論上它應該只是返回一個錯誤而不是實例化變量。

2)這是我最愛關於此題目的文章:Nonmonotonic Logic Programming

+0

你通過掙扎瞭解什麼?就我的理解而言,它僅僅意味着像safenot(G)這樣的協同目標:當(地面(G),\ + G).'是答案的一部分時。但你似乎有一個不同的概念。 – false

+1

第二點:不要求基礎性,只要堅持否定目標以外發生的變量的基礎性就足夠了。即使這樣也太需要了。 – false

+0

我不確定我瞭解你的問題。 '保險單(G): - 當(地面(G),\ + G)。「是一個解決方案來解決那些有解決方案的案例。雖然爲了解決這個問題,我打算髮生一個目標,因爲NAF的Prolog概念導致了一個不正確的答案。 – NotAUser