1

私は 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 は、Y を 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.
4

1 に答える 1

3

numDigits/2問題はあなたの述語にあると思います。

それはあらゆる種類の答えを提供するので、プログラムは何度も何度もバックトラックを続けます:

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

プログラムにカットを追加した後、numDigits/2正しく動作するように見えます:

isCircularPrime(19).
false.
于 2013-04-26T07:13:09.977 に答える