错误:未定义的过程:(+)/ 2

str*_*ony 3 primes prolog

我是SWI-Prolog的新手,我想检查Prolog的主要功能.

prime(N) :-
    N > 1,
    M is N - 1,
    check(N, M).

check(_, 1).
check(N, M) :-
    M > 1,
    R is N - M * N / M,
    R > 0,
    P is M - 1,
    check(N, P).
Run Code Online (Sandbox Code Playgroud)

但是当我问2 + 2或其他运营商一样(*)/2,(/)/2......在序言这样说的:undefined procedure: (+)/2.我认为这是为了seetell.我重新分配see(user),tell(user)但这个错误再次发生.为什么?

Bor*_*isM 6

在您使用的SWI prolog 6.0.2分区中,它返回浮点数.因此prime(13),例如将失败,因为余数为0.整数除法使用运算符//.但检查prolog SWI功能remmod.

你也希望在第一次定义后有一个剪切check,否则prolog将探索第二个定义,它将返回false.Cut确保在检查了小于N的所有自然数后,它会成功停止.

这是在SWI Prolog 6.0.2中按照需要运行的更正代码.

prime(N) :-
    N > 1,
    M is N - 1,
    check(N, M).

check(_, 1) :- !.
check(N, M) :-
    M > 1,
    R is N mod M,
    R > 0,
    P is M - 1,
    check(N, P).
Run Code Online (Sandbox Code Playgroud)