2013-04-26 39 views
1

我是Prolog的新手,很难弄清楚我的代码出了什么问题。 我试图找到circular prime numbers 到目前为止,我有这样的代码:在Prolog中检查循环素数

isCircularPrime(N):- 
    prime(N), 
    numDigits(N, Y), 
    Y2 is Y-1, 
    rotate(N,Y,N2), 
    circularPrime(N2, Y2, Y2). 

circularPrime(_, 0, _).  
circularPrime(N, 1, _):-prime(N). 
circularPrime(N, I, J):- 
    I > 1, 
    prime(N), 
    I2 is I-1, 
    rotate(N,J,N2), 
    circularPrime(N2,I2,J). 

其中:

  • numDigits使得Ÿ位数在N.
  • 旋转使N2 N的旋转(例如12→21)。
  • 素为真,如果N是素数,否则为假

目前,它递归无限每当一个数是素数,但不是圆形素(例如19,23,等等)。如果有人能够解释我做错了什么,我会非常感激。

下面是其他代码的情况下,任何人想要对此进行测试自己:

prime(2). 
prime(3). 
prime(N):- 
    N>3, 
    N mod 2 =\= 0, 
    \+ divisible(N,3). 

divisible(N,I):- N mod I =:= 0. 
divisible(N,I):- 
    I*I < N, 
    I2 is I + 2, 
    divisible(N, I2). 

numDigits(N, 1):- 
    N<10, N>0. 
numDigits(N, X):- 
    N2 is N/10, 
    numDigits(N2, Y), 
    X is (Y+1). 

rotate(N, L, R):- 
    LastDigit is N mod 10, 
    Base is div(N, 10), 
    Exponent is L - 1, 
    Num is 10**Exponent, 
    NewBase is LastDigit*Num, 
    R is Base + NewBase. 
+0

而是使用'^'代替'**'。 – false 2014-01-24 16:10:42

回答

3

我认为这个问题是在你的numDigits/2谓语。

它提供了所有类型的答案,所以程序一直连连后退:

numDigits(1, X). 
X = 1 ; 
X = 2 ; 
X = 3 ; 
X = 4 ; 
X = 5 etc... 

将削减numDigits/2程序后似乎正常行为:

isCircularPrime(19). 
false. 
+0

现在完美工作,谢谢! – X3no 2013-04-26 08:04:39