このディレクトリの索引
http://hibari.2ch.net/test/read.cgi/tech/1312201995/929
#  [1] プログラミング 
#  [2] 入力された整数が偶数だったら2で割り、奇数ならば3倍してから1足す 
#  これを1になるまで繰り返し、かつ過程も出力するプログラムを作れ 
#  

'入力された整数が偶数だったら2で割り、奇数ならば3倍してから1足す。これを1になるまで繰り返し、かつ過程も出力する' :-
        入力された整数が(_入力された整数),
        '偶数だったら2で割り、奇数ならば3倍してから1足す。これを1になるまで繰り返し、かつ過程も出力する'(_入力された整数).

'偶数だったら2で割り、奇数ならば3倍してから1足す。これを1になるまで繰り返し、かつ過程も出力する'(1) :-
        過程も出力する('受け取り整数が 1 になった為終了します。\n),!.
'偶数だったら2で割り、奇数ならば3倍してから1足す。これを1になるまで繰り返し、かつ過程も出力する'(_受け取り整数) :-
        過程も出力する('新たに受け取った整数は %t です\n',[_受け取り整数]),
        偶数だったら2で割り(_受け取り整数,_2で割った整数),
        '偶数だったら2で割り、奇数ならば3倍してから1足す。これを1になるまで繰り返し、かつ過程も出力する'(_2で割った整数).
'偶数だったら2で割り、奇数ならば3倍してから1足す。これを1になるまで繰り返し、かつ過程も出力する'(_受け取り整数) :-
        奇数ならば3倍してから1足す(_受け取り整数,_3倍してから1足した整数),
        '偶数だったら2で割り、奇数ならば3倍してから1足す。これを1になるまで繰り返し、かつ過程も出力する'(_3倍してから1足した整数).

偶数だったら2で割り(_受け取り整数,_2で割った整数) :-
        偶数だったら(_受け取り整数),
        過程も出力する('%t は偶数でした\n',[_受け取り整数]),
        '2で割り'(_受け取り整数,_2で割った整数),
        過程も出力する('受け取り整数 %t を2で割った整数は %t となりました\n',[_受け取り整数,_2で割った整数]),!.

奇数ならば3倍してから1足す(_受け取り整数,_3倍してから1足した整数) :-
        奇数ならば(_受け取り整数),
        過程も出力する('%t は奇数でした\n',[_受け取り整数]),
        '3倍してから1足す'(_受け取り整数,_3倍してから1足した整数),
        過程も出力する('受け取り整数 %t を3倍してから1足した整数は %t となりました\n',[_受け取り整数,_3倍してから1足した整数]),!.

偶数だったら(_受け取り整数) :-
        0 is _受け取り整数 mod 2.

'2で割り'(_受け取り整数,_2で割った整数) :-
        _2で割った整数 is _受け取り整数 // 2.

奇数ならば(_受け取り整数) :-
        1 is _受け取り整数 mod 2.

'3倍してから1足す'(_受け取り整数,_3倍してから1足した整数) :-
        _3倍してから1足した整数 is _受け取り整数 * 3 + 1.

入力された整数が(_入力された整数) :-
        write('整数を入力して下さい : '),
        get_line(Line),
        入力された整数診断(Line,_入力された整数),!.
入力された整数が(_入力された整数) :-
        入力された整数が(_入力された整数).

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

過程も出力する(_出力フォーマット,_値ならび) :-
        writef(_出力フォーマット,_値ならび).