क्या किसी ने औपचारिक पेपर लिखा है जो स्वचालित रूप से फ़ंक्शन को बदलने के लिए एक विधि का वर्णन करता है (स्वचालित रूप से) पूंछ रिकर्सिव होने के लिए? मैं विश्वविद्यालय स्तर के औपचारिक उपचार की तलाश कर रहा हूं जिसमें सीमाएं (कार्यों के प्रकार जिन्हें परिवर्तित किया जा सकता है), रूपांतरण के लिए प्रक्रियाएं, और यदि संभव हो, तो शुद्धता का सबूत? हास्केल में उदाहरण बोनस होंगे।पूंछ रिकर्सन का उपयोग करने के लिए एक फ़ंक्शन को परिवर्तित करना - एक औपचारिक अध्ययन
उत्तर
फ़ंक्शन को स्वचालित रूप से बदलने के लिए एक विधि (स्वचालित रूप से) पूंछ रिकर्सिव होने के लिए?
- मान्यता है कि किसी दिए गए पुनरावर्ती क्रिया एक पूंछ पुनरावर्ती रूप में बदला जा सकता है और कर रही है कि परिवर्तन
- को लागू करने पूंछ एक कुशल तरीके से कहता है हां, तो:
तो वहाँ इस के दो हिस्से हैं परिवर्तन के लायक है।
पूंछ प्रत्यावर्तन
में बदलने प्रत्यावर्तन यह वाक्य रचना पूंछ पुनरावर्ती परिभाषाओं पहचान करने के लिए अपेक्षाकृत सीधे आगे दिखाई देता है। आखिरकार, 'पूंछ रिकर्सिव' का मतलब है कि कॉल अभिव्यक्ति की पूंछ में वाक्य रचनात्मक रूप से प्रकट होता है।
उदा। योजना के लोग वर्णन करते हैं:
केवल उपयुक्त स्व-कॉल संकलित करते हुए कूदता है क्योंकि पूर्ण पूंछ-रिकर्सन प्राप्त करने के लिए उपयुक्त नहीं है। इसके बजाए, हम स्रोत भाषा में सभी कक्षाओं में उप-अभिव्यक्ति पदों को दो वर्गों में विभाजित करते हैं: पूंछ (या कमी) स्थिति और उपप्रोबल स्थिति। सरल अभिव्यक्ति (यदि
predicate
परिणामस्वरूप वैकल्पिक) में,predicate
सबप्रोबलेम स्थिति है, जबकि परिणामस्वरूप और वैकल्पिक में कमी की स्थिति में हैं। इस वाक्य रचनात्मक धारणा को आसानी से मनमाने ढंग से नेस्टेड उप-अभिव्यक्तियों तक बढ़ाया जा सकता है।
पूंछ में कार्यों को बदलने कॉल
अपने प्रश्न का मुश्किल हिस्सा पहचान करने और पूंछ पुनरावर्ती लोगों में उम्मीदवार पुनरावर्ती संगणना बदलने के लिए अनुकूलन है।
एक संदर्भ जीएचसी में है, जो अंतर्निहित पूंछ रिकर्सिव संरचना बनी हुई है, जब तक रिकर्सिव कॉल को दूर करने के लिए सरलीकरण नियमों की विस्तृत श्रृंखला का उपयोग करता है।
पूंछ कॉल उन्मूलन
एक बार जब आप एक पूंछ पुनरावर्ती रूप में अपने कार्यों है, तो आप उस effiicently कार्यान्वित करना चाहते हैं। यदि आप एक लूप उत्पन्न कर सकते हैं, तो यह एक अच्छी शुरुआत है।अपने लक्ष्य मशीन नहीं है, तो tail call elimination "कुछ चाल की आवश्यकता होगी। Odersky और Schinz, नीचे उद्धृत के शब्दों में,
विभिन्न तकनीकों सामान्य (और न केवल पुनरावर्ती खत्म करने के लिए पिछले कुछ वर्षों में प्रस्तावित किया गया है) पूंछ कहता है, ज्यादातर compilers को लक्षित सी
के लिए ... एक बड़ा समारोह में पूरे कार्यक्रम रखा और समारोह अनुकरण करने के लिए प्रत्यक्ष छलांग का उपयोग कर या इस समारोह के अंदर बयान स्विच कॉल।
... एक लोकप्रिय तकनीक ट्रामपोलिन का उपयोग करना है। एक ट्रैम्पोलिन एक बाहरी फ़ंक्शन है जो बार-बार एक आंतरिक फ़ंक्शन को कॉल करता है। प्रत्येक बार आंतरिक फ़ंक्शन किसी अन्य फ़ंक्शन को कॉल करने की इच्छा रखता है, यह सीधे इसे कॉल नहीं करता है लेकिन बस ट्रैम्पोलिन में अपनी पहचान (जैसे बंद होने के रूप में) देता है, जो तब कॉल करता है। इस प्रकार असीमित ढेर वृद्धि से बचा जाता है, लेकिन कुछ प्रदर्शन अनिवार्य रूप से खो जाता है, अधिकांशतः क्योंकि ट्रैम्पोलिन द्वारा बनाई गई सभी कॉल को सांख्यिकीय रूप से अज्ञात कार्यों पर कॉल करती हैं।
एक और तकनीक हेनरी बेकर उनकी तकनीक के साथ "चेनी एमटीए पर", कार्यक्रम पहले निरंतरता शैली (सीपीएस) गुजर रहा है, इसलिए पूंछ कॉल में सभी कॉल्स मोड़ करने के लिए परिवर्तित किया जाना है, और फिर हो सकता है संकलित है हमेशा की तरह। रन-टाइम पर, जब स्टैक ओवरफ्लो होने वाला होता है, तो वर्तमान निरंतरता कॉल स्टैक के नीचे ट्रैम्पोलिन "प्रतीक्षा" में निर्मित और लौटा (या लांगजंपेड) है।
Tail call elimination on the Java Virtual Machine, मिशेल Schinz मार्टिन ओडर्स्की, 2001
हेनरी जी बेकर, जूनियर कान्स चाहिए नहीं कान्स अपने तर्कों, भाग द्वितीय: एमटीए ड्राफ़्ट संस्करण, जनवरी 1994 पर चेनी ।
मैंने सोचा था कि ओपी एक पूंछ रिकर्सन उन्मूलन की भी तलाश कर रहा था, लेकिन जिस तरह से प्रश्न को ओपी कहा जाता है, ओपी विपरीत (या विपरीत के सामान्यीकरण) की तलाश में प्रतीत होता है - उद्धरण: "कार्यों को ** में परिवर्तित करें ** पूंछ रिकर्सिव [जोर मेरा] " – Attila
ओपी पूंछ कॉल उन्मूलन से लाभ उठाने के लिए, पुनर्नवीनीकरण कार्यों के स्वचालित रूपांतरण के बारे में पूछ रहा है। वह पूंछ कॉल उन्मूलन की तलाश नहीं कर रहा है। – Ben
सवाल संदिग्ध है। वह स्पष्ट नहीं है कि क्या वह पूंछ कॉल उन्मूलन, या आम तौर पर पूंछ रिकर्सन ऑप्टिमाइज़ेशन की तलाश में है। किसी भी तरह से, वे कागजात शुरू करने के लिए जगह हैं। –
बुध में चीजों को स्वचालित रूप से चीजों को बनाने के लिए कुछ अनुकूलन शामिल हैं। (Mercury एक प्रवर्तन-शुद्धता तर्क प्रोग्रामिंग भाषा है, इसलिए यह कार्यों के बजाय भविष्यवाणियों के बारे में बात करता है, लेकिन कई विचार एक ही विचार है जो बुध कार्यक्रमों पर हास्केल के रूप में लागू होते हैं। कार्यात्मक के बजाए तार्किक होने की तुलना में बहुत बड़ा अंतर यह है कि यह है आलसी के बजाय सख्त)
"संचयक परिचय" आवर्ती संचालन को रिकर्सिव कॉल से पहले स्थानांतरित करने की अनुमति देने के लिए एक अतिरिक्त संचयक पैरामीटर के साथ भविष्यवाणियों के विशेष संस्करण उत्पन्न करता है। स्पष्ट रूप से यह ऑप्टिमाइज़ेशन आवश्यक रूप से पूंछ-पुनरावर्ती भविष्यवाणियों के परिणामस्वरूप नहीं होता है, लेकिन अक्सर दूसरे प्रारूप द्वारा अनुकूलित किया जा सकता है:
"अंतिम कॉल मॉड्यूलो कन्स्ट्रक्टर" अनिवार्य रूप से एक रिकर्सिव कॉल की अनुमति देता है केवल कन्स्ट्रक्टर अनुप्रयोगों द्वारा फिर से लिखा जाना चाहिए कि मूल्य का निर्माण पहले "छेद" होता है और फिर रिकर्सिव कॉल सामान्य रिटर्न-वैल्यू-पासिंग सम्मेलन का उपयोग करने के बजाय सीधे "छेद" के मेमोरी पते में अपना आउटपुट देता है। मेरा मानना है कि हास्केल को आलस्य के कारण आसानी से यह अनुकूलन मिल जाएगा।
इन दोनों अनुकूलन पेपर Making Mercury programs tail recursive में वर्णित हैं।
- 1. एक पूंछ-रिकर्सन संस्करण सूची संलग्न करने वाला फ़ंक्शन
- 2. एक स्टैक का उपयोग करने के लिए एक रिकर्सिव फ़ंक्शन को कैसे परिवर्तित करें?
- 3. क्या यह फ़ंक्शन पूंछ रिकर्सन का उपयोग करता है?
- 4. क्या पूंछ रिकर्सन को एक संचयक की आवश्यकता है?
- 5. अज्ञात एफएन में रिकर्सन कैसे करें, पूंछ रिकर्सन के बिना
- 6. कंस्ट्रैक्स फ़ंक्शन मूल्यांकन कर सकते हैं पूंछ रिकर्सन ऑप्टिमाइज़ेशन
- 7. पूंछ-रिकर्सन उन्मूलन क्या है?
- 8. क्या एरलांग में बहुत सी पूंछ-रिकर्सन का उपयोग करना धीमा हो जाता है?
- 9. योजना में दो रिकर्सिव कॉल के साथ एक फ़ंक्शन को कनवर्ट करना इसे पूंछ-रिकर्सिव बनाने के लिए
- 10. पुनरावृत्ति में पुनरावृत्ति को परिवर्तित करना - जटिल रिकर्सन
- 11. मेरे सामान्य रिकर्सन और पूंछ रिकर्सन उदाहरण के बीच एक गोल अंतर क्यों है?
- 12. रिकर्सन लागू करने के लिए कॉल/सीसी का उपयोग करना संभव है?
- 13. खाली सूचियों के लिए हास्केल पूंछ फ़ंक्शन
- 14. हास्केल पूंछ रिकर्सन कैसे काम करता है?
- 15. क्यों कुछ परिदृश्यों में पूंछ रिकर्सन को अनुकूलित करने के लिए स्केलैक नहीं कर सकते?
- 16. क्या ऐसी समस्याएं हैं जिन्हें पूंछ रिकर्सन का उपयोग करके लिखा नहीं जा सकता है?
- 17. फ़ंक्शन के अंदर एक फ़ंक्शन को परिभाषित करने के लिए
- 18. जावा रिकर्सन समस्या के साथ एक भूलभुलैया को हल करना
- 19. एक भूलभुलैया को हल करने और हल करने के लिए एक ढेर का उपयोग करना - जावा
- 20. एक कस्टम फ़ंक्शन को कॉल करने के लिए jQuery .trigger का उपयोग करें जो एक मान
- 21. क्या मुझे स्कैला का अध्ययन करना चाहिए?
- 22. मशीन लर्निंग का अध्ययन करने के लिए क्या आवश्यकताएं हैं?
- 23. शैल पूंछ को कार्य करना
- 24. कैसे एक प्रतीक करने के लिए एक समारोह का पता परिवर्तित करने के लिए
- 25. एक एमपीएल वेक्टर को एक स्टेटिक ऐरे में परिवर्तित करना
- 26. एक वेक्टर को एक सरणी में परिवर्तित करना - क्या ऐसा करने के लिए 'मानक' तरीका है?
- 27. द्विआधारी "पूंछ" एक फ़ाइल
- 28. जावा जावा पूंछ रिकर्सन का समर्थन करता है?
- 29. क्या स्कैला समर्थन पूंछ रिकर्सन ऑप्टिमाइज़ेशन का समर्थन करता है?
- 30. पाइथन रिमोट पूंछ अनुकरण करने के लिए?
मैंने कुछ गूगलिंग किया, लेकिन कोई विशिष्ट संदर्भ नहीं मिला।मैं उम्मीद कर रहा था कि कोई संदर्भ या दो प्रदान कर सकता है। – Ralph
एक सीपीएस ट्रांसफॉर्म निश्चित रूप से सबसे सामान्य मामले में नौकरी करेगा (और कुछ परिणामी अनुकूलन परिणामस्वरूप क्रूफ़्ट के अधिकांश को खत्म कर सकता है)। इस विषय पर कागजात के टन प्रकाशित किए गए हैं। –