2014-05-03 54 views
0

我试图创建一个列表,它返回数字素数直到N个数字。返回Prolog中的素数列表

我有这样的代码,表明如果一个数是素数:

is_prime(2). 
is_prime(3). 
is_prime(P) :- integer(P), P > 3, P mod 2 =\= 0, \+has_factor(P,3). 
has_factor(N,L) :- N mod L =:= 0. 
has_factor(N,L) :- L * L < N, L2 is L + 2, has_factor(N,L2). 

工作得非常好。

我的逻辑是:测试N是否为素数,如果是这样,则在列表中添加N,如果不只是忽略并测试到N-1。这里代码:

primeList(N,C):- is_prime(N) -> append(N,[C],L),fail; N1 is N-1, primeList(N1,L). 

它不起作用!我怎么能解决这个问题,遵循我的逻辑? 非常感谢。

回答

3

一旦Prolog中的变量在谓词子句中被实例化(具有值),它就不能被重新分配。所以你不能继续追加到的列表L

但是你可以使用findallbetween

prime_list(N, C) :- 
    findall(X, (between(2,N,X), is_prime(X)), C).