Son zamanlarda λ-hesabının temelini öğrettiğim için, Common Lisp'de basit bir λ-calculus değerlendiricisi uyguladım. Y fac 3Normal düzen azaltımında normal biçimini sorduğumda, biraz fazla görünen 619 adım atıyor.
Tabii ki, kağıt üzerinde benzer indirimler her yaptığımda, türlenmemiş λ hesabını hiç kullanmadım, ancak üzerinde çalışan sayılar ve işlevler ekledim. Bu durumda, fac şöyle tanımlanır:
fac = λfac.λn.if (= n 0) 1 (* n (fac (- n 1)))
Bu durumda, dikkate =, *ve -işlevleri tımar olarak, sadece almak için yaklaşık 50 adımlar atması Y fac 3normal forma 6.
Ancak değerlendiricimde aşağıdakileri kullandım:
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 adımda Y fac ⌜3⌝normal formuna ⌜6⌝, yani normal formuna geçiyorum λf.λx.f (f (f (f (f (f x))))).
Birçok adımın hızlı bir şekilde gözden kaybolmasından, sanırım bu preduzun bir azaltmayı gerektiriyor, ama yine de benim uygulamada büyük bir kötü hata olup olmadığını merak ediyorum ...
DÜZENLEME: Başlangıçta bin adım hakkında sordum, bazıları gerçekten normal düzenin yanlış uygulanmasına neden oldu, bu yüzden ilk adım sayısının 2 / 3'üne düştüm. Aşağıda yorumlandığı gibi, mevcut uygulama ile, Kilise'den Peano aritmetiğine geçmek aslında adım sayısını arttırıyor…