このディレクトリの索引
http://hibari.2ch.net/test/read.cgi/tech/1268979408/921
#  <p>text</p> を <h3>text</h3> に変換したいんです。 
#   
#  ただし text がない<p></p>はそのままで。 
#   
#  '/<p>(.+?)<\/p>/is', '<h3>$1</h3>' 
#   
#  ここから進まない… 助けて 
#   
%
%  最初から順に変換していく非決定性の述語とすべてを一気に変換してしまう決定性の述語の両例を示す。

%%%%%% 最初から順に変換していく。以前に変換された部分が変換前の状態に戻ることがないように注意する %%%%%

'

text

text

に変換したい'(_文字列,_変換された文字列) :- sub_atom(_文字列,_,_,_,S1,S2,S3,L1,['<',p,'>'|R2],L3), append(L22,['<','/',p'>'],R2), \+(append(_,['<',p,'>'|_],L22)), \+(append(_,['<',/,p,'>'|_],L22)), \+(L22=[]), append(L1,['<',h,3,'>'|L22],['<','/',h,3,'>'|L3],L4), atom_chars(_変換された文字列,L4). '

text

text

に変換したい'(_文字列,_変換された文字列) :- sub_atom(_文字列,_,_,_,S1,S2,S3,L1,['<',p,'>'|R2],L3), append(L22,['<','/',p'>'],R2), \+(append(_,['<',p,'>'|_],L22)), \+(append(_,['<',/,p,'>'|_],L22)), \+(L22=[]), append(L1,['<',h,3,'>'|L22],['<','/',h,3,'>'],L4), atom_chars(_変換された文字列1,L4). '

text

text

に変換したい'(S3,_変換された文字列2), concat_atom([_変換された文字列1,_変換された文字列2],_変換された文字列),!. '

text

text

に変換したい'(_文字列,_文字列). %%%%%%%%%%%%%%%%%%%% 全体を一気に変換してしまう決定性の述語 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% '

text

text

に変換したい(全置換)'(_文字列,_変換された文字列) :- '文字列の中の

text

text

に変換し、変換部分までのならびとする'(_文字列,L), concat_atom(L,_変換された文字列). '

text

text

に変換し、変換部分までのならびとする'(_文字列,[_変換された文字列|R]) :- sub_atom(_文字列,_,_,_,S1,S2,S3,L1,['<',p,'>'|R2],L3), append(L22,['<','/',p'>'],R2), \+(append(_,['<',p,'>'|_],L22)), \+(append(_,['<',/,p,'>'|_],L22)), \+(L22=[]), append(L1,['<',h,3,'>'|L22],['<','/',h,3,'>'],L4), atom_chars(_変換された文字列,L4), '

text

text

に変換部分までのならびとする'(S3,R),!. '

text

text

に変換し、変換部分までのならびとする'(_文字列,[_文字列]).