정상적인 형태의 Y fac ⌜3⌝를 얻기에는 수백 개의 축소 단계가 너무 많은가?


9

최근에 λ- 미적분학의 기초를 가르치면서 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 산술로 전환하면 실제로 단계 수가 증가합니다.

답변:


11

당신이 사용하고 싶다면 교회 코딩은 정말 나쁩니다 pred. Peano 스타일에서보다 효율적인 코딩을 사용하는 것이 좋습니다.

// 산술

: p_zero = λs.λz.z
: p_one = λs.λz.s p_zero
: p_succ = λn.λs.λz.sn
: p_null = λn.n (λx. ff) tt
: p_pred = λn.n (λp.p) p_zero
: p_plus = μ! f.λn.λm.n (λp. p_succ (! fpm)) m
: p_subs = μ! f.λn.λm.n (λp. p_pred (! fpm)) m
: p_eq = μ! f.λm.λn. m (λp. n (λq.! fpq) ff) (n (λx.ff) tt)
: p_mult = μ! f.λm.λn. m (λp. p_plus n (! fpn)) p_zero
: p_exp = μ! f.λm.λn. m (λp. p_mult n (! fpn)) p_one
: p_even = μ! f.λm. m (λp. not (! fp)) tt

// 번호

: p_0 = λs.λz.z
: p_1 = λs.λz.s p_0
: p_2 = λs.λz.s p_1
: p_3 = λs.λz.s p_2
...

이것은 이전 라이브러리 중 하나에서 가져온 일부 코드 μ!f. …이며에 최적화 된 구성이었습니다 Y (λf. …). (그리고 tt, ff, not부울 수 있습니다.)

fac그래도 더 나은 결과를 얻을 수 있을지 모르겠습니다 .


팁에 감사드립니다.이 대체 인코딩으로 작업하면 구현에서 몇 가지 버그를 찾을 수있었습니다. 실제로, 수정 후 정상적인 형태 3을 찾기 때문에 단계 수에 도움이되지 않습니다! 교회 숫자로 619 걸음, Peano 숫자로 687 걸음…
Nowhere man

그렇습니다. 제 생각에 그 이유는 약간의 축소 규칙을 사용 Y하면 짧은 축소를 얻는 데 중요합니다 (특히 Peano 숫자).
Stéphane Gimenez

그냥 궁금해서 4, 5, 6은 어떻습니까! ?
Stéphane Gimenez

1
이상하게도 3! 이후 Peano 인코딩은 Church 인코딩보다 효율적입니다. 각각 1 !, 2 !, 3 !, 4! 그리고 5! Peano / Church의 경우 10/10, 40/33, 157/134, 685/667, 3541/3956 및 21629/27311 단계가 걸립니다. 6의 대략적인 단계 수! 이전 데이터로부터 보간함으로써 독자를위한 연습으로 남는다.
아무데도 남자

1
위에서 언급 한 것은 스콧 숫자 "Peano + λ = Scott"인 것 같습니다. 시도해 볼 가치가있는 다른 것은 바이너리와 이진 변형입니다 (교회와 <strike> Peano </ strike> 스캇 모두).
Stéphane Gimenez

2

파이썬에서 CPU가 3의 계승을 계산하기 위해 얼마나 많은 일을 생각한다면, 수백 개의 축소는 크게 중요하지 않습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.