Son zamanlarda λ-hesabının temelini öğrettiğim için, Common Lisp'de basit bir λ-calculus değerlendiricisi uyguladım. Y fac 3
Normal 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 3
normal 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 pred
uzun 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…