このディレクトリの索引
http://hibari.2ch.net/test/read.cgi/tech/1291471791/3
#  1] 授業単元:プログラミング 
#  [2] 問題文(含コード&リンク):問い2:キーボードから入力された整数に対して「偶数なら2で割り、
#  奇数なら3倍して1加える」という作業を行いこれを結果が1になるまで繰り返すプログラムを作成し
#  途中の変化の値を表示させよ 
#  

'キーボードから入力された整数に対して「偶数なら2で割り、奇数なら3倍して1加える」という作業を行いこれを結果が1になるまで繰り返すプログラムを作成し途中の変化の値を表示させよ' :-
        'キーボードから入力された整数'(_整数),
        途中の変化の値を表示(_整数),
        「偶数なら2で割り、奇数なら3倍して1加える」という作業を行い結果が1になるまで繰り返す(_整数),!.

キーボードから入力された整数(_整数) :-
        write('整数を入力したください : '),
        get_line(Line),
        キーボードから入力された整数診断(Line,_整数),!.
キーボードから入力された整数(_整数) :-
        キーボードから入力された整数(_整数).

キーボードから入力された整数診断(Line,_整数) :-
        atom_to_integer(Line,_整数,_),
        integer(_整数),!.
キーボードから入力された整数診断(Line,_整数) :-
        write_formatted('入力された %t からは整数が得られません。再入力をお願いします。\n',[Line]),
        fail.

「偶数なら2で割り、奇数なら3倍して1加える」という作業を行い結果が1になるまで繰り返す(1) :- !.
「偶数なら2で割り、奇数なら3倍して1加える」という作業を行い結果が1になるまで繰り返す(_整数) :-
        偶数(_整数),
        '2で割り'(_整数,_結果),
        途中の変化の値を表示(偶数,_整数,'2で割り',_結果),
        途中の変化の値を表示(_整数),
        「偶数なら2で割り、奇数なら3倍して1加える」という作業を行い結果が1になるまで繰り返す(_結果),!.
「偶数なら2で割り、奇数なら3倍して1加える」という作業を行い結果が1になるまで繰り返す(_整数) :-
        奇数(_整数),
        '3倍して1加える'(_整数,_結果),
        途中の変化の値を表示(奇数,_整数,'3倍して1加える',_結果),
        「偶数なら2で割り、奇数なら3倍して1加える」という作業を行い結果が1になるまで繰り返す(_結果).

偶数(_整数) :-
        0 is _整数 mod 2.

奇数(_整数) :-
        1 is _整数 mod 1.

'2で割り'(_整数,_結果) :-
        _結果 is _整数 // 2.

'3倍して1加える'(_整数,_結果) :-
        _結果 is _整数 * 3 + 1.

途中の変化の値を表示(_偶数または奇数,_整数,'2で割り',_結果),
        write_formatted('%tなら %t を %t 結果は %t\n',[_偶数または奇数,_整数,'2で割り',_結果]).