चर्च एन्कोडिंग: Difference between revisions
No edit summary |
No edit summary |
||
Line 2: | Line 2: | ||
गणित में, चर्च एन्कोडिंग [[लैम्ब्डा कैलकुलस]] में डेटा और ऑपरेटरों का प्रतिनिधित्व करने का एक साधन है। चर्च अंक लैम्ब्डा संकेतन का उपयोग करते हुए प्राकृतिक संख्याओं का प्रतिनिधित्व करते हैं। विधि का नाम [[अलोंजो चर्च]] के नाम पर रखा गया है, जिसने सबसे पहले लैम्ब्डा कैलकुलस में डेटा को इस तरह से एनकोड किया था। | गणित में, चर्च एन्कोडिंग [[लैम्ब्डा कैलकुलस]] में डेटा और ऑपरेटरों का प्रतिनिधित्व करने का एक साधन है। चर्च अंक लैम्ब्डा संकेतन का उपयोग करते हुए प्राकृतिक संख्याओं का प्रतिनिधित्व करते हैं। विधि का नाम [[अलोंजो चर्च]] के नाम पर रखा गया है, जिसने सबसे पहले लैम्ब्डा कैलकुलस में डेटा को इस तरह से एनकोड किया था। | ||
सामान्यतः अन्य संकेतन (जैसे पूर्णांक, बूलियन, जोड़े, सूचियाँ और टैग किए गए संघ) में आदिम माने जाने वाले शब्दों को चर्च एन्कोडिंग के अनुसार उच्च-क्रम के कार्यों में मैप किया जाता है। [[चर्च-ट्यूरिंग थीसिस]] का दावा है कि किसी भी संगणनीय ऑपरेटर (और उसके संचालन) को चर्च एन्कोडिंग के अनुसार प्रदर्शित किया जा सकता है।{{dubious|reason=The Church-Turing thesis is that lambda calculus is [[Turing complete]].|date=March 2022}} लैम्ब्डा कैलकुलस में एकमात्र आदिम डेटा प्रकार फ़ंक्शन है। | |||
== प्रयोग == | == प्रयोग == | ||
चर्च एन्कोडिंग का एक सीधा कार्यान्वयन कुछ एक्सेस ऑपरेशंस को धीमा कर देता है <math>O(1)</math> को <math>O(n)</math>, कहाँ <math>n</math> डेटा संरचना का आकार है, जो चर्च एन्कोडिंग को अव्यावहारिक बनाता है।<ref name=Widemann>{{cite journal |last1=Trancón y Widemann |first1=Baltasar |last2=Parnas |first2=David Lorge |title=सारणीबद्ध भाव और कुल कार्यात्मक प्रोग्रामिंग|journal=Implementation and Application of Functional Languages |series=Lecture Notes in Computer Science |date=2008 |volume=5083 |pages=228–229 |doi=10.1007/978-3-540-85373-2_13|isbn=978-3-540-85372-5 |url=https://books.google.com/books?id=E1zuY1Q6sOsC&pg=PA228}}</ref> शोध से पता चला है कि इसे लक्षित अनुकूलन द्वारा संबोधित किया जा सकता है, लेकिन अधिकांश [[कार्यात्मक प्रोग्रामिंग]] भाषाएं इसके | चर्च एन्कोडिंग का एक सीधा कार्यान्वयन कुछ एक्सेस ऑपरेशंस को धीमा कर देता है <math>O(1)</math> को <math>O(n)</math>, कहाँ <math>n</math> डेटा संरचना का आकार है, जो चर्च एन्कोडिंग को अव्यावहारिक बनाता है।<ref name=Widemann>{{cite journal |last1=Trancón y Widemann |first1=Baltasar |last2=Parnas |first2=David Lorge |title=सारणीबद्ध भाव और कुल कार्यात्मक प्रोग्रामिंग|journal=Implementation and Application of Functional Languages |series=Lecture Notes in Computer Science |date=2008 |volume=5083 |pages=228–229 |doi=10.1007/978-3-540-85373-2_13|isbn=978-3-540-85372-5 |url=https://books.google.com/books?id=E1zuY1Q6sOsC&pg=PA228}}</ref> शोध से पता चला है कि इसे लक्षित अनुकूलन द्वारा संबोधित किया जा सकता है, लेकिन अधिकांश [[कार्यात्मक प्रोग्रामिंग]] भाषाएं इसके अतिरिक्त [[बीजगणितीय डेटा प्रकार]]ों को सम्मिलित करने के लिए अपने मध्यवर्ती प्रतिनिधित्वों का विस्तार करती हैं।<ref>{{cite book |last1=Jansen |first1=Jan Martin |last2=Koopman |first2=Pieter W. M. |last3=Plasmeijer |first3=Marinus J. |editor1-last=Nilsson |editor1-first=Henrik |title=Trends in functional programming. Volume 7 |date=2006 |publisher=Intellect |location=Bristol |isbn=978-1-84150-188-8 |chapter=Efficient interpretation by transforming data types and patterns to functions|pages=73–90|citeseerx=10.1.1.73.9841}}</ref> बहरहाल, चर्च एन्कोडिंग अधिकांशतः सैद्धांतिक तर्कों में प्रयोग किया जाता है, क्योंकि यह आंशिक मूल्यांकन और प्रमेय सिद्ध करने के लिए एक प्राकृतिक प्रतिनिधित्व है।<ref name=Widemann/> ऑपरेशंस को उच्च-रैंक वाले प्रकारों का उपयोग करके टाइप किया जा सकता है,<ref>{{cite web |work=Lambda Calculus and Lambda Calculators |url=https://okmij.org/ftp/Computation/lambda-calc.html#predecessor |publisher=okmij.org|title=Predecessor and lists are not representable in simply typed lambda calculus}}</ref> और आदिम पुनरावर्तन आसानी से सुलभ है।<ref name=Widemann/> यह धारणा कि कार्य केवल आदिम डेटा प्रकार हैं, कई प्रमाणों को सुव्यवस्थित करते हैं। | ||
चर्च एन्कोडिंग पूर्ण है लेकिन केवल प्रतिनिधित्व रूप में। लोगों को प्रदर्शित करने के लिए सामान्य डेटा प्रकारों में प्रतिनिधित्व का अनुवाद करने के लिए अतिरिक्त कार्यों की आवश्यकता होती है। | चर्च एन्कोडिंग पूर्ण है लेकिन केवल प्रतिनिधित्व रूप में। लोगों को प्रदर्शित करने के लिए सामान्य डेटा प्रकारों में प्रतिनिधित्व का अनुवाद करने के लिए अतिरिक्त कार्यों की आवश्यकता होती है। सामान्यतः यह तय करना संभव नहीं है कि लैम्ब्डा कैलकुस या चर्च के प्रमेय से समानता की अनिर्णीतता के कारण दो कार्य [[विस्तार]] के बराबर हैं या नहीं। अनुवाद किसी तरह से फ़ंक्शन को उस मूल्य को पुनः प्राप्त करने के लिए लागू कर सकता है जो इसका प्रतिनिधित्व करता है, या इसके मूल्य को शाब्दिक लैम्ब्डा शब्द के रूप में देख सकता है। लैम्ब्डा कैलकुलस की व्याख्या सामान्यतः डिडक्टिव लैम्ब्डा कैलकुलस या इंटेन्शनल बनाम एक्सटेंशनल इक्वेलिटी के उपयोग के रूप में की जाती है। परिणाम की व्याख्या के साथ डिडक्टिव लैम्ब्डा कैलकुलस या इंटेंशनल बनाम एक्सटेंशनल समानता हैं क्योंकि समानता की गहन और विस्तारित परिभाषा के बीच अंतर है। | ||
== चर्च अंक == | == चर्च अंक == | ||
चर्च अंक चर्च एन्कोडिंग के | चर्च अंक चर्च एन्कोडिंग के अनुसार [[प्राकृतिक संख्या]]ओं का प्रतिनिधित्व करते हैं। प्राकृतिक संख्या n का प्रतिनिधित्व करने वाला उच्च-क्रम फ़ंक्शन एक ऐसा फ़ंक्शन है जो किसी फ़ंक्शन को मैप करता है <math>f</math> इसकी एन-गुना फ़ंक्शन संरचना के लिए। सरल शब्दों में, अंक का मान उस संख्या के बराबर होता है जितनी बार फ़ंक्शन अपने तर्क को समाहित करता है। | ||
: <math>f^{\circ n} = \underbrace{f \circ f \circ \cdots \circ f}_{n\text{ times}}.\,</math> | : <math>f^{\circ n} = \underbrace{f \circ f \circ \cdots \circ f}_{n\text{ times}}.\,</math> | ||
Line 42: | Line 42: | ||
संख्याओं पर [[अंकगणित|अंकगणितीय]] संक्रियाओं को चर्च अंकों पर कार्यों द्वारा दर्शाया जा सकता है। इन कार्यों को लैम्ब्डा कैलकुस में परिभाषित किया जा सकता है, या अधिकांश कार्यात्मक प्रोग्रामिंग भाषाओं में कार्यान्वित किया जा सकता है (देखें लैम्ब्डा लिफ्टिंग या कनवर्ज़न विदाउट लिफ्टिंग)। | संख्याओं पर [[अंकगणित|अंकगणितीय]] संक्रियाओं को चर्च अंकों पर कार्यों द्वारा दर्शाया जा सकता है। इन कार्यों को लैम्ब्डा कैलकुस में परिभाषित किया जा सकता है, या अधिकांश कार्यात्मक प्रोग्रामिंग भाषाओं में कार्यान्वित किया जा सकता है (देखें लैम्ब्डा लिफ्टिंग या कनवर्ज़न विदाउट लिफ्टिंग)। | ||
अतिरिक्त | अतिरिक्त फलन <math>\operatorname{plus}(m, n)= m+n</math> पहचान का उपयोग करता है <math>f^{\circ (m+n)}(x)=f^{\circ m}(f^{\circ n}(x))</math>. | ||
: <math>\operatorname{plus} \equiv \lambda m.\lambda n.\lambda f.\lambda x. m\ f\ (n\ f\ x)</math> | : <math>\operatorname{plus} \equiv \lambda m.\lambda n.\lambda f.\lambda x. m\ f\ (n\ f\ x)</math> | ||
उत्तराधिकारी | उत्तराधिकारी फलन <math>\operatorname{succ}(n)=n+1</math> बीटा रिडक्शन या .सीई.बी2-रिडक्शन|β-समतुल्य है <math>(\operatorname{plus}\ 1)</math>. | ||
: <math>\operatorname{succ} \equiv \lambda n.\lambda f.\lambda x. f\ (n\ f\ x)</math> | : <math>\operatorname{succ} \equiv \lambda n.\lambda f.\lambda x. f\ (n\ f\ x)</math> | ||
गुणन | गुणन फलन <math>\operatorname{mult}(m, n) = m*n</math> पहचान का उपयोग करता है <math>f^{\circ (m*n)}(x) = (f^{\circ n})^{\circ m}(x)</math>. | ||
: <math>\operatorname{mult} \equiv \lambda m.\lambda n.\lambda f.\lambda x. m\ (n\ f)\ x</math> | : <math>\operatorname{mult} \equiv \lambda m.\lambda n.\lambda f.\lambda x. m\ (n\ f)\ x</math> | ||
घातांक | घातांक फलन <math>\operatorname{exp}(m, n) = m^n</math> चर्च अंकों की परिभाषा द्वारा दिया गया है, <math>n\ h\ x = h^n\ x </math>. परिभाषा में स्थानापन्न <math> h \to m, x \to f</math> पाने के <math>n\ m\ f = m^n\ f </math> और, | ||
: <math>\operatorname{exp}\ m\ n = m^n = n\ m </math> | : <math>\operatorname{exp}\ m\ n = m^n = n\ m </math> | ||
जो लैम्ब्डा अभिव्यक्ति देता है, | जो लैम्ब्डा अभिव्यक्ति देता है, | ||
Line 61: | Line 61: | ||
एक चर्च अंक n बार फ़ंक्शन लागू करता है। पूर्ववर्ती फ़ंक्शन को एक फ़ंक्शन वापस करना चाहिए जो इसके पैरामीटर n - 1 बार लागू करता है। यह f और x के चारों ओर एक कंटेनर बनाकर हासिल किया जाता है, जिसे इस तरह से प्रारंभ किया जाता है कि फ़ंक्शन के आवेदन को पहली बार छोड़ दिया जाता है। अधिक विस्तृत विवरण के लिए पूर्ववर्ती कार्य की या व्युत्पत्ति देखें। | एक चर्च अंक n बार फ़ंक्शन लागू करता है। पूर्ववर्ती फ़ंक्शन को एक फ़ंक्शन वापस करना चाहिए जो इसके पैरामीटर n - 1 बार लागू करता है। यह f और x के चारों ओर एक कंटेनर बनाकर हासिल किया जाता है, जिसे इस तरह से प्रारंभ किया जाता है कि फ़ंक्शन के आवेदन को पहली बार छोड़ दिया जाता है। अधिक विस्तृत विवरण के लिए पूर्ववर्ती कार्य की या व्युत्पत्ति देखें। | ||
घटाव | घटाव फलन पूर्ववर्ती फलन के आधार पर लिखा जा सकता है। | ||
: <math>\operatorname{minus} \equiv \lambda m.\lambda n. (n \operatorname{pred})\ m</math> | : <math>\operatorname{minus} \equiv \lambda m.\lambda n. (n \operatorname{pred})\ m</math> | ||
Line 70: | Line 70: | ||
{| class="wikitable" | {| class="wikitable" | ||
|- | |- | ||
! कार्य !! बीजगणित !! पहचान !! | ! कार्य !! बीजगणित !! पहचान !! फलन परिभाषा | ||
! colspan="2" | लैम्ब्डा भाव | ! colspan="2" | लैम्ब्डा भाव | ||
|- | |- | ||
Line 93: | Line 93: | ||
}}}} | }}}} | ||
=== पूर्ववर्ती | === पूर्ववर्ती फलन की व्युत्पत्ति === | ||
चर्च एन्कोडिंग में प्रयुक्त पूर्ववर्ती कार्य है, | चर्च एन्कोडिंग में प्रयुक्त पूर्ववर्ती कार्य है, | ||
Line 99: | Line 99: | ||
:<math>\operatorname{pred}(n) = \begin{cases} 0 & \mbox{if }n=0, \\ n-1 & \mbox{otherwise}\end{cases}</math>. | :<math>\operatorname{pred}(n) = \begin{cases} 0 & \mbox{if }n=0, \\ n-1 & \mbox{otherwise}\end{cases}</math>. | ||
पूर्ववर्ती बनाने के लिए हमें फ़ंक्शन को 1 कम समय में लागू करने का एक तरीका चाहिए। एक अंक {{mvar|n}} फ़ंक्शन लागू करता है {{mvar|f}} {{mvar|n}} बार {{mvar|x}}. पूर्ववर्ती फ़ंक्शन को अंक का उपयोग करना चाहिए {{mvar|n}} | पूर्ववर्ती बनाने के लिए हमें फ़ंक्शन को 1 कम समय में लागू करने का एक तरीका चाहिए। एक अंक {{mvar|n}} फ़ंक्शन लागू करता है {{mvar|f}} {{mvar|n}} बार {{mvar|x}}. पूर्ववर्ती फ़ंक्शन को अंक का उपयोग करना चाहिए {{mvar|n}} फलन लागू करने के लिए {{math|''n''-1}} बार। | ||
पूर्ववर्ती फ़ंक्शन को लागू करने से पहले, यहां एक योजना है जो मान को कंटेनर फ़ंक्शन में लपेटती है। हम इसके स्थान पर उपयोग करने के लिए नए कार्यों को परिभाषित करेंगे {{mvar|f}} और {{mvar|x}}, बुलाया {{math|inc}} और {{math|init}}. कंटेनर फ़ंक्शन कहा जाता है {{math|value}}. तालिका के बाईं ओर एक अंक दिखाता है {{mvar|n}} के लिए आवेदन किया {{math|inc}} और {{math|init}}. | पूर्ववर्ती फ़ंक्शन को लागू करने से पहले, यहां एक योजना है जो मान को कंटेनर फ़ंक्शन में लपेटती है। हम इसके स्थान पर उपयोग करने के लिए नए कार्यों को परिभाषित करेंगे {{mvar|f}} और {{mvar|x}}, बुलाया {{math|inc}} और {{math|init}}. कंटेनर फ़ंक्शन कहा जाता है {{math|value}}. तालिका के बाईं ओर एक अंक दिखाता है {{mvar|n}} के लिए आवेदन किया {{math|inc}} और {{math|init}}. | ||
Line 134: | Line 134: | ||
यदि कंटेनर से मान प्राप्त करने के लिए कोई फ़ंक्शन भी है (कहा जाता है {{math|extract}}), | यदि कंटेनर से मान प्राप्त करने के लिए कोई फ़ंक्शन भी है (कहा जाता है {{math|extract}}), | ||
:<math> \operatorname{extract}\ (\operatorname{value}\ v) = v</math> | :<math> \operatorname{extract}\ (\operatorname{value}\ v) = v</math> | ||
तब {{math|extract}} को परिभाषित करने के लिए | तब {{math|extract}} को परिभाषित करने के लिए उपयोग किया जा सकता है {{math|samenum}} ऐसे काम करता है, | ||
: <math>\operatorname{samenum} = \lambda n.\lambda f.\lambda x.\operatorname{extract}\ (n \operatorname{inc} \operatorname{init}) = \lambda n.\lambda f.\lambda x.\operatorname{extract}\ (\operatorname{value}\ (n\ f\ x)) = \lambda n.\lambda f.\lambda x.n\ f\ x = \lambda n.n</math> | : <math>\operatorname{samenum} = \lambda n.\lambda f.\lambda x.\operatorname{extract}\ (n \operatorname{inc} \operatorname{init}) = \lambda n.\lambda f.\lambda x.\operatorname{extract}\ (\operatorname{value}\ (n\ f\ x)) = \lambda n.\lambda f.\lambda x.n\ f\ x = \lambda n.n</math> | ||
{{math|samenum}um}} फ़ंक्शन आंतरिक रूप से उपयोगी नहीं है। | {{math|samenum}um}} फ़ंक्शन आंतरिक रूप से उपयोगी नहीं है। चूँकि , जैसा {{math|inc}} प्रतिनिधि बुला रहे हैं {{mvar|f}} इसके कंटेनर तर्क के लिए, हम इसे पहले आवेदन पर व्यवस्थित कर सकते हैं {{math|inc}} एक विशेष कंटेनर प्राप्त करता है जो इसके तर्क को अनदेखा करता है जिससे पहले आवेदन को छोड़ दिया जा सके {{mvar|f}}. इस नए प्रारंभिक कंटेनर को कॉल करें {{math|const}}. उपरोक्त तालिका के दाहिने हाथ की ओर के विस्तार को दर्शाता है {{mvar|n}} {{math|inc}} {{math|const}}. फिर रिप्लेस करके {{math|init}} साथ {{math|const}} के लिए अभिव्यक्ति में {{math|same}} फ़ंक्शन हमें पूर्ववर्ती फ़ंक्शन मिलता है, | ||
: <math>\operatorname{pred} = \lambda n.\lambda f.\lambda x.\operatorname{extract}\ (n \operatorname{inc} \operatorname{const}) = \lambda n.\lambda f.\lambda x.\operatorname{extract}\ (\operatorname{value}\ ((n-1)\ f\ x)) = \lambda n.\lambda f.\lambda x.(n-1)\ f\ x = \lambda n.(n-1)</math> | : <math>\operatorname{pred} = \lambda n.\lambda f.\lambda x.\operatorname{extract}\ (n \operatorname{inc} \operatorname{const}) = \lambda n.\lambda f.\lambda x.\operatorname{extract}\ (\operatorname{value}\ ((n-1)\ f\ x)) = \lambda n.\lambda f.\lambda x.(n-1)\ f\ x = \lambda n.(n-1)</math> | ||
Line 189: | Line 189: | ||
:<math> \operatorname{inc}\ \operatorname{const} = \operatorname{value}\ x </math> | :<math> \operatorname{inc}\ \operatorname{const} = \operatorname{value}\ x </math> | ||
:<math> \lambda h.h\ (\operatorname{const}\ f) = \lambda h.h\ x </math> | :<math> \lambda h.h\ (\operatorname{const}\ f) = \lambda h.h\ x </math> | ||
जो संतुष्ट है | जो संतुष्ट है यदि , | ||
:<math> \operatorname{const}\ f = x </math> | :<math> \operatorname{const}\ f = x </math> | ||
या लैम्ब्डा अभिव्यक्ति के रूप में, | या लैम्ब्डा अभिव्यक्ति के रूप में, | ||
Line 225: | Line 225: | ||
</ref> | </ref> | ||
: <math> n/m = \operatorname{if}\ n \ge m\ \operatorname{then}\ 1 + (n-m)/m\ \operatorname{else}\ 0 </math> | : <math> n/m = \operatorname{if}\ n \ge m\ \operatorname{then}\ 1 + (n-m)/m\ \operatorname{else}\ 0 </math> | ||
गिना जा रहा है <math>n-m</math> कई बीटा कटौती लेता है। जब तक हाथ से कटौती नहीं कर रहा है, इससे कोई फर्क नहीं पड़ता, लेकिन यह | गिना जा रहा है <math>n-m</math> कई बीटा कटौती लेता है। जब तक हाथ से कटौती नहीं कर रहा है, इससे कोई फर्क नहीं पड़ता, लेकिन यह उत्तम है कि इस गणना को दो बार न करना पड़े। परीक्षण संख्याओं के लिए सबसे सरल विधेय IsZero है इसलिए स्थिति पर विचार करें। | ||
: <math> \operatorname{IsZero}\ (\operatorname{minus}\ n\ m) </math> | : <math> \operatorname{IsZero}\ (\operatorname{minus}\ n\ m) </math> | ||
लेकिन यह स्थिति बराबर है <math> n \le m </math>, नहीं <math> n<m </math>. यदि इस अभिव्यक्ति का उपयोग किया जाता है तो ऊपर दी गई विभाजन की गणितीय परिभाषा को चर्च के अंकों पर कार्य में अनुवादित किया जाता है, | लेकिन यह स्थिति बराबर है <math> n \le m </math>, नहीं <math> n<m </math>. यदि इस अभिव्यक्ति का उपयोग किया जाता है तो ऊपर दी गई विभाजन की गणितीय परिभाषा को चर्च के अंकों पर कार्य में अनुवादित किया जाता है, | ||
: <math> \operatorname{divide1}\ n\ m\ f\ x = (\lambda d.\operatorname{IsZero}\ d\ (0\ f\ x)\ (f\ (\operatorname{divide1}\ d\ m\ f\ x)))\ (\operatorname{minus}\ n\ m) </math> | : <math> \operatorname{divide1}\ n\ m\ f\ x = (\lambda d.\operatorname{IsZero}\ d\ (0\ f\ x)\ (f\ (\operatorname{divide1}\ d\ m\ f\ x)))\ (\operatorname{minus}\ n\ m) </math> | ||
वांछित के रूप में, इस परिभाषा में एक ही कॉल है <math> \operatorname{minus}\ n\ m </math>. | वांछित के रूप में, इस परिभाषा में एक ही कॉल है <math> \operatorname{minus}\ n\ m </math>. चूँकि परिणाम यह है कि यह सूत्र का मान देता है <math>(n-1)/ m</math>. | ||
डिवाइड कॉल करने से पहले n में 1 जोड़कर इस समस्या को ठीक किया जा सकता है। विभाजन की परिभाषा तब है, | डिवाइड कॉल करने से पहले n में 1 जोड़कर इस समस्या को ठीक किया जा सकता है। विभाजन की परिभाषा तब है, | ||
Line 403: | Line 403: | ||
== विधेय == | == विधेय == | ||
एक विधेय एक ऐसा कार्य है जो एक बूलियन मान लौटाता है। सबसे मौलिक विधेय है <math>\operatorname{IsZero}</math>, जो लौट आता है <math>\operatorname{true}</math> | एक विधेय एक ऐसा कार्य है जो एक बूलियन मान लौटाता है। सबसे मौलिक विधेय है <math>\operatorname{IsZero}</math>, जो लौट आता है <math>\operatorname{true}</math> यदि इसका तर्क चर्च अंक है <math>0</math>, और <math>\operatorname{false}</math> यदि इसका तर्क कोई अन्य चर्च अंक है: | ||
: <math>\operatorname{IsZero} = \lambda n.n\ (\lambda x.\operatorname{false})\ \operatorname{true}</math> | : <math>\operatorname{IsZero} = \lambda n.n\ (\lambda x.\operatorname{false})\ \operatorname{true}</math> | ||
निम्नलिखित विधेय परीक्षण करता है कि क्या पहला तर्क दूसरे से कम-से-या-बराबर है: | निम्नलिखित विधेय परीक्षण करता है कि क्या पहला तर्क दूसरे से कम-से-या-बराबर है: | ||
Line 457: | Line 457: | ||
* प्रत्येक सूची नोड को एक जोड़ी से बनाएँ। | * प्रत्येक सूची नोड को एक जोड़ी से बनाएँ। | ||
* फोल्ड (उच्च-क्रम फ़ंक्शन) का उपयोग करके सूची का प्रतिनिधित्व करें। | * फोल्ड (उच्च-क्रम फ़ंक्शन) का उपयोग करके सूची का प्रतिनिधित्व करें। | ||
* स्कॉट के एन्कोडिंग का उपयोग करके सूची का प्रतिनिधित्व करें जो मिलान अभिव्यक्ति के | * स्कॉट के एन्कोडिंग का उपयोग करके सूची का प्रतिनिधित्व करें जो मिलान अभिव्यक्ति के स्थितियों को तर्क के रूप में लेता है | ||
=== सूची नोड === के रूप में दो जोड़े | === सूची नोड === के रूप में दो जोड़े | ||
Line 465: | Line 465: | ||
* दूसरे में पूंछ होती है। | * दूसरे में पूंछ होती है। | ||
चूँकि यह खाली सूची का प्रतिनिधित्व नहीं देता है, क्योंकि कोई अशक्त सूचक नहीं है। शून्य का प्रतिनिधित्व करने के लिए, जोड़ी को दूसरी जोड़ी में लपेटा जा सकता है, जिससे तीन मान मिलते हैं: | |||
* सबसे पहले - अशक्त सूचक (खाली सूची)। | * सबसे पहले - अशक्त सूचक (खाली सूची)। | ||
* दूसरा। पहले में सिर होता है। | * दूसरा। पहले में सिर होता है। | ||
Line 528: | Line 528: | ||
\operatorname{tail} &\equiv \lambda l.\lambda c.\lambda n.l\ (\lambda h.\lambda t.\lambda g.g\ h\ (t\ c))\ (\lambda t.n)\ (\lambda h.\lambda t.t) | \operatorname{tail} &\equiv \lambda l.\lambda c.\lambda n.l\ (\lambda h.\lambda t.\lambda g.g\ h\ (t\ c))\ (\lambda t.n)\ (\lambda h.\lambda t.t) | ||
\end{align}</math> | \end{align}</math> | ||
इस सूची प्रतिनिधित्व को [[सिस्टम एफ]] में टाइप किया जा सकता है। | इस सूची प्रतिनिधित्व को [[सिस्टम एफ|प्रणाली एफ]] में टाइप किया जा सकता है। | ||
=== स्कॉट एन्कोडिंग === का उपयोग करके सूची का प्रतिनिधित्व करें | === स्कॉट एन्कोडिंग === का उपयोग करके सूची का प्रतिनिधित्व करें | ||
Line 545: | Line 545: | ||
| year = 2013}}</ref> (मोजेन्सन-स्कॉट एन्कोडिंग भी देखें)। | | year = 2013}}</ref> (मोजेन्सन-स्कॉट एन्कोडिंग भी देखें)। | ||
इस दृष्टिकोण में, हम इस तथ्य का उपयोग करते हैं कि पैटर्न मिलान अभिव्यक्ति का उपयोग करके सूचियों को देखा जा सकता है। उदाहरण के लिए, [[ स्काला (प्रोग्रामिंग भाषा) ]] नोटेशन का उपयोग करना, यदि <code>list</code> प्रकार के मान को दर्शाता है <code>List</code> खाली सूची के साथ <code>Nil</code> और कंस्ट्रक्टर <code>Cons(h, t)</code> हम सूची का निरीक्षण कर सकते हैं और गणना कर सकते हैं <code>nilCode</code> | इस दृष्टिकोण में, हम इस तथ्य का उपयोग करते हैं कि पैटर्न मिलान अभिव्यक्ति का उपयोग करके सूचियों को देखा जा सकता है। उदाहरण के लिए, [[ स्काला (प्रोग्रामिंग भाषा) ]] नोटेशन का उपयोग करना, यदि <code>list</code> प्रकार के मान को दर्शाता है <code>List</code> खाली सूची के साथ <code>Nil</code> और कंस्ट्रक्टर <code>Cons(h, t)</code> हम सूची का निरीक्षण कर सकते हैं और गणना कर सकते हैं <code>nilCode</code> स्थितियों में सूची खाली है और {{code|consCode(h, t)}} जब सूची खाली न हो: | ||
<syntaxhighlight lang="scala"> | <syntaxhighlight lang="scala"> | ||
list match { | list match { | ||
Line 552: | Line 552: | ||
} | } | ||
</syntaxhighlight> | </syntaxhighlight> | ||
{{code|list}st}} यह कैसे कार्य करता है इसके द्वारा दिया जाता है {{code|nilCode}} और {{code|consCode}}. इसलिए हम एक सूची को ऐसे कार्य के रूप में परिभाषित करते हैं जो इसे स्वीकार करता है {{code|nilCode}} और {{code|consCode}} तर्क के रूप में, ताकि उपरोक्त पैटर्न मैच के | {{code|list}st}} यह कैसे कार्य करता है इसके द्वारा दिया जाता है {{code|nilCode}} और {{code|consCode}}. इसलिए हम एक सूची को ऐसे कार्य के रूप में परिभाषित करते हैं जो इसे स्वीकार करता है {{code|nilCode}} और {{code|consCode}} तर्क के रूप में, ताकि उपरोक्त पैटर्न मैच के अतिरिक्त हम बस लिख सकें: | ||
: <math> | : <math> | ||
\operatorname{list}\ \operatorname{nilCode}\ \operatorname{consCode} | \operatorname{list}\ \operatorname{nilCode}\ \operatorname{consCode} | ||
Line 566: | Line 566: | ||
\operatorname{cons}\ h\ t\ \ \equiv\ \ \lambda n.\lambda c.\ c\ h\ t | \operatorname{cons}\ h\ t\ \ \equiv\ \ \lambda n.\lambda c.\ c\ h\ t | ||
</math> | </math> | ||
अधिक | अधिक सामान्यतः, एक बीजगणितीय डेटा प्रकार के साथ <math>m</math> विकल्प के साथ एक फलन बन जाता है <math>m</math> पैरामीटर। जब <math>i</math>वें निर्माता है <math>n_i</math> तर्क, एन्कोडिंग के संबंधित पैरामीटर लेता है <math>n_i</math> तर्क भी। | ||
स्कॉट एन्कोडिंग अनटाइप्ड लैम्ब्डा कैलकुलस में किया जा सकता है, जबकि टाइप्स के साथ इसके उपयोग के लिए रिकर्सन और टाइप पॉलीमोर्फिज्म के साथ एक टाइप | स्कॉट एन्कोडिंग अनटाइप्ड लैम्ब्डा कैलकुलस में किया जा सकता है, जबकि टाइप्स के साथ इसके उपयोग के लिए रिकर्सन और टाइप पॉलीमोर्फिज्म के साथ एक टाइप प्रणाली की आवश्यकता होती है। इस प्रतिनिधित्व में तत्व प्रकार ई के साथ एक सूची जिसका उपयोग प्रकार सी के मूल्यों की गणना करने के लिए किया जाता है, निम्नलिखित पुनरावर्ती प्रकार की परिभाषा होगी, जहां '=>' फ़ंक्शन प्रकार को दर्शाता है: | ||
<syntaxhighlight lang="scala"> | <syntaxhighlight lang="scala"> | ||
type List = | type List = | ||
Line 579: | Line 579: | ||
== यह भी देखें == | == यह भी देखें == | ||
* लैम्ब्डा कैलकुलस | * लैम्ब्डा कैलकुलस | ||
* टाइप किए गए कलन में चर्च अंकों के लिए | * टाइप किए गए कलन में चर्च अंकों के लिए प्रणाली एफ | ||
* मोगेनसेन-स्कॉट एन्कोडिंग | * मोगेनसेन-स्कॉट एन्कोडिंग | ||
* क्रमसूचक संख्या या वॉन न्यूमैन क्रमसूचकों की परिभाषा - प्राकृतिक संख्याओं को सांकेतिक शब्दों में बदलने का दूसरा तरीका: समुच्चय के रूप में | * क्रमसूचक संख्या या वॉन न्यूमैन क्रमसूचकों की परिभाषा - प्राकृतिक संख्याओं को सांकेतिक शब्दों में बदलने का दूसरा तरीका: समुच्चय के रूप में |
Revision as of 23:02, 19 May 2023
गणित में, चर्च एन्कोडिंग लैम्ब्डा कैलकुलस में डेटा और ऑपरेटरों का प्रतिनिधित्व करने का एक साधन है। चर्च अंक लैम्ब्डा संकेतन का उपयोग करते हुए प्राकृतिक संख्याओं का प्रतिनिधित्व करते हैं। विधि का नाम अलोंजो चर्च के नाम पर रखा गया है, जिसने सबसे पहले लैम्ब्डा कैलकुलस में डेटा को इस तरह से एनकोड किया था।
सामान्यतः अन्य संकेतन (जैसे पूर्णांक, बूलियन, जोड़े, सूचियाँ और टैग किए गए संघ) में आदिम माने जाने वाले शब्दों को चर्च एन्कोडिंग के अनुसार उच्च-क्रम के कार्यों में मैप किया जाता है। चर्च-ट्यूरिंग थीसिस का दावा है कि किसी भी संगणनीय ऑपरेटर (और उसके संचालन) को चर्च एन्कोडिंग के अनुसार प्रदर्शित किया जा सकता है।[dubious ] लैम्ब्डा कैलकुलस में एकमात्र आदिम डेटा प्रकार फ़ंक्शन है।
प्रयोग
चर्च एन्कोडिंग का एक सीधा कार्यान्वयन कुछ एक्सेस ऑपरेशंस को धीमा कर देता है को , कहाँ डेटा संरचना का आकार है, जो चर्च एन्कोडिंग को अव्यावहारिक बनाता है।[1] शोध से पता चला है कि इसे लक्षित अनुकूलन द्वारा संबोधित किया जा सकता है, लेकिन अधिकांश कार्यात्मक प्रोग्रामिंग भाषाएं इसके अतिरिक्त बीजगणितीय डेटा प्रकारों को सम्मिलित करने के लिए अपने मध्यवर्ती प्रतिनिधित्वों का विस्तार करती हैं।[2] बहरहाल, चर्च एन्कोडिंग अधिकांशतः सैद्धांतिक तर्कों में प्रयोग किया जाता है, क्योंकि यह आंशिक मूल्यांकन और प्रमेय सिद्ध करने के लिए एक प्राकृतिक प्रतिनिधित्व है।[1] ऑपरेशंस को उच्च-रैंक वाले प्रकारों का उपयोग करके टाइप किया जा सकता है,[3] और आदिम पुनरावर्तन आसानी से सुलभ है।[1] यह धारणा कि कार्य केवल आदिम डेटा प्रकार हैं, कई प्रमाणों को सुव्यवस्थित करते हैं।
चर्च एन्कोडिंग पूर्ण है लेकिन केवल प्रतिनिधित्व रूप में। लोगों को प्रदर्शित करने के लिए सामान्य डेटा प्रकारों में प्रतिनिधित्व का अनुवाद करने के लिए अतिरिक्त कार्यों की आवश्यकता होती है। सामान्यतः यह तय करना संभव नहीं है कि लैम्ब्डा कैलकुस या चर्च के प्रमेय से समानता की अनिर्णीतता के कारण दो कार्य विस्तार के बराबर हैं या नहीं। अनुवाद किसी तरह से फ़ंक्शन को उस मूल्य को पुनः प्राप्त करने के लिए लागू कर सकता है जो इसका प्रतिनिधित्व करता है, या इसके मूल्य को शाब्दिक लैम्ब्डा शब्द के रूप में देख सकता है। लैम्ब्डा कैलकुलस की व्याख्या सामान्यतः डिडक्टिव लैम्ब्डा कैलकुलस या इंटेन्शनल बनाम एक्सटेंशनल इक्वेलिटी के उपयोग के रूप में की जाती है। परिणाम की व्याख्या के साथ डिडक्टिव लैम्ब्डा कैलकुलस या इंटेंशनल बनाम एक्सटेंशनल समानता हैं क्योंकि समानता की गहन और विस्तारित परिभाषा के बीच अंतर है।
चर्च अंक
चर्च अंक चर्च एन्कोडिंग के अनुसार प्राकृतिक संख्याओं का प्रतिनिधित्व करते हैं। प्राकृतिक संख्या n का प्रतिनिधित्व करने वाला उच्च-क्रम फ़ंक्शन एक ऐसा फ़ंक्शन है जो किसी फ़ंक्शन को मैप करता है इसकी एन-गुना फ़ंक्शन संरचना के लिए। सरल शब्दों में, अंक का मान उस संख्या के बराबर होता है जितनी बार फ़ंक्शन अपने तर्क को समाहित करता है।
सभी चर्च अंक ऐसे कार्य हैं जो दो पैरामीटर लेते हैं। चर्च अंक 0, 1, 2, ..., को लैम्ब्डा कैलकुस में निम्नानुसार परिभाषित किया गया है।
शुरुआत 0 फ़ंक्शन को बिल्कुल भी लागू नहीं करना 1 फ़ंक्शन को एक बार लागू करना, 2 फ़ंक्शन को दो बार लागू करना, 3 फ़ंक्शन को तीन बार लागू करना आदि:
चर्च अंक 3 किसी दिए गए फ़ंक्शन को तीन बार मान पर लागू करने की क्रिया का प्रतिनिधित्व करता है। आपूर्ति किया गया फ़ंक्शन पहले एक आपूर्ति किए गए पैरामीटर पर लागू होता है और उसके बाद क्रमिक रूप से अपने परिणाम पर लागू होता है। अंतिम परिणाम अंक 3 नहीं है (जब तक आपूर्ति पैरामीटर 0 नहीं होता है और फ़ंक्शन एक उत्तराधिकारी फ़ंक्शन होता है)। कार्य स्वयं, और इसका अंतिम परिणाम नहीं, चर्च अंक 3 है। चर्च अंक 3 का अर्थ केवल तीन बार कुछ भी करना है। यह तीन बार से क्या मतलब है इसका एक व्यापक परिभाषा प्रदर्शन है।
चर्च अंकों के साथ गणना
संख्याओं पर अंकगणितीय संक्रियाओं को चर्च अंकों पर कार्यों द्वारा दर्शाया जा सकता है। इन कार्यों को लैम्ब्डा कैलकुस में परिभाषित किया जा सकता है, या अधिकांश कार्यात्मक प्रोग्रामिंग भाषाओं में कार्यान्वित किया जा सकता है (देखें लैम्ब्डा लिफ्टिंग या कनवर्ज़न विदाउट लिफ्टिंग)।
अतिरिक्त फलन पहचान का उपयोग करता है .
उत्तराधिकारी फलन बीटा रिडक्शन या .सीई.बी2-रिडक्शन|β-समतुल्य है .
गुणन फलन पहचान का उपयोग करता है .
घातांक फलन चर्च अंकों की परिभाषा द्वारा दिया गया है, . परिभाषा में स्थानापन्न पाने के और,
जो लैम्ब्डा अभिव्यक्ति देता है,
h> फ़ंक्शन को समझना अधिक कठिन है।
एक चर्च अंक n बार फ़ंक्शन लागू करता है। पूर्ववर्ती फ़ंक्शन को एक फ़ंक्शन वापस करना चाहिए जो इसके पैरामीटर n - 1 बार लागू करता है। यह f और x के चारों ओर एक कंटेनर बनाकर हासिल किया जाता है, जिसे इस तरह से प्रारंभ किया जाता है कि फ़ंक्शन के आवेदन को पहली बार छोड़ दिया जाता है। अधिक विस्तृत विवरण के लिए पूर्ववर्ती कार्य की या व्युत्पत्ति देखें।
घटाव फलन पूर्ववर्ती फलन के आधार पर लिखा जा सकता है।
चर्च अंकों पर कार्यों की तालिका
कार्य | बीजगणित | पहचान | फलन परिभाषा | लैम्ब्डा भाव | |
---|---|---|---|---|---|
उत्तराधिकारी | ... | ||||
जोड़ना | |||||
गुणन | |||||
घातांक | [lower-alpha 1] | ||||
पूर्वाधिकारी[lower-alpha 2] |
| ||||
घटाव[lower-alpha 2] (मोनस) | ... |
पूर्ववर्ती फलन की व्युत्पत्ति
चर्च एन्कोडिंग में प्रयुक्त पूर्ववर्ती कार्य है,
- .
पूर्ववर्ती बनाने के लिए हमें फ़ंक्शन को 1 कम समय में लागू करने का एक तरीका चाहिए। एक अंक n फ़ंक्शन लागू करता है f n बार x. पूर्ववर्ती फ़ंक्शन को अंक का उपयोग करना चाहिए n फलन लागू करने के लिए n-1 बार।
पूर्ववर्ती फ़ंक्शन को लागू करने से पहले, यहां एक योजना है जो मान को कंटेनर फ़ंक्शन में लपेटती है। हम इसके स्थान पर उपयोग करने के लिए नए कार्यों को परिभाषित करेंगे f और x, बुलाया inc और init. कंटेनर फ़ंक्शन कहा जाता है value. तालिका के बाईं ओर एक अंक दिखाता है n के लिए आवेदन किया inc और init.
सामान्य पुनरावृत्ति नियम है,
यदि कंटेनर से मान प्राप्त करने के लिए कोई फ़ंक्शन भी है (कहा जाता है extract),
तब extract को परिभाषित करने के लिए उपयोग किया जा सकता है samenum ऐसे काम करता है,
samenum}um फ़ंक्शन आंतरिक रूप से उपयोगी नहीं है। चूँकि , जैसा inc प्रतिनिधि बुला रहे हैं f इसके कंटेनर तर्क के लिए, हम इसे पहले आवेदन पर व्यवस्थित कर सकते हैं inc एक विशेष कंटेनर प्राप्त करता है जो इसके तर्क को अनदेखा करता है जिससे पहले आवेदन को छोड़ दिया जा सके f. इस नए प्रारंभिक कंटेनर को कॉल करें const. उपरोक्त तालिका के दाहिने हाथ की ओर के विस्तार को दर्शाता है n inc const. फिर रिप्लेस करके init साथ const के लिए अभिव्यक्ति में same फ़ंक्शन हमें पूर्ववर्ती फ़ंक्शन मिलता है,
जैसा कि कार्यों के नीचे समझाया गया है inc, init, const, value और extract के रूप में परिभाषित किया जा सकता है,
जो के लिए लैम्ब्डा अभिव्यक्ति देता है pred जैसा,
वैल्यू कंटेनरमान कंटेनर फ़ंक्शन को उसके मान पर लागू करता है। इसके द्वारा परिभाषित किया गया है, इसलिए,
जी को मूल्य कंटेनर होने दें, तब, इसलिए, |
निकालेंपहचान फ़ंक्शन लागू करके मान निकाला जा सकता है, का उपयोग करते हुए I, इसलिए,
स्थिरांकअमल करना pred द init फ़ंक्शन को इसके साथ बदल दिया गया है const जो लागू नहीं होता f. ज़रुरत है const को पूरा करने के, जो संतुष्ट है यदि , या लैम्ब्डा अभिव्यक्ति के रूप में, |
पूर्व को परिभाषित करने का एक अन्य तरीका
जोड़े का उपयोग करके पूर्व को भी परिभाषित किया जा सकता है:
यह एक सरल परिभाषा है, लेकिन पूर्व के लिए एक अधिक जटिल अभिव्यक्ति की ओर ले जाती है। के लिए विस्तार :
विभाग
प्राकृतिक संख्याओं का विभाजन (गणित) किसके द्वारा कार्यान्वित किया जा सकता है,[4]
गिना जा रहा है कई बीटा कटौती लेता है। जब तक हाथ से कटौती नहीं कर रहा है, इससे कोई फर्क नहीं पड़ता, लेकिन यह उत्तम है कि इस गणना को दो बार न करना पड़े। परीक्षण संख्याओं के लिए सबसे सरल विधेय IsZero है इसलिए स्थिति पर विचार करें।
लेकिन यह स्थिति बराबर है , नहीं . यदि इस अभिव्यक्ति का उपयोग किया जाता है तो ऊपर दी गई विभाजन की गणितीय परिभाषा को चर्च के अंकों पर कार्य में अनुवादित किया जाता है,
वांछित के रूप में, इस परिभाषा में एक ही कॉल है . चूँकि परिणाम यह है कि यह सूत्र का मान देता है .
डिवाइड कॉल करने से पहले n में 1 जोड़कर इस समस्या को ठीक किया जा सकता है। विभाजन की परिभाषा तब है,
डिवाइड 1 एक पुनरावर्ती परिभाषा है। रिकर्सन को लागू करने के लिए फिक्स्ड-पॉइंट कॉम्बिनेटर का उपयोग किया जा सकता है। Div by नामक एक नया फ़ंक्शन बनाएँ;
- वाम भाग में
- दाहिने हाथ में
पाने के लिए और,
तब,
कहाँ,
देता है,
या पाठ के रूप में \ के लिए का उपयोग करना λ,
डिवाइड = (\n.((\f.(\x.x x) (\x.f (x x))) (\c.\n.\m.\f.\x.(\d.(\n.n (\x) .(\a.\b.b)) (\a.\b.a)) d ((\f.\x.x) f x) (f (c d m f x))) ((\m.\n.n (\n.\f.\) x.n (\g.\h.h (g f)) (\u.x) (\u.u)) m) n m))) ((\n.\f.\x. f (n f x)) n))
उदाहरण के लिए, 9/3 द्वारा दर्शाया गया है
डिवाइड (\f.\x.f (f (f (f (f (f (f (f (f x)))))))) (\f.\x.f (f (f x)))
लैम्ब्डा कैलकुलस कैलकुलेटर का उपयोग करते हुए, सामान्य क्रम का उपयोग करते हुए, उपरोक्त अभिव्यक्ति 3 तक कम हो जाती है।
\f.\x.f (f (f (x)))
हस्ताक्षरित संख्या
चर्च अंकों को पूर्णांक तक विस्तारित करने के लिए एक सरल दृष्टिकोण एक चर्च जोड़ी का उपयोग करना है, जिसमें चर्च अंक सकारात्मक और नकारात्मक मान का प्रतिनिधित्व करते हैं।[5] पूर्णांक मान दो चर्च अंकों के बीच का अंतर है।
एक प्राकृतिक संख्या को एक हस्ताक्षरित संख्या में परिवर्तित किया जाता है,
मूल्यों की अदला-बदली करके नकारात्मकता का प्रदर्शन किया जाता है।
यदि जोड़ी में से एक शून्य है तो पूर्णांक मान अधिक स्वाभाविक रूप से प्रदर्शित होता है। OneZero फ़ंक्शन इस स्थिति को प्राप्त करता है,
रिकर्सन को वाई कॉम्बिनेटर का उपयोग करके कार्यान्वित किया जा सकता है,
प्लस और माइनस
जोड़ी पर जोड़ को गणितीय रूप से परिभाषित किया गया है,
अंतिम अभिव्यक्ति का लैम्ब्डा कैलकुलस में अनुवाद किया गया है,
इसी प्रकार घटाव परिभाषित किया गया है,
देना,
गुणा और भाग
गुणन द्वारा परिभाषित किया जा सकता है,
अंतिम अभिव्यक्ति का लैम्ब्डा कैलकुलस में अनुवाद किया गया है,
विभाजन के लिए यहाँ एक समान परिभाषा दी गई है, इस परिभाषा को छोड़कर, प्रत्येक जोड़ी में एक मान शून्य होना चाहिए (ऊपर OneZero देखें)। DivZ फ़ंक्शन हमें शून्य घटक वाले मान को अनदेखा करने की अनुमति देता है।
divZ का उपयोग तब निम्न सूत्र में किया जाता है, जो गुणन के समान है, लेकिन divZ द्वारा प्रतिस्थापित बहु के साथ।
परिमेय और वास्तविक संख्याएं
लैम्ब्डा कैलकुस में तर्कसंगत और गणना योग्य संख्या भी एन्कोड की जा सकती है। तर्कसंगत संख्याओं को हस्ताक्षरित संख्याओं की एक जोड़ी के रूप में एन्कोड किया जा सकता है। संगणनीय वास्तविक संख्याओं को एक सीमित प्रक्रिया द्वारा एन्कोड किया जा सकता है जो गारंटी देता है कि वास्तविक मूल्य से अंतर एक संख्या से भिन्न होता है जो कि हमारी आवश्यकता के अनुसार छोटा हो सकता है।[6]
[7] दिए गए संदर्भ सॉफ्टवेयर का वर्णन करते हैं, जो सैद्धांतिक रूप से लैम्ब्डा कैलकुलस में अनुवादित हो सकते हैं। एक बार वास्तविक संख्या परिभाषित हो जाने के बाद, जटिल संख्याएं स्वाभाविक रूप से वास्तविक संख्याओं की एक जोड़ी के रूप में एन्कोडेड होती हैं।
ऊपर वर्णित डेटा प्रकार और फ़ंक्शन प्रदर्शित करते हैं कि लैम्ब्डा कैलकुलस में किसी भी डेटा प्रकार या गणना को एन्कोड किया जा सकता है। यह चर्च-ट्यूरिंग थीसिस है।
अन्य अभ्यावेदन के साथ अनुवाद
अधिकांश वास्तविक दुनिया की भाषाओं में मशीन-देशी पूर्णांकों का समर्थन है; चर्च और अनचर्च फ़ंक्शंस गैर-नकारात्मक पूर्णांक और उनके संबंधित चर्च अंकों के बीच परिवर्तित होते हैं। कार्य यहां हास्केल (प्रोग्रामिंग भाषा) में दिए गए हैं, जहां \
लैम्ब्डा कैलकुस के λ के अनुरूप है। अन्य भाषाओं में कार्यान्वयन समान हैं।
type Church a = (a -> a) -> a -> a
church :: Integer -> Church Integer
church 0 = \f -> \x -> x
church n = \f -> \x -> f (church (n-1) f x)
unchurch :: Church Integer -> Integer
unchurch cn = cn (+ 1) 0
चर्च बूलियन्स
चर्च बूलियन सच्चे और झूठे बूलियन मूल्यों के चर्च एन्कोडिंग हैं। कुछ प्रोग्रामिंग भाषाएं इन्हें बूलियन अंकगणित के कार्यान्वयन मॉडल के रूप में उपयोग करती हैं; उदाहरण स्मालटाक और पिको (प्रोग्रामिंग भाषा) हैं।
बूलियन तर्क को एक विकल्प के रूप में माना जा सकता है। सच और झूठ का चर्च एन्कोडिंग दो मापदंडों के कार्य हैं:
- सच पहला पैरामीटर चुनता है।
- झूठा दूसरा पैरामीटर चुनता है।
दो परिभाषाओं को चर्च बूलियंस के रूप में जाना जाता है:
यह परिभाषा विधेय (अर्थात सत्य मान लौटाने वाले कार्य) को सीधे-सीधे क्रिया-खंड के रूप में कार्य करने की अनुमति देती है। बूलियन लौटाने वाला एक फ़ंक्शन, जिसे दो पैरामीटर पर लागू किया जाता है, या तो पहला या दूसरा पैरामीटर देता है:
तत्कालीन खंड का मूल्यांकन करता है यदि विधेय-एक्स सत्य का मूल्यांकन करता है, और अन्य-खंड का मूल्यांकन करता है यदि विधेय-एक्स गलत का मूल्यांकन करता है।
क्योंकि सत्य और असत्य पहले या दूसरे पैरामीटर का चयन करते हैं, उन्हें लॉजिक ऑपरेटर प्रदान करने के लिए संयोजित किया जा सकता है। ध्यान दें कि नहीं के कई संभावित कार्यान्वयन हैं।
कुछ उदाहरण:
विधेय
एक विधेय एक ऐसा कार्य है जो एक बूलियन मान लौटाता है। सबसे मौलिक विधेय है , जो लौट आता है यदि इसका तर्क चर्च अंक है , और यदि इसका तर्क कोई अन्य चर्च अंक है:
निम्नलिखित विधेय परीक्षण करता है कि क्या पहला तर्क दूसरे से कम-से-या-बराबर है:
- ,
पहचान के कारण,
समानता के लिए परीक्षण के रूप में लागू किया जा सकता है,
चर्च जोड़े
चर्च जोड़े विपक्ष (दो-टुपल) प्रकार के चर्च एन्कोडिंग हैं। जोड़ी को एक फ़ंक्शन के रूप में दर्शाया गया है जो फ़ंक्शन तर्क लेता है। जब इसका तर्क दिया जाता है तो यह तर्क जोड़ी के दो घटकों पर लागू होगा। लैम्ब्डा कैलकुस में परिभाषा है,
उदाहरण के लिए,
सूची एन्कोडिंग
सूची नोड्स से एक (अपरिवर्तनीय वस्तु) सूची (कंप्यूटिंग) का निर्माण किया जाता है। सूची पर मूल संचालन हैं;
कार्य | विवरण |
---|---|
शून्य | एक खाली सूची बनाएँ। |
इस्निल | सूची खाली होने पर परीक्षण करें। |
दोष | किसी दिए गए मान को (संभवतः खाली) सूची में जोड़ें। |
शीर्ष | सूची का पहला तत्व प्राप्त करें। |
अंतिम भाग | बाकी सूची प्राप्त करें। |
हम नीचे सूचियों के चार अलग-अलग प्रतिनिधित्व देते हैं:
- प्रत्येक सूची नोड को दो जोड़े से बनाएं (खाली सूचियों की अनुमति देने के लिए)।
- प्रत्येक सूची नोड को एक जोड़ी से बनाएँ।
- फोल्ड (उच्च-क्रम फ़ंक्शन) का उपयोग करके सूची का प्रतिनिधित्व करें।
- स्कॉट के एन्कोडिंग का उपयोग करके सूची का प्रतिनिधित्व करें जो मिलान अभिव्यक्ति के स्थितियों को तर्क के रूप में लेता है
=== सूची नोड === के रूप में दो जोड़े
एक चर्च जोड़ी द्वारा एक गैर-खाली सूची को लागू किया जा सकता है;
- सबसे पहले सिर होता है।
- दूसरे में पूंछ होती है।
चूँकि यह खाली सूची का प्रतिनिधित्व नहीं देता है, क्योंकि कोई अशक्त सूचक नहीं है। शून्य का प्रतिनिधित्व करने के लिए, जोड़ी को दूसरी जोड़ी में लपेटा जा सकता है, जिससे तीन मान मिलते हैं:
- सबसे पहले - अशक्त सूचक (खाली सूची)।
- दूसरा। पहले में सिर होता है।
- दूसरा। दूसरे में पूंछ होती है।
इस विचार का उपयोग करते हुए मूल सूची संचालन को इस प्रकार परिभाषित किया जा सकता है:[8]
अभिव्यक्ति | विवरण |
---|---|
जोड़ी का पहला तत्व सत्य है जिसका अर्थ है कि सूची शून्य है। | |
अशक्त (या खाली सूची) सूचक को पुनः प्राप्त करें। | |
एक सूची नोड बनाएँ, जो शून्य नहीं है, और इसे एक हेड एच और एक टेल टी दें। | |
दूसरा.पहला शीर्ष है। | |
दूसरा.दूसराअंतिम भाग है। |
एक शून्य नोड में दूसरा कभी भी एक्सेस नहीं किया जाता है, बशर्ते कि 'सिर' और 'पूंछ' केवल गैर-खाली सूचियों पर लागू हों।
=== सूची नोड === के रूप में एक जोड़ी
वैकल्पिक रूप से परिभाषित करें[9]
जहां अंतिम परिभाषा सामान्य का विशेष मामला है
=== राइट फोल्ड === का उपयोग करके सूची का प्रतिनिधित्व करें
चर्च जोड़े का उपयोग करके एन्कोडिंग के विकल्प के रूप में, एक सूची को इसके फोल्ड (उच्च-क्रम फ़ंक्शन) के साथ पहचान कर एन्कोड किया जा सकता है। उदाहरण के लिए, तीन तत्वों x, y और z की एक सूची को एक उच्च-क्रम फ़ंक्शन द्वारा एन्कोड किया जा सकता है, जब एक कॉम्बिनेटर c पर लागू किया जाता है और एक मान n रिटर्न c x (c y (c z n)) देता है।
इस सूची प्रतिनिधित्व को प्रणाली एफ में टाइप किया जा सकता है।
=== स्कॉट एन्कोडिंग === का उपयोग करके सूची का प्रतिनिधित्व करें
एक वैकल्पिक प्रतिनिधित्व स्कॉट एन्कोडिंग है, जो निरंतरता के विचार का उपयोग करता है और सरल कोड को जन्म दे सकता है।[10] (मोजेन्सन-स्कॉट एन्कोडिंग भी देखें)।
इस दृष्टिकोण में, हम इस तथ्य का उपयोग करते हैं कि पैटर्न मिलान अभिव्यक्ति का उपयोग करके सूचियों को देखा जा सकता है। उदाहरण के लिए, स्काला (प्रोग्रामिंग भाषा) नोटेशन का उपयोग करना, यदि list
प्रकार के मान को दर्शाता है List
खाली सूची के साथ Nil
और कंस्ट्रक्टर Cons(h, t)
हम सूची का निरीक्षण कर सकते हैं और गणना कर सकते हैं nilCode
स्थितियों में सूची खाली है और consCode(h, t)
जब सूची खाली न हो:
list match {
case Nil => nilCode
case Cons(h, t) => consCode(h,t)
}
list}st
यह कैसे कार्य करता है इसके द्वारा दिया जाता हैnilCode
औरconsCode
. इसलिए हम एक सूची को ऐसे कार्य के रूप में परिभाषित करते हैं जो इसे स्वीकार करता हैnilCode
औरconsCode
तर्क के रूप में, ताकि उपरोक्त पैटर्न मैच के अतिरिक्त हम बस लिख सकें:
आइए हम द्वारा निरूपित करें n
के अनुरूप पैरामीटर nilCode
और तक c
के अनुरूप पैरामीटर consCode
.
खाली सूची वह है जो शून्य तर्क लौटाती है:
सिर के साथ गैर-खाली सूची h
और पूंछ t
द्वारा दिया गया है
अधिक सामान्यतः, एक बीजगणितीय डेटा प्रकार के साथ विकल्प के साथ एक फलन बन जाता है पैरामीटर। जब वें निर्माता है तर्क, एन्कोडिंग के संबंधित पैरामीटर लेता है तर्क भी।
स्कॉट एन्कोडिंग अनटाइप्ड लैम्ब्डा कैलकुलस में किया जा सकता है, जबकि टाइप्स के साथ इसके उपयोग के लिए रिकर्सन और टाइप पॉलीमोर्फिज्म के साथ एक टाइप प्रणाली की आवश्यकता होती है। इस प्रतिनिधित्व में तत्व प्रकार ई के साथ एक सूची जिसका उपयोग प्रकार सी के मूल्यों की गणना करने के लिए किया जाता है, निम्नलिखित पुनरावर्ती प्रकार की परिभाषा होगी, जहां '=>' फ़ंक्शन प्रकार को दर्शाता है:
type List =
C => // nil argument
(E => List => C) => // cons argument
C // result of pattern matching
एक सूची जिसका उपयोग मनमानी प्रकारों की गणना करने के लिए किया जा सकता है, में एक प्रकार होगा जो मात्रा निर्धारित करता है C
. एक सूची सामान्य[clarification needed] में E
भी ले जाएगा E
प्रकार तर्क के रूप में।
यह भी देखें
- लैम्ब्डा कैलकुलस
- टाइप किए गए कलन में चर्च अंकों के लिए प्रणाली एफ
- मोगेनसेन-स्कॉट एन्कोडिंग
- क्रमसूचक संख्या या वॉन न्यूमैन क्रमसूचकों की परिभाषा - प्राकृतिक संख्याओं को सांकेतिक शब्दों में बदलने का दूसरा तरीका: समुच्चय के रूप में
संदर्भ
- ↑ 1.0 1.1 1.2 Trancón y Widemann, Baltasar; Parnas, David Lorge (2008). "सारणीबद्ध भाव और कुल कार्यात्मक प्रोग्रामिंग". Implementation and Application of Functional Languages. Lecture Notes in Computer Science. 5083: 228–229. doi:10.1007/978-3-540-85373-2_13. ISBN 978-3-540-85372-5.
- ↑ Jansen, Jan Martin; Koopman, Pieter W. M.; Plasmeijer, Marinus J. (2006). "Efficient interpretation by transforming data types and patterns to functions". In Nilsson, Henrik (ed.). Trends in functional programming. Volume 7. Bristol: Intellect. pp. 73–90. CiteSeerX 10.1.1.73.9841. ISBN 978-1-84150-188-8.
- ↑ "Predecessor and lists are not representable in simply typed lambda calculus". Lambda Calculus and Lambda Calculators. okmij.org.
- ↑ Allison, Lloyd. "Lambda Calculus Integers".
- ↑ Bauer, Andrej. "Andrej's answer to a question; "Representing negative and complex numbers using lambda calculus"".
- ↑ "Exact real arithmetic". Haskell. Archived from the original on 2015-03-26.
- ↑ Bauer, Andrej (26 September 2022). "Real number computational software". GitHub.
- ↑ Pierce, Benjamin C. (2002). Types and Programming Languages. MIT Press. p. 500. ISBN 978-0-262-16209-8.
- ↑ Tromp, John (2007). "14. Binary Lambda Calculus and Combinatory Logic". In Calude, Cristian S (ed.). यादृच्छिकता और जटिलता, लीबनिज से चैतिन तक. World Scientific. pp. 237–262. ISBN 978-981-4474-39-9.
As PDF: Tromp, John (14 May 2014). "Binary Lambda Calculus and Combinatory Logic" (PDF). Retrieved 2017-11-24. - ↑ Jansen, Jan Martin (2013). "Programming in the λ-Calculus: From Church to Scott and Back". In Achten, Peter; Koopman, Pieter W. M. (eds.). The Beauty of Functional Code - Essays Dedicated to Rinus Plasmeijer on the Occasion of His 61st Birthday. Lecture Notes in Computer Science. Vol. 8106. Springer. pp. 168–180. doi:10.1007/978-3-642-40355-2_12.
- Stump, A. (2009). "Directly reflective meta-programming" (PDF). Higher-Order Symb Comput. 22 (2): 115–144. CiteSeerX 10.1.1.489.5018. doi:10.1007/s10990-007-9022-0. S2CID 16124152.
- Cartwright, Robert. "Church numerals and booleans explained" (PDF). Comp 311 — Review 2. Rice University.
- Kemp, Colin (2007). "§2.4.1 Church Naturals, §2.4.2 Church Booleans, Ch. 5 Derivation techniques for TFP". Theoretical Foundations for Practical 'Totally Functional Programming' (PhD). School of Information Technology and Electrical Engineering, The University of Queensland. pp. 14–17, 93–145. CiteSeerX 10.1.1.149.3505. All about Church and other similar encodings, including how to derive them and operations on them, from first principles
- Some interactive examples of Church numerals
- Lambda Calculus Live Tutorial: Boolean Algebra