このディレクトリの索引
http://hibari.2ch.net/test/read.cgi/tech/1320365280/136
#  [1] 授業単元:基礎プロ 
#  [2] 問題文(含コード&リンク): 
#  整数型の変数 i の値を 1 から k まで順に変化させ,以下を繰り返す.  
#  n に i の値を代入する. 
#  n が偶数のときは n を 2 で割った値を n に代入する. 
#  n が奇数のときは n を 3 倍して 1 を加えた値を n に代入する. 
#  n の値が 1 になるまで b. の操作を繰り返す. 
#  i ごとに繰り返した回数を以下の実行例のように出力する. 
#  実行例 
#  >./extra06-2 
#  自然数を入力: 4 
#  1: 0 
#  2: 1 
#  3: 7 
#  4: 2 
#  > 
#  この動作をするプログラムを作成せよ 
#  

'整数型の変数 i の値を 1 から k まで順に変化させ,以下を繰り返す. n に i の値を代入する. n が偶数のときは n を 2 で割った値を n に代入する.n が奇数のときは n を 3 倍して 1 を加えた値を n に代入する.n の値が 1 になるまで b. の操作を繰り返す.i ごとに繰り返した回数を以下の実行例のように出力する' :-
        '整数型の変数 i の値を 1 から k まで順に変化させ,以下を繰り返す'(_k,_n),
        以下を繰り返す(0,_m,_n),
        実行例のように出力する(_m,_n),
        _n = _k.

'整数型の変数 i の値を 1 から k まで順に変化させ'(_k,_i) :-
        for(1,_i,_k).

以下を繰り返す(_m,_m,1) :- !.
以下を繰り返す(_m_1,_m,_n_1) :-
        'n が偶数のときは n を 2 で割った値を n に代入する'(_n_1,_n_2),
        _m_2 is _m_1 + 1,
        以下を繰り返す(_m_2,_m,_n_2).
以下を繰り返す(_m_1,_m,_n_1) :-
        'n が奇数のときは n を 3 倍して 1 を加えた値を n に代入する'(_n_1,_n_2),
        _m_2 is _m_1 + 1,
        以下を繰り返す(_m_2,_m,_n_2).

'n が偶数のときは n を 2 で割った値を n に代入する'(_n_1,_n_2),
        'n が偶数のときは'(_n_1),
        _n_2 is _n_1 // 2.

'n が奇数のときは n を 3 倍して 1 を加えた値を n に代入する'(_n_1,_n_2),
        'n が奇数のときは'(_n_1),
        _n_2 is (_n_1 * 3) + 1.

'n が偶数のときは'(_n) :-
        0 is _n mod 2.

'n が偶数のときは'(_n) :-
        1 is _n mod 2.

実行例のように出力する(_m,_n) :-
        writef('%t: %t\n',[_n,_m]).