लैम्ब्डा कैलकुलस का उपयोग करके नकारात्मक और जटिल संख्याओं का प्रतिनिधित्व करना


14

लैंबडा कैलकुलस के अधिकांश ट्यूटोरियल उदाहरण प्रदान करते हैं जहां पॉजिटिव इंटेगर और बूलियंस को कार्य द्वारा दर्शाया जा सकता है। क्या -1 और मैं?

जवाबों:


18

पहले प्राकृतिक संख्याओं और युग्मों को सांकेतिक शब्दों में बदलना, जैसा कि जैम द्वारा वर्णित है।

एक पूर्णांक k को प्राकृतिक संख्याओं (a,b) जैसे कि जोड़े के रूप में प्रस्तुत करेंk=ab । तब आप पूर्णांक पर सामान्य संचालन को परिभाषित कर सकते हैं ( λ -calculus के लिए हास्केल संकेतन का उपयोग करके ):

neg = \k -> (snd k, fst k)
add = \k m -> (fst k + fst m, snd k + snd m)
sub = \k m -> add k (neg m)
mul = \k m -> (fst k * fst m + snd k * snd m, fst k * snd m + snd k * fst m)

जटिल संख्याओं का मामला इस अर्थ में समान है कि एक जटिल संख्या को वास्तविक की जोड़ी के रूप में एन्कोड किया गया है। लेकिन एक अधिक जटिल सवाल यह है कि वास्तविक को कैसे एन्कोड किया जाए। यहाँ आपको अधिक काम करना होगा:

  1. एक जोड़ी ( k , a ) जहां k एक पूर्णांक है, एक प्राकृतिक है, और q = k / ( 1 + a ) के रूप में एक परिमेय संख्या को एनकोड करें ।q(k,a)kaq=k/(1+a)
  2. सांकेतिक शब्दों में बदलना एक वास्तविक संख्या एक समारोह से ऐसी है कि हर प्राकृतिक के लिए कश्मीर एन , कश्मीर encodes एक तर्कसंगत संख्या क्ष ऐसा है कि | x - q | < 2 - के । दूसरे शब्दों में, वास्तविक k दर 2 - k पर इसे रूपांतरित करने वाले अनुक्रमों के अनुक्रम के रूप में एन्कोडेड है ।xfkNfkq|xq|<2kk2k

वास्तविक एन्कोडिंग बहुत काम है और आप वास्तव में इसे -calculus में नहीं करना चाहते हैं । लेकिन उदाहरण के लिए देखें शुद्ध हास्केल में वास्तविक के सरल कार्यान्वयन के लिए मार्शल की उपनिर्देशिका । इस सिद्धांत को शुद्ध λ -culculus में अनुवादित किया जा सकता है ।λetc/haskellλ


1
वाह =) मैं सहज रूप से सोच रहा हूं कि इसका क्या अर्थ है ... उदाहरण के लिए, चर्च संख्या एन्कोडिंग का उपयोग करके ... अर्थात। पूर्णांक मान n की एक चर्च संख्या एक फ़ंक्शन द्वारा दर्शाई गई है जो फ़ंक्शन को मान n पर लागू करती है। क्या जोड़े और नकारात्मक लैम्ब्डा मूल्यों में उनके बारे में समान सहज ज्ञान है?
१२:४

1
चर्च एन्कोडिंग प्राकृतिक संख्याओं को , 1 , 2 , ... को सांकेतिक शब्दों में बदलना नहीं है। ऊपर दिए गए उत्तर में मैंने माना कि आप पहले से ही प्राकृतिक संख्याओं के एक एन्कोडिंग के बारे में जानते हैं, इसलिए मैंने समझाया कि पूर्णांक कैसे प्राप्त करें। पूर्णांक के रूप में मैंने उन्हें एन्कोड किया, चर्च अंकों के विपरीत एक अधिक औपचारिक निर्माण है, जो λ -calculus के साथ अधिक जटिल रूप से जुड़े हुए हैं । मुझे नहीं लगता कि "नकारात्मक लंबोदा मूल्य" एक सार्थक वाक्यांश है। 012λ
बाउर

@zcaudate [प्रकार एनोटेशन: i:ℤ, x:a, f,u,s:a→a, p:(a→a,a→a)] क्या आप ℤ के रूप में सांकेतिक शब्दों में बदलना है, तो (Sign,ℕ)फिर, कार्यों की एक जोड़ी दिया (s,f)के रूप में p, इस शब्द λi.λp.λx.(fst i) (fst p) id ((snd i) (snd p) x)का उत्पादन करेगा या तो f(…f(x)…)या s(f(…f(x)…))(परिणाम नकारात्मक है)। आप के रूप में ℤ सांकेतिक शब्दों में बदलना है, तो (ℕ,ℕ), आप एक समारोह एक व्युत्क्रम है कि जरूरत है - एक जोड़ी दिया (f,u)और x, समारोह λi.λp.λx.(snd i)(snd p)((fst i)(fst p) x)का उत्पादन करेगा u(…u(f(…f(x)…))…)जो छोड़ देंगे fलागू iकरने के लिए बार x। दोनों अलग-अलग संदर्भों में काम करते हैं (परिणाम "फ़्लिप किया जा सकता है" f) उल्टा है)।
कोई नहीं

