อะไรคือความแตกต่างระหว่างชุดและประเภทใน Coq [ปิด]


13

ประเภท AFAIU สามารถเป็นSetองค์ประกอบที่มีโปรแกรมหรือpropositionองค์ประกอบที่มีการพิสูจน์ ดังนั้นตามความเข้าใจนี้:

Inductive prod (X Y: Type) : Set := 
| pair: X -> Y -> prod X Y.

รหัสต่อไปนี้ควรรวบรวม แต่มันไม่ได้เกิดจากข้อผิดพลาดดังต่อไปนี้ ถ้าฉันเปลี่ยนSetด้วยTypeหรืออื่น ๆTypeด้วยSetมันรวบรวมดี ใครสามารถช่วยฉันเข้าใจว่าข้อผิดพลาดต่อไปนี้หมายถึงอะไร ฉันพยายามสอนตัวเอง Coq โดยใช้หนังสือ Software Foundations

ข้อผิดพลาด:

Error: Large non-propositional inductive types must be in Type.

2
ทฤษฎีบทพิสูจน์แล้วว่าเป็นพื้นที่สีเทาสำหรับ CS.SE เสมอ แต่ฉันเดาว่านี่เป็นตัวเลือกที่ดีสำหรับ mods ในการโยกย้ายไปยัง StackOverflow
jmite

คำถามนี้มีคำตอบบางอย่างที่นี่
Anton Trunov

@jmite เนื่องจากคำถามนี้เกี่ยวกับแคลคูลัสของสิ่งปลูกสร้างที่มี Coq ซึ่งทำหน้าที่เป็นรูปธรรมที่เป็นรูปธรรมฉันคิดว่าเป็นหัวข้อที่นี่
Gilles 'หยุดชั่วร้าย'

คำตอบ:


12

Coq มี 3 "ใหญ่" ประเภท:

  • Propมีไว้สำหรับข้อเสนอ มันเป็นสิ่งที่ไม่จำเป็นซึ่งหมายความว่าคุณสามารถยกตัวอย่างฟังก์ชัน polymorphic ด้วยประเภท polymorphic นอกจากนี้ยังมีหลักฐานไม่ตรงประเด็นซึ่งหมายความว่าถ้าแล้วP_2 อนุญาตให้ใช้ข้อกำหนดที่ใช้สำหรับการพิสูจน์เท่านั้นที่จะถูกลบในโค้ดที่สร้างโดย Coqp 1 = p 2พี1,พี2:Pพี1=พี2
  • Setมีไว้สำหรับการคำนวณ มันเป็นกริยาและไม่ได้มีหลักฐานไม่ตรงประเด็นซึ่งช่วยให้คุณทำสิ่งที่ดีเช่นไม่สมมติ2 ชิ้นส่วนยังคงอยู่ในระหว่างการสกัดรหัส1=2Set
  • Type เป็น supertype ของทั้งคู่ช่วยให้คุณสามารถเขียนโค้ดได้ทันทีเมื่อใช้งานได้

ฉันค่อนข้างมั่นใจว่าข้อผิดพลาดของคุณเป็นเพราะคุณกำลังกำหนดSetพารามิเตอร์ที่สามารถเป็นได้Typeซึ่งหมายความว่าพวกเขาสามารถเป็นได้Propซึ่งไม่ได้รับอนุญาต หากคุณเปลี่ยนเป็น:

Inductive prod (X Y: Set) : Set := 
| pair: X -> Y -> prod X Y. 

รหัสของคุณควรทำงาน


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