चर्च घटाव
लैम्ब्डा कैलकुलस हमेशा से मेरा एक आकर्षण रहा है और एक दूसरे में कार्य करने के उद्भव व्यवहार खुशी से जटिल हैं। चर्च अंक एक समारोह के दोहराया आवेदन (आमतौर पर एक निरंतर के अतिरिक्त) से दूषित प्राकृतिक संख्या का प्रतिनिधित्व कर रहे हैं। उदाहरण के लिए, संख्या शून्य x और इनपुट फ़ंक्शन को "अनदेखा करता है", एक है f(x)
, दो है f(f(x))
और इसी तरह:
ident = lambda x: x
zero = lambda f: ident
succ = lambda n: lambda f: lambda x: f(n(f)(x))
one = succ(zero)
add1 = lambda x: x + 1
to_int = lambda f: f(add1)(0)
print(to_int(one))
>>> 1
इससे हम आसानी से यह देख सकते हैं कि पहले फंक्शन को x पर लागू करके पूरा किया जाता है और फिर दूसरे फंक्शन को x पर लागू किया जाता है:
add = lambda m: lambda n: lambda f: lambda x: n(f)(m(f)(x))
print(to_int(add(one)(two)))
>>> 3
जोड़ समझना अपेक्षाकृत आसान है। हालाँकि, एक नवागंतुक के लिए यह सोचना असंभव हो सकता है कि चर्च एन्कोडेड नंबर सिस्टम में घटाव कैसा दिखता है। किसी फ़ंक्शन को अन-लागू करने के लिए संभवतः इसका क्या अर्थ हो सकता है?
चुनौती
एक चर्च एन्कोडेड अंक प्रणाली में घटाव समारोह को लागू करें। जहां घटाव मॉनस ऑपरेशन करता है और एक कार्य n
समय को अनपेक्षित करता है यदि परिणाम शून्य या शून्य से अधिक होगा अन्यथा। यह कोड-गोल्फ है इसलिए सबसे छोटा कोड जीतता है।
इनपुट
दो चर्च अंक जो भाषा की आपकी पसंद में एन्कोड किए गए हैं। इनपुट स्थितिगत या करी जा सकता है। ये हैं सच चर्च अंकों के साबित करने के लिए वे किसी भी समारोह में लेते हैं और उन्हें बार-बार आवेदन करना होगा ( add1
उदाहरण में दी गई है, लेकिन यह हो सकता है add25
, mult7
या किसी भी अन्य एकल कार्य करते हैं।)
उत्पादन
एक चर्च अंक। यह ध्यान देने योग्य है कि अगर m < n
उसके बाद m - n
हमेशा पहचान समारोह के रूप में एक ही है।
उदाहरण:
minus(two)(one) = one
minus(one)(two) = zero
...
स्वीकार्य भी:
minus(two, one) = one
minus(one, two) = zero
क्रेडिट:
यह गिथुब मुझे चर्च के अंकों का एक अजगर कार्यान्वयन देने के लिए देता है।
lambda m,n,f:apply f m-n times
(या यहां तक कि lambda m,n,f,x:apply f m-n times to x
) को परिभाषित करना ठीक है lambda m,n:lambda f:...
? या यह सिर्फ दो इनपुट पर लागू होता है m
और n
?
m
और n
दूसरे क्रम में ले सकते हैं ? इससे करीने में मदद मिलेगी।
exp(m, n)
गणनाm^n
।)