このディレクトリの索引
http://pc12.2ch.net/test/read.cgi/tech/1276810079/619
#  [1] 授業単元:Cプログラミング演習 
#  [2] 問題文(含コード&リンク): 
#  問題1. 10進数1234を2進数で表示するプログラムを作成せよ。 
#  問題2. 変数の下位16ビット中の1のビット数を数える
#  

'10進数1234を2進数で表示する' :-
         write('0b'),
         '10進数1234を2進数で表示する'(1234,[],L),
         append(_,[A|R],L),
         write_formatted('%t\n',[A]),
         R = [].

'10進数1234を2進数で表示する'(_,L,L) :- !.
'10進数1234を2進数で表示する'(N,L1,L) :-
        M is N mod 2,
        N1 is N // 2,
        '10進数1234を2進数で表示する'(N1,[M|L1],L).

変数の下位16ビット中の1のビット数を数える(_変数,_頻度) :-
        integer(_変数),
        M is _変数 mod 65536,
        整数の下位16ビット中の1のビット数を数える(M,_頻度).
変数の下位16ビット中の1のビット数を数える(_変数,_頻度) :-
        atom(_変数),
        atom_codes(_変数,Codes),
        'Codesの下位16ビット中の1のビット数を数える'(Codes,_頻度).

整数の下位16ビット中の1のビット数を数える(0,0) :- !.
整数の下位16ビット中の1のビット数を数える(N,X) :-
        0 is N mod 2,
        N1 is N // 2,
        整数の下位16ビット中の1のビット数を数える(N1,X).
整数の下位16ビット中の1のビット数を数える(N,X) :-
        1 is N mod 2,
        N1 is N // 2,
        整数の下位16ビット中の1のビット数を数える(N1,Y),
        X is Y + 1.

'Codesの下位16ビット中の1のビット数を数える'(Codes,_頻度) :-
        last(Codes,Code),
        Code >= 256,
        整数の下位16ビット中の1のビット数を数える(N,_頻度),!.
'Codesの下位16ビット中の1のビット数を数える'(Codes,_頻度) :-
        last(Codes,Code),
        Code < 256,
        append(_,[A,B],Codes),
        N is (A * 256 + B) mod 65536,
        整数の下位16ビット中の1のビット数を数える(N,_頻度),!.
'Codesの下位16ビット中の1のビット数を数える'([Code],_頻度) :-
        整数の下位16ビット中の1のビット数を数える(Code,_頻度),!.