चुनौती यह है कि जितने संभव हो उतने लैंबडा कैलकुलस के लिए एक दुभाषिया लिखें । हम अप्रकाशित लैम्ब्डा कैलकुलस को इस प्रकार परिभाषित करते हैं:
वाक्य - विन्यास
निम्नलिखित तीन प्रकार के भाव हैं:
एक लैम्ब्डा अभिव्यक्ति का वह रूप है
(λ x. e)जहाँxकोई भी कानूनी चर नाम औरeकोई कानूनी अभिव्यक्ति हो सकती है। यहांxपैरामीटरeकहा जाता है और फ़ंक्शन बॉडी कहा जाता है।सादगी की खातिर हम आगे प्रतिबंध लगाते हैं कि एक ही नाम के साथ एक चर नहीं होना चाहिए जैसा कि
xवर्तमान में गुंजाइश है। एक चर उस दायरे में होना शुरू होता है जब उसका नाम बीच में दिखाई देता है(λऔर.इसी के दायरे में होना बंद हो जाता है)।- समारोह आवेदन फार्म है
(f a)जहांfऔरaकानूनी अभिव्यक्ति कर रहे हैं। यहांfफ़ंक्शनaको कहा जाता है और तर्क कहा जाता है। - एक वैरिएबल का वह रूप है
xजहांxएक कानूनी वैरिएबल नाम है।
शब्दार्थ
फ़ंक्शन में पैरामीटर की प्रत्येक घटना को उसके तर्क के साथ प्रतिस्थापित करके एक फ़ंक्शन लागू किया जाता है। अधिक औपचारिक रूप से प्रपत्र की एक अभिव्यक्ति ((λ x. e) a)है, जहां xएक चर नाम है और eऔर aभाव, मूल्यांकन करता है (या कम कर देता है) अभिव्यक्ति कर रहे हैं e'जहां e'से प्रत्येक घटना की जगह का परिणाम है xमें eसाथ a।
एक सामान्य रूप एक अभिव्यक्ति है जिसका मूल्यांकन आगे नहीं किया जा सकता है।
चुनौती
आपका मिशन, क्या आपको इसे स्वीकार करना चाहिए, एक दुभाषिया लिखना है जो अपने इनपुट के रूप में बिना किसी मुक्त चर वाले लांपा कलन की अभिव्यक्ति लेता है और इसका आउटपुट अभिव्यक्ति के सामान्य रूप (या एक अभिव्यक्ति अल्फा-अनुरूप) के रूप में होता है। । यदि अभिव्यक्ति का कोई सामान्य रूप नहीं है या यह एक मान्य अभिव्यक्ति नहीं है, तो व्यवहार अपरिभाषित है।
सबसे छोटी संख्या वाले वर्णों का समाधान जीत जाता है।
नोटों की एक जोड़ी:
- इनपुट या तो स्टड से पढ़ा जा सकता है या कमांड लाइन तर्क के रूप में दिए गए फ़ाइलनाम से (आपको केवल एक या दूसरे को लागू करने की आवश्यकता है - दोनों नहीं)। आउटपुट स्टडआउट जाता है।
- वैकल्पिक रूप से आप एक फ़ंक्शन को परिभाषित कर सकते हैं जो इनपुट को स्ट्रिंग के रूप में लेता है और आउटपुट को स्ट्रिंग के रूप में वापस करता है।
- यदि गैर-ASCII वर्ण आपके लिए समस्याग्रस्त हैं, तो आप
\λ के बजाय बैकस्लैश ( ) वर्ण का उपयोग कर सकते हैं । - हम वर्णों की संख्या की गणना करते हैं, बाइट्स की नहीं, इसलिए भले ही आपकी स्रोत फ़ाइल यूनिकोड λ के एक वर्ण के रूप में गिना जाए।
- कानूनी चर नामों में एक या अधिक लोअर केस लेटर्स होते हैं, यानी a और z के बीच के अक्षर (अल्फ़ान्यूमेरिक नाम, अपर केस लेटर्स या नॉन-लैटिन लेटर्स का समर्थन करने की आवश्यकता नहीं है - हालाँकि ऐसा करने से आपका समाधान अमान्य नहीं होगा)।
- जहां तक इस चुनौती का सवाल है, कोई भी कोष्ठक वैकल्पिक नहीं हैं। प्रत्येक लैम्ब्डा अभिव्यक्ति और प्रत्येक फ़ंक्शन एप्लिकेशन को कोष्ठक के ठीक एक जोड़े से घिरा होगा। कोई चर नाम कोष्ठकों से घिरा नहीं होगा।
- के
(λ x y. e)लिए लिखने की तरह सिंथेटिक चीनी का(λ x. (λ y. e))समर्थन करने की आवश्यकता नहीं है। - यदि किसी फ़ंक्शन का मूल्यांकन करने के लिए 100 से अधिक की पुनरावृत्ति गहराई आवश्यक है, तो व्यवहार अपरिभाषित है। यह सभी भाषाओं में अनुकूलन के बिना लागू होने के लिए कम से कम पर्याप्त होना चाहिए और अभी भी काफी बड़ा है जो अधिकांश अभिव्यक्तियों को निष्पादित करने में सक्षम हो।
- तुम भी, मान सकते हैं कि रिक्ति उदाहरणों की तरह हो जाएगा शुरुआत और इनपुट के अंत में या एक से पहले कोई रिक्त स्थान यानी
λया.एक के बाद और वास्तव में एक अंतरिक्ष.और और एक समारोह और उसके तर्क के बीच एक के बादλ।
नमूना इनपुट और आउटपुट
इनपुट:
((λ x. x) (λ y. (λ z. z)))आउटपुट:
(λ y. (λ z. z))इनपुट:
(λ x. ((λ y. y) x))आउटपुट:
(λ x. x)इनपुट:
((λ x. (λ y. x)) (λ a. a))आउटपुट:
(λ y. (λ a. a))इनपुट:
(((λ x. (λ y. x)) (λ a. a)) (λ b. b))आउटपुट:
(λ a. a)इनपुट:
((λ x. (λ y. y)) (λ a. a))आउटपुट:
(λ y. y)इनपुट:
(((λ x. (λ y. y)) (λ a. a)) (λ b. b))आउटपुट:
(λ b. b)इनपुट:
((λx. (x x)) (λx. (x x)))आउटपुट: कुछ भी (यह एक ऐसी अभिव्यक्ति का उदाहरण है जिसका कोई सामान्य रूप नहीं है)
इनपुट:
(((λ x. (λ y. x)) (λ a. a)) ((λx. (x x)) (λx. (x x))))आउटपुट:
(λ a. a)(यह एक अभिव्यक्ति का एक उदाहरण है जो सामान्य नहीं होता है यदि आप फ़ंक्शन कॉल से पहले तर्कों का मूल्यांकन करते हैं, और दुख की बात है कि एक उदाहरण जिसके लिए मेरा प्रयास समाधान विफल हो जाता है)इनपुट:
((λ a. (λ b. (a (a (a b))))) (λ c. (λ d. (c (c d)))))आउटपुट:
`(λ a. (λ b. (a (a (a (a (a (a (a (a b))))))))))यह चर्च के अंकों में 2 ^ 3 की गणना करता है।
(\y. a)।