เนื่องจากCurry-Howard Correspondenceแพร่กระจายอย่างกว้างขวางดังนั้นจึงมีความแตกต่างระหว่างหลักฐานและโปรแกรม (หรือระหว่างข้อเสนอและประเภท)? เราสามารถระบุได้จริงเหรอ?
เนื่องจากCurry-Howard Correspondenceแพร่กระจายอย่างกว้างขวางดังนั้นจึงมีความแตกต่างระหว่างหลักฐานและโปรแกรม (หรือระหว่างข้อเสนอและประเภท)? เราสามารถระบุได้จริงเหรอ?
คำตอบ:
ภาษาการเขียนโปรแกรมที่ผู้คนใช้ในแต่ละวันไม่เหมาะกับการติดต่อกับ Curry-Howard เพราะระบบประเภทของพวกเขาอ่อนแอเกินไป หากต้องการพูดสิ่งที่น่าสนใจโดยใช้ Curry-Howard สำหรับโปรแกรมที่จำเป็นต้องมีระบบการพิมพ์ที่ซับซ้อนยิ่งขึ้น หนังสือดัดแปลงการพิสูจน์เป็นโปรแกรมผลักมุมนี้โดยมีจุดประสงค์ในการสังเคราะห์โปรแกรมที่จำเป็น ด้วยประเภทที่ขึ้นอยู่กับการเป็นที่นิยมมากขึ้นอย่างแน่นอนในภาษาหน้าที่การวิจัย ( Agda , Epigram ) ความแตกต่างจะกลายเป็นพร่าเลือน แน่นอนว่าคุณสามารถทำการสังเคราะห์ / แยกโปรแกรมภายในตัวพิสูจน์ทฤษฎีบทCoq (และอื่น ๆ ) ซึ่งเป็นไปตาม Curry-Howard
การติดต่อ Curry-Howard ยังสามารถใช้ในสถานการณ์ที่บทพิสูจน์ไม่สอดคล้องกับโปรแกรมอย่างชัดเจน (หรือไม่ใช่โปรแกรมที่ทุกคนจะทำงาน) หนึ่งในตัวอย่างนี้อยู่ในการอนุมัติหลักฐานการดำเนินการ ข้อเสนอนั้นตรงกับข้อความที่ว่าใครได้รับอนุญาตให้ทำอะไร หลักฐานแสดงหลักฐานที่จำเป็นว่าข้อเสนอมีไว้จึงอนุญาตให้มีการร้องขอได้ เพื่อเข้ารหัสการพิสูจน์คำแนะนำการพิสูจน์ (ผ่านแกง - ฮาวเวิร์ด) เงื่อนไขการพิสูจน์ถูกส่งระหว่างฝ่ายต่าง ๆ ในฐานะตัวแทนของการพิสูจน์ความถูกต้องของคำขอการให้สิทธิ์ แต่ไม่ถือว่าเป็นโปรแกรม
ใน Coq มี 2 ประเภท (Prop และ Set) โดยโปรแกรมเมอร์ใช้เพื่อแยกสิ่งที่พิสูจน์ว่าจะไม่ผลิตรหัสจริงและส่วนหนึ่งของการพิสูจน์ที่จะใช้ในการแยกรหัสทำงาน (โปรแกรมของคุณ)
นั่นเป็นทางออกที่ดีสำหรับปัญหาที่คุณถามวิธีการระบุสิ่งที่มีความหมายในการสร้างรหัสเครื่อง (โปรแกรม) และสิ่งที่นำเสนอเพื่อให้การพิสูจน์ข้อเสนอ (หรือประเภท) สมบูรณ์
AFAIK ไม่มีวิธีอัตโนมัติในการแยกความแตกต่างทั้งสองแบบ นี่อาจเป็นสิ่งที่น่าสนใจสำหรับการวิจัย? หรือบางทีใครบางคนสามารถชี้ให้เห็นว่าเป็นไปไม่ได้อย่างชัดเจน?
ด้วยประเภทที่ขึ้นอยู่กับไม่เพียง แต่จะไม่มีความแตกต่างที่ชัดเจนระหว่างการพิสูจน์และโปรแกรม แต่ยังมีความแตกต่างระหว่างโปรแกรมและประเภท! ความแตกต่างเพียงอย่างเดียวคือตำแหน่งที่ประเภท (หรือโปรแกรม) ปรากฏขึ้นทำให้เป็นส่วนหนึ่งของสถานที่ "โปรแกรม" หรือสถานที่ "ประเภท" ของคำที่กำหนด
ตัวอย่างจะทำให้ชัดเจนยิ่งขึ้นฉันหวังว่า:
เมื่อคุณใช้ฟังก์ชั่นตัวตนที่มีประเภทตามคุณต้องผ่านประเภทของคุณจะใช้ฟังก์ชั่นด้วย! กำลังใช้ประเภทนี้เป็นค่าใน "โปรแกรม" ของคุณ!
แลมบ์ดาที่ไม่ได้พิมพ์
ด้วยประเภทที่ขึ้นอยู่กับ:
id: (A: Set) -> A -> A
หากคุณใช้งานฟังก์ชั่นนี้คุณจะทำเช่นนี้:
id Naturals 1
โปรดสังเกตว่า "type" (ในกรณีนี้ Set of Naturals) ที่ถูกส่งผ่านเป็นค่าจะถูกโยนทิ้งไปดังนั้นจะไม่ถูกคำนวณ แต่ยังอยู่ในส่วน "โปรแกรม" ของคำ นั่นคือสิ่งที่จะเกิดขึ้นกับส่วน "พิสูจน์" พวกเขาจำเป็นต้องอยู่ที่นั่นเพื่อตรวจสอบคำศัพท์ แต่ในระหว่างการคำนวณพวกเขาจะถูกโยนทิ้งไป
ฉันจะออกไปที่ขาและพูดว่าถ้าคุณเต็มใจที่จะเหลื่อมกันเล็กน้อยสามารถพิสูจน์และยุติโปรแกรมได้
โปรแกรมการยกเลิกใด ๆ เป็นหลักฐานว่าคุณสามารถรับอินพุตและสร้างเอาต์พุตได้ นี่เป็นข้อพิสูจน์พื้นฐานที่สำคัญมาก
แน่นอนว่าเพื่อให้ความหมายนี้มีข้อมูลที่มีความหมายมากกว่าการระบุชัดเจนคุณจะต้องสามารถแสดงให้เห็นว่าโปรแกรมทำงานได้กับอินสแตนซ์ใด ๆ ของอินพุทที่ดึงมาจากบางคลาสด้วยความหมายเชิงตรรกะ (และเช่นกันสำหรับผลลัพธ์)
จากอีกด้านหนึ่งการพิสูจน์ด้วยขั้นตอนการอนุมานแบบ จำกัด เป็นโปรแกรมเชิงสัญลักษณ์ที่จัดการวัตถุในระบบลอจิคัลบางระบบ (ถ้าเราไม่ต้องกังวลมากเกินไปเกี่ยวกับความหมายของสัญลักษณ์เชิงตรรกะและกฎเกณฑ์)
มันค่อนข้างง่าย แต่ฉันคิดว่ามันแนะนำความแข็งแกร่งของความคิด (แม้ว่าบางคนจะผูกพันไม่ชอบมัน ;-))
หลักฐานที่ไม่เกี่ยวข้อง?
เมื่อคุณเขียนโปรแกรมบางโปรแกรมคุณมีความสนใจในประสิทธิภาพของโปรแกรมการใช้หน่วยความจำ
เช่นการใช้อัลกอริทึมการเรียงลำดับที่ชาญฉลาดแทนที่จะใช้การเรียงลำดับแบบมีฟองแม้ว่าการใช้งานของพวกเขาจะมีประเภทเดียวกัน
แต่เมื่อคุณพิสูจน์ทฤษฎีบทบางอย่างมันเป็นเพียงหลักฐานที่คุณสนใจ
แน่นอนว่าจากมุมมองด้านสุนทรียภาพการพิสูจน์บางอย่างนั้นง่ายกว่า / สวยงาม / เร้าใจ / ฯลฯ (เช่นหลักฐานจาก The Book)
หากคุณยอมรับการติดต่อจาก Curry – Howard คำถามนั้นส่วนใหญ่จะเป็นปรัชญา "หลักฐานและโปรแกรมต่างกันหรือไม่แน่นอนได้อย่างไรเราเรียกว่า 'บทพิสูจน์' และเราเรียกโปรแกรม 'โปรแกรม'
หรือพูดให้ชัดเจนน้อยลงถ้ามีมอร์ฟิซึ่มส์ระหว่างการพิสูจน์และโปรแกรม - ซึ่งดูเหมือนชัดเจนว่ามี - จากนั้นคำถามของคุณจะถามว่ามี oracle ใด ๆ ที่สามารถแยกแยะทั้งสองได้ มนุษย์จัดหมวดหมู่พวกเขาว่าเป็นคนละส่วน (ส่วนใหญ่) ดังนั้นจึงเป็นที่ถกเถียงกันอยู่ว่า คำถามสำคัญก็จะกลายเป็นว่ามีความแตกต่างที่มีความหมายระหว่างพวกเขาซึ่งจะขึ้นอยู่กับการถกเถียงทางปรัชญา "หลักฐาน" คืออะไร? ไม่มีคำจำกัดความที่เป็นทางการว่าอะไรเป็นข้อพิสูจน์ มันเป็นคำศัพท์ทางศิลปะเหมือนกับแนวคิดของ "การคำนวณอย่างมีประสิทธิภาพ" ในวิทยานิพนธ์ศาสนจักร - ทัวริง สำหรับเรื่องนั้น "โปรแกรม" ไม่มีคำจำกัดความที่เป็นทางการเช่นกัน
เหล่านี้เป็นคำของภาษาธรรมชาติที่ใช้ในการจัดหมวดหมู่ที่แตกต่างกันของการสอบถามทางคณิตศาสตร์ สิ่งที่แกงกะหรี่และฮาวเวิร์ดสังเกตก็คือว่าทั้งสองสาขาต่างกันที่จริง ๆ แล้วเรียนสิ่งเดียวกัน การสังเกตเห็นการเชื่อมต่อนี้มีความสำคัญเพราะมันบอกว่านักวิจัยที่แตกต่างกันเหล่านี้ควรจะพูดคุยกับคนอื่น แต่ในอีกระดับหนึ่งการสังเกตการเชื่อมต่อคือการปฏิเสธความแตกต่างระหว่างพวกเขา เมื่อแก้ไขปัญหาบางครั้งมันจะมีประโยชน์มากกว่าที่จะคิดว่ามันเป็นปัญหาการเขียนโปรแกรมในขณะที่เวลาอื่น ๆ มันจะมีประโยชน์มากกว่าที่จะคิดว่ามันเป็นปัญหาเชิงตรรกะ ฉันคิดว่าความแตกต่างในมุมมองนี้คือความแตกต่างที่สำคัญระหว่างพวกเขา แต่ไม่ว่ามุมมองที่แตกต่างถือเป็นความแตกต่างของอัตลักษณ์หรือไม่เป็นคำถามเชิงลึกที่ได้รับการสำรวจอย่างน้อยที่สุดเท่าที่ Fregeueber Sinn คาดไม่ถึง Bedeutung