当列表中可以有列表时,如何计算列表中的元素总数?(将所有列表的长度相加)
?- sumOfLists([[1,2],[],[a,s,d],[a,1,3],[1]],S).
S = 9
当列表中可以有列表时,如何计算列表中的元素总数?(将所有列表的长度相加)
?- sumOfLists([[1,2],[],[a,s,d],[a,1,3],[1]],S).
S = 9
这是我知道的更短的方法,使用flatten /2:
sumOfLists(Ls, S) :-
flatten(Ls, Flat),
length(Flat, S).
您可以在不展平和不使用 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.
首先,用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).