【问题标题】:How to count nth prime in prolog如何在序言中计算第n个素数
【发布时间】:2020-11-24 09:24:49
【问题描述】:

我对 prolog 很陌生,我正在尝试编写一个谓词,它给出第 n 个素数的值,它看起来像 nth_prime(N, Prime) 。 我已经完成了计算数字是否为素数的函数

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

我不明白我的下一步是什么,以及我应该如何计算哪个素数属于 N。

【问题讨论】:

    标签: prolog primes


    【解决方案1】:

    您的代码对于 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 直到遇到质数。 add 1 部分是通过帮助谓词nextprime/2 完成的:对于给定的数字P,它将检查该数字是否为质数。如果是,它会返回这个数字,否则它将调用自己以获得下一个更高的数字 (nextprime(PP,Prime)) 并转发输出。爆炸! 被称为切割其他选择分支。所以如果你曾经遇到过一个质数,你就不能回去尝试另一条路了。

    要对其进行测试,您可以向?- nthprime(N,P). 询问给定的N。或者要一次检查多个答案,让我们引入一个辅助谓词 nthprimeList/2,它为 firstlist 中的每个项目调用 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】:

      使用您的定义,我们定义以下内容以逐个计数并测试 2 及以上的所有数字:

      nth_prime(N, Prime):-
        nth_prime(N, Prime, 1, 2).  % 2 is the candidate for 1st prime
      
      nth_prime(N, P, I, Q):-   % Q is I-th prime candidate
        prime(Q) 
        -> ( I = N, P = Q
           ; I1 is I+1, Q1 is Q+1, nth_prime(N, P, I1, Q1) 
           )
        ;  Q1 is Q+1, nth_prime(N, P, I, Q1).
      

      测试:

      30 ?- nth_prime(N,P).
      N = 1,
      P = 2 ;
      N = 2,
      P = 3 ;
      N = 3,
      P = 5 ;
      N = 4,
      P = 7 ;
      N = 5,
      P = 11 .
      
      31 ?- nth_prime(N,P), N>24.
      N = 25,
      P = 97 ;
      N = 26,
      P = 101 ;
      N = 27,
      P = 103 .
      
      32 ?- nth_prime(N,P), N>99.
      N = 100,
      P = 541 ;
      N = 101,
      P = 547 ;
      N = 102,
      P = 557 .
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-03-26
        • 2010-12-19
        • 2013-02-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多