2013-05-21 57 views
-1

考慮瞭如下定義:如何Prolog的處理這個查詢

my_append([], L, L). 
my_append([H|T], L, [H|NewTail]):- 
my_append(T, L, NewTail). 

和可能的用途,它的輸出:

?- my_append([1,2,5], [3,4], L). 
L = [1, 2, 5, 3, 4]. 

有人能幫助我理解它是如何工作的?

+3

這是任何人學習的首批Prolog程序之一。這不是在教科書中解釋的嗎? – Barmar

回答

0

這項工作就像一個recusive功能。 有兩個步驟(1 & 2)來定義遞歸函數 my_append(A,B,C)取兩個列表A & B並構建一個列表,它是A和B元素的附加元素(稱爲此結果C) 。 這裏第三個參數作爲函數的結果(這不是真的,但是是一個好的第一個近似)。

1)基本情況。 my_append([],L,L)。

在第一個Liste爲空的情況下,trivaly的結果是所有可以放入第二個參數的結果。

2)遞歸的情況。 my_append([H | T],L,[H | NewTail]): - my_append(T,L,NewTail)。

在第一個列表不爲空的情況下,第一個列表的形式是[Head | Tail],我們希望該頭部是我們結果的頭部(第三個參數)。 第二行給出瞭如何構建結果的結尾的詳細信息。 結果的尾部/尾部是縮短的第一個參數和第二個參數的附加值:這是遞歸;問題是使用它自己的定義來表達,但在列表中巫婆是一個更短的元素。

因此,日復一日,第一個參數越來越短,直到基本情況匹配。

請注意,如果您使用不是綁定變量的參數(如果您更喜歡知道變量)調用my_append(),那麼結果可能是不確定的:即每個調用都將返回一個不同的解決方案,直到沒有更多的解決方案。

我所說的方法是這樣的:

my_append([1,2],[3,4],L) 

和與之相匹配

my_append([1,2],[3,4],[1,2,3,4]) 


it's logicals implication are given by : 
my_append([1,2],[3,4],L) => match 2) 
so the reduction is : 
    my_append([1,2],[3,4],[1,I]) 
where my_append([2],[3,4],I) must be reduce. 

my_append([2],[3,4],I) => match 2) 
so the reduction is : 
    my_append([2],[3,4],[1,2,J]) 
where my_append([],[3,4],J) must be reduce. 

my_append([],[3,4],K) => match 1) 
so the reduction is : 
    my_append([],[3,4],[3,4]) where all variables are know/bind. 

,所以我們 「去堆棧」

K = [3,4]  (base case) 
J = [3,4]  (recursion case) 
I = [2,3,4] (recursion case) 
L = [1,2,3,4] (call) 
0

這是一個遞歸函數。

它將第一個列表拆分成頭件,當它爲空時,它將第二個列表並將頭部連續添加到前面。

可以按如下想象這是多次調用my_append:

my_append([1,2,5], [3,4], L) 

的呼叫:

my_append([2,5], [3,4], L) 

的呼叫:

my_append([5], [3,4], L) 

然後調用基本情況:

my_append([], [3,4], L) 

這然後以相反的順序返回如下:

L是[3,4],則L是[5,3,4],則L是[2,5,3,4] ,那麼L是[1,2,5,3,4],函數結束。