:-dynamic(ca/2). even(N):- 1 =:= N /\ 1. c(1,0):-!. c(N,R):-ca(N,R),!. c(N,R) :-!, (even(N)->N1 is N * 3 + 1; N1 is N / 2), c(N1,R0), succ(R0,R), asserta(ca(N,R)). max_c(M,M,MaxI,MaxF,(MaxI,MaxF)). max_c(I,M,MaxI,MaxF,R):-!, c(I,F), succ(I,I1), (MaxF < F -> max_c(I1,M,I,F,R) ; max_c(I1,M,MaxI,MaxF,R)). max_c(M,R):-max_c(1,M,0,0,R). :-N is integer(2^20) + 1, max_c(N,R), write(R), nl, halt.