2013-02-04 89 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

相关问题