【问题标题】:Check whether prime or not in Prolog在 Prolog 中检查是否为素数
【发布时间】:2014-04-26 00:03:32
【问题描述】:

我正在尝试学习 Prolog,我发现了一个示例,我需要实现一个程序来检查一个数字是否为素数,使用单个谓词。

我试图遵循的逻辑是制定一个递归规则来除以小于该谓词的所有数字,直到它到达基本情况,即X>2,因为01 不是素数且可被自身整除

到目前为止我的代码是:

isPrime(2).
isPrime(X):-
    X>2, %0,1 aren't primes
    1 is mod(X,2),

有人可以帮忙吗?

【问题讨论】:

  • 您必须使用 single 谓词来实现此目的吗?两个人很容易。
  • 它不必是单个谓词:)

标签: recursion prolog primes


【解决方案1】:

只要你不关心效率,这很容易。

isPrime(X) :-
  X > 1,
  succ(X0, X),
  \+ (between(2, X0, N), 0 is X mod N).

:)

【讨论】:

  • 你可以使用succ(X0, X) 代替X0 is truncate(sqrt(X)) :)
  • @lurker:你的建议不适用于非常大的整数:sqrt 给出了一个浮点数。
  • @false truncate 不会处理这个问题吗?或者是否有一些与sqrt 一起使用的超大整数类型,但truncate 会产生一个不适合truncate 类型的“正常”整数?
  • @lurker:我的意思是非常大,以至于无法再精确地表示平方根。假设 X 是 7^7^3
  • @false 很有趣。在 Prolog 提示符下使用它,我看到 truncate(和 floor 等)适用于高达 2**27 的整数,但对于 2**28 及以上的整数没有给出正确的结果。我对此有点惊讶,但还没有真正深入研究内部表示来解释它。
猜你喜欢
  • 2014-06-10
  • 1970-01-01
  • 2018-11-17
  • 2014-11-16
  • 2014-06-05
  • 2017-09-24
  • 1970-01-01
  • 1970-01-01
  • 2013-03-22
相关资源
最近更新 更多