Λ-पथरी , या लैम्ब्डा पथरी, एक तार्किक अनाम प्रक्रियाएं पर आधारित प्रणाली है। उदाहरण के लिए, यह एक λ-अभिव्यक्ति है:
λf.(λx.xx)(λx.f(xx))
हालाँकि, इस चुनौती के प्रयोजनों के लिए, हम इस अधिसूचना को सरल करेंगे:
- बदलने के
λ
लिए\
(टाइप करने के लिए यह आसान बनाने के लिए):\f.(\x.xx)(\x.f(xx))
.
लैम्ब्डा हेडर में, अनावश्यक है तो हम इसे छोड़ कर सकते हैं:\f(\xxx)(\xf(xx))
- दो कार्यों को एक साथ लिखने के बजाय आवेदन के साथ अनलम्बास्टाइल -उपसर्ग उपसर्ग संकेतन का उपयोग करें
`
(यह कैसे करें की पूरी व्याख्या के लिए , लैंबडा कैलकुलस नोटिफ़िकेशन के बीच कनवर्ट देखें ):\f`\x`xx\x`f`xx
- यह सबसे जटिल प्रतिस्थापन है। प्रत्येक चर को कोष्ठक में एक संख्या के साथ बदलें, इस आधार पर कि चर कितना गहरा घोंसला है, यह लैम्बडा हेडर के सापेक्ष है (जिसका उपयोग 0-आधारित डी ब्रूजन इंडेक्सिंग है )। उदाहरण के लिए,
\xx
(पहचान फ़ंक्शन)x
में, शरीर[0]
में चर को बदल दिया जाएगा , क्योंकि यह पहले (0-आधारित) हेडर से संबंधित है, जब अभिव्यक्ति को चर से अंत तक ट्रेस किया जाता है;\x\y``\x`xxxy
में परिवर्तित हो जाएगा\x\y``\x`[0][0][1][0]
। अब हम हेडर में चर छोड़ सकते हैं, छोड़कर\\``\`[0][0][1][0]
।
संयुक्त तर्क मूल रूप से एक ट्यूरिंग टारपिट है जो λ- पथरी से बना है (ठीक है, वास्तव में, यह पहले आया था, लेकिन यहां अप्रासंगिक है।)
"संयोजन तर्क को लैम्ब्डा कैलकुलस के एक प्रकार के रूप में देखा जा सकता है, जिसमें लैम्बडा एक्सप्रेशंस (कार्यात्मक अमूर्तता का प्रतिनिधित्व करते हैं) को कॉम्बिनेटरों के सीमित सेट द्वारा प्रतिस्थापित किया जाता है, आदिम फ़ंक्शंस जिसमें से बाध्य चर अनुपस्थित होते हैं।" 1
कॉम्बिनेटर लॉजिक का सबसे सामान्य प्रकार एसके कॉम्बिनेटर कैलकुलस है , जो निम्नलिखित प्राइमेटिव का उपयोग करता है:
K = λx.λy.x
S = λx.λy.λz.xz(yz)
कभी-कभी एक कॉम्बीनेटर I = λx.x
जोड़ा जाता है, लेकिन यह निरर्थक है, जैसा SKK
(या वास्तव SKx
में किसी के लिए x
) के बराबर है I
।
आप सभी की जरूरत है कश्मीर, एस, और आवेदन λ-पथरी में किसी भी अभिव्यक्ति को एनकोड करने में सक्षम होने के लिए। एक उदाहरण के रूप में, यहाँ फ़ंक्शन λf.(λx.xx)(λx.f(xx))
से कॉम्बिनेशन लॉजिक का अनुवाद है :
λf.(λx.xx)(λx.f(xx)) = S(K(λx.xx))(λf.λx.f(xx))
λx.f(xx) = S(Kf)(S(SKK)(SKK))
λf.λx.f(xx) = λf.S(Kf)(S(SKK)(SKK))
λf.S(Sf)(S(SKK)(SKK)) = S(λf.S(Sf))(K(S(SKK)(SKK)))
λf.S(Sf) = S(KS)S
λf.λx.f(xx) = S(S(KS)S)(K(S(SKK)(SKK)))
λx.xx = S(SKK)(SKK)
λf.(λx.xx)(λx.f(xx)) = S(K(S(SKK)(SKK)))(S(S(KS)S)(K(S(SKK)(SKK))))
चूंकि हम उपसर्ग संकेतन का उपयोग कर रहे हैं, यह है ```S`K``S``SKK``SKK``S``S`KSS`K``SKK`
।
1 स्रोत: विकिपीडिया
चुनौती
अब तक, आपने शायद अनुमान लगाया है कि क्या है: एक प्रोग्राम लिखें जो एक मान्य λ-अभिव्यक्ति लेता है (ऊपर वर्णित संकेतन में) इनपुट और आउटपुट (या रिटर्न) के रूप में एक ही फ़ंक्शन, SK-combinator पथरी में फिर से लिखा गया। ध्यान दें कि इसे फिर से लिखने के लिए अनंत तरीके हैं; आपको केवल अनंत तरीकों में से एक को आउटपुट करने की आवश्यकता है।
यह कोड-गोल्फ है , इसलिए सबसे कम वैध जमा (बाइट्स में मापा गया) जीतता है।
परीक्षण के मामलों
प्रत्येक परीक्षण के मामले में एक संभव उत्पादन दिखाता है। शीर्ष पर अभिव्यक्ति बराबर λ-पथरी अभिव्यक्ति है।
λx.x:
\[0] -> ``SKK
λx.xx:
\`[0][0] -> ```SKK``SKK
λx.λy.y:
\\[0] -> `SK
λx.λy.x:
\\[1] -> K
λx.λy.λz.xz(yz):
\\\``[2][0]`[1][0] -> S
λw.w(λx.λy.λz.xz(yz))(λx.λy.x):
\``[0]\\[1]\\\``[2][0]`[1][0] -> ``S``SI`KS`KK
λx.f(xx) = S(Kf)(SKK)
? क्या यह नहीं होना चाहिए λx.f(xx) = S(Kf)(SII) = S(Kf)(S(SKK)(SKK))
? परिवर्तित करते समय λx.f(xx)
, मुझे वह मिलता है S {λx.f} {λx.xx}
जो कम हो जाता है S (Kf) {λx.xx}
और कोष्ठक में अभिव्यक्ति के अलावा और कुछ नहीं है ω=λx.xx
, जिसे हम जानते हैं कि SII = S(SKK)(SKK)
सही के रूप में दर्शाया गया है ?
SII
, नहीं SKK
। वह एक ग़लती थी।