प्रोलॉग में एनटी प्राइम की गणना कैसे करें

Nov 24 2020

मैं प्रोलॉग करने के लिए काफी नया हूँ और मैं एक विधेय लिखने की कोशिश कर रहा हूँ जो nth अभाज्य संख्या का मान देता है और ऐसा दिखता है 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 से संबंधित हैं।

जवाब

DuDa Nov 24 2020 at 18:33

आपका कोड प्रोलॉग के लिए थोड़ा असामान्य है लेकिन (इसके अपवाद के साथ 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).) है। Nसे बड़ी हर दूसरी संख्या के 1लिए, पिछली अभाज्य संख्या प्राप्त करें ( nthprime(NN, PrevPrime)), जब तक आप अभाज्य संख्या को हिट न कर दें तब तक 1 जोड़ें। जोड़ 1 भाग एक सहायता विधेय के माध्यम से किया जाता है nextprime/2: किसी दिए गए नंबर के लिए Pयह जाँच करेगा कि क्या यह संख्या एक प्रधान है। यदि हाँ, तो यह इस नंबर को वापस कर देता है, अन्यथा यह खुद को अगले उच्च संख्या ( nextprime(PP,Prime)) और आउटपुट के बाद के लिए कॉल करेगा । बैंग !को एक कट कहा जाता है जो अन्य पसंद शाखाओं को काटता है। इसलिए यदि आप एक बार प्राइम हिट करते हैं, तो आप वापस नहीं जा सकते हैं और दूसरे रास्ते की कोशिश कर सकते हैं।

यह परीक्षण करने के लिए आप पूछ सकते हैं ?- nthprime(N,P).एक दिया के लिए N। या एक ही बार में कई उत्तरों की जांच करने के लिए, आइए एक सहायक के बारे में जानें, 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.
WillNess Nov 26 2020 at 23:10

आपकी परिभाषाओं का उपयोग करते हुए, हम 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 .