Предикат Коллатца в Прологе
Я застрял с некоторыми упражнениями Пролог. Я должен написать предикат 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.