质数列表。为什么我的代码不起作用?
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])
并且前两个子句永远不会匹配并且它永远不会结束......
我是 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])
并且前两个子句永远不会匹配并且它永远不会结束......