我是新手,我尝试实现一个函数,该函数为我提供了特定范围(从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)).
答案 0 :(得分:1)
在最后一个子句中,应将两个[H|T]
仅替换为T
。否则,这假定必须至少有一个素数。因此,您希望成为最后一个递归调用的内容看起来像prime_list(9,9,[H|T])
,并且前两个子句永不匹配,而且永无止境...