Относно грешката си, вижте това:
?- 2+2.
ERROR: Undefined procedure: (+)/2
?- X is 2+2.
X = 4
Трябва да използвате is
в Prolog, за да принудите оценката на аритметични изрази. Опитайте да напишете "help(is).
" в подканата на SWI-Prolog.
Но вашият алгоритъм е изключително неефективен по две причини. Първо, вие проверявате кандидат-числото за делимост на всички негови предходни числа, докато само тези, които не са по-големи от неговия квадратен корен, са достатъчни (ако a*b=n
и a >= sqrt(n)
, тогава b =< sqrt(n)
).
След това тествате в обратен ред. Множество по-малки фактори са много по-чести, отколкото по-големите, така че тестването ще бъде прекъснато много по-рано, когато се прави във възходящ ред, което прави цялостната програма да работи много много по-бързо. И накрая, няма нужда да се тества с четно число освен 2:
prime(2).
prime(N) :- N > 1,
N mod 2 > 0, % is odd
M is floor(sqrt(N+1)), % round-off paranoia
check(N, M, 3).
check(N, M, F) :- F>M.
check(N, M, F) :- F=<M,
N mod F > 0,
F1 is F + 2, % test by odds only
check(N, M, F1).
primesFromTo(F,T,X):-
between(F,T,X), prime(X).
person
Will Ness
schedule
13.06.2012
?- X is 2+2.
- person CapelliC   schedule 11.06.2012