このディレクトリの索引
http://toro.2ch.net/test/read.cgi/tech/1357191974/68
#  お題:文字列をランダムに並べ替える。 
#  ただし、どの文字も元と同じ位置ではないこと。

'文字列をランダムに並べ替える。 ただし、どの文字も元と同じ位置ではないこと。'(_文字列,_ランダムに並べ替えた文字列) :-
        文字列の置換位置ならび(_文字列,_文字列の置換位置ならび),
        文字列の置換位置ならびからランダムに並び替えた文字列を得る(_文字列の置換位置ならび,_文字列,_ランダムに並べ替えた文字列).

文字列の置換位置ならび(_文字列,_文字列の置換位置ならび) :-
        atom_length(_文字列,_文字列の長さ),
        length(_位置決めならび,_文字列の長さ),
        findall(N,between(1,_文字列の長さ,N),_整数順ならび),
        位置を置換する(_整数順ならび,_文字列の置換位置ならび).

位置を置換する([],_位置決めならび) :- !.
位置を置換する([_位置1,_位置2,_位置3],_位置決めならび) :-
        三つ巴交換(_位置1,_位置2,_位置3,_位置決めならび).
位置決めならび(L,_位置決めならび) :-
        位置の交換(L,R,_位置決めならび),
        位置を置換する(R,_位置決めならび).

三つ巴交換(_位置1,_位置2,_位置3,_位置決めならび) :-
        nth1(_位置1,_位置決めならび,_位置2),
        nth1(_位置2,_位置決めならび,_位置3),
        nth1(_位置3,_位置決めならび,_位置1),!.

位置の交換(L,L2,_位置決めならび) :-
        位置選択(L,N1,L1),
        位置選択(N2,L1,L2),
        nth1(N1,_位置決めならび,N2),
        nth1(N2,_位置決めならび,N1),!.

位置選択(L,_位置,L2) :-
        length(L,Len),
        _乱数値 is random(Len),
        length(L0,Len),
        append(L0,[_位置|R],L),
        append(L0,R,L2),!.

文字列の置換位置ならびからランダムに並び替えた文字列を得る(_文字列の置換位置ならび,_文字列,_ランダムに並べ替えた文字列) :-
        findall(_文字,(
                    member(_位置,_文字列の置換位置ならび),
                    _位置_1 is _位置 - 1,
                    sub_atom(_文字列,_位置_1,1,_,_文字)),
                _ランダムに並べ替えた文字ならび),
        atomic_list_concat(_ランダムに並べ替えた文字ならび,_ランダムに並べ替えた文字列).