ทำไม Coq ถึงมี Prop?


35

Coq มีข้อเสนอประเภทข้อพิสูจน์ที่ไม่เกี่ยวข้องซึ่งถูกทิ้งในระหว่างการแยก อะไรคือสาเหตุของการมีสิ่งนี้หากเราใช้ Coq สำหรับการพิสูจน์เท่านั้น Prop นั้นไม่จำเป็นดังนั้น Prop: Propอย่างไรก็ตาม Coq จะ infers ดัชนีของจักรวาลโดยอัตโนมัติและเราสามารถใช้ Type (i) แทนได้ทุกที่ ดูเหมือนว่า Prop จะทำให้ทุกอย่างซับซ้อนขึ้นมาก

ฉันอ่านว่ามีเหตุผลทางปรัชญาในการแยก Set และ Prop ในหนังสือของ Luo แต่ฉันไม่พบพวกเขาในหนังสือ พวกเขาคืออะไร


6
“ ถ้าเราใช้ Coq เพียงเพื่อพิสูจน์”: ฉันคิดว่าคุณได้ระบุประเด็นสำคัญที่นี่ Coq ไม่ได้ใช้สำหรับการพิสูจน์เท่านั้น
Gilles 'หยุดความชั่วร้าย'

คำตอบ:


34

Propมีประโยชน์มากสำหรับการแตกโปรแกรมเนื่องจากช่วยให้เราสามารถลบส่วนของรหัสที่ไม่มีประโยชน์ ตัวอย่างเช่นในการแยกอัลกอริทึมการเรียงลำดับเราจะพิสูจน์คำสั่ง "สำหรับทุกรายการมีรายการที่ได้รับคำสั่งและเป็นพีชคณิตของ " หากเราเขียนลงใน Coq และแยกโดยไม่ใช้เราจะได้รับ:kkkProp

  1. "สำหรับทั้งหมดมี " จะให้แผนที่ซึ่งนำรายการไปสู่รายการksort
  2. "เช่นนั้นสั่ง " จะให้ funciton ซึ่งทำงานผ่านและตรวจสอบว่ามันถูกเรียงและkverifyk
  3. "คือการเปลี่ยนแปลงของ " จะให้การเปลี่ยนแปลงซึ่งจะใช้เวลาเพื่อkโปรดทราบว่าไม่ได้เป็นเพียงการจับคู่แผนที่ แต่ยังรวมถึงการทำแผนที่ผกผันพร้อมกับโปรแกรมที่ตรวจสอบว่าแผนที่ทั้งสองนั้นเป็นแบบผกผันจริงๆkpikpi

sortในขณะที่สิ่งที่พิเศษไม่ได้ไร้ประโยชน์โดยสิ้นเชิงในการใช้งานมากเราต้องการที่จะกำจัดมันและให้เพียง สิ่งนี้สามารถทำได้ถ้าเราใช้เพื่อระบุว่า "ถูกสั่ง" และ "คือการเปลี่ยนแปลงของ " แต่ไม่ใช่ "สำหรับทั้งหมดมี "Propkkk

โดยทั่วไปวิธีการทั่วไปในการแยกรหัสคือการพิจารณาคำสั่งของฟอร์มโดยที่คืออินพุต,คือเอาต์พุตและอธิบายว่ามันหมายถึงอะไรสำหรับที่จะเป็นเอาต์พุตที่ถูกต้อง (ในตัวอย่างข้างต้นและเป็นประเภทของรายการและคือ "ได้รับคำสั่งและเป็นการเปลี่ยนแปลงของ .") ถ้าอยู่ในดังนั้นการแยก ให้แผนที่ที่ถืออยู่ทั้งหมดx:A.y:B.ϕ(x,y)xyϕ(x,y)yABϕ(,k)kkϕPropf:ABϕ(x,f(x))xAA หากอยู่ในแล้วเรายังได้รับฟังก์ชั่นดังกล่าวว่าเป็นหลักฐานที่ถือสำหรับทุกA บ่อยครั้งที่การพิสูจน์นั้นไม่มีประโยชน์ในการคำนวณและเราต้องการที่จะกำจัดมันโดยเฉพาะอย่างยิ่งเมื่อมันถูกซ้อนในส่วนลึกของคำสั่งอื่น ให้โอกาสเราในการทำเช่นนั้นϕSetgg(x)ϕ(x,f(x))xAProp

