质数列表。为什么我的代码不起作用?

List of Prime Numbers. Why is my code not working?

我是 prolog 的新手,我尝试实现一个函数,该函数为我提供特定范围(从 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]

但是对于大于 8 的 B,Prolog 不会终止并且似乎陷入了无限循环。谁能解释一下为什么我的方法不起作用?

我很确定我的 "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)).

在最后一个子句中,您应该将 [H|T] 都替换为 T。否则,这假设至少必须有一个素数。所以你希望最后的递归调用看起来像 prime_list(9,9,[H|T]) 并且前两个子句永远不会匹配并且它永远不会结束......