2013-06-05 175 views
1

如何組合列表中的所有列表元素?結合列表中的所有元素

例如

combine([[a,b,c],[d,[e,f],g],h],X). 
return X = [a,b,c,d,e,f,g,h] 

這是我不得不嘗試

flat([], []). 
flat([First|Rest], _X):- 
    flat(Rest, First). 
+1

你也可以尋找靈感的SWI-Prolog的庫實現'的扁平化/ 2',這是您要執行的確切斷言:HTTP://www.swi- prolog.org/pldoc/doc/home/vnc/prolog/lib/swipl/library/lists.pl?show=src(在頁面中搜索flatten的定義) – 2013-06-06 07:59:22

+0

這不就是內置的'flatten '是嗎? – lurker

回答

0

遞歸。

首先定義您的基本案例 - 如果您沒有列表要組合,您有一個空的列表。

combine([],[]). 

,如果你有一個單一的元素,你有一個單獨列表

combine(X,[X]). 

然後我們定義一般情況下 - 一個非空列表

combine([X|Xs], Y) :- 

首先我們要遞歸壓平頭部

combine(X,XX), 

然後尾部

combine(XS,XXs), 

然後我們把這些結合在一起

append(XX,XXs,Y). 

我們必須認真思考如何把這個一起。單例元素的基本情況想要最後出現。當匹配規則Prolog將匹配第一個適用的情況時 - 具有單例元素的基本情況將匹配列表,所以我們在此情況下將此情況放在這種情況下停止匹配。最後給我們:

combine([],[]). 
combine([X|Xs],Y) :- combine(X,XX), combine(Xs,XXs), append(XX,XXs,Y). 
combine(X,[X]). 
+0

該實現似乎效率很低。你測試過了嗎? – CapelliC

+0

這給了我很多幫助。非常感謝。 –

+0

順便說一句,我沒有修改你的代碼中的一點點。 :P –