2013-02-04 85 views
1

我有一個包含列表數量的列表。我想將這些列表的總和列入另一個列表。如何獲取另一個列表中的列表的總和?

full_list([[12,13,14],[5,7,9],[1,12,72]])。 %這是我的原始列表

我想得到如下輸出, L = [39,21,85]。

有人請解釋我如何使用prolog做到這一點。 在此先感謝!

回答

0

使用列表和謂詞是這樣的:

listSum(nil,N,N); 
listSum([H|Tail],N,Res) :- Acc is N+H, listSum(Tail,Acc,Res) 


sumofSubLists([L1,L2,L3],[R1,R2,R3]):- 
    listSum(L1,0,R1), 
    listSum(L2,0,R2), 
    listSum(L3,0,R3) 

調用

sumofSubLists([[12,13,14],[5,7,9],[1,12,72]], ResultList) 

應該給結果。 這可以更有效地完成...... 希望它可以幫助


好吧,如果你想與任何數量的清單做它,你需要定義一些新的謂詞:

的addElement添加一個新的元素列表:

addElement(X,[],[X]); 
    addElement(X,L,[X|L]); 

另外一個追加名單:

append([],X,X); 
    append([T|Q1],X,[T|Q2]) :- append(Q1,X,Q2); 

和一個遞歸一個對工作清單:

sumSubListsRec(nil,AccList,ResultList):- ResultList = AccList; 
sumSubListsRec([HeadList| Tail], AccList,ResultList) :- 
       listSum(HeadList,0,Tmp), 
       append(AccList,[Tmp],T), 
       sumSubListsRec(Tail,T,ResultList); 

現在你可以用任何數量的列表來調用它。

+0

謝謝Lahniep。但它只適用於3個子列表。 –

+0

檢查修改後的謂詞... – Lahniep

+2

'append/3'是內置的。在定義它之後,你從未使用過'addElement/3'。 –

3

sum_list/2,準備內置使用:

full_list(I, L) :- 
    maplist(sum_list, I, L). 

test:

?- full_list([[12,13,14],[5,7,9],[1,12,72]], L). 
L = [39, 21, 85]. 
+0

+1我太過於迷戀lambda! – joel76

+0

剛剛退夥的sim_list謂詞,以及更強大的maplist!謝謝 – Lahniep

相關問題