我有一個包含列表數量的列表。我想將這些列表的總和列入另一個列表。如何獲取另一個列表中的列表的總和?
full_list([[12,13,14],[5,7,9],[1,12,72]])。 %這是我的原始列表
我想得到如下輸出, L = [39,21,85]。
有人請解釋我如何使用prolog做到這一點。 在此先感謝!
我有一個包含列表數量的列表。我想將這些列表的總和列入另一個列表。如何獲取另一個列表中的列表的總和?
full_list([[12,13,14],[5,7,9],[1,12,72]])。 %這是我的原始列表
我想得到如下輸出, L = [39,21,85]。
有人請解釋我如何使用prolog做到這一點。 在此先感謝!
使用列表和謂詞是這樣的:
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);
現在你可以用任何數量的列表來調用它。
一個functionnal設計,採用SWI-Prolog的工作
:- use_module(library(lambda)).
sum_list(L, R) :-
maplist(\X^foldl(\T^U^V^(V is T+U), X, 0), L, R).
lambda.pl可以在這裏找到:http://www.complang.tuwien.ac.at/ulrich/Prolog-inedit/lambda.pl
謝謝Lahniep。但它只適用於3個子列表。 –
檢查修改後的謂詞... – Lahniep
'append/3'是內置的。在定義它之後,你從未使用過'addElement/3'。 –