如何在 prolog 中添加所有长度的子列表。请帮助我,我卡住了

How to Add all lengths of sublists In prolog . Please Help me , i'm stuck

在序言中添加所有长度的子列表 使用

sum([],ADD,ADD).
sum([P|R], ADD, OUTPUT):- X is ADD + P,
                          sum(R,X,ADD).
nestedlist_length(List, Length) :-
    flatten(List, Flat),
    length(Flat, Length).

您的代码:sum([],ADD,ADD). 表示空列表的长度之和可以是任何值,只要您重复足够多即可。 sum([], 50, 50). 在那里工作,sum([], dog, dog)..

也在那里工作

这:sum([P|R], ADD, OUTPUT):- X is ADD + P, sum(R,X,ADD). 表示您再也不会使用 OUTPUT,并且您尝试将头部添加到任何内容上,然后将其填充到尾部的总和中,尾部永远无法获得值,因为无处可寻你说一个空列表的长度总和为 0.

list_subsum([], 0).
list_subsum([H|T], Output) :-
    length(H, HLen),
    list_subsum(T, TLengthSum),
    Output is HLen + TLengthSum.

空列表的长度为0,列表的东西得到头部的长度,得到尾部的长度,然后将两者相加输出。

尾部最终将是 [],其长度为 0,这会停止该过程。

避免缓慢的递归:

sublists_len(SubLists, Length) :-
    sublists_len_(SubLists, 0, Length).
    
sublists_len_([], Len, Len).
sublists_len_([H|T], Upto, Len) :-
    length(H, LenH),
    Upto1 is Upto + LenH,
    sublists_len_(T, Upto1, Len).

swi-prolog中的性能比较:

?- length(SubLists, 5000000), maplist(=([1, 2]), SubLists), time(sublists_len(SubLists, Len)).
% 20,000,002 inferences, 2.730 CPU in 2.697 seconds (101% CPU, 7326281 Lips)

?- length(SubLists, 5000000), maplist(=([1, 2]), SubLists), time(list_subsum(SubLists, Len)).
% 20,000,001 inferences, 7.581 CPU in 7.500 seconds (101% CPU, 2638194 Lips)