क्या उच्च आदेश कार्य कार्यात्मक प्रोग्रामिंग के लिए अधिक शक्ति प्रदान करते हैं?


13

मैंने cstheory.SE पर एक समान प्रश्न पूछा है ।

Stackoverflow पर इस उत्तर के अनुसार एक एल्गोरिथ्म है कि एक गैर-आलसी शुद्ध कार्यात्मक प्रोग्रामिंग भाषा पर एक जटिलता है, जबकि अनिवार्य प्रोग्रामिंग में समान एल्गोरिथ्म । FP भाषा में आलसीपन जोड़ने से एल्गोरिथम ।Ω(nlogn)Ω(n)Ω(n)

क्या उच्च क्रम के कार्यों के साथ और बिना एफपी भाषा की तुलना करने के लिए कोई समकक्ष संबंध है? क्या यह अभी भी ट्यूरिंग पूर्ण है? यदि ऐसा है, तो क्या एफपी पर उच्च आदेश की कमी भाषा को "शक्तिशाली" या कुशल बनाती है?


कौन सी FP भाषा?
रीइनियरियरपोस्ट

उच्च क्रम के कार्य और आलसी मूल्यांकन समान नहीं हैं, अफैक। तो आपका सवाल कौन सा है?
राफेल

जवाबों:


11

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

हालाँकि यदि भाषा पर्याप्त शक्तिशाली नहीं है, तो हाँ, उच्चतर क्रम अभिव्यंजक शक्ति प्रदान करता है। लैम्ब्डा-कैलकुलस पर विचार करें: किसी भी उच्च-क्रम फ़ंक्शन के बिना, यह वास्तव में कुछ भी नहीं कर सकता है, क्योंकि ज्यादातर बुनियादी डेटा प्रकार (पूर्णांक, बूलियन) कार्यों का उपयोग करके कार्यान्वित किए जाते हैं।

निष्कर्ष में, यह वास्तव में भाषा पर निर्भर करता है।


ऊपर मेरा जवाब है। नीचे, अनिवार्य भाषाओं पर एक सामान्य धारणा के बारे में एक टिप्पणी।

एक एल्गोरिथ्म के बारे में जो एक गैर-आलसी कार्यात्मक प्रोग्रामिंग भाषा पर एक जटिलता है, जबकि अनिवार्य प्रोग्रामिंग में एक ही एल्गोरिथ्म । FP भाषा में आलसीपन जोड़ने से एल्गोरिथम ।Ω(nlogn)Ω(n)Ω(n)

मैं इस संदर्भ को देखना चाहूंगा। सामान्य धारणा यह है कि एक रैम में लंबाई की एक सरणी तक पहुंच और शुद्ध एफपी के बराबर समय । यह पूरी तरह से सच नहीं है: रैम में एक्सेस टाइम जहां मेमोरी का आकार होता है। बेशक, । व्यवहार में एक सरणी के एक तत्व तक पहुँचने के लिए बहुत तेज है। एक कारण यह होगा कि बाउंडेड है ... लेकिन !nO(1)O(logn)O(logm)mmnmn

संपादित करें: लिंक के लिए धन्यवाद (आलस्य के बारे में कागज के लिए लिंक उपलब्ध नहीं है, यहां एक और एक है )। जैसा कि टिप्पणियों में पोस्ट किया गया है और मेरे जवाब में ऊपर है, रैम का मॉडल हेफ़ -टाइम लुक-अप प्रदान करके थोड़ा एफपी के लिए थोड़ा अनुचित है , जब एक पते का आकार बाध्य नहीं होता है। मुझे अभी तक समझ नहीं आया है कि आलसी चाल कैसे काम करती है लेकिन मुझे लगता है कि यह ध्यान रखना महत्वपूर्ण है कि यह केवल इस विशेष समस्या के लिए है।O(1)


4

यह इस बात पर निर्भर करता है कि आपका अर्थ अभिव्यंजना से है।

यहाँ एक तर्क है कि उच्च-क्रम कुछ जोड़ता है: प्रथम-क्रम वाली भाषाओं के साथ, एकरमन फ़ंक्शन को व्यक्त करने के लिए आदिम पुनरावृत्ति पर्याप्त नहीं है । हालांकि, उच्च-क्रम वाले कार्यों की उपस्थिति में, आदिम पुनरावृत्ति पर्याप्त है:

Ackermann 0=λx.x+1Ackermann (m+1)=Iter (Ackermann m)Iter f 0=f 1Iter f (n+1)=f (Iter f n)

यह केवल आदिम पुनरावृत्ति का उपयोग करके एकरमैन फ़ंक्शन को परिभाषित करता है।

ध्यान दें कि पारंपरिक पुनरावृत्ति सिद्धांत में निश्चित नहीं है, क्योंकि उच्च क्रम है। पारंपरिक पुनरावर्तन सिद्धांत में, सभी निश्चित कार्यों में कुछ लिए टाइप , जबकि में टाइप ।Iter N kN k Iter ( NN ) ( NN )IterIterNkNkIter(NN)(NN)

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.