このディレクトリの索引
http://toro.2ch.net/test/read.cgi/tech/1335517816/712
#  よろしくお願いします! 
#   
#  [1] 授業単元:プログラミングC 
#  [2] 問題文(含コード&リンク):  
#  入力した2進数の数値について、10進数表記に直す計算を行いたい。 
#  以下に示すように、下の桁から順に2をかける回数を増やすように計算を行い、最終的な結果を表示せよ。 
#  なお、再帰は用いなくてよい。 
#  参考:ttp://kie.nu/bOw  
#     ttp://kie.nu/bOx   
#  

'入力した2進数の数値について、10進数表記に直す計算を行い、最終的な結果を表示する' :-
        入力した2進数の数値について(_入力した2進数の数値ならび),
        '下の桁から順に2をかける回数を増やすように計算を行い、10進数表記に直す'(_入力した2進数の数値ならび,_10進数表記),
        最終的な結果を表示する(_10進数表記).

入力した2進数の数値について(_入力した2進数の数値ならび) :-
        write('2進数を0か1からなる数字列として入力してください : '),
        get_line(Line),
        入力した2進数の数値表現診断(Line,_入力した2進数の数値ならび),!.
入力した2進数の数値について(_入力した2進数の数値ならび) :-
        入力した2進数の数値について(_入力した2進数の数値ならび).

入力した2進数の数値表現診断(Line,_入力した2進数の数値ならび) :-
        findall(_文字,(
                        sub_atom(Line,_,1,_,_文字)),
                L),
        '2進数文字ならびを数値ならびに変換する'(L,_入力した2進数の数値ならび),!.
        要素が0または1のみの場合数値に変換する(
入力した2進数の数値表現診断(Line,_入力した2進数の数値ならび) :-
        writef('入力された %t には2進数として不適切な文字が含まれています。再入力をお願いします。\n',[Line]),
        fail.

'2進数文字ならびを数値ならびに変換する'(['0',b|R],_入力した2進数の数値ならび) :-
        要素が0または1のみの場合数値に変換する(R,_入力した2進数の数値ならび),!.
'2進数文字ならびを数値ならびに変換する'(L,_入力した2進数の数値ならび) :-
        要素が0または1のみの場合数値に変換する(L,_入力した2進数の数値ならび).

要素が0または1のみの場合数値に変換する([]).
要素が0または1のみの場合数値に変換する(['0'|R1],[0|R2]) :-
        要素が0または1のみの場合数値に変換する(R1,R2).
要素が0または1のみの場合数値に変換する(['1'|R1],[1|R1]) :-
        要素が0または1のみの場合数値に変換する(R1,R2).

'下の桁から順に2をかける回数を増やすように計算を行い、10進数表記に直す'(_入力した2進数の数値ならび,_10進数表記) :-
        下の桁から取り出しやすいように逆順に並べ直す(_入力した2進数の数値ならび,_逆順に並べ直した2進数の数値ならび),
        '下の桁から順に2をかける回数を増やすように計算を行い'(_逆順に並べ直した2進数の数値ならび,0,_10進数),
        '10進数表記に直す'(_10進数,_10進数表記).

'下の桁から順に2をかける回数を増やすように計算を行い'([],_,0).
'下の桁から順に2をかける回数を増やすように計算を行い'([N|R],M,X) :-
        _掛ける数 is truncate(2 ^ M),        
        M_2 is M + 1,
        '下の桁から順に2をかける回数を増やすように計算を行い'(R,M_2,X_2),
        X is (N * _掛ける数) + _X_2.

下の桁から取り出しやすいように逆順に並べ直す(_入力した2進数の数値ならび,_逆順に並べ直した2進数の数値ならび) :-
        reverse(_入力した2進数の数値ならび,_逆順に並べ直した2進数の数値ならび).

'10進数表記に直す'(_10進数,_10進数表記) :-
        swritef(_10進数表記,'%t',[_10進数]).

最終的な結果を表示する(_10進数表記) :-
        writef('%t\n',[_10進数表記]).