2016-09-22 2 views
2

Ich versuche Prolog zu lernen und jetzt versuche ich eine Liste des N-ten primenumber zu drucken:Liste des Nth Primzahlen Prolog

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

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

Prime/1 prüft wheter die gegebene Zahl eine Primzahl ist.

Der Ausgang für Primzahlen (10) wird 2, 3 sein, wo es 2, 3, 5, 7 sein sollte, denn wenn der NewF nach 3 (was 4 sein wird) ist kein Prime. Es wird also weder den Schreib- (F) noch den rekursiven Aufruf ausführen. Ich habe mich gefragt, wie ich das beheben kann, also wird es nicht F schreiben, wenn es kein Prime ist, aber den Teil danach noch ausführen. Danke im Voraus!

+1

Mögliches Duplikat von [Prolog Find N Primzahlen] (http://stackoverflow.com/questions/12446407/prolog-find-n-prime-numbers) – Prune

Antwort

3

Sie einfach die Klausel hinzufügen könnte:

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

Ich weiß, dass diese Antwort auf die OP Frage (meine getPrimeList(N, L) erstellen Sie eine Liste mit allen L Primzahl von Null auf N nicht genau antworten, das OP Fragen Sie nach ersten N Primzahlen), aber ... nur zum Spaß ... Ich habe versucht, das Sieb von Eratosthenes zu implementieren.

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). 

Ich wiederhole: nicht wirklich eine Antwort; nur zum Spaß (als OP, ich versuche Prolog zu lernen).