第N个素数列表Prolog

时间:2016-09-22 17:17:41

标签: recursion prolog

我正在尝试学习prolog,现在我正在尝试打印第N个黄金编号列表:

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检查给定数字是否为素数。

素数(10)的输出将是2,3,其应该是2,3,5,7,因为当3之后的NewF(将是4)不是素数时。所以它也不会执行write(F)和递归调用。我想知道如何解决这个问题,所以当它不是素数时它不会写F但是之后仍然会执行该部分。提前谢谢!

2 个答案:

答案 0 :(得分:3)

您只需添加以下条款:

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

答案 1 :(得分:3)

我知道这个答案并没有完全回应OP问题(我的getPrimeList(N, L)创建了一个列表L,所有素数从零到N; 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)。