Список простых чисел.Почему мой код не работает? - PullRequest
0 голосов
/ 21 сентября 2019

Я новичок в прологе и пытаюсь реализовать функцию, которая дает мне список простых чисел в определенном диапазоне (от 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)).

1 Ответ

1 голос
/ 21 сентября 2019

В последнем предложении вы должны заменить оба [H|T] просто T.В противном случае это предполагает, что по крайней мере простое число должно следовать после.То, что вы надеетесь сделать последним рекурсивным вызовом, выглядит как prime_list(9,9,[H|T]), а два первых предложения никогда не совпадают и никогда не заканчиваются ...

...