ความท้าทายคือการเขียนล่ามสำหรับแคลคูลัสแลมบ์ดาที่ไม่ได้พิมพ์ไว้ในตัวละครให้น้อยที่สุด เรากำหนดแคลคูลัสแลมบ์ดาที่ไม่ได้พิมพ์ดังนี้:
วากยสัมพันธ์
นิพจน์มีสามประเภทดังต่อไปนี้:
การแสดงออกแลมบ์ดามีรูปแบบ
(λ x. e)
ที่x
อาจเป็นชื่อตัวแปรทางกฎหมายและe
การแสดงออกทางกฎหมายใด ๆ นี่x
เรียกว่าพารามิเตอร์และe
เรียกว่าร่างกายของฟังก์ชั่นเพื่อความง่ายเราได้เพิ่มข้อ จำกัด เพิ่มเติมว่าจะต้องไม่มีตัวแปรที่มีชื่อเดียวกันกับ
x
ขอบเขตในปัจจุบัน ตัวแปรเริ่มต้นที่จะอยู่ในขอบเขตเมื่อชื่อของมันปรากฏขึ้นระหว่าง(λ
และและหยุดที่จะอยู่ในขอบเขตที่สอดคล้องกัน.
)
- แอปพลิเคชั่นมีรูปแบบ
(f a)
ที่ไหนf
และa
เป็นนิพจน์ทางกฎหมาย ที่นี่f
เรียกว่าฟังก์ชั่นและa
เรียกว่าอาร์กิวเมนต์ - ตัวแปรมีรูปแบบ
x
ที่x
เป็นชื่อตัวแปรทางกฎหมาย
อรรถศาสตร์
ฟังก์ชั่นถูกนำไปใช้โดยการแทนที่แต่ละพารามิเตอร์ที่เกิดขึ้นในร่างกายฟังก์ชั่นด้วยการโต้แย้ง อีกอย่างเป็นทางการการแสดงออกในรูปแบบ((λ x. e) a)
ที่x
เป็นชื่อตัวแปรและe
และa
มีการแสดงออกประเมิน (หรือลด) เพื่อการแสดงออกe'
ที่e'
เป็นผลมาจากการเปลี่ยนที่เกิดขึ้นแต่ละแห่งx
ในด้วยe
a
รูปแบบปกติคือการแสดงออกซึ่งไม่สามารถประเมินเพิ่มเติม
ความท้าทาย
ภารกิจของคุณหากคุณเลือกที่จะยอมรับมันคือการเขียนล่ามซึ่งใช้เป็นนิพจน์ของแคลคูลัสแลมบ์ดาที่ไม่มีการพิมพ์ที่ไม่มีตัวแปรอิสระและสร้างผลลัพธ์ตามรูปแบบปกติของนิพจน์ . หากการแสดงออกไม่มีรูปแบบปกติหรือไม่ใช่การแสดงออกที่ถูกต้องพฤติกรรมที่ไม่ได้กำหนด
โซลูชันที่มีจำนวนอักขระน้อยที่สุดชนะ
หมายเหตุสองประการ:
- อินพุตอาจถูกอ่านจาก stdin หรือจากชื่อไฟล์ที่กำหนดเป็นอาร์กิวเมนต์บรรทัดคำสั่ง (คุณจะต้องใช้อย่างใดอย่างหนึ่งหรืออื่น ๆ - ไม่ใช่ทั้งสองอย่าง) เอาต์พุตไปที่ stdout
- อีกทางหนึ่งคุณอาจกำหนดฟังก์ชั่นที่รับอินพุตเป็นสตริงและส่งคืนเอาต์พุตเป็นสตริง
- หากอักขระที่ไม่ใช่ ASCII เป็นปัญหาสำหรับคุณคุณสามารถใช้เครื่องหมายแบ็กสแลช (
\
) แทนλ - เรานับจำนวนอักขระไม่ใช่ไบต์ดังนั้นแม้ว่าไฟล์ต้นฉบับของคุณจะถูกเข้ารหัสเป็น Unicode un จะนับเป็นหนึ่งอักขระ
- ชื่อตัวแปรตามกฎหมายประกอบด้วยตัวอักษรตัวพิมพ์เล็กอย่างน้อยหนึ่งตัวเช่นอักขระระหว่าง a และ z (ไม่จำเป็นต้องสนับสนุนชื่อตัวอักษรและตัวเลขตัวอักษรตัวพิมพ์ใหญ่หรือตัวอักษรที่ไม่ใช่ละติน - แม้ว่าการทำเช่นนั้นจะไม่ทำให้โซลูชันของคุณใช้ไม่ได้)
- เท่าที่ความท้าทายนี้เกี่ยวข้องไม่มีวงเล็บเป็นตัวเลือก การแสดงออกแลมบ์ดาแต่ละครั้งและการใช้งานฟังก์ชั่นแต่ละอย่างจะถูกล้อมรอบด้วยวงเล็บหนึ่งคู่ ไม่มีชื่อตัวแปรจะถูกล้อมรอบด้วยวงเล็บ
- น้ำตาลประโยคเช่นการเขียน
(λ x y. e)
สำหรับการ(λ x. (λ y. e))
ไม่จำเป็นต้องได้รับการสนับสนุน - หากจำเป็นต้องใช้ความลึกการเรียกซ้ำมากกว่า 100 เพื่อประเมินฟังก์ชันการทำงานนั้นจะไม่ได้กำหนดไว้ นั่นควรจะต่ำเกินพอที่จะใช้งานได้โดยไม่ต้องปรับให้เหมาะสมในทุกภาษาและยังมีขนาดใหญ่พอที่จะสามารถใช้งานนิพจน์ส่วนใหญ่ได้
- นอกจากนี้คุณยังอาจสมมติว่าการเว้นวรรคจะเป็นในตัวอย่างเช่นไม่มีช่องว่างที่จุดเริ่มต้นและจุดสิ้นสุดของอินพุตหรือก่อนหน้าหนึ่ง
λ
หรือ.
หนึ่งช่องว่างหลังจาก.
และระหว่างฟังก์ชันและอาร์กิวเมนต์และหลังจากλ
นั้น
ตัวอย่างอินพุตและเอาต์พุต
การป้อนข้อมูล:
((λ x. x) (λ y. (λ z. z)))
เอาท์พุท:
(λ y. (λ z. z))
การป้อนข้อมูล:
(λ x. ((λ y. y) x))
เอาท์พุท:
(λ x. x)
การป้อนข้อมูล:
((λ x. (λ y. x)) (λ a. a))
เอาท์พุท:
(λ y. (λ a. a))
การป้อนข้อมูล:
(((λ x. (λ y. x)) (λ a. a)) (λ b. b))
เอาท์พุท:
(λ a. a)
การป้อนข้อมูล:
((λ x. (λ y. y)) (λ a. a))
เอาท์พุท:
(λ y. y)
การป้อนข้อมูล:
(((λ x. (λ y. y)) (λ a. a)) (λ b. b))
เอาท์พุท:
(λ b. b)
การป้อนข้อมูล:
((λx. (x x)) (λx. (x x)))
เอาท์พุท: อะไร (นี่คือตัวอย่างของการแสดงออกที่ไม่มีรูปแบบปกติ)
การป้อนข้อมูล:
(((λ x. (λ y. x)) (λ a. a)) ((λx. (x x)) (λx. (x x))))
เอาท์พุท:
(λ a. a)
(นี่เป็นตัวอย่างของนิพจน์ที่ไม่ได้ทำให้ปกติถ้าคุณประเมินข้อโต้แย้งก่อนการเรียกใช้ฟังก์ชั่นและเป็นตัวอย่างที่น่าเศร้าที่วิธีแก้ปัญหาของฉันพยายามล้มเหลว)การป้อนข้อมูล:
((λ a. (λ b. (a (a (a b))))) (λ c. (λ d. (c (c d)))))
เอาท์พุท:
`(λ a. (λ b. (a (a (a (a (a (a (a (a b))))))))))
นี่คำนวณ 2 ^ 3 ในเลขคริสตจักร
(\y. a)
ผมหมายถึงตัวแปรที่ไม่ได้ผูกไว้โดยแลมบ์ดาเหมือนในการแสดงออก