このディレクトリの索引
http://pc12.2ch.net/test/read.cgi/tech/1274827528/75
#  [1] 授業単元:C言語プログラミング 
#  [2] 問題文:コマンドライン引数に指定された文字列それぞれが 
#  16進数表記で表された0以上100万以下の整数であ 
#  るをことをチェックした後、それを12進数に 
#  変換したものを表示するプログラムをつくれ 
#  16進数表記の先頭の0xはなくても良いがあってもエラーに 
#  してはならない。16進数表記になっていない、あるいは 
#  指定された範囲に無い場合はその旨表示する。 
#  

program :-
        user_parameters(L),
        append(_,[A|R],L),
        to_upper(A,A1),
        '100万以下の16進文字表現'(A1),
        '16進文字列表現を10進整数に変換'(A1,A1,_10進整数),
        'N進数'(12,_10進整数,X),
        write_formatted('%t\n',[X]),
        fail.
program.

'16進文字列表現を10進整数に変換'(_16進文字列表現,_10進整数) :-
        atom_chars(_16進文字列表現,L),
        '16進文字列表現を整数に変換'(L,0,_整数),!.
'16進文字列表現を10進整数に変換'(_16進文字列表現,_10進整数) :-
        write_formatted('%tは適切な16進文字列表記ではありません\n',[_16進文字列表現]),!.

'16進文字列表現を10進整数に変換'([],X,X) :-!.
'16進文字列表現を10進整数に変換'([A|R],Y,X) :-
        N進数利用文字(M,A),
        Y2 is 16 * Y + M,
        '16進文字列表現を10進整数に変換'(R,Y2,X).

'100万以下の16進文字表現'(A) :-
        '16進文字列表現'(A,B),
        sub_atom(B,_,Len,_,B),
        Len < 5,!.
'100万以下の16進文字表現'(A) :-
        '16進文字列表現'(A,B),
        sub_atom(B,_,5,_,B),
        B @=< 'F4240'.

'16進文字列表現'(A,A) :-
        \+(sub_atom(A,0,2,R,'0X')),!.
'16進文字列表現'(A,B) :-
        sub_atom(A,0,2,R,'0X'),
        sub_atom(A,2,R,_,B).

N進数(N,_10進数,_N進数文字列) :-
        N進数(N,_10進数,[],X),
        concat_atom(X,_N進数文字列).

N進数(N,J,Y,[M|Y]) :- J < N,N進数利用文字(J,M),!.
N進数(N,J,Y,X) :-
        J >= N,
        J2 is J // N,
        M is J mod N,
        N進数利用文字(M,M2),
        N進数(N,J2,[M2|Y],X).

N進数利用文字ならび(N,_利用文字ならび) :-
        length(L1,N),
        findall(A,N進数利用文字(_,A),L),
        append(L1,_,L).

N進数利用文字(0,'0').
N進数利用文字(1,'1').
N進数利用文字(2,'2').
N進数利用文字(3,'3').
N進数利用文字(4,'4').
N進数利用文字(5,'5').
N進数利用文字(6,'6').
N進数利用文字(7,'7').
N進数利用文字(8,'8').
N進数利用文字(9,'9').
N進数利用文字(10,'A').
N進数利用文字(11,'B').
N進数利用文字(12,'C').
N進数利用文字(13,'D').
N進数利用文字(14,'E').
N進数利用文字(15,'F').