如何得到另一个列表中的列表总和?

时间:2013-02-04 06:38:13

标签: lambda prolog swi-prolog

我有一个列表,其中包含多个列表。我想将这些列表的总和放到另一个列表中。

  

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

我想获得如下输出, L = [39,21,85]。

有人请用prolog向我解释如何做到这一点。 提前谢谢!

3 个答案:

答案 0 :(得分:3)

sum_list / 2,可以随时使用内置:

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

试验:

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

答案 1 :(得分:2)

功能设计,与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

答案 2 :(得分: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);

现在您可以使用任意数量的列表调用它。