このディレクトリの索引
http://pc12.2ch.net/test/read.cgi/tech/1272006124/85
#  <問題> 
#  与えられた文字列に含まれる整数を表す副文字列の中で最長のものを取り出しなさい。 

与えられた文字列に含まれる整数を表す副文字列の中で最長のものを取り出す(_文字列,_整数を表す副文字列の中で最長の文字列) :-
    atom_chars(_文字列,Chars),
    与えられた文字列に含まれる整数を表す副文字列ならび(Chars,_副文字列とその長さならび),
    findmax(_文字列長,member([_,_文字列長],_副文字列とその長さならび),_最長文字列長),
    member([_整数を表す副文字列の中で最長の文字列,_最長文字列長],_副文字列とその長さならび).

与えられた文字列に含まれる整数を表す副文字列ならび(Chars,[[_副文字列,_文字列長]|R2]) :-
    append(_,[A|R],Chars),
    A @>= '0',
    A @=< '9',
    先頭から整数を表す副文字列を切り出す([A|R],_副文字列,_残りならび),
    文字列長(_副文字列,_文字列長),
    与えられた文字列に含まれる整数を表す副文字列ならび(_残りならび,R2).
与えられた文字列に含まれる整数を表す副文字列ならび(_,[]).

先頭から整数を表す副文字列を切り出す(Chars,'',[B|R2]) :-
    append(L1,['.'|R],Chars),
    R=[A|R2],
    A @>= '0',
    A @=< '9',!,    
    append(_,[B|R2],R),
    \+((B @>= '0',B @=< '9')).
先頭から整数を表す副文字列を切り出す(Chars,_副文字列,[A|R]) :-
    append(L1,[A|R],Chars),
    \+((A @>= '0',A @=< '9')),
    concat_atom(Chars,_副文字列),!.
先頭から整数を表す副文字列を切り出す(Chars,_副文字列,[]) :- concat_atom(Chars,_副文字列).