List gnu Prolog电源组修改
所以我给powerset买了这个: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([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).