【问题标题】:Checking circular primes in Prolog在 Prolog 中检查圆形素数
【发布时间】:2013-04-26 06:44:45
【问题描述】:

我是 Prolog 的新手,很难弄清楚我的代码有什么问题。 我正在寻找circular prime numbers 到目前为止,我有这个代码:

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 中的位数。
  • rotate 使 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.

【问题讨论】:

  • 宁可使用^ 代替**

标签: prolog primes


【解决方案1】:

我认为问题出在您的 numDigits/2 谓词中。

它提供了各种各样的答案,所以程序一次又一次地回溯:

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

在对numDigits/2 添加剪辑后,程序似乎运行正常:

isCircularPrime(19).
false.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-10
    • 1970-01-01
    • 2014-04-08
    • 1970-01-01
    相关资源
    最近更新 更多