2014-05-03 52 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).