List prolog中包含列表所有元素的所有子集
我试图计算一个包含给定列表及其所有元素的所有子集的列表,但到目前为止,我只成功地找到了两个元素的子集,但这不是解决我问题的正确方法。。有人能帮我吗?我知道这样的问题是通过回溯方法解决的,但在Prolog中,我不确定应该如何编写。。源代码如下所示:List prolog中包含列表所有元素的所有子集,list,prolog,subset,dcg,powerset,swi-prolog,List,Prolog,Subset,Dcg,Powerset,Swi Prolog,我试图计算一个包含给定列表及其所有元素的所有子集的列表,但到目前为止,我只成功地找到了两个元素的子集,但这不是解决我问题的正确方法。。有人能帮我吗?我知道这样的问题是通过回溯方法解决的,但在Prolog中,我不确定应该如何编写。。源代码如下所示: subs(_, [], []). subs(H, [H1|Tail], [[H,H1]|Ta]):- subs(H, Tail, Ta). generatesubs([], []). generatesubs([H],
subs(_, [], []).
subs(H, [H1|Tail], [[H,H1]|Ta]):-
subs(H, Tail, Ta).
generatesubs([], []).
generatesubs([H], [H]).
generatesubs([H|Tail], [R|Ta]):-
subs(H, Tail, R),
generatesubs(Tail, Ta).
main1([], []).
main1([H], [H]):-
is_list(H).
main1([H|Tail], [H|Ta]):-
is_list(H),
main1(Tail, Ta).
main1([_|Tail], Ta):-
main1(Tail, Ta).
main([], []).
main(H ,R):-
generatesubs(H, G),
main1(G,R).
提前感谢!:) 使用强>
list_allsubseqs(Es, Uss) :-
list_acc_allsubseqs(Es, [[]], Uss).
lists_prependum([] , _) --> [].
lists_prependum([Es|Ess], E) --> [[E|Es]], lists_prependum(Ess, E).
list_acc_allsubseqs([] , Uss , Uss).
list_acc_allsubseqs([E|Es], Uss0, Uss) :-
list_acc_allsubseqs(Es, Uss0, Uss1),
phrase(lists_prependum(Uss1,E), Uss, Uss1).
在下文中,我们使用7.3.11版(64位)
:-(,假)。%隐藏一些替换
:-(全球,限额(2*10**9))。%查阅
让我们调查一下
?- between(18, 22, N),
numlist(1, N, _Es),
member(How, [findall_subseq, list_allsubseqs]),
garbage_collect,
call_time(( How = findall_subseq, findall(Xs,list_subseq(_Es,Xs),_)
; How = list_allsubseqs, list_allsubseqs(_Es,_)), T_in_ms),
statistics(globalused, Mem_in_B).
N = 18, How = findall_subseq, Mem_in_B = 62_915_848, T_in_ms = 185
; N = 18, How = list_allsubseqs, Mem_in_B = 12_584_904, T_in_ms = 22
;
N = 19, How = findall_subseq, Mem_in_B = 132_121_888, T_in_ms = 361
; N = 19, How = list_allsubseqs, Mem_in_B = 25_167_888, T_in_ms = 42
;
N = 20, How = findall_subseq, Mem_in_B = 276_825_400, T_in_ms = 804
; N = 20, How = list_allsubseqs, Mem_in_B = 50_333_784, T_in_ms = 80
;
N = 21, How = findall_subseq, Mem_in_B = 578_815_312, T_in_ms = 1_973
; N = 21, How = list_allsubseqs, Mem_in_B = 100_665_504, T_in_ms = 154
;
N = 22, How = findall_subseq, Mem_in_B = 1_207_960_936, T_in_ms = 3_966
; N = 22, How = list_allsubseqs, Mem_in_B = 201_328_872, T_in_ms = 290.
?-(18,22,N),
(1,N,_Es),
(如何,[findall_subseq,list_allsubseq]),
,
((How=findall_subseq,(Xs,list_subseq,Xs),)
;How=list_allsubseq,list_allsubseq(_Es,)),),
(全球评估,)。
N=18,How=findall_subseq,Mem_in_B=62_915_848,T_in_ms=185
; N=18,How=list_allsubseq,Mem_in_B=12_584_904,T_in_ms=22
;
N=19,How=findall_subseq,Mem_in_B=132_121_888,T_in_ms=361
; N=19,How=list\u allsubseq,Mem\u in\u B=25\u 167\u 888,T\u in\u ms=42
;
N=20,How=findall\u subseq,Mem\u in\u B=276\u 825\u 400,T\u in\u ms=804
; N=20,How=list\u allsubseq,Mem\u in\u B=50\u 333\u 784,T\u in\u ms=80
;
N=21,How=findall_subseq,Mem_in_B=578_815_312,T_in_ms=1_973
; N=21,How=list_allsubseq,Mem_in_B=100_665_504,T_in_ms=154
;
N=22,How=findall_subseq,Mem_in_B=1_207_960_936,T_in_ms=3_966
; N=22,How=list_allsubseq,Mem_in_B=201_328_872,T_in_ms=290。
请提供一些带有预期结果的示例查询!例如,如果我们调用main([2,3,4,5],R),R应该是:[[2,3],[2,4],[2,5],[2,3,4],[2,3,5],[3,4,5]]好的,为什么不进行整个过程呢?(这将包括
[2,3,4,5]
和[]
以及所有单例子集。)功率集将是一种原则性的方法,但如果你想变得粗俗,你可以将其限制在N>2,N@DanielLyons. 这难道不需要使用setof/3
(或者至少是findall/3
)吗?
list_subseq([], []).
list_subseq([E|Es], [E|Xs]) :- list_subseq(Es, Xs).
list_subseq([_|Es], Xs ) :- list_subseq(Es, Xs).
:- set_prolog_flag(toplevel_print_anon, false). % hide some substitutions
:- set_prolog_stack(global, limit(2*10**9)). % cf. SWI-FAQ on "stack sizes"
?- between(18, 22, N),
numlist(1, N, _Es),
member(How, [findall_subseq, list_allsubseqs]),
garbage_collect,
call_time(( How = findall_subseq, findall(Xs,list_subseq(_Es,Xs),_)
; How = list_allsubseqs, list_allsubseqs(_Es,_)), T_in_ms),
statistics(globalused, Mem_in_B).
N = 18, How = findall_subseq, Mem_in_B = 62_915_848, T_in_ms = 185
; N = 18, How = list_allsubseqs, Mem_in_B = 12_584_904, T_in_ms = 22
;
N = 19, How = findall_subseq, Mem_in_B = 132_121_888, T_in_ms = 361
; N = 19, How = list_allsubseqs, Mem_in_B = 25_167_888, T_in_ms = 42
;
N = 20, How = findall_subseq, Mem_in_B = 276_825_400, T_in_ms = 804
; N = 20, How = list_allsubseqs, Mem_in_B = 50_333_784, T_in_ms = 80
;
N = 21, How = findall_subseq, Mem_in_B = 578_815_312, T_in_ms = 1_973
; N = 21, How = list_allsubseqs, Mem_in_B = 100_665_504, T_in_ms = 154
;
N = 22, How = findall_subseq, Mem_in_B = 1_207_960_936, T_in_ms = 3_966
; N = 22, How = list_allsubseqs, Mem_in_B = 201_328_872, T_in_ms = 290.