【问题标题】:Determine if number is prime in Prolog在Prolog中确定数字是否为素数
【发布时间】:2014-06-05 02:38:52
【问题描述】:

所以我试图仅使用一个谓词来确定一个数字是否为素数。我真的不明白为什么这里的每个数字都被声明为假。

is_prime(2).
is_prime(X) :-
    X > 2, %0 and 1 aren't primes, 2 is dealt with above
    1 is mod(X,2), %number is odd
    N is floor(X/2), %I want to only divide X from 1 to X/2
    forall( between(1,N,Z), mod(X,Z) > 0 ). %This should do X mod 1:X/2

【问题讨论】:

  • 我相信正确的解决方法是将 forall 中的 1 更改为 2。这似乎已经做到了。
  • 我建议您将其作为答案提交并接受,如果可行的话。
  • 我会尽快。但是对此发表评论的人之一也提交了答案。我打算切换他的评论以获得答案。
  • 我写了一个答案(使用 1 作为起始值是不正确的)但意识到你已经自己发现了它,因此删除了我的答案。我应该取消删除它吗?

标签: prolog primes primality-test


【解决方案1】:

您的代码不起作用的原因是between/3 的起始值:它应该以 2(而不是 1)开头,因为 X mod 1 始终为 0。

【讨论】:

  • 我只想强调?- trace, is_prime(3). 让问题立即显现出来。
【解决方案2】:

一个非常直接的解决方案使用 CLP(FD) 约束来表达所需的属性。

我们从一个更简单的谓词开始,它是真的iff数字是复合

is_composite(N) :- N #= A*B, [A,B] ins 2..sup.

CLP(FD) 约束的确切使用细节在 Prolog 系统之间略有不同。只需稍加修改,您就可以在所有最广泛使用的系统中运行上述程序。

完成!

因为:

素数是大于 1 且合数的整数。

这里有几个例子:

?- 长度([_,_|_], P), \+ is_composite(P)。 P = 2; P = 3 ; P = 5 ; P = 7 ; P = 11; P = 13; P = 17 ; P = 19; P = 23; P = 29; 等等。

一般来说,在 Prolog 中对 整数 进行推理时,使用 CLP(FD) 约束是一种很好的做法。

【讨论】:

    猜你喜欢
    • 2014-11-16
    • 1970-01-01
    • 2016-09-27
    • 2015-01-22
    • 2011-06-09
    • 1970-01-01
    • 1970-01-01
    • 2012-02-03
    • 1970-01-01
    相关资源
    最近更新 更多