我用b-prolog版本8.1 的表格功能做了一些实验, 并且对我观察到的性能感到非常惊讶.
这是我使用的代码.它计算将一些正整数减少到以下所需的Collatz步N数:I1
%:- table posInt_CollatzSteps/2. % remove comment to enable tabling
posInt_CollatzSteps(I,N) :-
( I == 1
-> N = 0 % base case
; 1 is I /\ 1
-> I0 is I*3+1, posInt_CollatzSteps(I0,N0), N is N0+1 % odd
; I0 is I>>1, posInt_CollatzSteps(I0,N0), N is N0+1 % even
).
Run Code Online (Sandbox Code Playgroud)
要确定从所有整数需要减少最大步数I0来I:
i0_i_maxSteps0_maxSteps(I0,I,M0,M) :-
( I0 > I
-> M0 = M
; posInt_CollatzSteps(I0,N0),
I1 is …Run Code Online (Sandbox Code Playgroud)