Что касается вашей ошибки, проверьте это:
?- 2+2.
ERROR: Undefined procedure: (+)/2
?- X is 2+2.
X = 4
Вы должны использовать is
в Прологе для принудительного вычисления арифметических выражений. Попробуйте ввести "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