このディレクトリの索引
http://hibari.2ch.net/test/read.cgi/tech/1268979408/831
%  
%  文字列に対して、置換対象部分すべてを置換します。
%  置換対象となる文字列が見つからなかった時でも、僞にはなりません。
%  
%  ひとつひとつ置換は置換対象文字列を最初からひとつひとつ順に置換して行きます。
%  

全置換(_文字列,_置換対象文字列,_置換文字列,_置換された文字列) :-
        findall(S,(
                    ひとつひとつ置換(_文字列,'c++','c#',S)),
                L),
        last(L,_置換された文字列),!.
全置換(_文字列,_,_,_文字列).

ひとつひとつ置換(_文字列,_置換対象文字列,_置換文字列,_置換された文字列) :-
        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],_置換された文字列).