जैसा कि मैंने हाल ही में λ-पथरी के आधार को पढ़ाया है, मैंने सामान्य लिस्प में एक साधारण λ-पथरी मूल्यांकनकर्ता को लागू किया है। जब मैं Y fac 3
सामान्य-क्रम में कमी के सामान्य रूप से पूछता हूं , तो इसमें 619 कदम होते हैं, जो थोड़ा ज्यादा लगता था।
बेशक, हर बार जब मैंने कागज पर समान कटौती की, तो मैंने कभी भी अनपेक्षित λ-पथरी का उपयोग नहीं किया, लेकिन उन पर काम करने वाले संख्याओं और कार्यों को जोड़ा। इस स्थिति में, फेस को इस प्रकार परिभाषित किया गया है:
fac = λfac.λn.if (= n 0) 1 (* n (fac (- n 1)))
इस मामले में, विचार करना =
, *
और -
करी कार्यों के रूप में, इसे Y fac 3
अपने सामान्य रूप में लाने के लिए केवल लगभग 50 कदम हैं 6
।
लेकिन मेरे मूल्यांकनकर्ता में, मैंने निम्नलिखित का उपयोग किया:
true = λx.λy.x
false = λx.λy.y
⌜0⌝ = λf.λx.x
succ = λn.λf.λx.f n f x
⌜n+1⌝ = succ ⌜n⌝
zero? = λn.n (λx.false) true
mult = λm.λn.λf.m (n f)
pred = λn.λf.λx.n (λg.λh.h (g f)) (λu.x) (λu.u)
fac = λfac.λn.(zero? n) ⌜1⌝ (* n (fac (pred n)))
Y = λf.(λf.λx.f (x x)) f ((λf.λx.f (x x)) f)
619 चरणों में, मैं Y fac ⌜3⌝
सामान्य रूप से ⌜6⌝
, अर्थात् λf.λx.f (f (f (f (f (f x)))))
।
कई चरणों के त्वरित स्किमिंग से, मुझे लगता है कि यह pred
उस वारंट की परिभाषा है जो इतनी लंबी कमी है, लेकिन मुझे अभी भी आश्चर्य है कि क्या यह सिर्फ मेरे कार्यान्वयन में एक बड़ा बुरा बग हो सकता है ...
संपादित करें: मैंने शुरू में एक हजार कदमों के बारे में पूछा था, जिनमें से कुछ वास्तव में सामान्य आदेश के गलत कार्यान्वयन के कारण थे, इसलिए मैं प्रारंभिक चरणों की संख्या के 2/3 पर पहुंच गया। जैसा कि नीचे टिप्पणी की गई है, मेरे वर्तमान कार्यान्वयन के साथ, चर्च से पीनो अंकगणित पर स्विच करने से वास्तव में चरणों की संख्या बढ़ जाती है ...