このディレクトリの索引
http://hibari.2ch.net/test/read.cgi/tech/1311089619/627
#  [1] 授業単元:プログラミング演習 1 
#  [2] 問題文(含コード&リンク)        
#  符号無し整数xのposビット目を、1にした値を返す関数sec,0にした値を返す関数reset,反転した値を返す関数inverse 
#   
#     unsigned  set(     unsigned  x,  int  pos)   {  /* ••• */  } 
#   unsigned   reset (     unsigned  x,  int  pos)   {  /* ••• */  } 
#     unsigned   inverse (     unsigned  x,  int  pos)   {  /* ••• */  } 
#  を作成せよ。 
#  <実行例> 
#  非負の整数を入力してください:0x0B 
#  セットしたいポジションを入力してください:3 
#    Original bits: 00000000000000000000000000001011 
#     set 1 to pos: 00000000000000000000000000001011 
#   reset 0 to pos: 00000000000000000000000000000011 
#  inverse the pos: 00000000000000000000000000000011 
#  [3.1] OS: unix  
#  [3.2] コンパイラ名とバージョン: gcc  
#  [3.3] 言語: C  
#  [4] 期限:7月27日  
#  よろしくお願いします。 
# 
# 

sec(_符合無し整数x,_posビット目,_値) :-
        '符号無し整数xのposビット目を、1にした値を返す述語sec'(_符合無し整数x,_posビット目,_値).

reset(_符合無し整数x,_posビット目,_値) :-
        '符号無し整数xのposビット目を、反転した値を返す述語inverse'(_符合無し整数x,_posビット目,_値).

inverse(_符合無し整数x,_posビット目,_値) :-
        '符号無し整数xのposビット目を、反転した値を返す述語inverse'(_符合無し整数x,_posビット目,_値).

'符号無し整数xのposビット目を三様に変化させる' :-
        '符号無し整数xの入力'(_符号なし整数x),
        'posビット目の入力'(_posビット目),
        '符号無し整数xのposビット目を、1にした値を返す述語sec'(_符合無し整数x,_posビット目),
        '符号無し整数xのposビット目を、1にした値を返す述語sec'(_符合無し整数x,_posビット目),
        '符号無し整数xのposビット目を、反転した値を返す述語inverse'(_符合無し整数x,_posビット目),!.

'符号無し整数xのposビット目を、1にした値を返す述語sec'(_符合無し整数x,_posビット目) :-
        '符号無し整数xのposビット目を、1にした値を返す述語sec'(_符合無し整数x,_posビット目,_値),
        表示する('set 1 to pos : ',_値).

'符号無し整数xのposビット目を、1にした値を返す述語sec'(_符合無し整数x,_posビット目,_値) :-
        '符号無し整数xのposビット目を'(0,_posビット目,Y),
        _値 is _符号無し整数x \/ Y.

'符号無し整数xのposビット目を、0にした値を返す述語reset'(_符合無し整数x,_posビット目) :-
        '符号無し整数xのposビット目を、0にした値を返す述語reset'(_符合無し整数x,_posビット目,_値),
        表示する('reset 0 to pos: ',_値).

'符号無し整数xのposビット目を、0にした値を返す述語reset'(_符合無し整数x,_posビット目,_値) :-
        '符号無し整数xのposビット目を'(0,_posビット目,Y),
        _値 is _符号無し整数x /\ Y.

'符号無し整数xのposビット目を、反転した値を返す述語inverse'(_符合無し整数x,_posビット目) :-
        '符号無し整数xのposビット目を、反転した値を返す述語inverse'(_符合無し整数x,_posビット目,_値),
        表示する('inverse the pos: ',_値).

'符号無し整数xのposビット目を、反転した値を返す述語inverse'(_符合無し整数x,_posビット目,_値) :-
        '符号無し整数xのposビット目を'(0,_posビット目,Y),
        _値 is _符号無し整数x # Y.

'符号無し整数xのposビット目を'(N,N,1) :- !.
'符号無し整数xのposビット目を'(M,N,X) :-
        M2 is M + 1,
        '符号無し整数xのposビット目を'(M2,N,Y),
        X is Y * 2.

'符号無し整数xの入力'(_符号無し整数x) :-
        write('符合無し整数xを入力してください : '),
        get_line(Line),
        '符号無し整数xの入力診断'(Line,_符号無し整数x),!.
'符号無し整数xの入力'(_符号なし整数x) :-
        '符号無し整数xの入力'(_符号無し整数x).

'符号無し整数xの入力診断'(Line,_符号無し整数x) :-
        atom_to_term(Line,_符号無し整数x,_),
        integer(_符号無し整数x),!.
'符号無し整数xの入力診断'(Line,_符号無し整数x) :-
        writef('入力された%tから符号無し整数が得られません。再入力をお願いします。\n',[Line]),
        fail.

'posビット目の入力'(_posビット目) :-
        write('posビット目を入力してください : '),
        get_line(Line),
        'posビット目の入力診断'(_posビット目),!.
'posビット目の入力'(_posビット目) :-
        'posビット目の入力'(_posビット目).

'posビット目の入力診断'(Line,_posビット目) :-
        atom_to_term(Line,_posビット目,_),
        integer(_posビット目),
        _posビット目 >= 0,
        _posビット目 =< 31,!.
'posビット目の入力診断'(Line,_posビット目) :-
        writef('入力された%tから適切な整数値が得られませんでした。再入力をお願いします。\n',[Line]),
        fail.

表示する(_表示文字列,_値) :-
        write(_表示文字列),
        二進数表示(_値,[]),
        write('\n'),!.

二進数表示(0,L) :-
        L1 = [0|L],
        '32桁になるように頭部に0を付加する'(L1,L2),
        concat_atom(L2,S),
        writef('%32s',[S]),!.
二進数表示(1,L) :-
        L1 = [1|L],
        '32桁になるように頭部に0を付加する'(L1,L2),
        concat_atom(L2,S),
        writef('%32s',[S]),!.
二進数表示(_値,L) :-
        _値_1 is _値 // 2,
        _余り is _値 mod 2,
        二進数表示(_値_1,[_余り|L]),!.

'32桁になるように頭部に0を付加する'(L1,L2) :-
        length(L2,32),
        append(L0,L1,L2),
        all(L0,0),!.