4

所以我得到了这个用于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],因为这些子集是从左到右的子集。

我尝试过结合使用追加和递归,但这并没有达到我想要的效果。小小在这一点上愣住了。

谢谢。

4

4 回答 4

6

怎么样

powerset(L, [H|T]):-
  append([H|T], _, L).
powerset([_|L], P):-
  powerset(L, P).
于 2010-11-10T16:05:57.640 回答
3

您想要所有子序列子字符串(定义)。语法(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-序言)

于 2010-11-10T18:38:46.143 回答
2

我知道这是一篇旧帖子,但我不会无缘无故地更新它。所有方面都接受的答案,可分离地生成所有子集,并且不生成幂集。

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

我的解决方案(没有bagof/2

生成(X,[Y],[[X|Y]])。

生成(X,S,P):-
        S = [H| T],
        附加([X],H,温度),
        生成(X,T,休息),
        追加([温度],休息,P),!。

电源集([],[[]])。

电源组(设置,P):-
        设置 = [H| T],
        幂集(T,PST),
        生成(H,PsT,Ps),
% write('试图推送'), print(H), write(' to '),
% write('powerset的所有元素'), print(T), write('即'),
% 打印 (PsT), nl,
% write('结果是'), print(Ps), nl, nl,
        追加(Ps,PsT,P),!。

如果参考注释行,代码将被理解。

此处提供了另一种使用内置谓词的解决方案bagof/3

现在可能会更有帮助。

于 2013-04-08T23:33:21.923 回答
0

这个怎么样:

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

test():-
    setof(X,powerset(X,[1,2,3]),L),
    writeln(L).
于 2015-12-12T08:29:58.983 回答