Prolog - 如何计算元素总数

时间:2013-02-28 01:16:46

标签: prolog

如果列表中有列表,您如何计算列表中元素的总数? (将所有列表的长度加在一起)

?- sumOfLists([[1,2],[],[a,s,d],[a,1,3],[1]],S).
    S = 9

3 个答案:

答案 0 :(得分:2)

以下是我所知道的更短的方式,使用flatten / 2:

sumOfLists(Ls, S) :-
  flatten(Ls, Flat),
  length(Flat, S).

答案 1 :(得分:1)

您可以在不使用地图列表的情况下执行此操作。

以下是我的建议:

%element atomic? -> count
deep_len([H|T],N) :- atomic(H), deep_len(T, M), N is M + 1.

%element list? -> recurse for head and tail and sum results
deep_len([H|T],N) :- is_list(H), deep_len(H, Sum1), deep_len(T, Sum2), N is Sum1+Sum2.

答案 2 :(得分:0)

首先,使用maplist将每个列表替换为它的长度,然后总结长度。

使用像这样的sum谓词:

sum(L, S) :- sum(L, S, 0).
sum([], Acc, Acc).
sum([X|Xs], Sum, Acc) :- 
  Acc1 is Acc + X, 
  sum(Xs, Sum, Acc1).

归结为:

sumOfLists(L, S) :- maplist(length, L, Lengths), sum(Lengths, S).