如果列表中有列表,您如何计算列表中元素的总数? (将所有列表的长度加在一起)
?- sumOfLists([[1,2],[],[a,s,d],[a,1,3],[1]],S).
S = 9
答案 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).