确定Prolog中的数字是否为素数

时间:2014-04-21 03:45:17

标签: prolog primes primality-test

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

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

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

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

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

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

CLP(FD)约束的确切用法细节在Prolog系统之间略有不同。通过最多小的修改,您将能够在所有最广泛使用的系统中运行上述内容。

完成!

由于:

  

素数是大于1的整数,复合。

以下是一些例子:

?- length([_,_|_], P), \+ is_composite(P).
P = 2 ;
P = 3 ;
P = 5 ;
P = 7 ;
P = 11 ;
P = 13 ;
P = 17 ;
P = 19 ;
P = 23 ;
P = 29 ;
etc.

通常,在Prolog中推理整数时,最好使用CLP(FD)约束。