如何在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

我对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+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
。或者,为了一次检查多个答案,让我们介绍一个helperpredicate
nthprimeList/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。