2017-05-20 37 views
0
polarbear([],H,[H]). 
polarbear([H|T],Y,[H|Z]):- polarbear(T,Y,Z). 

這是序言碼。當進入?-polarbear([1,2], 6, P).獲取P =[1,2,6].Prolog中遞歸的具體示例

的事情是我只是不明白它是如何工作的,我一直在試圖找出Prolog是如何做它在做什麼。

我對Prolog有一些經驗,但是我不明白這一點,所以對於它如何做以幫助我理解Prolog會有什麼指導將不勝感激。

回答

0

指出第一個參數是頭部H和尾部T的列表,第三個參數是頭部H和尾部Z的列表。因此,它強制(通過使用統一)兩個列表的頭部相同。遞歸地,除了第三個參數列表在結尾處有一個元素(元素Y)並且由第一個子句定義的事實之外,這兩個列表變得完全相同。請注意,第二個子句僅適用於具有一個或多個元素的列表。因此,當我們檢查空列表時,作爲遞歸的基礎,第三個列表由於第一個子句只包含一個元素Y.

+0

謝謝。這肯定有幫助。因此,它嘗試第一個子句並失敗,然後將提供的列表拆分爲頭部和尾部,6變成Y,最後一個變量保留爲未知變量。然後它再次運行Polarbear,再次失敗第一個子句,再次轉到第二個子句,然後這就是我感到困惑的地方,它如何移動值。對不起,我只是想明白它究竟發生了什麼,我認爲我沒有深度,但找不到一個好的資源。 –

+1

第一次調用(第二個子句):H = 1,T = [2],Y = 6。第二次調用:H = 2,T = [],Y = 6.第三次調用第一個子句匹配,所以list = [6 ]。然後回到第二個呼叫(H = 2),列表= [2,6],首先呼叫(H = 1)列表= [1,2,6]。 –