正整数のゲーデル数化?
Posted feedbacks - Erlang
1> c(goedel).
{ok,goedel}
2> goedel:goedel(9).
512
3> goedel:goedel(81).
768
4> goedel:goedel(230).
108
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | -module(goedel).
-export([goedel/1]).
prime(Num) -> prime(Num - 1, [2], 3).
prime(0, List, _) -> lists:last(List);
prime(Num, List, Max) ->
case lists:any(fun(X) -> (Max rem X) =:= 0 end, List) of
true -> prime(Num, List, Max + 2);
false -> prime(Num - 1, List ++ [Max], Max + 2)
end.
pow({_, 0}) -> 1;
pow({X, Y}) -> X * pow({X, Y - 1}).
column(Num) -> length(hd(io_lib:format("~B", [Num]))).
goedel(Num) ->
List = [pow(X) || X <- goedel(Num, [], column(Num))],
lists:foldl(fun(X, Proc) -> X * Proc end, 1, List).
goedel(_, List, 0) -> lists:zip([prime(X) || X <- lists:seq(1, length(List))], List);
goedel(Num, List, Size) -> goedel(Num div 10, [Num rem 10] ++ List, Size - 1).
|



nobsun
#4420()
Rating2/2=1.00
see: ゲーデル数
[ reply ]