"  出典: このディレクトリの索引
#  [1] 授業単元: プログラミング基礎
#  [2] 問題文
#  ?以下のプログラムを作成しなさい.
#  文字列を入力して、
#  その文字列が数字であるかどうか調べる
#  (符号も対応すること)
#  (数字は、intの範囲内で)
#  (0023は、数字として扱う)
#  実行例)
#  1234 入力
#  number 出力
#  1234abncdef 入力
#  string 出力
#  ab^d34x 入力
#  string 出力
#  -92837 入力
#  number 出力
#  +37 入力
#  number 出力
#  [3] 環境 .
#   [3.1] Windows 8.1
#   [3.2] Visual studio 2013
#   [3.3] C
#  [4] 期限:2014年7月14日0:00


'文字列を入力して、その文字列が数字であるかどうか調べる(符号も対応すること)(数字は、intの範囲内で)(0023は、数字として扱う)' :-
        get_line(_文字列),
        '文字列を入力して、その文字列が数字であるかどうか調べる(符号も対応すること)(数字は、intの範囲内で)(0023は、数字として扱う)'(_文字列).


'文字列を入力して、その文字列が数字であるかどうか調べる(符号も対応すること)(数字は、intの範囲内で)(0023は、数字として扱う)'(_文字列) :-
        その文字列が数字であるかどうか調べる(_文字列).

その文字列が数字であるかどうか調べる(_文字列) :-
        その文字列は数字を構成する(_文字列).

その文字列は数字を構成する(_文字列) :-
        数字文字列(_文字列),
        write('number\n').
その文字列は数字を構成する(_文字列) :-
        \+(数字文字列(_文字列)),
        write('string\n').

数字文字列(_文字列) :-
        '先頭文字が+または-である'(_文字列,_残り文字列),
        '記号を除く数字ならび。ただし先頭と最終要素以外ならピリオドと一度だけ含むことができる'(_残り文字列),!.
数字文字列(_文字列) :-
        '記号を除く数字文字列。ただし先頭と最終要素以外ならピリオドと一度だけ含むことができる'(_文字列).

'先頭文字が+または-である'(_文字列,_残り文字列) :-
        先頭文字と残り文字列を得る(_文字列,_先頭文字,_残り文字列),
        '+または-である'(_先頭文字).

'+または-である'('+').
'+または-である'('-').

'記号を除く数字文字列。ただし先頭と最終要素以外ならピリオドと一度だけ含むことができる'(_文字列) :-
        先頭文字と最終文字にピリオドが来ている(_文字列),!,fail.
'記号を除く数字文字列。ただし先頭と最終要素以外ならピリオドと一度だけ含むことができる'(_文字列) :-
        記号を除く数字文字列(_文字列),

先頭文字と最終文字にピリオドが来ている(_文字列) :-
        sub_atom(_文字列,0,1,_,'.').
先頭文字と最終文字にピリオドが来ている(_文字列) :-
        sub_atom(_文字列,_,1,0,'.').

記号を除く数字文字列('') :- !.
記号を除く数字文字列(_文字列) :-
        先頭文字の数字記号検査(_文字列,_残り文字列).
        記号を除く数字文字列(_残り文字列).

先頭文字の数字記号検査(_文字列,_残り文字列) :-
        先頭文字と残り文字列を得る(_文字列,_先頭文字,_残り文字列),
        先頭文字の数字記号検査(_先頭文字,_文字列,_残り文字列).

先頭文字の数字記号検査('.',_残り文字列) :-
        \+(sub_atom(_残り文字列,_,1,_,'.')),!.
先頭文字の数字記号検査(A,_残り文字列) :-
        sub_atom('0123456789',_,1,_,A),!.

先頭文字と残り文字列を得る(_文字列,_先頭文字,_残り文字列) :-
        sub_atom(_文字列,0,1,R,_先頭文字),
        sub_atom(_文字列,1,R,0,_残り文字列).