@zcaudate चर्च-एन्कोडेड संख्या "अपने दम पर पुनरावृत्ति" के रूप में अतिरिक्त कार्य आवश्यक हैं, लेकिन जोड़े केवल आपके घटकों को सौंप देंगे। सहायक कार्य केवल "सही" क्रम में घटकों को एक साथ गोंद करता है (जो स्वचालित रूप से nats के लिए हो रहा है।) इन्हें भी देखें: en.wikipedia.org/wiki/… - चर्च एन्कोडिंग मूल रूप fold . ctorसे किसी भी निर्माता के लिए है और उस प्रकार का fold( r) है। (यही कारण है कि, पुनरावर्ती प्रकारों के लिए, डेटा "अपने दम पर पुनरावृत्ति करेगा"। गैर-पुनरावर्ती प्रकारों के लिए यह एक case/ पैटर्न मैच की तरह अधिक है ।)
कोई नहीं

13

लैम्ब्डा-कैलकुलस अधिकांश डेटा संरचनाओं और बुनियादी प्रकारों को एन्कोड कर सकता है। उदाहरण के लिए, आप लैम्ब्डा कैलकुलस में मौजूदा शब्दों की एक जोड़ी को एन्कोड कर सकते हैं , उसी चर्च एन्कोडिंग का उपयोग करते हुए जिसे आप आमतौर पर नॉनजेंटिव पूर्णांक और बूलियन को एनकोड करने के लिए देखते हैं:

fst = λ p p ( λ x y x ) snd = λ p p ( λ x y y )

pair=λxyz.zxy
fst=λp.p(λxy.x)
snd=λp.p(λxy.y)

फिर जोड़ी है पी = ( जोड़ी  एक ) और तुम वापस पाने के लिए चाहते हैं, तो एक और आप कर सकते हैं ( FST  पी ) और ( SND  पी )(a,b)p=(pair ab)ab(fst p)(snd p)

इसका मतलब है कि आप आसानी से एक जोड़ी के साथ सकारात्मक और नकारात्मक पूर्णांक का प्रतिनिधित्व कर सकते हैं: बाईं ओर संकेत और दाईं ओर पूर्ण मान। संकेत एक बूलियन है जो निर्दिष्ट करता है कि संख्या सकारात्मक है या नहीं। चर्च एन्कोडिंग का उपयोग करके दाईं ओर एक प्राकृतिक संख्या है।

(sign,n)

और अब जब आपके पास रिश्तेदार पूर्णांक हैं। गुणन को परिभाषित करना आसान है, आपको बस साइन पर फ़ंक्शनxor लागू करना होगा और निरपेक्ष मान पर प्राकृतिक संख्याओं पर गुणा करना होगा :

mult=λab.pair  (xor(fst a)(fst b))  (mult(snd a)(snd b))

इसके अलावा परिभाषित करने के लिए, आपको दो प्राकृतिक संख्याओं की तुलना करनी होगी और संकेत अलग-अलग होने पर घटाव का उपयोग करना होगा, इसलिए यह एक λ-टर्म नहीं है, लेकिन यदि आप वास्तव में चाहते हैं तो आप इसे अनुकूलित कर सकते हैं:

add=λab.{(true,add(snd a)(snd b))if a0b0(false,add(snd a)(snd b))if a<0b<0(true,sub(snd a)(snd b))if a0b<0|a||b|(false,sub(snd b)(snd a))if a0b<0|a|<|b|(true,sub(snd b)(snd a))if a<0b0|a|<|b|(false,sub(snd a)(snd b))if a<0b0|a||b|

लेकिन तब घटाव को परिभाषित करना बहुत आसान है:

minus=λa.pair(not(fst a))(snd a)
sub=λab.add(a)(minusb)

(a,b)a+bi

add[i]=λz1z2.pair(add(fst z1)(fst z2))(add(snd z1)(snd z2))

6
k(a,b)k=ab

जटिल पूर्णांक ठीक है, लेकिन वह जटिल संख्या के लिए पूछ रहा था। फिर से, वे निश्चित रूप से प्रतिनिधित्व नहीं कर सकते हैं क्योंकि वहाँ बेशुमार हैं।
HdM

@AndrejBauer: बहुत अच्छी चाल (शायद इतना आसान नहीं) HdM: यकीन है कि वे कर सकते हैं, यहां तक ​​कि उन सभी में नहीं। लेकिन मुझे लगा कि चर्च एन्कोडिंग के साथ λ-पथरी में सामान बनाने की विधि यहां अधिक महत्वपूर्ण / उपयुक्त थी।
11

काश मैं दो सही उत्तर दे पाता =) मैं यह भी नहीं सोच रहा था कि जब मैं जटिल संख्याओं के बारे में पूछूं तो वास्तविक का प्रतिनिधित्व किया जा सकता है, लेकिन आप जाते हैं!
zaudate
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.