최근에 λ- 미적분학의 기초를 가르치면서 Common Lisp에서 간단한 λ- 미적분학 평가자를 구현했습니다. Y fac 3
정상 순서 축소 의 정상적인 형태를 물으면 619 단계가 걸리며, 이는 약간 많이 보입니다.
물론, 종이에서 비슷한 감소를 할 때마다 나는 형식화되지 않은 λ- 미적분학을 사용하지 않았지만 그 위에 숫자와 함수를 추가했습니다. 이 경우 fac는 다음과 같이 정의됩니다.
fac = λfac.λn.if (= n 0) 1 (* n (fac (- n 1)))
이 경우, 고려 =
, *
및 -
기능을 무두질로, 그것은 단지 얻기 위해 약 50 조치를 취할 Y fac 3
정상적인 형태 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로 줄었습니다. 아래에서 언급했듯이 현재 구현에서 Church에서 Peano 산술로 전환하면 실제로 단계 수가 증가합니다.