चर्च एन्कोडिंग: Difference between revisions
No edit summary |
No edit summary |
||
Line 101: | Line 101: | ||
पूर्ववर्ती बनाने के लिए हमें फलन को 1 कम समय में प्रयुक्त करने का एक विधि चाहिए। एक अंक {{mvar|n}} फलन {{mvar|f}} {{mvar|n}} बार {{mvar|x}} पर प्रयुक्त होता है। फलन {{math|''n''-1}} बार प्रयुक्त करने के लिए पूर्ववर्ती फलन को अंक {{mvar|n}} का उपयोग करना चाहिए। | पूर्ववर्ती बनाने के लिए हमें फलन को 1 कम समय में प्रयुक्त करने का एक विधि चाहिए। एक अंक {{mvar|n}} फलन {{mvar|f}} {{mvar|n}} बार {{mvar|x}} पर प्रयुक्त होता है। फलन {{math|''n''-1}} बार प्रयुक्त करने के लिए पूर्ववर्ती फलन को अंक {{mvar|n}} का उपयोग करना चाहिए। | ||
पूर्ववर्ती फलन को प्रयुक्त करने से पहले, यहां योजना है जो मान को कंटेनर फलन में लपेटती है। हम इसके स्थान पर उपयोग करने के लिए नए कार्यों को परिभाषित करेंगे {{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}}.''' | ||
पूर्ववर्ती फलन को प्रयुक्त करने से पहले, यहां एक योजना है जो मान को कंटेनर फलन में लपेटती है। हम {{mvar|f}} और {{mvar|x}} के स्थान पर उपयोग करने के लिए नए कार्यों को परिभाषित करेंगे, जिन्हें {{math|inc}} और {{math|init}} कहा जाता है। कंटेनर फलन को + कहा जाता है। तालिका के बाईं ओर inc और init पर प्रयुक्त अंक n दिखाता है। | पूर्ववर्ती फलन को प्रयुक्त करने से पहले, यहां एक योजना है जो मान को कंटेनर फलन में लपेटती है। हम {{mvar|f}} और {{mvar|x}} के स्थान पर उपयोग करने के लिए नए कार्यों को परिभाषित करेंगे, जिन्हें {{math|inc}} और {{math|init}} कहा जाता है। कंटेनर फलन को + कहा जाता है। तालिका के बाईं ओर {{math|inc}} और {{math|init}} पर प्रयुक्त अंक {{mvar|n}} दिखाता है। | ||
:<math> | :<math> | ||
Line 132: | Line 132: | ||
\end{array} | \end{array} | ||
</math> | </math> | ||
सामान्य पुनरावृत्ति नियम है | |||
:<math> \operatorname{inc}\ (\operatorname{value}\ v) = \operatorname{value}\ (f\ v)</math> | :<math> \operatorname{inc}\ (\operatorname{value}\ v) = \operatorname{value}\ (f\ v)</math> | ||
यदि कंटेनर से मान प्राप्त करने के लिए कोई फलन भी है ( {{math|extract}} कहा जाता है), | यदि कंटेनर से मान प्राप्त करने के लिए कोई फलन भी है ( {{math|extract}} कहा जाता है), | ||
Line 220: | Line 220: | ||
=== विभाग === | === विभाग === | ||
प्राकृतिक संख्याओं का विभाजन (गणित) किसके द्वारा कार्यान्वित किया जा सकता है,<ref> | |||
{{cite web | {{cite web | ||
|last=Allison | |last=Allison | ||
Line 228: | Line 228: | ||
</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> \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> \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>(n-1)/ m</math> का मान देता है। | ||
विभाजित करने से पहले n में 1 जोड़कर इस समस्या को ठीक किया जा सकता है। विभाजन की परिभाषा तब है, | |||
: <math> \operatorname{divide}\ n = \operatorname{divide1}\ (\operatorname{succ}\ n) </math> | : <math> \operatorname{divide}\ n = \operatorname{divide1}\ (\operatorname{succ}\ n) </math> | ||
विभाजित 1 पुनरावर्ती परिभाषा है। पुनरावर्तन को प्रयुक्त करने के लिए [[फिक्स्ड-पॉइंट कॉम्बिनेटर]] का उपयोग किया जा सकता है। डिव बाय; नामक नया फलन बनाएँ; | |||
* वाम भाग में <math> \operatorname{divide1} \rightarrow \operatorname{div} \ c</math> | * वाम भाग में <math> \operatorname{divide1} \rightarrow \operatorname{div} \ c</math> | ||
* दाहिने हाथ में <math> \operatorname{divide1} \rightarrow c </math> | * दाहिने हाथ में <math> \operatorname{divide1} \rightarrow c </math> | ||
Line 261: | Line 261: | ||
देता है, | देता है, | ||
: <math>\scriptstyle \operatorname{divide} = \lambda n.((\lambda f.(\lambda x.x\ x)\ (\lambda x.f\ (x\ x)))\ (\lambda c.\lambda n.\lambda m.\lambda f.\lambda x.(\lambda d.(\lambda n.n\ (\lambda x.(\lambda a.\lambda b.b))\ (\lambda a.\lambda b.a))\ d\ ((\lambda f.\lambda x.x)\ f\ x)\ (f\ (c\ d\ m\ f\ x)))\ ((\lambda m.\lambda n.n (\lambda n.\lambda f.\lambda x.n\ (\lambda g.\lambda h.h\ (g\ f))\ (\lambda u.x)\ (\lambda u.u)) m)\ n\ m)))\ ((\lambda n.\lambda f.\lambda x. f\ (n\ f\ x))\ n) </math> | : <math>\scriptstyle \operatorname{divide} = \lambda n.((\lambda f.(\lambda x.x\ x)\ (\lambda x.f\ (x\ x)))\ (\lambda c.\lambda n.\lambda m.\lambda f.\lambda x.(\lambda d.(\lambda n.n\ (\lambda x.(\lambda a.\lambda b.b))\ (\lambda a.\lambda b.a))\ d\ ((\lambda f.\lambda x.x)\ f\ x)\ (f\ (c\ d\ m\ f\ x)))\ ((\lambda m.\lambda n.n (\lambda n.\lambda f.\lambda x.n\ (\lambda g.\lambda h.h\ (g\ f))\ (\lambda u.x)\ (\lambda u.u)) m)\ n\ m)))\ ((\lambda n.\lambda f.\lambda x. f\ (n\ f\ x))\ n) </math> | ||
या | या {{mvar|λ}} के लिए \ का उपयोग कर पाठ के रूप में | ||
डिवाइड = (\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)) | डिवाइड = (\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)) | ||
Line 272: | Line 272: | ||
=== हस्ताक्षरित संख्या === | === हस्ताक्षरित संख्या === | ||
चर्च अंकों को [[पूर्णांक]] तक विस्तारित करने के लिए सरल दृष्टिकोण चर्च जोड़ी का उपयोग करना है, जिसमें चर्च अंक सकारात्मक और | चर्च अंकों को [[पूर्णांक]] तक विस्तारित करने के लिए सरल दृष्टिकोण चर्च जोड़ी का उपयोग करना है, जिसमें चर्च अंक सकारात्मक और ऋणात्मक मान का प्रतिनिधित्व करते हैं।<ref> | ||
{{cite web | {{cite web | ||
|last=Bauer | |last=Bauer | ||
Line 283: | Line 283: | ||
:<math>\operatorname{convert}_s = \lambda x.\operatorname{pair}\ x\ 0 </math> | :<math>\operatorname{convert}_s = \lambda x.\operatorname{pair}\ x\ 0 </math> | ||
मानो की अदला-बदली करके ऋणात्मकता का प्रदर्शन किया जाता है। | |||
:<math>\operatorname{neg}_s = \lambda x.\operatorname{pair}\ (\operatorname{second}\ x)\ (\operatorname{first}\ x) </math> | :<math>\operatorname{neg}_s = \lambda x.\operatorname{pair}\ (\operatorname{second}\ x)\ (\operatorname{first}\ x) </math> | ||
Line 318: | Line 318: | ||
(\operatorname{mult}\ (\operatorname{first}\ x)\ (\operatorname{second}\ y))\ | (\operatorname{mult}\ (\operatorname{first}\ x)\ (\operatorname{second}\ y))\ | ||
(\operatorname{mult}\ (\operatorname{second}\ x)\ (\operatorname{first}\ y))) </math> | (\operatorname{mult}\ (\operatorname{second}\ x)\ (\operatorname{first}\ y))) </math> | ||
विभाजन के लिए यहाँ समान परिभाषा दी गई है, इस परिभाषा को छोड़कर, प्रत्येक जोड़ी में मान शून्य होना चाहिए (ऊपर | विभाजन के लिए यहाँ समान परिभाषा दी गई है, इस परिभाषा को छोड़कर, प्रत्येक जोड़ी में मान शून्य होना चाहिए (ऊपर वनजीरो देखें)। DivZ फलन हमें शून्य घटक वाले मान को अनदेखा करने की अनुमति देता है। | ||
:<math>\operatorname{divZ} = \lambda x.\lambda y.\operatorname{IsZero}\ y\ 0 \ (\operatorname{divide}\ x\ y) </math> | :<math>\operatorname{divZ} = \lambda x.\lambda y.\operatorname{IsZero}\ y\ 0 \ (\operatorname{divide}\ x\ y) </math> | ||
divZ का उपयोग तब निम्न सूत्र में किया जाता है, जो गुणन के समान है, किन्तु divZ द्वारा प्रतिस्थापित बहु के | divZ का उपयोग तब निम्न सूत्र में किया जाता है, जो गुणन के समान है, किन्तु divZ द्वारा प्रतिस्थापित बहु के साथ है । | ||
:<math>\operatorname{divide}_s = \lambda x.\lambda y.\operatorname{pair}\ | :<math>\operatorname{divide}_s = \lambda x.\lambda y.\operatorname{pair}\ | ||
Line 344: | Line 344: | ||
|date=26 September 2022 | |date=26 September 2022 | ||
|url=https://github.com/andrejbauer/marshall}} | |url=https://github.com/andrejbauer/marshall}} | ||
</ref> दिए गए संदर्भ सॉफ्टवेयर का वर्णन करते हैं | </ref> दिए गए संदर्भ सॉफ्टवेयर का वर्णन करते हैं जो सैद्धांतिक रूप से लैम्ब्डा कैलकुलस में अनुवादित हो सकते हैं। बार वास्तविक संख्या परिभाषित हो जाने के बाद जटिल संख्याएं स्वाभाविक रूप से वास्तविक संख्याओं की जोड़ी के रूप में एन्कोडेड होती हैं। | ||
ऊपर वर्णित डेटा प्रकार और फलन प्रदर्शित करते हैं कि लैम्ब्डा कैलकुलस में किसी भी डेटा प्रकार या गणना को एन्कोड किया जा सकता है। यह चर्च-ट्यूरिंग थीसिस है। | ऊपर वर्णित डेटा प्रकार और फलन प्रदर्शित करते हैं कि लैम्ब्डा कैलकुलस में किसी भी डेटा प्रकार या गणना को एन्कोड किया जा सकता है। यह चर्च-ट्यूरिंग थीसिस है। | ||
=== अन्य अभ्यावेदन के साथ अनुवाद === | === अन्य अभ्यावेदन के साथ अनुवाद === | ||
अधिकांश वास्तविक विश्व की भाषाओं में मशीन-देशी पूर्णांकों का समर्थन है; चर्च और अनचर्च फलन गैर- | अधिकांश वास्तविक विश्व की भाषाओं में मशीन-देशी पूर्णांकों का समर्थन है; चर्च और अनचर्च फलन गैर-ऋणात्मक पूर्णांक और उनके संबंधित चर्च अंकों के बीच परिवर्तित होते हैं। फलन यहां [[हास्केल (प्रोग्रामिंग भाषा)]] में दिए गए हैं, जहां <code>\</code> लैम्ब्डा कैलकुस के λ के अनुरूप है। अन्य भाषाओं में कार्यान्वयन समान हैं। | ||
<syntaxhighlight lang="haskell"> | <syntaxhighlight lang="haskell"> | ||
Line 366: | Line 366: | ||
== चर्च बूलियन्स == | == चर्च बूलियन्स == | ||
चर्च बूलियन सच्चे और झूठे बूलियन | चर्च बूलियन सच्चे और झूठे बूलियन मानो के चर्च एन्कोडिंग हैं। कुछ प्रोग्रामिंग भाषाएं इन्हें बूलियन अंकगणित के कार्यान्वयन मॉडल के रूप में उपयोग करती हैं; उदाहरण स्मालटाक और [[पिको (प्रोग्रामिंग भाषा)]] हैं। | ||
बूलियन तर्क को विकल्प के रूप में माना जा सकता है। सच और झूठ का चर्च एन्कोडिंग दो मापदंडों के फलन हैं: | बूलियन तर्क को विकल्प के रूप में माना जा सकता है। सच और झूठ का चर्च एन्कोडिंग दो मापदंडों के फलन हैं: | ||
Line 377: | Line 377: | ||
\operatorname{false} &\equiv \lambda a.\lambda b.b | \operatorname{false} &\equiv \lambda a.\lambda b.b | ||
\end{align}</math> | \end{align}</math> | ||
यह परिभाषा विधेय (अर्थात सत्य मान लौटाने वाले कार्य) को सीधे-सीधे क्रिया-खंड के रूप में फलन करने की अनुमति देती है। बूलियन लौटाने वाला फलन | यह परिभाषा विधेय (अर्थात सत्य मान लौटाने वाले कार्य) को सीधे-सीधे क्रिया-खंड के रूप में फलन करने की अनुमति देती है। बूलियन लौटाने वाला फलन जिसे दो पैरामीटर पर प्रयुक्त किया जाता है, या तो पहला या दूसरा पैरामीटर देता है: | ||
: <math>\operatorname{predicate-}x\ \operatorname{then-clause}\ \operatorname{else-clause} </math> | : <math>\operatorname{predicate-}x\ \operatorname{then-clause}\ \operatorname{else-clause} </math> | ||
तत्कालीन खंड का मूल्यांकन करता है यदि विधेय-एक्स सत्य का मूल्यांकन करता है | तत्कालीन खंड का मूल्यांकन करता है यदि विधेय-एक्स सत्य का मूल्यांकन करता है और अन्य-खंड का मूल्यांकन करता है यदि विधेय-एक्स गलत का मूल्यांकन करता है। | ||
क्योंकि सत्य और असत्य पहले या दूसरे पैरामीटर का चयन करते हैं, उन्हें लॉजिक ऑपरेटर प्रदान करने के लिए संयोजित किया जा सकता है। ध्यान दें कि नहीं के कई संभावित कार्यान्वयन हैं। | क्योंकि सत्य और असत्य पहले या दूसरे पैरामीटर का चयन करते हैं, उन्हें लॉजिक ऑपरेटर प्रदान करने के लिए संयोजित किया जा सकता है। ध्यान दें कि नहीं के कई संभावित कार्यान्वयन हैं। | ||
Line 406: | Line 406: | ||
== विधेय == | == विधेय == | ||
एक विधेय ऐसा | एक विधेय एक ऐसा कार्य है जो एक बूलियन मान लौटाता है। सबसे मौलिक विधेय <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 462: | Line 462: | ||
* स्कॉट के एन्कोडिंग का उपयोग करके सूची का प्रतिनिधित्व करें जो मिलान अभिव्यक्ति के स्थितियों को तर्क के रूप में लेता है | * स्कॉट के एन्कोडिंग का उपयोग करके सूची का प्रतिनिधित्व करें जो मिलान अभिव्यक्ति के स्थितियों को तर्क के रूप में लेता है | ||
=== सूची नोड | ===== सूची नोड के रूप में दो जोड़े ===== | ||
एक चर्च जोड़ी द्वारा गैर-खाली सूची को प्रयुक्त किया जा सकता है; | एक चर्च जोड़ी द्वारा गैर-खाली सूची को प्रयुक्त किया जा सकता है; | ||
* सबसे पहले सिर होता है। | * सबसे पहले सिर होता है। | ||
* दूसरे में पूंछ होती है। | * दूसरे में पूंछ होती है। | ||
चूँकि यह खाली सूची का प्रतिनिधित्व नहीं देता है | चूँकि यह खाली सूची का प्रतिनिधित्व नहीं देता है क्योंकि कोई अशक्त सूचक नहीं है। शून्य का प्रतिनिधित्व करने के लिए, जोड़ी को दूसरी जोड़ी में लपेटा जा सकता है, जिससे तीन मान मिलते हैं: | ||
* सबसे पहले - अशक्त सूचक (खाली सूची)। | * सबसे पहले - अशक्त सूचक (खाली सूची)। | ||
* दूसरा। पहले में सिर होता है। | * दूसरा। पहले में सिर होता है। | ||
Line 497: | Line 496: | ||
|- | |- | ||
|<math> \operatorname{head} \equiv \lambda z.\operatorname{first}\ (\operatorname{second} z) </math> | |<math> \operatorname{head} \equiv \lambda z.\operatorname{first}\ (\operatorname{second} z) </math> | ||
| दूसरा.पहला ''शीर्ष'' है। | | दूसरा.पहला ''शीर्ष'' है। | ||
|- | |- | ||
| <math> \operatorname{tail} \equiv \lambda z.\operatorname{second}\ (\operatorname{second} z) </math> | | <math> \operatorname{tail} \equiv \lambda z.\operatorname{second}\ (\operatorname{second} z) </math> | ||
Line 514: | Line 513: | ||
\operatorname{isnil} &\equiv \lambda l.l (\lambda h.\lambda t.\lambda d.\operatorname{false}) \operatorname{true} | \operatorname{isnil} &\equiv \lambda l.l (\lambda h.\lambda t.\lambda d.\operatorname{false}) \operatorname{true} | ||
\end{align}</math> | \end{align}</math> | ||
जहां अंतिम परिभाषा सामान्य का विशेष | जहां अंतिम परिभाषा सामान्य का विशेष स्थति है | ||
: <math>\operatorname{process-list} \equiv \lambda l.l (\lambda h.\lambda t.\lambda d. \operatorname{head-and-tail-clause}) \operatorname{nil-clause} </math> | : <math>\operatorname{process-list} \equiv \lambda l.l (\lambda h.\lambda t.\lambda d. \operatorname{head-and-tail-clause}) \operatorname{nil-clause} </math> | ||
===== राइट फोल्ड का उपयोग करके सूची का प्रतिनिधित्व करें ===== | |||
=== राइट फोल्ड | चर्च जोड़े का उपयोग करके एन्कोडिंग के विकल्प के रूप में, सूची को इसके फोल्ड (उच्च-क्रम फलन ) के साथ पहचान कर एन्कोड किया जा सकता है। उदाहरण के लिए, तीन तत्वों x, y और z की सूची को उच्च-क्रम फलन द्वारा एन्कोड किया जा सकता है जब कॉम्बिनेटर c पर प्रयुक्त किया जाता है और मान n रिटर्न c x (c y (c z n)) देता है। | ||
चर्च जोड़े का उपयोग करके एन्कोडिंग के विकल्प के रूप में, सूची को इसके फोल्ड (उच्च-क्रम फलन ) के साथ पहचान कर एन्कोड किया जा सकता है। उदाहरण के लिए, तीन तत्वों x, y और z की सूची को उच्च-क्रम फलन द्वारा एन्कोड किया जा सकता है | |||
: <math> | : <math> | ||
Line 533: | Line 530: | ||
इस सूची प्रतिनिधित्व को [[सिस्टम एफ|प्रणाली एफ]] में टाइप किया जा सकता है। | इस सूची प्रतिनिधित्व को [[सिस्टम एफ|प्रणाली एफ]] में टाइप किया जा सकता है। | ||
=== स्कॉट एन्कोडिंग | ===== स्कॉट एन्कोडिंग का उपयोग करके सूची का प्रतिनिधित्व करें ===== | ||
एक वैकल्पिक प्रतिनिधित्व स्कॉट एन्कोडिंग है जो निरंतरता के विचार का उपयोग करता है और सरल कोड को जन्म दे सकता है।<ref>{{cite book | |||
एक वैकल्पिक प्रतिनिधित्व स्कॉट एन्कोडिंग है | |||
| last = Jansen | first = Jan Martin | | last = Jansen | first = Jan Martin | ||
| editor1-last = Achten | editor1-first = Peter | | editor1-last = Achten | editor1-first = Peter | ||
Line 548: | Line 544: | ||
| year = 2013}}</ref> (मोजेन्सन-स्कॉट एन्कोडिंग भी देखें)। | | year = 2013}}</ref> (मोजेन्सन-स्कॉट एन्कोडिंग भी देखें)। | ||
इस दृष्टिकोण में, हम इस तथ्य का उपयोग करते हैं कि | इस दृष्टिकोण में, हम इस तथ्य का उपयोग करते हैं कि प्रतिरूप मिलान अभिव्यक्ति का उपयोग करके सूचियों को देखा जा सकता है। उदाहरण के लिए, [[ स्काला (प्रोग्रामिंग भाषा) |स्काला (प्रोग्रामिंग भाषा)]] नोटेशन का उपयोग करते हुए, यदि <code>List</code> खाली सूची <code>Nil</code> और कंस्ट्रक्टर Cons(h, t) के साथ प्रकार <code>list</code> के मान को दर्शाती है, तो हम सूची का निरीक्षण कर सकते हैं और सूची के खाली होने की स्थिति में <code>nilCode</code> और {{code|consCode(h, t)}} की गणना कर सकते हैं। सूची खाली नहीं है: | ||
<syntaxhighlight lang="scala"> | <syntaxhighlight lang="scala"> | ||
list match { | list match { | ||
Line 555: | Line 551: | ||
} | } | ||
</syntaxhighlight> | </syntaxhighlight> | ||
{{code|list}st}} यह | यह {{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} | ||
</math> | </math> | ||
आइए | आइए {{code|nilCode}} के अनुरूप पैरामीटर {{code|n}} द्वारा और {{code|consCode}}के अनुरूप पैरामीटर {{code|c}} द्वारा निरूपित करें। खाली सूची वह है जो शून्य तर्क लौटाती है: | ||
खाली सूची वह है जो शून्य तर्क लौटाती है: | '''खाली सूची वह है जो शून्य तर्क लौटाती है: ००००''' | ||
: <math> | : <math> | ||
\operatorname{nil} \equiv \lambda n. \lambda c.\ n | \operatorname{nil} \equiv \lambda n. \lambda c.\ n | ||
Line 569: | Line 565: | ||
\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> पैरामीटर के साथ एक फलन बन जाता है। जब iवें कंस्ट्रक्टर में <math>n_i</math> तर्क होते हैं, तो एन्कोडिंग के संबंधित पैरामीटर <math>n_i</math> तर्क भी लेते हैं। | ||
स्कॉट एन्कोडिंग अनटाइप्ड लैम्ब्डा कैलकुलस में किया जा सकता है, जबकि टाइप्स के साथ इसके उपयोग के लिए रिकर्सन और टाइप पॉलीमोर्फिज्म के साथ टाइप प्रणाली की आवश्यकता होती है। इस प्रतिनिधित्व में तत्व प्रकार | स्कॉट एन्कोडिंग अनटाइप्ड लैम्ब्डा कैलकुलस में किया जा सकता है, जबकि टाइप्स के साथ इसके उपयोग के लिए रिकर्सन और टाइप पॉलीमोर्फिज्म के साथ टाइप प्रणाली की आवश्यकता होती है। इस प्रतिनिधित्व में तत्व प्रकार E के साथ सूची जिसका उपयोग प्रकार C के मानो की गणना करने के लिए किया जाता है, निम्नलिखित पुनरावर्ती प्रकार की परिभाषा होगी, जहां '=>' फलन प्रकार को दर्शाता है: | ||
<syntaxhighlight lang="scala"> | <syntaxhighlight lang="scala"> | ||
type List = | type List = | ||
Line 578: | Line 574: | ||
C // result of pattern matching | C // result of pattern matching | ||
</syntaxhighlight> | </syntaxhighlight> | ||
एक सूची जिसका उपयोग मनमानी प्रकारों की गणना करने के लिए किया जा सकता है, में प्रकार होगा जो | |||
एक सूची जिसका उपयोग मनमानी प्रकारों की गणना करने के लिए किया जा सकता है, में एक प्रकार होगा जो <code>C</code>से अधिक मात्रा में होता है। <code>E</code> में एक सामान्य सूची भी <code>E</code> को प्रकार तर्क के रूप में ले जाएगा। | |||
== यह भी देखें == | == यह भी देखें == | ||
Line 584: | Line 582: | ||
* टाइप किए गए कलन में चर्च अंकों के लिए प्रणाली एफ | * टाइप किए गए कलन में चर्च अंकों के लिए प्रणाली एफ | ||
* मोगेनसेन-स्कॉट एन्कोडिंग | * मोगेनसेन-स्कॉट एन्कोडिंग | ||
* क्रमसूचक संख्या या वॉन न्यूमैन क्रमसूचकों की परिभाषा - प्राकृतिक संख्याओं को सांकेतिक शब्दों में बदलने का दूसरा विधि : समुच्चय के रूप में | * क्रमसूचक संख्या या वॉन न्यूमैन क्रमसूचकों की परिभाषा - प्राकृतिक संख्याओं को सांकेतिक शब्दों में बदलने का दूसरा विधि: समुच्चय के रूप में | ||
== संदर्भ == | == संदर्भ == |
Revision as of 12:10, 21 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-1 बार प्रयुक्त करने के लिए पूर्ववर्ती फलन को अंक n का उपयोग करना चाहिए।
पूर्ववर्ती फलन को प्रयुक्त करने से पहले, यहां योजना है जो मान को कंटेनर फलन में लपेटती है। हम इसके स्थान पर उपयोग करने के लिए नए कार्यों को परिभाषित करेंगे f और x, बुलाया inc और init. कंटेनर फलन कहा जाता है value. तालिका के बाईं ओर अंक दिखाता है n के लिए आवेदन किया inc और init.
पूर्ववर्ती फलन को प्रयुक्त करने से पहले, यहां एक योजना है जो मान को कंटेनर फलन में लपेटती है। हम f और x के स्थान पर उपयोग करने के लिए नए कार्यों को परिभाषित करेंगे, जिन्हें inc और init कहा जाता है। कंटेनर फलन को + कहा जाता है। तालिका के बाईं ओर inc और init पर प्रयुक्त अंक n दिखाता है।
सामान्य पुनरावृत्ति नियम है
यदि कंटेनर से मान प्राप्त करने के लिए कोई फलन भी है ( extract कहा जाता है),
तब extract का उपयोग samenum कार्य को परिभाषित करने के लिए किया जा सकता है,
samenum}um कार्य आंतरिक रूप से उपयोगी नहीं है। चूँकि, जैसा कि inc प्रतिनिधियों ने अपने कंटेनर तर्क के लिए f को कॉल किया है, हम यह व्यवस्थित कर सकते हैं कि पहले एप्लिकेशन inc पर एक विशेष कंटेनर प्राप्त होता है जो f के पहले एप्लिकेशन को छोड़ने की अनुमति देने वाले इसके तर्क को अनदेखा करता है। इस नए प्रारंभिक कंटेनर को कॉल करें। उपरोक्त तालिका का दाहिना भाग n inc const के विस्तार को दर्शाता है। फिर same फलन के व्यंजक में init को const से प्रतिस्थापित करने पर हमें पूर्ववर्ती फलन प्राप्त होता है,
जैसा कि कार्यों के नीचे समझाया गया है inc, init, const, value और extract के रूप में परिभाषित किया जा सकता है,
जो pred के रूप में लैम्ब्डा अभिव्यक्ति देता है जैसा,
वैल्यू कंटेनरमान कंटेनर फलन को उसके मान पर प्रयुक्त करता है। इसके द्वारा परिभाषित किया गया है, इसलिए, इंकinc}nc फलन को v युक्त मान लेना चाहिए, और f v युक्त एक नया मान वापस करना चाहिए। g को मान कंटेनर होने दें, तब, इसलिए, |
निकालेंपहचान फलन प्रयुक्त करके मान निकाला जा सकता है, I का उपयोग करते हुए , इसलिए,
स्थिरांकpred को प्रयुक्त करने के लिए init फलन को उस const से बदल दिया जाता है जो f प्रयुक्त नहीं होता है। हमें संतुष्ट करने के लिए const की आवश्यकता है, जो संतुष्ट है यदि , या लैम्ब्डा अभिव्यक्ति के रूप में, |
पूर्व को परिभाषित करने का अन्य विधि
जोड़े का उपयोग करके पूर्व को भी परिभाषित किया जा सकता है:
यह सरल परिभाषा है, किन्तु पूर्व के लिए अधिक जटिल अभिव्यक्ति की ओर ले जाती है।
के लिए विस्तार :
विभाग
प्राकृतिक संख्याओं का विभाजन (गणित) किसके द्वारा कार्यान्वित किया जा सकता है,[4]
की गणना करने में कई बीटा कटौती होती है। जब तक हाथ से कटौती नहीं कर रहा है, इससे कोई फर्क नहीं पड़ता, किन्तु यह उत्तम है कि इस गणना को दो बार न करना पड़े। परीक्षण संख्याओं के लिए सबसे सरल विधेय इस्ज़ेरो है इसलिए स्थिति पर विचार करें।
किन्तु यह स्थिति के समतुल्य है, न कि यदि इस अभिव्यक्ति का उपयोग किया जाता है तो ऊपर दी गई विभाजन की गणितीय परिभाषा को चर्च के अंकों पर कार्य में अनुवादित किया जाता है,
वांछित के रूप में, इस परिभाषा में के लिए एक ही कॉल है। चूँकि परिणाम यह है कि यह सूत्र का मान देता है।
विभाजित करने से पहले n में 1 जोड़कर इस समस्या को ठीक किया जा सकता है। विभाजन की परिभाषा तब है,
विभाजित 1 पुनरावर्ती परिभाषा है। पुनरावर्तन को प्रयुक्त करने के लिए फिक्स्ड-पॉइंट कॉम्बिनेटर का उपयोग किया जा सकता है। डिव बाय; नामक नया फलन बनाएँ;
- वाम भाग में
- दाहिने हाथ में
पाने के लिए और,
तब,
जहां ,
देता है,
या λ के लिए \ का उपयोग कर पाठ के रूप में
डिवाइड = (\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 फलन इस स्थिति को प्राप्त करता है,
रिकर्सन को वाई कॉम्बिनेटर का उपयोग करके कार्यान्वित किया जा सकता है,
प्लस और माइनस
जोड़ी पर जोड़ को गणितीय रूप से परिभाषित किया गया है,
अंतिम अभिव्यक्ति का लैम्ब्डा कैलकुलस में अनुवाद किया गया है,
इसी प्रकार घटाव परिभाषित किया गया है,
देना,
गुणा और भाग
गुणन द्वारा परिभाषित किया जा सकता है,
अंतिम अभिव्यक्ति का लैम्ब्डा कैलकुलस में अनुवाद किया गया है,
विभाजन के लिए यहाँ समान परिभाषा दी गई है, इस परिभाषा को छोड़कर, प्रत्येक जोड़ी में मान शून्य होना चाहिए (ऊपर वनजीरो देखें)। 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
खाली सूची Nil
और कंस्ट्रक्टर Cons(h, t) के साथ प्रकार list
के मान को दर्शाती है, तो हम सूची का निरीक्षण कर सकते हैं और सूची के खाली होने की स्थिति में nilCode
और consCode(h, t)
की गणना कर सकते हैं। सूची खाली नहीं है:
list match {
case Nil => nilCode
case Cons(h, t) => consCode(h,t)
}
यहlist}st
दी गई है कि यहnilCode
औरconsCode
पर कैसे कार्य करता है। इसलिए हम एक सूची को एक फलन के रूप में परिभाषित करते हैं जो ऐसेnilCode
औरconsCode
को तर्कों के रूप में स्वीकार करता है, जिससे उपरोक्त प्रतिरूप मिलान के अतिरिक्त हम बस लिख सकें:
आइए nilCode
के अनुरूप पैरामीटर n
द्वारा और consCode
के अनुरूप पैरामीटर c
द्वारा निरूपित करें। खाली सूची वह है जो शून्य तर्क लौटाती है:
खाली सूची वह है जो शून्य तर्क लौटाती है: ००००
सिर के साथ गैर-खाली सूची h
और पूंछ t
द्वारा दिया गया है
अधिक सामान्यतः विकल्पों के साथ बीजगणितीय डेटा प्रकार पैरामीटर के साथ एक फलन बन जाता है। जब iवें कंस्ट्रक्टर में तर्क होते हैं, तो एन्कोडिंग के संबंधित पैरामीटर तर्क भी लेते हैं।
स्कॉट एन्कोडिंग अनटाइप्ड लैम्ब्डा कैलकुलस में किया जा सकता है, जबकि टाइप्स के साथ इसके उपयोग के लिए रिकर्सन और टाइप पॉलीमोर्फिज्म के साथ टाइप प्रणाली की आवश्यकता होती है। इस प्रतिनिधित्व में तत्व प्रकार E के साथ सूची जिसका उपयोग प्रकार C के मानो की गणना करने के लिए किया जाता है, निम्नलिखित पुनरावर्ती प्रकार की परिभाषा होगी, जहां '=>' फलन प्रकार को दर्शाता है:
type List =
C => // nil argument
(E => List => C) => // cons argument
C // result of pattern matching
एक सूची जिसका उपयोग मनमानी प्रकारों की गणना करने के लिए किया जा सकता है, में एक प्रकार होगा जो C
से अधिक मात्रा में होता है। 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