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

时间:2019-09-21 18:53:28

标签: prolog primes

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

1 个答案:

答案 0 :(得分:1)

在最后一个子句中,应将两个[H|T]仅替换为T。否则,这假定必须至少有一个素数。因此,您希望成为最后一个递归调用的内容看起来像prime_list(9,9,[H|T]),并且前两个子句永不匹配,而且永无止境...