1

リストが与えられると、そのパワーセットの順列を返すプログラムをPrologで書くことになっています。 言い忘れたことの 1 つ: リストを反転する述語が既にあります: deep_reverse(List,RevList)。 例:?-sublist_perm([a,b,c],X). が返されます:(重複は許可されます)

 X = [] ;
 X = [c] ;
 X = [b] ;
 X = [b, c] ;
 X = [c, b] ;
 X = [a] ;
 X = [a, c] ;
 X = [c, a] ;
 X = [a, b] ;
 X = [b, a] ;
 X = [a, b, c] ;
 X = [b, a, c] ;
 X = [b, c, a] ;
 X = [a, c, b] ;
 X = [c, a, b] ;
 X = [c, b, a]
4

1 に答える 1

4

1 つの質問で 2 つのことを尋ねます: すべてのサブリストを取得する方法とリストを並べ替える方法:

sublist_perm(In, Out) :-
    sublist(In, Temp),
    permutation(Temp, Out).

sublist([], []).
sublist([_|XS], YS) :-
    sublist(XS, YS).
sublist([X|XS], [X|YS]) :-
    sublist(XS, YS).

permutation/2 の man ページも参照してください。

findall(X, sublist_perm([a,b,c], X), XS),
XS = [[],[c],[b],[b,c],[c,b],[a],[a,c],[c,a],[a,b],[b,a],
      [a,b,c],[b,a,c],[b,c,a],[a,c,b],[c,a,b],[c,b,a]].
于 2013-06-22T15:08:42.997 に答える