1

当列表中可以有列表时,如何计算列表中的元素总数?(将所有列表的长度相加)

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

3 回答 3

2

这是我知道的更短的方法,使用flatten /2:

sumOfLists(Ls, S) :-
  flatten(Ls, Flat),
  length(Flat, S).
于 2013-02-28T11:35:18.063 回答
1

您可以在不展平和不使用 maplist 的情况下执行此操作。

这是我的建议:

%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.
于 2014-08-24T12:51:38.970 回答
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).
于 2013-02-28T11:04:51.940 回答