所以我试图仅使用一个谓词来确定一个数字是否为素数。我真的不明白为什么每个号码在这里被宣布为假。
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
答案 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)约束。