1

我坚持做一些 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.

但我需要以某种方式停止循环:) 谢谢:)

4

1 回答 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.
于 2015-10-19T21:31:42.357 回答