我正在尝试学习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但是之后仍然会执行该部分。提前谢谢!
答案 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)。