Comment detail

正整数のゲーデル数化? (Nested Flatten)
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).

Index

Feed

Other

Link

Pathtraq

loading...