मैं प्रोलॉग में एक प्रोग्राम लिखने की कोशिश कर रहा हूं जो सभी अभाज्य संख्याओं को एक सीमा तक ढूंढता है N, मैं इरेटोस्थनीज की छलनी। मैं प्रोलॉग के लिए बहुत नया हूं इसलिए मैंने वास्तव में पुनरावर्ती सोचने की कला में महारत हासिल नहीं की है (आप शायद इसे मेरे कोड में देख सकते हैं)।

फिर भी, मैंने (अधिक या कम) प्रोलॉग में एल्गोरिदम को लागू करने का प्रयास किया, लेकिन जितना आप यहां देखेंगे उतना दूर नहीं मिला:

 allPrimes(N, Primes) :-
     numlist(2, N, Numlist),
     A is round(sqrt(N)),
     foreach(between(2, A, _i), sift(_i, Numlist, Primes)).

 sift(_i, Numlist, Primes) :-
     findall(_j, (member(_j, Numlist), _j \== _i, (_j mod _i =:= 0)), L),
     subtract(Numlist, L, Primes).

मैं आउटपुट के रूप में false प्राप्त करता रहता हूं क्योंकि subtract(Numlist, L, Primes) विफल रहता है, मेरा अनुमान है कि यह क्यों विफल होता है क्योंकि Primes पहले ही तत्काल हो चुका है और इसका मान बदला नहीं जा सकता है। मैंने इसे अन्य तरीकों से हल करने का प्रयास किया है, लेकिन समाधान के साथ नहीं आ सका।

मुझे सही दिशा में मार्गदर्शन करने में कोई मदद की बहुत सराहना की जाती है!

0
mrMoonpenguin 6 अक्टूबर 2020, 22:45

1 उत्तर

सबसे बढ़िया उत्तर

आप इसे तुरंत चालू करने के बाद प्राइम की सूची नहीं बदल सकते। हालाँकि आप उस पर कुछ वस्तुओं को और भी त्वरित कर सकते हैं यदि वे अनइंस्टेंटिड थे (आपका मामला नहीं) और आप शायद इस तरह से इस समस्या को हल कर सकते हैं।

यहां आपके एल्गोरिदम के आधार पर एक पुनरावर्ती समाधान दिया गया है:

allPrimes(N, Primes) :-
    numlist(2, N, Numlist),
    Stop is round(sqrt(N)),
    allPrimes(Numlist, Stop, Primes).
    
allPrimes([N|Numlist], Stop, [N|Primes]):-
  exclude(is_multiple(N), Numlist, MPrimes),
  (N =< Stop -> allPrimes(MPrimes, Stop, Primes) ; Primes=MPrimes).
  
is_multiple(N, I):-
  I mod N =:= 0.

तो आप संभावित पूर्णांकों की एक सूची बनाते हैं और स्टॉप नंबर की गणना करते हैं। फिर आप रिकर्सिव प्रक्रिया allPrimes/3 को कॉल करते हैं जो पहले प्राइम लेता है, फिर उस नंबर के सभी गुणकों को सूची से बाहर कर देता है और शेष तत्वों के साथ खुद को दोबारा कॉल करता है। रिकर्सन खत्म करने के बाद (बेस केस तब होता है जब एन स्टॉप नंबर होता है) हम प्राइम लिस्ट को वापस बनाते हैं।

नमूना रन:

?- allPrimes(100, Primes).
Primes = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97].
4
gusbro 7 अक्टूबर 2020, 01:02