このディレクトリの索引
http://hibari.2ch.net/test/read.cgi/tech/1280653311/570
#  [1] 授業単元:応用C言語 
#  [2] 問題文(含コード&リンク): 
#  標準入力を読み込み、指定された文字列(mainの引数に2個以上与えられる)を検索し、それらの指定文字列が現れた、直後に与えられた引数に置換 
#  して標準出力するプログラムを作成せよ。 
#  ただし最後の引数の文字列が現れた場合は最初に指定された文字列に 
#  置換するものとする。 
#  また複数の指定文字列に一致する箇所の場合、もっとも長い文字列が 
#  現れたものと解釈する。 
#   
#  *入力文字に非ASCII文字が含まれないとして良い 
#  
'標準入力を読み込み、指定された文字列(mainの引数に2個以上与えられる)を検索し、それらの指定文字列が現れた、直後に与えられた引数に置換して標準出力する。ただし最後の引数の文字列が現れた場合は最初に最初に指定された文字列に置換するものとする。また複数の指定文字列に一致する箇所の場合、もっとも長い文字列が現れたものと解釈する。' :-
        user_parameters(_指定文字列ならび),
        _指定文字列ならび = [A|R1],
        append(_指定文字列ならび,[A],_指定文字列ならびの二),
        置換述語の生成(_指定文字列ならびの二),
        '標準入力を読み込み'(Chars),
        '指定された文字列(mainの引数に2個以上与えられる)を検索し、それらの指定文字列が現れた、直後に与えられた引数に置換して'(Chars,Chars2),
        put_chars(Chars2).

置換述語の生成([_]) :- !.
置換述語の生成([_文字列1,_文字列2|R]) :-
        atom_chars(_文字列1,Chars1),
        atom_chars(_文字列2,Chars2),
        atom_length(_文字列1,Len),
        append(_文字列1,R1,L1),
        append(_文字列2,R2,L2),
        assertz((置換述語(L1,R1,Len,L2,R2))),
        置換述語の生成([_文字列2|R]).

標準入力を読み込み(Chars) :-
        get_chars(Chars).        
        
'指定された文字列(mainの引数に2個以上与えられる)を検索し、それらの指定文字列が現れた、直後に与えられた引数に置換して'(Chars1,Chars2x) :-
        findmax([Len,R1,Char2,R2],置換述語(Chars1,R1,Len,Char2,R2),[Lenx,R1x,Char2x,R2x]),
        '指定された文字列(mainの引数に2個以上与えられる)を検索し、それらの指定文字列が現れた、直後に与えられた引数に置換して'(R1x,R2x).
'指定された文字列(mainの引数に2個以上与えられる)を検索し、それらの指定文字列が現れた、直後に与えられた引数に置換して'([A|R1],[A|R2]) :-
        '指定された文字列(mainの引数に2個以上与えられる)を検索し、それらの指定文字列が現れた、直後に与えられた引数に置換して'(R1,R2).

標準出力する(Chars) :-
        concat_atom(Chars,Atom),
        write(Atom).