2012-07-18 64 views
16

如何在prolog中追加列表?我搜索在互聯網上,我發現這個(從http://www.csupomona.edu/~jrfisher/www/prolog_tutorial/2_7.html如何在prolog中追加列表?

append([X|Y],Z,[X|W]) :- append(Y,Z,W). 
append([],X,X). 

所以在[X|W]去除[X|Y]元素得到Z。但是,我如何在一起附加兩個列表?

實施例,

appendlist([1,2],[3,4,5],X). 

其結果將是X = [1,2,3,4,5]

另外我不知道在遞歸中發生了什麼。 (我追查,但不明白)

編輯:我想知道的是應該如何進行編碼,如預定義的append()的功能在序言

回答

20

的代碼,因爲你已經發布它(幾乎)確定。條款的順序只是需要交換(爲了使這個謂詞定義富有成效,在生成的方式使用時):

append([],X,X).       % your 2nd line 
append([X|Y],Z,[X|W]) :- append(Y,Z,W). % your first line 

這定義了三個參數之間的關係,讓我們說ABC

你的第一行說,C是追加AB如果AC非空列表的結果,它們都具有相同的(即第一個元素),和的C是用相同的第二個參數B」追加A的尾部的結果。

a  a 
    ---------- 
    b  b 
    c  c 
    . d d 
     e e 
     . . 

想一想,這很有道理。它所做的是,我們想要定義關係,並且我們知道我們想要的是什麼,所以我們只是寫下我們希望它實現的一些明顯的事實,如果您願意的話,它必須遵循的法律。

因此,假設我們已經爲我們定義了此代碼,那麼必須遵守哪些法律?很顯然,將一個列表的尾部與另一個列表相連接會給我們帶來一個追加完整列表與第二個列表的結果。

這定義了我們如何「滑動」第一個列表。但是如果沒有更多的空間可以滑動呢?如果我們已經達到了這個列表的末尾呢?然後,我們已經到達空白列表,並且用另一個列表追加一個空列表,並將結果列表顯示給我們。明顯。這就是代碼中的第二行告訴我們,它說,「將空列表與另一個列表附加在一起生成該列表,結果爲」「。令人驚訝的是,寫下了這兩條必須遵循的兩條法則,這與寫下定義本身是一樣的。

此外:這從聲明的角度解釋它;請檢查出an answer by m09,這從操作的角度來看更多。

9

但是怎麼辦我在一起追加兩個列表?

你回答了自己的問題:您使用append/3

如果要追加XY和結果存儲在Z,你做

append(X, Y, Z) 

例如,如果X = [1, 2]Y = [3, 4, 5]然後Z將被綁定到[1, 2, 3, 4, 5]

| ?- append([1,2],[3,4,5], X). 

X = [1,2,3,4,5] 

yes 
| ?- 
+1

噢,我的意思是,我該如何編寫代碼,它的功能類似於序言的append() – Zik 2012-07-18 10:31:07

+5

您使用與「append」編碼相同的方式進行編碼!?你已經發現了這個實現(這是你問題中的前兩行代碼)。 – aioobe 2012-07-18 13:02:14