このディレクトリの索引
http://pc12.2ch.net/test/read.cgi/tech/1272006124/86
#  <問題> 
#  与えられた文字列に含まれる数値文字列で1.0-49.0(整数であってもよい)の 
#  範囲の数値文字列を取り出しなさい。 
# 
# 

'与えられた文字列に含まれる数値文字列で1.0-49.0(整数であってもよい)の範囲の数値文字列を取り出す'(_文字列,_副文字列) :-
        atom_chars(_文字列,Chars),
        数値ならびを切り出す(Chars,L,_),
        number_chars(V,L),
        V >= 1.0,V =< 49.0,
        concat_atom(L,_副文字列).
'与えられた文字列に含まれる数値文字列で1.0-49.0(整数であってもよい)の範囲の数値文字列を取り出す'(_文字列,_副文字列) :-
        atom_chars(_文字列,Chars),
        数値ならびを切り出す(Chars,L,_残りならび),
        concat_atom(_残りならび,L3),
        '与えられた文字列に含まれる数値文字列で1.0-49.0(整数であってもよい)の範囲の数値文字列を取り出す'(L3,_副文字列).

数値ならびを切り出す(Chars,L,_残りならび) :-
        先頭が数値文字であるならびを切り出す(Chars,L1),
        ひとつだけピリオドを含む数値文字ならびを切り取る(L1,L,_残りならび),!.

先頭が数値文字であるならびを切り出す(Chars,[A|R]) :- append(L0,[A|R],Chars),A @>= '0',A @=< '9',!.

一つだけピリオドを含む数値文字ならびを切り取る([],[],[]) :- !.
一つだけピリオドを含む数値文字ならびを切り取る(['.'|R1],['.'|R2],R3) :- すべてが数値文字のならびを切り取る(R1,R2,R3),\+(R2=[]),!.
一つだけピリオドを含む数値文字ならびを切り取る(['.'|R1],[],['.'|R1]) :- !.
一つだけピリオドを含む数値文字ならびを切り取る([A|R1],[],[A|R1]) :- \+((A @>= '0',A @=< '9')),!.
一つだけピリオドを含む数値文字ならびを切り取る(['.'|R1],['.'|R2],R3) :- すべてが数値文字のならびを切り取る(R1,R2,R3),!.
一つだけピリオドを含む数値文字ならびを切り取る([A|R1],[A|R2],R3) :- A @>= '0',A @=< '9',一つだけピリオドを含む数値文字ならび(R1,R2,R3).

すべてが数値文字のならびを切り取る([],[],[]) :- !.
すべてが数値文字のならびを切り取る([A|R],[],[A|R]) :- \+((A @>= '0',A @=< '9')),!.
すべてが数値文字のならびを切り取る([A|R1],[A|R2],R3) :- A @>= '0',A @=< '9',すべてが数値文字のならびを切り取る(R1,R2,R3).