List gnu Prolog电源组修改

List gnu Prolog电源组修改,list,prolog,set,substring,dcg,List,Prolog,Set,Substring,Dcg,所以我给powerset买了这个: powerset([], []). powerset([H|T], P) :- powerset(T,P). powerset([H|T], [H|P]) :- powerset(T,P). 这将生成列表的所有集合。是否可以按列表顺序生成所有集合 例如: List = [a,b,c] 我想去 [a],[a,b],[a,b,c],[b],[b,c],[c] 注:此子集列表中没有[a,c],因为这些子集从左开始,向右 我尝试过使用附加和递归的组合,但没有达到

所以我给powerset买了这个:

powerset([], []).
powerset([H|T], P) :- powerset(T,P).
powerset([H|T], [H|P]) :- powerset(T,P).
这将生成列表的所有集合。是否可以按列表顺序生成所有集合

例如:

List = [a,b,c]
我想去

[a],[a,b],[a,b,c],[b],[b,c],[c]
注:此子集列表中没有
[a,c]
,因为这些子集从左开始,向右

我尝试过使用附加和递归的组合,但没有达到我想要的效果。小男孩在这一点上感到困惑

谢谢。

怎么样

powerset(L, [H|T]):-
  append([H|T], _, L).
powerset([_|L], P):-
  powerset(L, P).
您需要所有子序列子字符串()。语法(DCG)最适合这一点:


seq([]) -->
   [].
seq([E|Es]) -->
   [E],
   seq(Es).

... --> [] | [_], ... .

?- Es = [_|_], phrase((..., seq(Es), ...), [A,B,C]).
Es = [A] ;
Es = [A, B] ;
Es = [A, B, C] ;
Es = [B] ;
Es = [B, C] ;
Es = [C] ;
false.

(SWI序言)

我知道这是一篇老文章,但我不会无缘无故地更新它。 所有方面都接受的答案,可分离地生成所有子集,而不生成功率集

几天前,我试图实现一个
powerSet/2
谓词,而不使用内置谓词
bagof/2
。但是,即使使用
bagof/2
setof/2
,对于初学者来说,这也不是一个很容易的问题(可分离地生成所有子集是另一个问题,而且要容易得多)。因此,在实施解决方案后,我认为最好将其放在这里,以防止搜索此主题的人出错

我的解决方案(无
bagof/2
) 生成(X[Y],[X | Y]])。 生成(X,S,P):- S=[H | T], 附加([X],H,温度), 生成(X,T,Rest), 附加([Temp],Rest,P)!。 电源集([],[[])。 动力装置(组,P):- 集合=[H | T], 动力装置(T,PsT), 生成(H、PsT、Ps), %write('trying to push')、print(H)、write('to'), %write('powerset of')、print(T)、write('which is'), %打印(PsT),nl, %写入('结果是')、打印(Ps)、nl、nl、, 附加(Ps、PsT、P)!。 如果参考注释行,代码将被理解

另一个解决方案是使用内置谓词
bagof/3

现在可能会更有帮助。

这个怎么样:

powerset(A,B):-
    append(A,_,B);
    append(_,A,B).

test():-
    setof(X,powerset(X,[1,2,3]),L),
    writeln(L).

谢谢这是有道理的。我很接近。似乎总是这样。这不会产生完整的动力集。例如,当被问到[a,b,c]的幂集是什么时,它无法生成[a,c]。@RasmusJ:你看到这个问题了吗?它明确指出[a,c]不应是输入[a,b,c]的答案。OP需要“按列表顺序设置”(检查OP样本输入/输出以获得澄清)
powerset(A,B):-
    append(A,_,B);
    append(_,A,B).

test():-
    setof(X,powerset(X,[1,2,3]),L),
    writeln(L).