2

そのため、述語を 1 つだけ使用して、数値が素数かどうかを判断しようとしています。ここですべての数値が false と宣言されている理由がよくわかりません。

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

非常に単純なソリューションでは、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 に答える
2

あなたのコードが動かない理由は の開始値ですbetween/3: X mod 1 は常に 0 であるため、(1 ではなく) 2 から開始する必要があります。

于 2014-04-21T04:41:43.587 に答える