如何在prolog中计算n个素数
我对prolog非常陌生,我正在尝试编写一个谓词,它给出N个素数的值,看起来像如何在prolog中计算n个素数,prolog,primes,Prolog,Primes,我对prolog非常陌生,我正在尝试编写一个谓词,它给出N个素数的值,看起来像N个素数(N,素数)。 我已经完成了计算数字是否为素数的函数 div(X, Y):- 0 is X mod Y. div(X, Y):- X>Y+1, Y1 is Y+1, div(X, Y1). prime(2):- true. prime(X):- X<2, false. prime(X):- not(div(X, 2)). div(X,Y):-0是X模Y。 div(X,Y):-X>Y+1,Y1是Y
N个素数(N,素数)
。
我已经完成了计算数字是否为素数的函数
div(X, Y):- 0 is X mod Y.
div(X, Y):- X>Y+1, Y1 is Y+1, div(X, Y1).
prime(2):- true.
prime(X):- X<2, false.
prime(X):- not(div(X, 2)).
div(X,Y):-0是X模Y。
div(X,Y):-X>Y+1,Y1是Y+1,div(X,Y1)。
质数(2):-正确。
prime(X):-X您的代码对于prolog来说有点不寻常,但是(除了prime(1)
)它可以工作
以下是谓词的解决方案:
nextprime(N,N):-
prime(N),
!.
nextprime(P, Prime):-
PP is P+1,
nextprime(PP,Prime).
nthprime(1, 2).
nthprime(N, Prime):-
N>1,
NN is N-1,
nthprime(NN, PrevPrime),
PP is PrevPrime+1,
nextprime(PP, Prime).
?- nthprime(1,P).
P = 2 ;
false.
?- nthprime(2,P).
P = 3 ;
false.
?- nthprime(3,P).
P = 5 ;
false.
它的工作原理如下:已知第一个素数是2(nthprime(1,2)。
)。对于比1
大的每一个数N
,获取上一个素数(nthprime(NN,PrevPrime)
),添加1直到找到一个素数。添加1部分通过帮助谓词nexttime/2
:对于给定的数字P
,它将检查该数字是否为素数。如果是,则返回该号码,否则将调用下一个更高的号码(nexttime(PP,Prime)
)并转发输出。砰的一声代码>称为剪切,它剪切其他选择分支。因此,如果你曾经碰到一个黄金点,你就不能回头尝试另一条路
要测试它,您可以询问?-nthprime(N,p)。
给定的N
。或者,为了一次检查多个答案,让我们介绍一个helperpredicatenthprimeList/2
,它为第一个列表中的每个项目调用nthprime/2
,并将“输出”放入列表中:
nthprimeList([],[]).
nthprimeList([N|TN],[P|TP]):-
nthprime(N,P),
nthprimeList(TN,TP).
?- nthprimeList([1,2,3,4,5,6,7,8,9],[P1,P2,P3,P4,P5,P6,P7,P8,P9]).
P1 = 2,
P2 = 3,
P3 = 5,
P4 = 7,
P5 = 11,
P6 = 13,
P7 = 17,
P8 = 19,
P9 = 23;
false.
使用您的定义,我们定义了以下各项,以逐个计算和测试2及以上的所有数字:
N次素数(N,素数):-
N_素数(N,素数,1,2)。%2是第一首相候选人
第N个素数(N,P,I,Q):-%Q是第I个素数候选者
素数(Q)
->(I=N,P=Q
;I1是I+1,Q1是Q+1,N_素数(N,P,I1,Q1)
)
; Q1是Q+1,N_素数(N,P,I,Q1)。
测试:
30?-N次素数(N,P)。
N=1,
P=2;
N=2,
P=3;
N=3,
P=5;
N=4,
P=7;
N=5,
P=11。
31?-N次素数(N,P),N>24。
N=25,
P=97;
N=26,
P=101;
N=27,
P=103。
32?-N次素数(N,P),N>99。
N=100,
P=541;
N=101,
P=547;
N=102,
P=557。