このディレクトリの索引
http://toro.2ch.net/test/read-cgi/tech/1351769173/728
#  
#  配列に、{1,2,3}の3つの数字が入っている時、並び替えて 
#  123 
#  132 
#  213 
#  231 
#  312 
#  321 
#  
#  のように全パターンを出力したいのですが何か良い方法はありませんか。 
#  ちなみにVBですが、他の言語で書いていただいてもだいたいわかると思います。 
#  配列の長さは変わることもあります・・・。 
%
%  Prologでは普通配列を使わない。ここでもリストとして置き換える。


'リストに、{1,2,3}の3つの数字が入っている時、並び替えて 
123 
132 
213 
231 
312 
321 

のように全パターンを出力したい' :-
        リストを並び替えて全パターンを出力したい([1,2,3]).

リストを並び替えて全パターンを出力したい(_リスト) :-
        リストを並び替えて全パターンを(_リスト,_全パターン),
        出力したい(_全パターン).

リストを並べ替えて全パターンを(_リスト,_全パターン) :-
        findall(_パターン,
                    リストを並べ替えて(_リスト,_リスト,_パターン),
                _全パターン).

リストを並べ替えて(Y,[],[]).
リストを並べ替えて(Y,[_|Ln],[A|X]) :-
        一つ取り除いて(A,Y,Z),
        リストを並べ替えて(Z,Ln,X).

一つ取り除いて(A,[A|X],X).
一つ取り除いて(A,[B|X],[B|Y]) :-
        一つ取り除いて(A,X,Y).

出力したい([]).
出力したい([_パターン|R]) :-
        atomic_list_concat(_パターン,_表示文字列),
        writef('%t\n',[_表示文字列]),
        出力したい(R).