Prolog (SWIPL), 129/137 byte
g(1,R):-u(3,4,R).
g(L,R):-M is L-1,g(M,P),u(3,P,R).
u(N,1,R):-R is 3**N.
u(1,_,3).
u(N,M,R):-K is N-1,L is M-1,u(K,M,Y),u(Y,L,R).
Để xuất số của Graham, truy vấn cho g(64,G).
(nếu 8 byte của truy vấn này được tính, độ dài là 137 byte):
?- g(64, G).
ERROR: Out of local stack
Nhưng như có thể dự đoán, điều này sẽ hết stack.
Kiểm tra
?- u(3, 2, X).
X = 7625597484987
Quay lui khiến nó hết stack:
?- u(3, 2, X).
X = 7625597484987 ;
ERROR: Out of local stack
Ung dung
Phiên bản không được bổ sung thêm ký hiệu mũi tên lên chung, không chỉ cho 3, và sử dụng các vết cắt và kiểm tra để tránh quay lại và các tình huống không xác định.
% up-arrow notation
u(X, 1, _M, X) :- !.
u(X, N, 1, R) :-
R is X**N, !.
u(X, N, M, R) :-
N > 1,
M > 1,
N1 is N - 1,
M1 is M - 1,
u(X, N1, M, R1),
u(X, R1, M1, R).
% graham's number
g(1,R) :- u(3, 3, 4, R), !.
g(L,R) :-
L > 1,
L1 is L - 1,
g(L1,G1),
u(3, G1, R).