1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
:-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.