การลบคริสตจักร
แลมบ์ดาแคลคูลัสเป็นที่สนใจของฉันมาโดยตลอดและพฤติกรรมฉุกเฉินของการส่งผ่านหน้าที่ต่าง ๆ เข้ามามีความซับซ้อนอย่างน่ายินดี เลขคริสตจักรเป็นตัวแทนของตัวเลขธรรมชาติที่สร้างขึ้นจากการใช้ฟังก์ชั่นซ้ำ ๆ (โดยปกติจะเป็นการเพิ่มค่าคงที่แบบเอกภาพ) ตัวอย่างเช่นจำนวนศูนย์ส่งคืน x และ "ละเว้น" ฟังก์ชันอินพุตหนึ่งคือf(x)
สองคือf(f(x))
และต่อไปนี้:
ident = lambda x: x
zero = lambda f: ident
succ = lambda n: lambda f: lambda x: f(n(f)(x))
one = succ(zero)
add1 = lambda x: x + 1
to_int = lambda f: f(add1)(0)
print(to_int(one))
>>> 1
จากนี้เราสามารถเห็นได้อย่างง่ายดายว่าการเติมนั้นทำได้โดยใช้ฟังก์ชันแรกกับ x จากนั้นใช้ฟังก์ชันที่สองกับ x:
add = lambda m: lambda n: lambda f: lambda x: n(f)(m(f)(x))
print(to_int(add(one)(two)))
>>> 3
นอกจากนี้ค่อนข้างง่ายต่อการเข้าใจ อย่างไรก็ตามสำหรับผู้ใช้ใหม่อาจนึกไม่ถึงว่าการลบแบบใดในระบบหมายเลขที่เข้ารหัสของศาสนจักร มันอาจจะหมายถึงอะไรที่จะยกเลิกการใช้ฟังก์ชั่น?
ท้าทาย
ใช้ฟังก์ชั่นการลบในระบบตัวเลขที่เข้ารหัสของศาสนจักร โดยที่การลบจะดำเนินการmonusและไม่ใช้ฟังก์ชันn
ถ้าผลลัพธ์จะมากกว่าศูนย์หรือศูนย์ นี่คือรหัส - กอล์ฟเพื่อให้ได้รหัสที่สั้นที่สุด
อินพุต
ตัวเลขสองคริสตจักรที่ได้รับการเข้ารหัสในภาษาที่คุณเลือก อินพุตสามารถเป็นตำแหน่งหรือ curried เพื่อพิสูจน์ว่าตัวเลขคริสตจักรเหล่านี้เป็นจริงพวกเขาจะต้องใช้เวลาในการทำงานใด ๆ และนำไปใช้ซ้ำ ๆ ( add1
จะได้รับในตัวอย่าง แต่มันอาจจะเป็นadd25
, mult7
หรือฟังก์ชั่นเอกอื่น ๆ .)
เอาท์พุต
เลขคริสตจักร ควรสังเกตว่าถ้าเป็นเช่นm < n
นั้นm - n
เสมอกับฟังก์ชั่นตัวตน
ตัวอย่าง:
minus(two)(one) = one
minus(one)(two) = zero
...
ยังเป็นที่ยอมรับ:
minus(two, one) = one
minus(one, two) = zero
เครดิต:
สรุปสาระสำคัญนี้เพื่อให้ฉันการดำเนินการหลามของเลขคริสตจักร
lambda m,n,f:apply f m-n times
(หรือแม้กระทั่งlambda m,n,f,x:apply f m-n times to x
) แทนlambda m,n:lambda f:...
? หรือนี่ใช้กับอินพุตทั้งสองm
และn
?
m
และn
ในลำดับอื่น ๆ ได้ไหม? สิ่งนี้จะช่วยในการแกง
exp(m, n)
คำนวณm^n
แน่นอน)