2016-09-22 132 views
2

我努力學習序言,現在我要打印的第N primenumber的列表:列表第N個素數的序言

primes(N, N). 
primes(N, F):- 
    prime(F), 
    write(F), nl, 
    NewF is F + 1, 
    primes(N, NewF). 

primes(N):- 
    primes(N, 2). 

總理/ 1檢查wheter給定的數字是一個素數。

質數(10)的輸出將是2,3,它應該是2,3,5,7,因爲當3之後的NewF(其將是4)不是素數時。所以它也不會執行寫(F)也不執行遞歸調用。我想知道如何解決這個問題,所以當它不是素數時不會寫F,但是在那之後仍然執行該部分。提前致謝!

+1

[Prolog查找N個素數]的可能重複(http://stackoverflow.com/questions/12446407/prolog-find-n-prime-numbers) – Prune

回答

3

你可以簡單地加上一句:

primes(N, F):- 
    \+prime(F), nl, 
    NewF is F + 1, 
    primes(N, NewF). 
3

我知道這個答案不完全的OP回答這個問題(我getPrimeList(N, L)創建從零到N所有質數的列表L;在OP要求第一個N素數),但......只是爲了好玩......我試圖實施Eratosthenes篩。

getListDisp(Top, Val, []) :- 
    Val > Top. 

getListDisp(Top, V0, [V0 | Tail]) :- 
    V0 =< Top, 
    V1 is V0+2, 
    getListDisp(Top, V1, Tail). 

reduceList(_, _, [], []). 

reduceList(Step, Exclude, [Exclude | Ti], Lo) :- 
    NextE is Exclude+Step, 
    reduceList(Step, NextE, Ti, Lo). 

reduceList(Step, Exclude, [H | Ti], [H | To]) :- 
    Exclude > H, 
    reduceList(Step, Exclude, Ti, To). 

reduceList(Step, Exclude, [H | Ti], [H | To]) :- 
    Exclude < H, 
    NextE is Exclude+Step, 
    reduceList(Step, NextE, Ti, To). 

eratSieve([], []). 

eratSieve([Prime | Ti], [Prime | To]) :- 
    Step is 2*Prime, 
    Exclude is Prime+Step, 
    reduceList(Step, Exclude, Ti, Lo), 
    eratSieve(Lo, To). 

getPrimeList(Top, []) :- 
    Top < 2. 

getPrimeList(Top, [2 | L]) :- 
    Top >= 2, 
    getListDisp(Top, 3, Ld), 
    eratSieve(Ld, L). 

我再說一遍:不是真的答案;只是爲了好玩(就像OP,我試圖學習Prolog)。

相關問題