2016-09-22 85 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)。