เพิ่ม 2015-07-29:มีคำถามว่าเราสามารถหลีกเลี่ยงทั้งหมดหรือไม่โดยการปรับ "รหัสที่ไร้ประโยชน์ออก" ให้เหมาะสมโดยอัตโนมัติ ในระดับที่เราสามารถทำได้เช่นโค้ดทั้งหมดที่สกัดจากส่วนเชิงลบของตรรกะ (สิ่งที่สร้างขึ้นจากประเภทที่ว่างเปล่า, ประเภทของหน่วย, ผลิตภัณฑ์) จะไร้ประโยชน์เพราะมันเพียงแค่สับรอบหน่วย แต่มีการตัดสินใจการออกแบบของแท้หนึ่งจะทำให้เมื่อใช้{} นี่เป็นตัวอย่าง simpe ที่หมายถึงว่าเราอยู่ในและวิธีการที่เราอยู่ใน{} หากเราดึงข้อมูลจาก PropPropΣTypeProp

Πn:NΣb:{0,1}Σk:Nn=2k+b
เราจะได้รับโปรแกรมที่สลายตัวเป็นของต่ำสุดบิตและที่เหลือบิตคือมันคำนวณทุกอย่าง หากเราดึงข้อมูลจาก แล้วโปรแกรมจะคำนวณต่ำสุดบิตขเครื่องไม่สามารถบอกได้ว่าสิ่งใดถูกต้องผู้ใช้ต้องบอกสิ่งที่เขาต้องการnbk
Πn:NΣb:{0,1}k:Nn=2k+b
b

1
ฉันสับสนเล็กน้อย คุณกำลังบอกว่าไม่มีมันเป็นไปไม่ได้ที่จะรับรู้ในโปรแกรมที่แตกออกซึ่งไม่ได้มีส่วนร่วมในการส่งออก (เช่นว่ามันเป็นเพียงการตรวจสอบมัน)? มีสถานการณ์ที่ไม่มีใครสามารถดึงรหัสที่ไม่มีประโยชน์เช่นนั้นผ่านวิธีการปกติที่มีอยู่ในเครื่องมือเพิ่มประสิทธิภาพโค้ดหรือไม่ Propg(x)
ผู้ใช้

1
จากโปรแกรมที่แยกออกมาอาจบอกว่า "ฉันต้องการ ," และย้อนกลับจากตรงนั้น ฉันไม่สามารถสร้างสถานการณ์ขึ้นมายุ่งได้ดังนั้นเราจึงไม่สามารถปรับสิ่งที่ไม่ได้มีส่วนร่วมโดยตรงให้กับการกำหนดการเปลี่ยนแปลงโดยที่มันไม่จำเป็นที่จะต้องคำนวณการเปลี่ยนแปลงดังกล่าว (จากมุมมองการปรับให้เหมาะสมระดับโลก ) k
ผู้ใช้

1
คุณไม่มีข้อมูล "ฉันต้องการ " นั่นเป็นข้อสันนิษฐานเพิ่มเติมและแน่นอนว่าเมื่อพวกเขาบอกคุณว่าผลลัพธ์ใดที่พวกเขาต้องการคุณสามารถเพิ่มประสิทธิภาพรหัสที่ไม่ทำงาน อันที่จริงผมคิดว่าคำตอบที่ดี: มันเป็นออกแบบคำถามซึ่งสิ่งที่จะใส่ใน{} คุณจำเป็นต้องรู้ว่าสิ่งที่ผู้ใช้ต้องการและเขาจะบอกคุณสิ่งที่เขาต้องการโดยใช้{} มันง่ายที่จะเกิดขึ้นกับตัวอย่างที่มีหลายตัวเลือก ฉันจะเพิ่มหนึ่งคำตอบ kPropProp
Andrej Bauer

