このディレクトリの索引

#  
#  非決定性述語を目標とする時、その得られる解の内で最後の解だけを取得したい。
#  
#  適用例としては、
#  文字列置換を出現順に非決定性で置換する。つまり利用者は出現順に1-n個の
#  置換を選択することができる。そういう述語が定義済みだとする。
#  この述語を使って、全置換を求めるというような場合。
#  


非決定性述語の最後の解(_非決定性述語,_解) :-
        findall(_解,_非決定性述語,_解ならび),
        last(_解ならび,_解).


%
%  非決定性述語の引数を構成する項の中に_解が含まれる必要がある。
%  
%  順に置換する述語例
%

全ての対象を置換する(_文字列,_置換対象副文字列,_置換文字列,_置換された文字列) :-
        非決定性述語の最後の解(_置換された文字列,順に置換する(_文字列,_置換対象副文字列,_置換文字列,_置換された文字列),_置換された文字列).


順に置換する(_文字列,_置換対象副文字列,_置換文字列,_置換された文字列) :-

        置換対象副文字列の前後を取得する(_文字列,_置換対象副文字列,_前文字列,_残り文字列),
        順に置換する(_文字列,_置換対象副文字列,_置換文字列,_前文字列,_残り文字列,_置換された文字列).


順に置換する(_文字列,_置換対象副文字列,_置換文字列,_前文字列,_残り文字列,_置換された文字列) :-
        atomic_list_concat([_前文字列,_置換文字列,_残り文字列],_置換された文字列).
順に置換する(_文字列,_置換対象副文字列,_置換文字列,_前文字列,_残り文字列,_置換された文字列) :-
        順に置換する(_残り文字列,_置換対象副文字列,_置換文字列,_置換された文字列_2),
        atomic_list_concat([_前文字列,_置換文字列,_置換された文字列_2],_置換された文字列).

置換対象副文字列の前後を取得する(_文字列,_置換対象副文字列,_前文字列,_残り文字列) :-
        sub_atom(_文字列,_開始位置0オリジン,_長さ,_残り文字数,_置換対象副文字列),
        sub_atom(_文字列,0,_開始位置0オリジン,_,_前文字列),
        _残り文字列の開始位置 is _開始位置0オリジン + _長さ,
        sub_atom(_文字列,_残り文字列の開始位置,_残り文字数,_,_残り文字列),!.