このディレクトリの索引
http://toro.2ch.net/test/read.cgi/tech/1349545643/775
#  【お題】 
#  コラッツ予想とは、「任意の0でない自然数nをとり、 
#  ・nが偶数の場合、nを2で割る 
#  ・nが奇数の場合、nに3をかけて1を足す 
#  という操作を繰り返すと、有限回で1に到達する」という主張である。 
#   
#  nからスタートして1に到達するまでのステップをsとしたとき、 
#  n = 1 .. 100000についてsを計算し、最長のsを出力せよ。 
#   
#  ただし、それぞれのnに対するsの計算は並列(スレッド、プロセス問わない)で行う事。 
# 
# 

'コラッツ予想とは、「任意の0でない自然数nをとり、 
・nが偶数の場合、nを2で割る 
・nが奇数の場合、nに3をかけて1を足す 
という操作を繰り返すと、有限回で1に到達する」という主張である。
 
nからスタートして1に到達するまでのステップをsとしたとき、 
n = 1 .. 100000についてsを計算し、最長のsを出力せよ。'(_n,_最長のs) :-
         findmax(_回数,(
                     between(1,100000,_n),
                     コラッツの予想(_n,_回数)),
                 _最長のs).

コラッツの予想(_n,_回数) :-
        コラッツの予想(_n,0,_回数).

コラッツの予想(1,_回数,_回数) :- !.
コラッツの予想(_n,_回数_1,_回数) :-
        'nが偶数の場合、nを2で割る nが奇数の場合、nに3をかけて1を足す'(_n,_n_2),
        _回数_2 is _回数_1 + 1,
        コラッツの予想(_n_2,_回数_2,_回数),!.

'nが偶数の場合、nを2で割る nが奇数の場合、nに3をかけて1を足す'(_n,n_2) :-
        'nが偶数の場合、nを2で割る'(_n,_n_2).
'nが偶数の場合、nを2で割る nが奇数の場合、nに3をかけて1を足す'(_n,_n_2) :-
        'nが奇数の場合、nに3をかけて1を足す'(_n,_n_2).

'nが偶数の場合、nを2で割る'(_n,_n_2) :-
        _n_2 is _n // 2.

'nが奇数の場合、nに3をかけて1を足す'(_n,_n_2) :-
        1 is _n mod 2,
        _n_2 is _n * 3 + 1.