Prolog中的Collat​​z谓词

时间:2015-10-19 20:25:42

标签: prolog predicate collatz

我坚持一些Prolog练习。我要写一个谓词collat​​z2(X,N),假设我们知道X是什么,则返回N,它是1的结果的索引(从1开始)。' collat​​z2'是Collat​​z功能。因此,假设我将写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).

然而,我无法弄清楚第二个谓词。它应该很简单,因为它只是我与Prolog的开始。有人可以帮忙吗?

修改

它没有重复。我还不知道列表,我需要使用我已经知道的东西(这只是真正的基础)。以下是我到目前为止的情况:

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 个答案:

答案 0 :(得分: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.