2
เท่าที่ฉันรู้ว่าไม่มีใครสามารถบอกวิธีดึงสิ่งต่าง ๆ จากได้ เป็นที่ชัดเจนว่าพวกเขามีเนื้อหาการคำนวณบางอย่างแต่ไม่ใช่สิ่งที่อาจเป็น (1)
Andrej Bauer

3
อ่าโอเค. การใช้เป็นวิธีการระบุการตัดสินใจการออกแบบทำให้ฉันมีความหมายมากกว่าการใช้วิธีลบรหัสที่ไร้ประโยชน์ Prop
ผู้ใช้

19

Propเป็นสิ่งที่ไม่คาดฝันซึ่งสร้างระบบการพิสูจน์ที่แสดงออกมาก อย่างไรก็ตามมันเป็น "เกินไป" ที่แสดงออกในแง่ต่อไปนี้:

impredicative Prop+large elimination+excluded middle

ไม่สอดคล้องกัน โดยปกติแล้วคุณต้องการที่จะเพิ่มความเป็นไปได้ที่จะเพิ่มตรงกลางที่แยกออกดังนั้นวิธีหนึ่งคือการกำจัดขนาดใหญ่และทำให้ภาคแสดงข้อสรุป อื่น ๆ คือการปราบปรามการกำจัดขนาดใหญ่

Coq ทำทั้งสองอย่าง! พวกเขาเปลี่ยนชื่อเสากริยาเป็นชุดและปิดใช้งานการกำจัดขนาดใหญ่ใน Prop

การแสดงออกที่ได้มาจากการแสดงอารมณ์คือ "ความมั่นใจ" ในแง่ที่ 99% ของคณิตศาสตร์ "สมเหตุสมผล" นั้นสามารถทำเป็นกรงกับมันได้และเป็นที่รู้กันว่าสัมพันธ์กันกับทฤษฎีเซต สิ่งนี้ทำให้เป็นไปได้ว่าพวกเขาจะไม่ทำให้มันอ่อนแรงลงไปเหมือน Agda ซึ่งมีจักรวาลเชิงภาคเท่านั้น


8
โอ้และฉันลืมที่จะพูดถึง: มันไม่ใช่กรณีProp : Propที่จะไม่สอดคล้องกัน ปริมาณค่อนข้างมากกว่าข้อเสนอทั้งหมดเป็นข้อเสนออีกครั้ง
ดี้

คุณช่วยชี้ทางฉันไปยังแหล่งข้อมูลอื่น ๆ ทุกสิ่งที่ฉันพบดูเหมือนกระจัดกระจายมาก
user833970

1
@ user833970 สิ่งใดที่คุณต้องการให้พอยน์เตอร์ชี้ ฉันเกรงว่าจะไม่มีการอ้างอิงที่ครอบคลุมทั้งหมดสำหรับทฤษฎีเมตาของประเภทที่ต้องพึ่งพา การสนทนานี้ (! ซึ่งจุดกลับมาที่นี่) อาจจะมีประโยชน์: github.com/FStarLang/FStar/issues/360
cody

ขอบคุณฉันกำลังทำงานผ่านกระดาษ Berardi เส้นขนานตอนนี้ฉันคิดว่าจะล้างความสับสนของฉัน
user833970

14

แม้ว่าคุณจะไม่ได้สนใจในการแยกโปรแกรม แต่ความจริงที่Propเป็นประโยชน์ช่วยให้คุณสามารถสร้างแบบจำลองบางอย่างที่คุณไม่สามารถสร้างโดยใช้หอคอยแห่งจักรวาล IIRC Thorsten Altenkirch มีรูปแบบของ System F โดยใช้การแสดงอารมณ์ของ Coq

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.