करी (प्रोग्रामिंग भाषा)
This article relies too much on references to primary sources. (July 2019) (Learn how and when to remove this template message) |
Paradigm | functional, logic, non-strict, modular |
---|---|
द्वारा डिज़ाइन किया गया | Michael Hanus, Sergio Antoy, et al. |
टाइपिंग अनुशासन | static, strong, inferred |
ओएस | portable |
वेबसाइट | Curry |
Major implementations | |
PAKCS (with Prolog as the target), mcc (with C as the target), KiCS2 (with Haskell as the target) | |
Influenced by | |
Haskell and Prolog |
करी[1] एक प्रायोगिक कार्यात्मक तर्क प्रोग्रामिंग भाषा है,[2] हास्केल (प्रोग्रामिंग भाषा) भाषा पर आधारित है। यह कार्यात्मक और तर्क प्रोग्रामिंग के तत्वों को मिलाता है,[3] बाधा प्रोग्रामिंग एकीकरण सहित।
यह हास्केल का लगभग एक सुपरसेट है, जिसमें बहुरूपता (कंप्यूटर विज्ञान)#सबटाइपिंग का उपयोग करके ओवरलोडिंग के लिए समर्थन की कमी है, जो कुछ कार्यान्वयन वैसे भी भाषा विस्तार के रूप में प्रदान करते हैं, जैसे मुंस्टर करी कंपाइलर।[4]
कार्यात्मक तर्क प्रोग्रामिंग की नींव
बुनियादी अवधारणाएं
एक कार्यात्मक कार्यक्रम समीकरणों या नियमों द्वारा परिभाषित कार्यों का एक समूह है। एक कार्यात्मक संगणना में उप-अभिव्यक्तियों को समान (फ़ंक्शन परिभाषाओं के संबंध में) उप-अभिव्यक्तियों को तब तक बदलना शामिल है जब तक कि कोई और प्रतिस्थापन (या कटौती) संभव न हो और एक मूल्य या सामान्य रूप प्राप्त हो। उदाहरण के लिए, डबल द्वारा परिभाषित फ़ंक्शन पर विचार करें
डबल एक्स = एक्स + एक्स
भाव "double 1” द्वारा प्रतिस्थापित किया जाता है 1+1. बाद वाले को प्रतिस्थापित किया जा सकता है 2 अगर हम ऑपरेटर की व्याख्या करते हैं "+"समीकरणों के एक अनंत सेट द्वारा परिभाषित किया जाना है, उदाहरण के लिए, 1+1 = 2, 1+2 = 3, आदि। इसी तरह, कोई नेस्टेड एक्सप्रेशन का मूल्यांकन कर सकता है (जहां प्रतिस्थापित किए जाने वाले उप-अभिव्यक्तियों को उद्धृत किया गया है):
'डबल (1+2)' → '(1+2)'+(1+2) → 3+'(1+2)' → '3+3' → 6
मूल्यांकन का एक अन्य क्रम भी है यदि हम ऑपरेटरों के तर्कों को दाएं से बाएं ओर बदलते हैं:
'डबल (1+2)' → (1+2)+'(1+2)' → '(1+2)'+3 → '3+3' → 6
इस मामले में, दोनों व्युत्पत्ति एक ही परिणाम की ओर ले जाती हैं, एक संपत्ति जिसे कंफ्लुएंस (शब्द पुनर्लेखन) के रूप में जाना जाता है। यह शुद्ध कार्यात्मक भाषाओं की एक मौलिक संपत्ति से आता है, जिसे संदर्भित पारदर्शिता कहा जाता है: साइड इफेक्ट की अनुपस्थिति के कारण गणना किए गए परिणाम का मूल्य मूल्यांकन के क्रम या समय पर निर्भर नहीं करता है। यह शुद्ध कार्यात्मक कार्यक्रमों के तर्क और रखरखाव को सरल करता है।
हास्केल (प्रोग्रामिंग लैंग्वेज) जैसी कई कार्यात्मक भाषाएं करती हैं, करी बीजगणितीय डेटा प्रकारों की परिभाषा का उनके निर्माणकर्ताओं की गणना करके समर्थन करती है। उदाहरण के लिए, बूलियन मानों के प्रकार में कंस्ट्रक्टर होते हैं True और False जो इस प्रकार घोषित किए गए हैं: <वाक्यविन्यास लैंग = हैकेल>
डेटा बूल = ट्रू | गलत
</वाक्यविन्यास हाइलाइट> बूलियंस पर कार्यों को पैटर्न मिलान द्वारा परिभाषित किया जा सकता है, अर्थात, विभिन्न तर्क मानों के लिए कई समीकरण प्रदान करके: <वाक्यविन्यास लैंग = हैकेल>
सत्य नहीं = असत्य असत्य नहीं = सत्य
</वाक्यविन्यास हाइलाइट> बराबर को बराबर से बदलने का सिद्धांत अभी भी मान्य है बशर्ते कि वास्तविक तर्कों का आवश्यक रूप हो, उदाहरण:
नहीं '(गलत नहीं)' → 'सच नहीं' → गलत
पुनरावर्ती डेटा प्रकारों द्वारा अधिक जटिल डेटा संरचनाएँ प्राप्त की जा सकती हैं। उदाहरण के लिए, तत्वों की एक सूची, जहां तत्वों का प्रकार मनमाना है (द्वारा चिह्नित प्रकार चर a), या तो खाली सूची है "[]"या गैर-खाली सूची"x:xs"पहले तत्व से मिलकर x और एक सूची xs: <वाक्यविन्यास लैंग = हैकेल>
डेटा सूची ए = [] | ए: सूची ए
</वाक्यविन्यास हाइलाइट> प्ररूप "List a"आमतौर पर लिखा जाता है [a] और परिमित सूची X1:लेपित:...:एक्सएन:[] के रूप में लिखे गए हैं [x1,लेपित,...,एक्सएन]. हम आगमनात्मक परिभाषाओं द्वारा पुनरावर्ती प्रकारों पर संचालन को परिभाषित कर सकते हैं जहां पैटर्न मिलान विभिन्न मामलों के सुविधाजनक पृथक्करण का समर्थन करता है। उदाहरण के लिए, संयोजन ऑपरेशन "++"बहुरूपी सूचियों पर निम्नानुसार परिभाषित किया जा सकता है (पहली पंक्ति में वैकल्पिक प्रकार की घोषणा निर्दिष्ट करती है कि"++"इनपुट के रूप में दो सूचियाँ लेता है और एक आउटपुट सूची बनाता है, जहाँ सभी सूची तत्व एक ही अनिर्दिष्ट प्रकार के होते हैं): <वाक्यविन्यास लैंग = हैकेल>
(++) :: [ए] -> [ए] -> [ए] [] ++ वाईएस = वाईएस (x:xs) ++ ys = x : xs++ys
</वाक्यविन्यास हाइलाइट> विभिन्न प्रोग्रामिंग कार्यों के लिए इसके आवेदन से परे, ऑपरेशन "++” सूचियों पर अन्य कार्यों के व्यवहार को निर्दिष्ट करने के लिए भी उपयोगी है। उदाहरण के लिए, किसी सूची के अंतिम तत्व को उत्पन्न करने वाले अंतिम फ़ंक्शन का व्यवहार निम्नानुसार निर्दिष्ट किया जा सकता है: सभी सूचियों xs और तत्वों e के लिए, last xs = ई अगर ∃ys:वाईएस++[e] = एक्सएस।
इस विनिर्देश के आधार पर, कोई भी ऐसे फ़ंक्शन को परिभाषित कर सकता है जो तर्क प्रोग्रामिंग सुविधाओं को नियोजित करके इस विनिर्देश को संतुष्ट करता है। इसी तरह तर्क भाषाओं के लिए, कार्यात्मक तर्क भाषाएं अस्तित्वगत रूप से परिमाणित चर के समाधान के लिए खोज प्रदान करती हैं। शुद्ध तर्क भाषाओं के विपरीत, वे नेस्टेड कार्यात्मक अभिव्यक्तियों पर समीकरण को हल करने का समर्थन करते हैं ताकि एक समीकरण जैसे y++[e] = [1,2,3] सूची में y को तत्काल करके हल किया जाता है [1,2] और ई मूल्य के लिए 3. करी में कोई ऑपरेशन को अंतिम रूप से परिभाषित कर सकता है: <वाक्यविन्यास लैंग = हैकेल>
अंतिम एक्सएस | ys++[e] =:= xs = e जहां ys,e मुक्त है
</वाक्यविन्यास हाइलाइट> यहाँ, प्रतीक "=:=" समीकरणों को परिभाषित करने से एक वाक्य रचनात्मक भेद प्रदान करने के लिए समीकरण बाधाओं के लिए प्रयोग किया जाता है। इसी तरह, अतिरिक्त चर (अर्थात, परिभाषित समीकरण के बाईं ओर नहीं होने वाले चर) स्पष्ट रूप से "द्वारा घोषित किए जाते हैं"where...freeटाइपो की वजह से बग का पता लगाने के लिए कुछ अवसर प्रदान करने के लिए। फॉर्म एल का एक सशर्त समीकरण | सी = आर कमी के लिए लागू होता है अगर इसकी स्थिति सी हल हो गई है। विशुद्ध रूप से कार्यात्मक भाषाओं के विपरीत जहां स्थितियों का मूल्यांकन केवल एक बूलियन मान के लिए किया जाता है, कार्यात्मक तर्क भाषाएं स्थिति में अज्ञात के लिए मूल्यों का अनुमान लगाकर शर्तों को हल करने का समर्थन करती हैं। इस तरह की स्थितियों को हल करने के लिए अगले भाग में चर्चा के अनुसार संकीर्णता का उपयोग किया जाता है।
संकुचित करना
संकीर्णता एक ऐसा तंत्र है जिसके द्वारा एक चर का नाम बाध्यताओं द्वारा लगाए गए विकल्पों में से चुने गए मान के लिए बाध्यकारी होता है। बाध्यकारी की वैधता निर्धारित करने के लिए प्रत्येक मामले में लागू शेष कार्यक्रम के साथ प्रत्येक संभावित मूल्य को किसी क्रम में करने की कोशिश की जाती है। नैरोइंग लॉजिक प्रोग्रामिंग का एक विस्तार है, जिसमें यह एक समान खोज करता है, लेकिन वास्तव में मूल्यों को खोज के हिस्से के रूप में उत्पन्न कर सकता है, न कि उन्हें केवल परीक्षण तक सीमित किया जा सकता है।
संकीर्ण करना उपयोगी है क्योंकि यह किसी फ़ंक्शन को एक संबंध के रूप में व्यवहार करने की अनुमति देता है: इसके मान की गणना दोनों दिशाओं में की जा सकती है। पिछले अनुभाग के करी उदाहरण इसे स्पष्ट करते हैं।
जैसा कि पिछले अनुभाग में उल्लेख किया गया है, संकीर्णता को प्रोग्राम टर्म ग्राफ़ में कमी के रूप में माना जा सकता है, और किसी दिए गए टर्म ग्राफ़ को कम करने के लिए अक्सर कई अलग-अलग तरीके (रणनीतियाँ) होते हैं। एंटॉय एट अल।[5] 1990 के दशक में साबित हुआ कि एक विशेष संकीर्ण रणनीति, जिसे संकीर्ण करने की आवश्यकता है, एक समाधान के अनुरूप सामान्य रूप प्राप्त करने के लिए कई कटौती करने के अर्थ में इष्टतम है जो ध्वनि और पूर्ण रणनीतियों के बीच न्यूनतम है। प्रोलॉग की एसएलडी संकल्प | एसएलडी-रिज़ॉल्यूशन रणनीति के विपरीत, आवश्यक संकीर्णता एक आलसी रणनीति से मेल खाती है।
कार्यात्मक पैटर्न
परिभाषित करने वाला नियम last ऊपर दिखाया गया तथ्य इस तथ्य को व्यक्त करता है कि वास्तविक तर्क अभिव्यक्ति को कम करने के परिणाम से मेल खाना चाहिए ys++[e]. करी इस गुण को निम्नलिखित अधिक संक्षिप्त तरीके से भी व्यक्त कर सकता है: <वाक्यविन्यास लैंग = हैकेल>
अंतिम (वाईएस ++ [ई]) = ई
</वाक्यविन्यास हाइलाइट> हास्केल इस तरह की घोषणा की अनुमति नहीं देता है क्योंकि बाईं ओर के पैटर्न में एक परिभाषित कार्य होता है (++). इस तरह के पैटर्न को फंक्शनल पैटर्न भी कहा जाता है।[6] कार्यात्मक पैटर्न करी की संयुक्त कार्यात्मक और तर्क सुविधाओं द्वारा सक्षम हैं और पदानुक्रमित डेटा संरचनाओं में गहरे पैटर्न मिलान की आवश्यकता वाले कार्यों की संक्षिप्त परिभाषाओं का समर्थन करते हैं।
गैर नियतत्ववाद
चूंकि करी अज्ञात मूल्यों के साथ फ़ंक्शन कॉल वाले समीकरणों को हल करने में सक्षम है, इसलिए इसका निष्पादन तंत्र तर्क प्रोग्रामिंग के समान गैर-नियतात्मक संगणनाओं पर आधारित है। यह तंत्र गैर-नियतात्मक संचालन की परिभाषा का भी समर्थन करता है, अर्थात, संचालन जो किसी दिए गए इनपुट के लिए एक से अधिक परिणाम प्रदान करता है। गैर-नियतात्मक संचालन का मूलरूप पूर्वनिर्धारित इन्फिक्स ऑपरेशन है ?, जिसे च्वाइस ऑपरेटर कहा जाता है, जो अपना एक तर्क देता है। इस ऑपरेटर को निम्नलिखित नियमों द्वारा परिभाषित किया गया है:
एक्स ? वाई = एक्स एक्स ? वाई = वाई
इस प्रकार, अभिव्यक्ति का मूल्यांकन 0 ? 1 रिटर्न 0 साथ ही 1. गैर-नियतात्मक संचालन के साथ कंप्यूटिंग और संकीर्ण करके मुक्त चर के साथ कंप्यूटिंग में समान अभिव्यंजक शक्ति होती है।[7] परिभाषित करने वाले नियम ? करी की एक महत्वपूर्ण विशेषता दिखाएं: कुछ ऑपरेशन का मूल्यांकन करने के लिए सभी नियमों का प्रयास किया जाता है। इसलिए, द्वारा परिभाषित किया जा सकता है <वाक्यविन्यास लैंग = हैकेल>
एक्स वाईएस = एक्स: वाईएस डालें इन्सर्ट x (y:ys) = y : इन्सर्ट x ys
</वाक्यविन्यास हाइलाइट> एक अनिश्चित स्थिति में एक सूची में एक तत्व सम्मिलित करने के लिए एक ऑपरेशन ताकि ऑपरेशन perm द्वारा परिभाषित <वाक्यविन्यास लैंग = हैकेल>
पर्म [] = [] पर्म (एक्स: एक्सएस) = एक्स डालें (पर्म एक्सएस)
</वाक्यविन्यास हाइलाइट> किसी दी गई इनपुट सूची का कोई क्रमपरिवर्तन लौटाता है।
रणनीतियाँ
साइड इफेक्ट की अनुपस्थिति के कारण, एक कार्यात्मक तर्क कार्यक्रम को विभिन्न रणनीतियों के साथ निष्पादित किया जा सकता है। अभिव्यक्तियों का मूल्यांकन करने के लिए, करी आवश्यक संकीर्ण रणनीति के एक प्रकार का उपयोग करती है जो आलसी मूल्यांकन को गैर-नियतात्मक खोज रणनीतियों के साथ जोड़ती है। प्रोलॉग के विपरीत, जो समाधान खोजने के लिए बैकट्रैकिंग का उपयोग करता है, करी किसी विशेष खोज रणनीति को ठीक नहीं करता है। इसलिए, करी के कार्यान्वयन हैं, जैसे KiCS2, जहां उपयोगकर्ता आसानी से एक खोज रणनीति का चयन कर सकता है, जैसे गहराई-पहली खोज (बैकट्रैकिंग), चौड़ाई-पहली खोज, पुनरावृत्त गहनता या समानांतर खोज।
संदर्भ
- ↑ Michael Hanus (ed.). "करी: एक सही मायने में एकीकृत कार्यात्मक तर्क भाषा".
- ↑ Sergio Antoy and Michael Hanus (2010). "कार्यात्मक तर्क प्रोग्रामिंग". Communications of the ACM. ACM. 53 (4): 74–85. doi:10.1145/1721654.1721675. S2CID 14578759.
- ↑ "करी प्रयोगात्मक प्रोग्रामिंग भाषा". MVPS.net. Retrieved 2 September 2021.
- ↑ The Münster Curry Compiler
- ↑ Sergio Antoy, Rachid Echahed and Michael Hanus (2007). "एक आवश्यक संकीर्ण रणनीति". Journal of the ACM. ACM. 47 (4): 776–822. doi:10.1145/347476.347484. ISSN 0004-5411. S2CID 47275506.
- ↑ Antoy Sergio, Hanus Michael (2006). "फ़ंक्शन पैटर्न के साथ घोषणात्मक प्रोग्रामिंग". Lecture Notes in Computer Science. 3901: 6–22. doi:10.1007/11680093_2. ISBN 978-3-540-32654-0.
- ↑ Antoy Sergio, Hanus Michael (2006). "कार्यात्मक तर्क कार्यक्रमों में ओवरलैपिंग नियम और तर्क चर". Lecture Notes in Computer Science. 4079: 87–101. doi:10.1007/11799573_9. ISBN 978-3-540-36635-5.
इस पेज में लापता आंतरिक लिंक की सूची
- संदर्भात्मक पारदर्शिता
- संगम (अवधि पुनर्लेखन)
- नाम बंधन
- पहले चौड़ाई खोजो
बाहरी कड़ियाँ
- Curry - The home page of Curry
- Smap - A web-based execution environment for Curry and Haskell with various example programs
- MCC - The Münster Curry Compiler, which uses C as the target
- PAKCS A major Curry implementation with a WWW interface, which uses Prolog as the target
- KiCS2 A Curry implementation, which uses Haskell as the target
- Curry Mailing List
- Michael Hanus's home page
- Purely Functional Lazy Non-deterministic Programming (Fischer, Kiselyov, Shan, 2009), Transforming Functional Logic Programs into Monadic Functional Programs (Braßel, Fischer, Hanus, Reck, 2010) on modeling lazy non-deterministic (logic) programming (like in Curry) in a purely functional language (Haskell); such approach might give the programmer more flexibility in the control over the strategies that—in the case of Curry—are built-in.
श्रेणी: समवर्ती प्रोग्रामिंग भाषाएं श्रेणी: प्रायोगिक प्रोग्रामिंग भाषाएं श्रेणी: कार्यात्मक तर्क प्रोग्रामिंग भाषाएं श्रेणी:हास्केल प्रोग्रामिंग भाषा परिवार श्रेणी: 1990 के दशक में निर्मित प्रोग्रामिंग भाषाएं श्रेणी: गैर नियतात्मक प्रोग्रामिंग भाषाएं श्रेणी:साक्षर प्रोग्रामिंग श्रेणी:अकादमिक प्रोग्रामिंग भाषाएं