このディレクトリの索引
http://hibari.2ch.net/test/read.cgi/tech/1268979408/831
%  
%  ひとつひとつ置換は置換対象文字列をひとつひとつ順に置換していく、
%  非決定性の述語です。
%  一度置換された部分は次の置換候補が置換された時にも置換されたままであり、
%  元に戻ることはありません。
%  置換される対象がなくなって、さらのバックトラックにより、起動されると僞となります。
%  
%  ひとつひとつ置換/6 は置換される度に、前文字列、後文字列を切り出す。
%  置換文字列の引数位置に注意が必要。
%  

ひとつひとつ置換(_文字列,_置換対象文字列,_置換文字列,_置換された文字列) :-
        sub_atom(_文字列,Len1,Len2,Len3,_置換対象文字列),
        sub_atom(_文字列,0,Len1,_,S1),
        \+(sub_atom(S1,_,Len2,_,_置換対象文字列)),
        St is Len1+Len2,
        sub_atom(_文字列,St,Len3,_,S3),
        concat_atom([S1,_置換文字列,S3],_置換された文字列).
ひとつひとつ置換(_文字列,_置換対象文字列,_置換文字列,_置換された文字列) :-
        sub_atom(_文字列,Len1,Len2,Len3,_置換対象文字列),
        sub_atom(_文字列,0,Len1,_,S1),
        \+(sub_atom(S1,_,Len2,_,_置換対象文字列)),
        St is Len1+Len2,
        sub_atom(_文字列,St,Len3,_,S3),
        concat_atom([S1,_置換文字列],_置換された文字列1),
        ひとつひとつ置換(S3,_置換対象文字列,_置換文字列,_置換された文字列2),
        concat_atom([_置換された文字列1,_置換された文字列2],_置換された文字列).


ひとつひとつ置換(_文字列,_置換対象文字列,__前文字列,_置換文字列,_後文字列,_置換された文字列) :-
        sub_atom(_文字列,Len1,Len2,Len3,_置換対象文字列),
        sub_atom(_文字列,0,Len1,_,_前文字列),
        \+(sub_atom(_前文字列,_,Len2,_,_置換対象文字列)),
        St is Len1+Len2,
        sub_atom(_文字列,St,Len3,_,_後文字列),
        concat_atom([S1,_置換文字列,S3],_置換された文字列).
ひとつひとつ置換(_文字列,_置換対象文字列,__前文字列,_置換文字列,_後文字列,_置換された文字列) :-
        sub_atom(_文字列,Len1,Len2,Len3,_置換対象文字列),
        sub_atom(_文字列,0,Len1,_,_前文字列1),
        \+(sub_atom(_前文字列1,_,Len2,_,_置換対象文字列)),
        St is Len1+Len2,
        sub_atom(_文字列,St,Len3,_,_残り文字列),
        ひとつひとつ置換(_残り文字列,_置換対象文字列,_前文字列2,_置換文字列,_後文字列,_置換された文字列2),
        concat_atom([_前文字列1,_置換文字列,_前文字列2],_前文字列),
        concat_atom([_前文字列,_置換文字列,_後文字列],_置換された文字列).