2014-09-21 116 views
12

我開始學習prolog,並希望使整個切割更清晰。 我已經讀過「綠色切割不會改變程序的聲明性含義,而紅色切割」。但是,程序的含義並不是純粹的聲明式(僅僅是因爲prolog實際上會回溯所有選項)。Prolog - 紅色切割和綠色切割之間的差異

下面是一個例子:

p(1). 
p(2) :- !. 
p(3). 

有人說,這是綠色的削減。但如果我運行這個:

p(X), X =:= 3. 

我會得到「真」沒有削減,「假」與削減。 那麼,我錯過了什麼?

在此先感謝。

+7

這不是綠色環保。你從哪裏讀到這是一個綠色切割? – 2014-09-21 19:40:31

+2

你從哪裏閱讀了* green *和* red * cut的定義? – lurker 2014-09-21 20:08:42

+0

均來自講義文件: - \。你確定這不是綠色切割?如果它不是定義那麼是什麼?謝謝。 – rooster 2014-09-21 21:40:41

回答

11

該切換非常簡單,以便在操作上解釋,或者如果您願意,在程序上可以。然而,由於關於邏輯編程和Prolog主題的大多數文獻都偏向於Prolog程序的含義(出於很好的理由),所以在解釋切割時出現困難。一個試圖糾正這種情況的方法是根據它們的效果對着色進行「着色」。

這裏是我試圖讓一切都變得不那麼清楚。

切口的操作意義,

  1. SWI-Prolog's reference manual:「放棄自進入在其中出現切割換句​​話說謂詞創建的所有的選擇點,提交於其中出現的切割該條並放棄在當前條款中由切入點左側的目標創建的選擇點。「

  2. "The Art of Prolog" by Sterling and Shapiro:「的目標成功,並承諾序言,以取得自父目標是在 [重點不是我]發生切條款的頭部統一了所有的選擇。雖然這個定義是完整的,精確的,其影響和影響並不總是直觀清晰或明顯。「

  3. "The Craft of Prolog" by O'Keefe:「[切割]修剪的選擇點堆棧回它在哪裏時詞法包含切謂詞被稱爲這樣說的另一種方式是,晉級成功,並承諾序言,以把所有的選擇,因爲父目標被稱爲 [再次強調不是我]」

我建議你閱讀對砍至少從上面提到的兩本書的章節和它的用途。它一定會幫助你理解實際發生的事情。

一個常見的討論是尋找解答與答案與證明之間的區別。我們(用戶,程序員)通常需要答案。評估Prolog謂詞的結果是解決方案。但是,Prolog實際上正在尋找的是樣張

要採取你的榜樣。你有數據庫p(1). p(2). p(3).。現在要問的Prolog,「有p(X)這樣X =:= 3

?- p(X), X =:= 3. 
X = 3. 

你得到一個解決方案X = 3您還可以得到一個答案你的問題:是的,有這樣的p(X),X爲3,有沒有明確的答案更多。

(嘗試查詢?- p(X), X =:= 2.,這是否表現相同原始查詢?)

你證明樹可以看到(在一個時尚)通過跟蹤查詢:

?- trace(p/1), trace(=:=). 
%   p/1: [call,redo,exit,fail] 
%   (=:=)/2: [call,redo,exit,fail] 
true. 

[debug] ?- p(X), X =:= 3. 
T Call: (7) p(_G1004) 
T Exit: (7) p(1) 
T Call: (7) 1=:=3 
T Fail: (7) 1=:=3 
T Redo: (7) p(_G1004) 
T Exit: (7) p(2) 
T Call: (7) 2=:=3 
T Fail: (7) 2=:=3 
T Redo: (7) p(_G1004) 
T Exit: (7) p(3) 
T Call: (7) 3=:=3 
T Exit: (7) 3=:=3 
X = 3. 

基本上,每個p/1的條款又嘗試。前兩個不能提供證明,因爲該連接的第二個子目標失敗。從最後一個選擇點(p/1的下一個子句)每次都繼續搜索證明。最後一個可以證明,並且你得到一個解決方案和答案你的查詢。

現在你把切的p/1第二條的身體:p(1). p(2) :- !. p(3).。你告訴Prolog的(從上面的定義3計算),「當一個證明搜索到達的p/1第二條款,即統一其參數與2一,選擇修剪點的堆在那裏它是當p/1是被稱爲「。當調用p/1時,沒有選擇點。所以,當X =:= 3失敗時,搜索證明是完整的,連接不能被證明,沒有解決方案,並且你沒有得到答案。

(嘗試查詢?- p(X), X =:= 2.。它是等同於同一個查詢時,你沒有切?)

我們的顏色 .....在結合p(X), X =:= 3.的背景下,這削減修剪和證明。你沒有得到你所期望的答案。這個剪輯是紅色

這將是很好,如果我們能告訴Prolog的,我們指的是切是綠色或紅色(或綠色或綠藍或紅或藍),但序言不允許我們這樣做。 「顏色」是程序的意圖含義(程序員的意圖)和剪切的操作(程序)效果的結果。

但實際上,試圖讓一本書,閱讀削減部分。甚至兩本書。