如何在 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)
在序言中添加所有长度的子列表 使用
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)