1

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

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

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

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

4

3 回答 3

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].
于 2013-02-04T11:44:12.313 回答
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

于 2013-02-04T08:32:13.007 回答
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);

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

于 2013-02-04T08:13:14.273 回答