このディレクトリの索引
#  出典 :: プログラミングのお題スレ Part3 #435
#  
#  お題:10進数を2進数にしてビットごとに反転したものを10進数に戻す。
#  例
#  1 -> 0
#  12345 -> 4038
#  256 -> 255

'10進数を2進数にしてビットごとに反転したものを10進数に戻す。'(_10進数を,_2進数にしてビットごとに反転したものを10進数戻す) :-
        '10進数を2進数にして'(_10進数を,[],_2進数にして),
        ビットごとに反転したものを(_2進数にして,_ビットごとに反転したものを),
        '10進数に戻す'(_ビットごとに反転したものを,0,_2進数にしてビットごとに反転したものを10進数戻す).

'10進数を2進数にして'(0,_2進数,_2進数) :- !.
'10進数を2進数にして'(_10進数,_2進数_1,_2進数) :-
        _ビット is _10進数 mod 2,
        _10進数_1 is _10進数 // 2,
        '10進数を2進数にして'(_10進数_1,[_ビット|_2進数_1],_2進数).

ビットごとに反転したものを(_2進数にして,_ビットごとに反転したものを) :-
        findall(_ビットごとに反転,(
                    member(_ビット,_2進数にして),
                    ビットごとに反転(_ビット,_ビットごとに反転)),
                _ビットごとに反転したものを).

ビットごとに反転(0,1).
ビットごとに反転(1,0).

'10進数に戻す'([],_10進数,_10進数).
'10進数に戻す'([_ビット|R],_累計_1,_10進数) :-
        _累計_2 is _累計_1 * 2 + _ビット,
        '10進数に戻す'(R,_累計_2,_10進数).