Предикат Коллатца в Прологе

Я застрял с некоторыми упражнениями Пролог. Я должен написать предикат collatz2(X,N), который, предполагая, что мы знаем, что такое X, возвращает N, который является индексом (начиная с 1) для результата 1. 'collatz2' - это функция Коллатца. Итак, если я напишу collatz2(5,N)должно вернуться N=6, так как collatz1(N) (проверьте ниже для объяснения этого предиката) приводит к:

5
16
8
4
2
1
true

Я написал предикат, дающий последовательные числа:

collatz1(X):-X>0,X mod 2 =:= 0,write(X),nl,X1 is X//2,X1=\=1,collatz1(X1).
collatz1(X):-X>0,X mod 2 =\= 0,write(X),nl,X1 is 3*X +1,X1=\=1,collatz1(X1).
collatz1(2):-write(1).

Тем не менее, я не могу понять второй предикат. Это должно быть просто, потому что я только начинаю с Пролога. Кто-нибудь может помочь?

РЕДАКТИРОВАТЬ:

Это не дубликат. Я еще не знаю списки, и мне нужно использовать то, что я уже знаю (это просто реальная основа). Вот что у меня так далеко:

collatz2(X,1):-X=1.
collatz2(X,N):-X>0,X mod 2 =:= 0,X1 is X//2,collatz2(X1,R),N is R+1.
collatz2(X,N):-X>0,X mod 2 =\= 0,X1 is 3*X+1,collatz2(X1,R),N is R+1.

Но мне нужно как-то остановить цикл:) Спасибо:)

1 ответ

Решение

Хорошо, мне удалось решить эту проблему, для моего последнего редактирования потребовалась небольшая корректировка:

collatz2(1,4).
collatz2(2,2).
collatz2(X,N):-X>2,X mod 2 =:= 0,X1 is X//2,X=\=1,collatz2(X1,R),N is R+1.
collatz2(X,N):-X>2,X mod 2 =\= 0,X1 is 3*X+1,X=\=1,collatz2(X1,R),N is R+1.
Другие вопросы по тегам