Я новичок в прологе и пытаюсь реализовать функцию, которая дает мне список простых чисел в определенном диапазоне (от A до B).Вот мой код:
%ending recursion
prime_list(A,A,[A]) :- is_prime(A).
prime_list(A,A,[]) :- not(is_prime(A)).
% if A is prime:
prime_list(A,B,[H|T]) :-
N1 is A+1, H is A, is_prime(A), prime_list(N1,B,T).
% if A is not prime:
prime_list(A,B,[H|T]) :-
N1 is A+1, not(is_prime(A)), prime_list(N1,B,[H|T]).
, пока B меньше, чем 9, это работает.Так, например,
prime_list(1,8,X).
дает мне
X = [2, 3, 5, 7]
, но для B больше 8 пролог не завершается и, кажется,застрял в бесконечной петле.Может кто-нибудь объяснить мне, почему мой подход не работает?
Я почти уверен, что моя функция is_prime работает, потому что я протестировал ее со многими значениями.Но, чтобы быть в безопасности, я поставлю это и здесь:
is_prime_help(X,I) :-
(not(I is 1), 0 is mod(X,I));
(not(I is 1), N1 is I-1, is_prime_help(X, N1)).
is_prime(X) :- not(X is 1), N1 is X-1, not(is_prime_help(X,N1)).