このディレクトリの索引
http://hibari.2ch.net/test/read.cgi/tech/1320365280/126
#  どなたかお願いします。 
#   
#  [1] 授業単元:アルゴリズム 
#  [2] 問題文(含コード&リンク): 与えられた任意の長さのアルファベットの文字列(ただし 
#  重複する文字は含まないとする)に対して、文字を任意の順番に入れ替えてできる 
#  文字列のパターンをすべて出力する関数permute()を作成せよ。 
#   
#  例: 
#  permute("ABC"); 
#  ABC ACB BAC BCA CAB CBA 
#   
#  

'与えられた任意の長さのアルファベットの文字列(ただし重複する文字は含まないとする)に対して、文字を任意の順番に入れ替えてできる文字列のパターンをすべて空白区切りで横方向に出力する'(_文字列) :-
        fildall(_順番を入れ替えた文字列,(
                    '与えられた任意の長さのアルファベットの文字列(ただし重複する文字は含まないとする)に対して、文字を任意の順番に入れ替えてできる文字列のパターンを'(_文字列,_順番を入れ替えた文字列)),
                _文字列パターンならび),
        空白区切りで横方向に出力する(_文字列パターンならび,' ',_表示行).

空白区切りで横方向に出力する(_文字列パターンならび) :-
        concat_atom(_文字列パターン,' ',_表示行),
        writef('%t\n',[_表示行]).

'与えられた任意の長さのアルファベットの文字列(ただし重複する文字は含まないとする)に対して、文字を任意の順番に入れ替えてできる文字列のパターンを'(_文字列,_順番を入れ替えた文字列) :-
        atom_chars(_文字列,Chars),
        length(Chars,Len),
        順列(Chars,Len,Chars2),
        atom_chars(_順番を入れ替えた文字列,Chars2).

%
%  最初の課題述語名に「空白区切りで横方向に」を加えたのがポイント。
%  このような実例付き課題では、多くの場合、仕様文の表現に実例の細部が
%  反映されていないことが多い。
%  この時は思い切って、課題文に手を入れて考える。
%  

順列(Y,0,[]).
順列(Y,N,[A|X]) :-
        del(A,Y,Z),
        M is N - 1,
        順列(Z,M,X).

del(A,[A|X],X).
del(A,[B|X],[B|Y]) :-
        del(A,X,Y).