このディレクトリの索引
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) :-
         findall(_Idならび,(
                     between(1,100000,_n),
                     message_queue_create(_Id),
                     thread_create(コラッツの予想(_ID,_n),_,[])),
                 _Idならび),
         最長のsを出力する(_Idならび).

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

コラッツの予想(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.

最長のsを出力する(_Idならび) :-
        findmax(_n,(
                    between(1,100000,_),
                    repeat,
                    thread_get_massage(_Id,_n)),
                _最長のs),
        writef('最長のsは %t です。\n',[_最長のs]).