このディレクトリの索引
#  出典 :: C/C++の宿題片付けます 157代目 #118
#  [1] 授業単元:C言語演習 
#  [2] 問題文(含コード&リンク):  
#  次の規則に従う数列a_{0},a_{1},a_{2},...を表示するプログラムを作成しなさい. 
#  ただし、配列を使用してはならない。 
#     1. 初期値a_{0}は,任意の自然数とする. 
#     2. 数列a_{n+1}は次の式で決められる. 
#        a_{n+1}=a_{n}/2   (a_{n}が偶数のとき) 
#        a_{n+1}=3a_{n}+1   (a_{n}が奇数のとき)  
#     3. 数列a_{n}=1になったら終了する. 
#  例えば,a_{0}=13のとき{13, 40, 20, 10, 5, 16, 8, 4, 2, 1}となる. 
#  

'次の規則に従う数列a_{0},a_{1},a_{2},...を表示する.1. 初期値a_{0}は,任意の自然数とする. 2. 数列a_{n+1}は次の式で決められる. a_{n+1}=a_{n}/2 (a_{n}が偶数のとき) a_{n+1}=3a_{n}+1 (a_{n}が奇数のとき)  3. 数列a_{n}=1になったら終了する' :-
        '1. 初期値a_{0}は,任意の自然数とする'(_初期値a_0),
        '2. 数列a_{n+1}は次の式で決められる. a_{n+1}=a_{n}/2 (a_{n}が偶数のとき) a_{n+1}=3a_{n}+1 (a_{n}が奇数のとき)  3. 数列a_{n}=1になったら終了する'(_初期値a_0,_a),
        '数列a_{0},a_{1},a_{2},...を表示する'(_初期値a_0,_a).

'2. 数列a_{n+1}は次の式で決められる. a_{n+1}=a_{n}/2 (a_{n}が偶数のとき) a_{n+1}=3a_{n}+1 (a_{n}が奇数のとき)  3. 数列a_{n}=1になったら終了する'(_a_n,[_a_n]) :-
        '3. 数列a_{n}=1になったら終了する'(_a_n),!.
'2. 数列a_{n+1}は次の式で決められる. a_{n+1}=a_{n}/2 (a_{n}が偶数のとき) a_{n+1}=3a_{n}+1 (a_{n}が奇数のとき)  3. 数列a_{n}=1になったら終了する'(_a_n,[_a_n|R]) :-
        'a_{n+1}=a_{n}/2 (a_{n}が偶数のとき)'(_a_n,_a_n_1),
        '2. 数列a_{n+1}は次の式で決められる. a_{n+1}=a_{n}/2 (a_{n}が偶数のとき) a_{n+1}=3a_{n}+1 (a_{n}が奇数のとき)  3. 数列a_{n}=1になったら終了する'(_a_n_1,R).
'2. 数列a_{n+1}は次の式で決められる. a_{n+1}=a_{n}/2 (a_{n}が偶数のとき) a_{n+1}=3a_{n}+1 (a_{n}が奇数のとき)  3. 数列a_{n}=1になったら終了する'(_a_n,[_a_n|R]) :-
        'a_{n+1}=3a_{n}+1 (a_{n}が奇数のとき)'(_a_n,_a_n_1),
        '2. 数列a_{n+1}は次の式で決められる. a_{n+1}=a_{n}/2 (a_{n}が偶数のとき) a_{n+1}=3a_{n}+1 (a_{n}が奇数のとき)  3. 数列a_{n}=1になったら終了する'(_a_n_1,R).

'3. 数列a_{n}=1になったら終了する'(_a_n) :-
        _a_n = 1.

'a_{n+1}=a_{n}/2 (a_{n}が偶数のとき)'(_a_n,_a_n_1) :-
        'a_{n}が偶数のとき'(_a_n),
        _a_n_1 is _a_n // 2.

'a_{n}が偶数のとき'(_a_n) :-
        0 is _a_n mod 2.

'a_{n+1}=3a_{n}+1 (a_{n}が奇数のとき)'(_a_n,_a_n_1) :-
        'a_{n}が奇数のとき'(_a_n),
        _a_n_1 is 3 * _a_n + 1.

'a_{n}が奇数のとき'(_a_n) :-
        1 is _a_n mod 2.

'1. 初期値a_{0}は,任意の自然数とする'(_初期値a_0) :-
        任意の自然数とする(_初期値a_0).

任意の自然数とする(_初期値a_0) :-
        write('自然数を入力してください : '),
        get_integer(_初期値a_0),
        _初期値a_0 > 0.

'数列a_{0},a_{1},a_{2},...を表示する'(_初期値a_0,_a) :-
        atomic_list_concat(_a,', ',S),
        writef('a_{0}=%tのとき{ %t}\n',[_初期値a_0,S]).

get_integer(X) :-
        readln([X]),
        integer(X),!.
get_integer(X) :-
        get_integer(X).