このディレクトリの索引
#  [1] 授業単元: C言語
#  [2] 問題文(含コード&リンク): キーボードから入力した数値(10進数)を
#  2進数に変換して画面に出力するコードを作成しなさい。
#  
#  また,キーボードから入力した2進数の数値を
#  10進数に変換して画面に出力するコードを作成しなさい。
#  
#  また、必要に応じて再帰を使っても使わなくてもよい。

'キーボードから入力した数値(10進数)を2進数に変換して画面に出力する' :-
        'キーボードから入力した数値(10進数)を'(_10進数),
        '2進数に変換して'(_10進数,_2進数表示),
        画面に出力する(_2進数表示).

'キーボードから入力した数値(10進数)を'(_10進数) :-
        get_line(Line),
        入力した数値診断(Line,_10進数),!.

入力した数値診断(Line,_10進数) :-
        atom_to_term(Line,_10進数),
        integer(_10進数),!.

'2進数に変換して'(_10進数,_2進数表示) :-
        _10進数 >= 0,
        '10進数を2進数ならび表現に変換'(_10進数,[],L),
        concat_atom(L,_2進数表示).
'2進数に変換して'(_10進数,_2進数表示) :-
        _10進数 < 0,
        _10進数_1 is 2147483648 + _10進数,
        '10進数をn桁の2進数ならび表現に変換'(_10進数_1,31,[],L),
        concat_atom([1|L],_2進数表示).

'10進数を2進数ならび表現に変換'(0,L,L) :- !.
'10進数を2進数ならび表現に変換'(N,L1,L) :-
        M1 is N mod 2,
        N2 is N // 2,
        '10進数を2進数ならび表現に変換'(N2,[M1|L1],L).

'10進数をn桁の2進数ならび表現に変換'(0,_n桁,L) :-
        length(L,_n桁),
        '10進数を2進数ならび表現に変換'(_10進数,[],L1),
        append(L0,L1,L),
        all(L0,0),!.

画面に出力する(_2進数表示) :-
        writef('%t\n',[_2進数表示]).