考慮瞭如下定義:如何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].
有人能幫助我理解它是如何工作的?
考慮瞭如下定義:如何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].
有人能幫助我理解它是如何工作的?
這項工作就像一個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)
這是一個遞歸函數。
它將第一個列表拆分成頭件,當它爲空時,它將第二個列表並將頭部連續添加到前面。
可以按如下想象這是多次調用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],函數結束。
這是任何人學習的首批Prolog程序之一。這不是在教科書中解釋的嗎? – Barmar