我想写一个谓词来确定一个数字是否是素数。我通过蛮力 O(sqrt(n)) 算法来做到这一点:
1) 如果 number 为 2,则返回 true 并且不再检查任何谓词。
2)如果是偶数,返回false,不再检查谓词。
3) 如果数不是偶数,检查数的除数直到平方根。请注意,我们只需要检查从 3 开始的奇数除数,因为如果我们进入程序的这一部分,则数字不是偶数。在第 2 步中消除了偶数。
4) 如果我们找到一个偶数除数,则返回 false 并且不检查其他任何内容。
5)如果我们检查的除数大于数字的平方根,返回true,我们没有找到除数。不再进行谓词检查。
这是我的代码:
oddp(N) :- M is N mod 2, M = 1.
evenp(N) :- not(oddp(N)).
prime(2) :- !.
prime(X) :- X < 2, write_ln('case 1'), false, !.
prime(X) :- evenp(X), write_ln('case 2'), false, !.
prime(X) :- not(evenp(X)), write_ln('calling helper'),
prime_helper(X,3).
prime_helper(X, Divisor) :- K is X mod Divisor, K = 0,
write_ln('case 3'), false, !.
prime_helper(X, Divisor) :- Divisor > sqrt(X),
write_ln('case 4'), !.
prime_helper(X, Divisor) :- write_ln('case 5'),
Temp is Divisor + 2, prime_helper(X,Temp).
我遇到了问题。例如,如果我查询 prime(1)。该程序仍在检查除数。我以为添加'!将使程序停止检查先前条件是否为真。有人可以告诉我为什么程序会这样做吗?请记住,我是新手,我知道代码可以简化。但是,任何提示将不胜感激!