เมื่อฉันได้สอนพื้นฐานของ calcul-แคลคูลัสเมื่อเร็ว ๆ นี้ฉันได้ติดตั้ง evalu-แคลคูลัสธรรมดาใน 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 เลขคณิตจริง ๆ แล้วจะเพิ่มจำนวนขั้นตอน ...