List 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],

我试图计算一个包含给定列表及其所有元素的所有子集的列表,但到目前为止,我只成功地找到了两个元素的子集,但这不是解决我问题的正确方法。。有人能帮我吗?我知道这样的问题是通过回溯方法解决的,但在Prolog中,我不确定应该如何编写。。源代码如下所示:

  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.