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

Prolog 素数列表。为什么我的代码不起作用?,prolog,primes,Prolog,Primes,我不熟悉prolog,我尝试实现一个函数,该函数为我提供特定范围(从a到B)内的素数列表。这是我的密码: %结束递归 素数列表(A,A,[A]):-是素数(A)。 素数列表(A,A,[]):-not(is_素数(A))。 %如果A是素数: 素数列表(A,B,[H | T]):- N1是A+1,H是A,是素数(A),素数列表(N1,B,T)。 %如果A不是素数: 素数列表(A,B,[H | T]):- N1是A+1,而不是(is_prime(A)),prime_list(N1,B,[H|T])。

我不熟悉prolog,我尝试实现一个函数,该函数为我提供特定范围(从a到B)内的素数列表。这是我的密码:

%结束递归
素数列表(A,A,[A]):-是素数(A)。
素数列表(A,A,[]):-not(is_素数(A))。
%如果A是素数:
素数列表(A,B,[H | T]):-
N1是A+1,H是A,是素数(A),素数列表(N1,B,T)。
%如果A不是素数:
素数列表(A,B,[H | T]):-
N1是A+1,而不是(is_prime(A)),prime_list(N1,B,[H|T])。
只要B比9小,它就可以工作。比如说

prime\u列表(1,8,X)。

给我

X=[2,3,5,7]

但对于大于8的B,Prolog并没有终止,似乎陷入了一个无休止的循环中。有人能解释一下为什么我的方法不起作用吗

我很确定我的“is_prime”函数是有效的,因为我已经用很多值对它进行了测试。但为了安全起见,我也会把它放在这里:

is_prime_help(X,I):-
(不是(I是1),0是mod(X,I));
(不是(I是1),N1是I-1,is_prime_help(X,N1))。
is_prime(X):-not(X是1),N1是X-1,not(is_prime_help(X,N1))。

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