2013-04-26 83 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