このディレクトリの索引
http://hibari.2ch.net/test/read.cgi/tech/1288531658/939
#  [1] 授業単元:組込み工学 
#  [2] 問題文(含コード&リンク):入力された上位4bitと下位4bitを計算して 
#  その結果を16進数で表すプログラムを作成せよ。  
#  例として上位4bitが12、下位4bitが5のときは11と出力。 
#  応用として逆転したものも作ること。 
#  例として上位4bitが12、下位4bitが5のときはEEと出力。 
#  

入力された上位4bitと下位4bitを計算してその結果を16進数で表す :-
        整数を得る(_整数),
        計算時の演算子を入力してください(_演算子),
        入力された上位4bitと下位4bitを計算してその結果を16進数で表す(_整数,_演算子,_16進表示),
        write_formatted('%t\n',[_16進表示]).        

整数を得る(_整数) :-
        get_line(Line),
        整数入力診断(Line,_整数),!.
整数を得る(_整数) :- 整数を得る(_整数).

整数入力診断(Line,_整数) :-
        atom_to_term(Line,_整数,_),
        integer(_整数),!.
整数入力診断(Line,_整数) :-
        write_formatted('入力された %t からは整数は得られませんでした。再入力をお願いします。\n'),
        fail.

計算時の演算子を入力してください(_演算子) :-
        write('計算時の演算子を入力してください (+,-,*,//) : '),
        get_line(_演算子).

入力された上位4bitと下位4bitを計算してその結果を16進数で表す(_整数,_演算子,_16進表示) :-
        上位4binと下位4bit(_整数,_上位ビット数,_下位4ビット数),
        計算(_演算子,_上位4ビット数,_下位4ビット数,_計算結果),
        計算結果の下位8ビットを16進表示に変換(_計算結果,_16進表示).

上位4binと下位4bit(_整数,_上位ビット数,_下位4ビット数) :-
        _上位ビット数 is _整数 >> 28,
        _下位4ビット数 is (_整数 << 28) >> 28,!.

計算(+,N1,N2,N) :- N is N1 + N2,!.
計算(-,N1,N2,N) :- N is N1 - N2,!.
計算(*,N1,N2,N) :- N is N1 * N2,!.
計算(//,N1,N2,N) :- N is N1 // N2,!.
計算(_演算子,_,_,_) :- write_formatted('演算子 %t は未定義です。一旦終了します。\n',[_演算子]),fail.

計算結果の下位8ビットを16進表示に変換(_計算結果,_16進表示) :-
        下位8ビット以外を清算(_計算結果,_清算された下位8ビット数),
        除数16の商が上位4ビット、剰余が下位4ビットとなる(_清算された下位8ビット数,_上位4ビット数,_下位4ビット数),
        '16進文字変換'(_下位4ビット数,_16進数下位表示),
        '16進文字変換'(_上位4ビット数,_16進数上位表示),
        concat_atom(['0x',_16進数上位表示,_16進数下位表示],_16進表示).

下位8ビット以外を清算(N,_清算された下位8ビット数) :-
        _清算された下位8ビット数 is (N << 24) >> 24.

除数16の商が上位4ビット、剰余が下位4ビットとなる(_清算された下位8ビット数,_上位4ビット数,_下位4ビット数) :-
        _上位4ビット数 is _清算された下位8ビット数 // 16,
        _下位4ビット数 is _清算された下位8ビット数 mod 16.

'16進文字変換'(N,A) :- N < 10,Code is N + 48,char_code(A,Code),!.
'16進文字変換'(10,'A').
'16進文字変換'(11,'B').
'16進文字変換'(12,'C').
'16進文字変換'(13,'D').
'16進文字変換'(14,'E').
'16進文字変換'(15,'F').