このディレクトリの索引
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() を作れ。 
#   
#  2. 変換したい文字列を引数とし、正負を判断して値が正または0 の時には1 を、負の時には?1 
#  を、整数として文字列にエラーがある場合には0 を返す関数sign() を作れ。 
#   
#  3. 問1, 2 を利用して、8 桁までの整数を表わす文字列を引数とし、整数値に変換して返す関数 
#  myatoi() を作成せよ。 
#   
#  

myatoi(_文字列,_整数値) :-
        '8 桁までの整数を表わす文字列を引数とし、整数値に変換する'(_文字列,_整数値),!.

'8 桁までの整数を表わす文字列を引数とし、整数値に変換する'(_文字列,_整数値) :-
        check(_文字列,1),        
        sign(_文字列,_符号),
        atom_chars(_文字列,Chars),
        数値部を得る(Chars,_数値部),
        _整数値 is _数値部 * _符号,!.

check(_文字列,1) :-
        '文字列の先頭の文字は、符号を表わす’+’ または’-’ または、数字’0’〜’9’ である'(_文字列),
        '文字列の2 文字目以降は’0’〜’9’ である '(_文字列),
        '符号を除いた文字列の長さは1 以上8 以下である'(_文字列),!.
check(_,0).

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

'文字列の2 文字目以降は’0’〜’9’ である '(_文字列) :-
        sub_atom(_文字列,1,_,0,_副文字列),
        count(sub_atom(_副文字列,_,1,_,_文字),
              _文字 @>= '0',
              _文字 @=< '9'),Count),
        sub_atom(_副文字列,0,Count,0,_副文字列),!.

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

sign(_文字列,1) :-
        '変換したい文字列を引数とし、正負を判断して値が正または0 の時には1'(_文字列),!.        
sign(_文字列,-1) :-
        '変換したい文字列を引数とし、正負を判断して値が負の時には-1'(_文字列),!.

'変換したい文字列を引数とし、正負を判断して値が正または0 の時には1'(_文字列) :-
        sub_atom(_文字列,0,1,_,_文字),
        append(_,[_文字|_],['+','-','0','1','2','3','4','5','6','7','8','9']),!.

'変換したい文字列を引数とし、正負を判断して値が負の時には-1'(_文字列) :-
        sub_atom(_文字列,0,1,_,'-'),!.


数値部を得る([],1,0) :- !.
数値部を得る(['+'|R],M,N) :-
        数値部を得る(R,M,N),!.
数値部を得る(['-'|R],M,N) :-
        数値部を得る(R,M,N),!.
数値部を得る([_文字|R],M,N) :-
        数値部を得る(R,M1,N1),
        文字数値変換(_文字,N2),
        M is M1 * 10,
        N is N2 * M + N1.

文字数値変換('0',0).
文字数値変換('1',1).
文字数値変換('2',2).
文字数値変換('3',3).
文字数値変換('4',4).
文字数値変換('5',5).
文字数値変換('6',6).
文字数値変換('7',7).
文字数値変換('8',8).
文字数値変換('9',9).