ความท้าทายคือการเขียนล่ามสำหรับแคลคูลัสแลมบ์ดาที่ไม่ได้พิมพ์ไว้ในตัวละครให้น้อยที่สุด เรากำหนดแคลคูลัสแลมบ์ดาที่ไม่ได้พิมพ์ดังนี้:
วากยสัมพันธ์
นิพจน์มีสามประเภทดังต่อไปนี้:
การแสดงออกแลมบ์ดามีรูปแบบ
(λ x. e)ที่xอาจเป็นชื่อตัวแปรทางกฎหมายและeการแสดงออกทางกฎหมายใด ๆ นี่xเรียกว่าพารามิเตอร์และeเรียกว่าร่างกายของฟังก์ชั่นเพื่อความง่ายเราได้เพิ่มข้อ จำกัด เพิ่มเติมว่าจะต้องไม่มีตัวแปรที่มีชื่อเดียวกันกับ
xขอบเขตในปัจจุบัน ตัวแปรเริ่มต้นที่จะอยู่ในขอบเขตเมื่อชื่อของมันปรากฏขึ้นระหว่าง(λและและหยุดที่จะอยู่ในขอบเขตที่สอดคล้องกัน.)- แอปพลิเคชั่นมีรูปแบบ
(f a)ที่ไหนfและaเป็นนิพจน์ทางกฎหมาย ที่นี่fเรียกว่าฟังก์ชั่นและaเรียกว่าอาร์กิวเมนต์ - ตัวแปรมีรูปแบบ
xที่xเป็นชื่อตัวแปรทางกฎหมาย
อรรถศาสตร์
ฟังก์ชั่นถูกนำไปใช้โดยการแทนที่แต่ละพารามิเตอร์ที่เกิดขึ้นในร่างกายฟังก์ชั่นด้วยการโต้แย้ง อีกอย่างเป็นทางการการแสดงออกในรูปแบบ((λ x. e) a)ที่xเป็นชื่อตัวแปรและeและaมีการแสดงออกประเมิน (หรือลด) เพื่อการแสดงออกe'ที่e'เป็นผลมาจากการเปลี่ยนที่เกิดขึ้นแต่ละแห่งxในด้วยea
รูปแบบปกติคือการแสดงออกซึ่งไม่สามารถประเมินเพิ่มเติม
ความท้าทาย
ภารกิจของคุณหากคุณเลือกที่จะยอมรับมันคือการเขียนล่ามซึ่งใช้เป็นนิพจน์ของแคลคูลัสแลมบ์ดาที่ไม่มีการพิมพ์ที่ไม่มีตัวแปรอิสระและสร้างผลลัพธ์ตามรูปแบบปกติของนิพจน์ . หากการแสดงออกไม่มีรูปแบบปกติหรือไม่ใช่การแสดงออกที่ถูกต้องพฤติกรรมที่ไม่ได้กำหนด
โซลูชันที่มีจำนวนอักขระน้อยที่สุดชนะ
หมายเหตุสองประการ:
- อินพุตอาจถูกอ่านจาก 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)ผมหมายถึงตัวแปรที่ไม่ได้ผูกไว้โดยแลมบ์ดาเหมือนในการแสดงออก