このディレクトリの索引
http://hibari.2ch.net/test/read.cgi/tech/1294061094/143
#  [1] 授業単元: 
#  [2] 問題文(含コード&リンク): 
#  8 桁までの整数を表わす文字列(例: "-3246") を整数値(例: ?3246) に変換する関数を作りたい。各問いに答えよ。 
#   
#  1. 整数を表わす文字列はつぎの条件を全て同時に満たすと考えられる。 
#   
#  (1) 文字列の先頭の文字は、符号を表わす’+’ または’-’ または、数字’0’〜’9’ である 
#  (2) 文字列の2 文字目以降は’0’〜’9’ である 
#  (3) 符号を除いた文字列の長さは1 以上8 以下である 
#   
#  文字列を引数とし、これらの条件を同時に満たす時に整数値1 を、一つでも満たさない時(整数と 
#  して文字列にエラーがある場合) には0 を戻り値として返す関数check() を作れ。 
#   

check(_文字列,_返り値) :-
        '文字列を引数とし、これらの条件を同時に満たす時に整数値1を一つでも満たさない時には0戻す'(_文字列,_返り値).


'文字列を引数とし、これらの条件を同時に満たす時に整数値1を一つでも満たさない時には0戻す'(_文字列,1) :-
        '文字列の先頭の文字は、符号を表わす’+’ または’-’ または、数字’0’〜’9’ である'(_文字列),
        '文字列の2 文字目以降は’0’〜’9’ である'(_文字列),
        '符号を除いた文字列の長さは1 以上8 以下である'(_文字列),!.
'文字列を引数とし、これらの条件を同時に満たす時に整数値1を一つでも満たさない時には0を戻す'(_文字列,0).

'文字列の先頭の文字は、符号を表わす’+’ または’-’ または、数字’0’〜’9’ である'(_文字列) :-
        文字列の先頭の文字は(_文字列,'+'),!.
'文字列の先頭の文字は、符号を表わす’+’ または’-’ または、数字’0’〜’9’ である'(_文字列) :-
        文字列の先頭の文字は(_文字列,'-'),!.
'文字列の先頭の文字は、符号を表わす’+’ または’-’ または、数字’0’〜’9’ である'(_文字列) :-
        文字列の先頭の文字は(_文字列,A),
        append(_,[A|_],['0','1','2','3','4','5','6','7','8','9']).

'文字列の2 文字目以降は’0’〜’9’ である'(_文字列) :-
        sub_atom(_文字列,_,_,_,S1,S2,S3,[_],L1,[]),
        すべて数字(L1).

'符号を除いた文字列の長さは1 以上8 以下である'(_文字列) :-
        符号を除いた文字列(_文字列,_符号を除いた文字列),
        sub_atom(_符号を除いた文字列,0,_長さ,0,_符号を除いた文字列),
        _長さ >= 1,
        _長さ =< 8.

すべて数字([]) :- !.
すべて数字([A|R]) :-
        append(_,[A|_],['0','1','2','3','4','5','6','7','8','9']),
        すべて数字(R).

符号を除いた文字列(_文字列,_符号を除いた文字列) :-
        sub_atom(_文字列,0,1,R,_符号),
        append(_,[_符号|_],['+','-']),
        sub_atom(_文字列,1,R,0,_符号を除いた文字列),!.
符号を除いた文字列(_文字列,_文字列).