4

だから私はパワーセットのためにこれを手に入れました:

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]これらのサブセットは左から始まり、右に進むサブセットであるため、このサブセットのリストには no がないことに注意してください。

追加と再帰の組み合わせを使用してみましたが、思ったようにうまくいきませんでした。この時点で少し困惑。

ありがとう。

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

generate(X, [Y], [[X| Y]])。

生成 (X、S、P) :-
        S = [H | T]、
        append([X], H, 温度),
        generate(X, T, Rest),
        append([Temp], Rest, P), !.

powerSet([], [[]])。

powerSet(セット、P) :-
        セット = [H| T]、
        powerSet(T, PsT),
        生成(H、PsT、Ps)、
% write('プッシュしようとしています'), print(H), write(' to '),
% write('powerset のすべての要素'), print(T), write(' which is '),
% print(PsT), nl,
% write(' そして結果は '), print(Ps), nl, nl,
        append(Ps, PsT, P), !.

コメント行を参照すると、コードが理解されます。

組み込みの predicate を使用する別のソリューションが利用可能です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 に答える