このディレクトリの索引
http://toro.2ch.net/test/read.cgi/tech/1342966104/16
#  [1] 授業単元:C言語 
#  [2] 問題文(含コード&リンク):http://ime.nu/codepad.org/aARzaP9m 
#  次のプログラムのポイントを説明せよ。 
#  
#  #include 
#  #include 
#  
#  long int myatoi(const char *);
#  
#  int main(void)
#  {
#  	char str1[] = "123";
#  	char str2[] = "+234";
#  	char str3[] = "   -234";
#  	char str4[] = "   -123abc";
#  	char str5[] = "   - 123";   /* '-'と'1'の間にスペースあり */
#  	char str6[] = "   ";
#  	int n;
#  
#  	n = myatoi(str1);
#  	printf("myatoi(str1) returns %d\n", n);
#  
#  	n = myatoi(str2);
#  	printf("myatoi(str2) returns %d\n", n);
#  
#  	n = myatoi(str3);
#  	printf("myatoi(str3) returns %d\n", n);
#  
#  	n = myatoi(str4);
#  	printf("myatoi(str4) returns %d\n", n);
#  
#  	n = myatoi(str5);
#  	printf("myatoi(str5) returns %d\n", n);
#  
#  	n = myatoi(str6);
#  	printf("myatoi(str6) returns %d\n", n);
#  
#  	return(0);
#  }
#  
#  #define POSITIVE	(0)
#  #define NEGATIVE	(-1)
#  
#  long int myatoi (const char *str)
#  {
#  	int flag;
#  	long  int value;
#  
#  	flag = POSITIVE;	/* positive */
#  	value = 0;
#  
#  	while (isspace(*str)) {
#  		++str;
#  	}
#  	switch (*str) {
#  	  case '+':
#  		++str;
#  		break;
#  	  case '-':
#  		flag = NEGATIVE;
#  		++str;
#  		break;
#  	  default:
#  		break;
#  	}
#  	while (isdigit(*str)) {
#  		value = value * 10 + (*str - '0');
#  		++str;
#  	}
#  	if (flag == POSITIVE) {
#  		return(value);
#  	} else {
#  		return(-value);
#  	}
#  }

myatoi(_文字列,_整数) :-
        atom_chars(_文字列,_文字ならび),
        数字構成要素だけ切り取る(_文字ならび,_数字構成要素ならび),
        符号がある場合は先頭にある(_数字構成要素ならび,_符号の意味を示す整数,_数字ならび),
        数字ならびから整数を得る(_数字ならび,_整数_1),
        _整数 is _整数_1 * _符号の意味を示す整数,!.

数字構成要素だけ切り取る(_文字ならび,_数字構成要素ならび) :-
        append(L0,_数字構成要素ならび,L2,_文字ならび),
        全てが数字構成要素(_数字構成要素ならび),
        空集合であるか全てが空白(L0),
        空集合であるか全てが空白(L2).

全てが数字構成要素([]).
全てが数字構成要素([A|R]) :-
        数字構成要素(A),
        全てが数字構成要素(R).

空集合であるか全てが空白([]).
空集合であるか全てが空白([' '|R]) :-
        空集合であるか全てが空白(R).

符号がある場合は先頭にある([+|R],1,R).
符号がある場合は先頭にある([-|R],-1,R).
符号がある場合は先頭にある(L,1,L).

数字ならびから整数を得る(_数字ならび,_整数) :-
        数字ならびから整数を得る(_数字ならび,0,_整数).

数字ならびから整数を得る([],N,N).
数字ならびから整数を得る([A|R],N_1,N) :-
        数字整数変換(A,M),
        N_2 is N_1 * 10 + M,
        数字ならびから整数を得る(R,N_2,N).

数字構成要素(+) :- !.
数字構成要素(-) :- !.
数字構成要素(A) :-
        数字整数変換(A,_).

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