2

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

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
4

2 回答 2

2

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

于 2014-04-21T04:41:43.587 回答
2

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

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

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) 约束是一种很好的做法。

于 2016-10-24T19:47:24.693 回答