このディレクトリの索引
http://toro.2ch.net/test/read.cgi/tech/1328439334/333
#
#  Prologに於ける文字置換のパターンを示す
#  
#  置換対象文字列に出会う度に非決定性で置換される事を基本として
#  併せて、置換回数が最大になるような置換述語を定義する
#  

'置換回数が最大になるような文字列置換'(_文字列,_置換された文字列) :-
        findall([_置換回数,_置換された文字列],(
                    '置換回数を数えながら文字列置換'(_文字列,_置換回数,_置換された文字列)),
                LL),
        findmax(N,(
                    member([N,_],LL)),
                Max),
        member([Max,_置換された文字列],LL).

'置換回数を数えながら文字列置換'(_文字列,_置換回数,_置換された文字列) :-
        置換文字列定義を差分リストに変換する,
        atom_chars(_文字列,Chars),
        '置換回数を数えながらならび置換'(Chars,_置換回数,_置換されたChars),
        _置換回数 > 0,
        atom_chars(_置換された文字列,_置換されたChars).

'置換回数を数えながらならび置換'([],0,[]).
'置換回数を数えながらならび置換'(L1,N,L2) :-
        置換ならび定義(L1,R1,L2,R2),
        '置換回数を数えながらならび置換'(R1,N2,R2),
        N is N2 + 1.
'置換回数を数えながらならび置換'([A|R1],N,[A|R2]) :-
        '置換回数を数えながらならび置換'(R1,N,R2).

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

置換文字列定義を差分リストに変換する :-
        abolish(置換ならび定義/4),
        clause(置換文字列定義(_文字列,_置換する文字列),_本体),
        差分リストを構成する(_文字列,_置換する文字列,L1,R1,L2,R2),
        assertz((置換ならび定義(L1,R1,L2,R2) :- _本体)),
        fail.
置換文字列定義を差分リストに変換する.

差分リストを構成する(_文字列,_置換する文字列,L1,R1,L2,R2) :-
        atom_chars(_文字列,Chars_1),
        atom_chars(_置換する文字列,Chars_2),
        append(Chars_1,R1,L1),
        append(Chars_2,R2,L2).