ลำดับของการประกาศในเรื่องประเภทอุปนัยหรือไม่?


9

ฉันสงสัยว่าคำสั่งของการประกาศประเภทอุปนัยสามารถสำคัญได้หรือไม่

ตัวอย่างเช่นใน Coq คุณสามารถกำหนดNatอย่างใดอย่างหนึ่งโดย:

Inductive Nat :=
  | O : Nat
  | S : Nat -> Nat.

หรือ

Inductive Nat :=
  | S : Nat -> Nat
  | O : Nat.

นี่อาจจะเปลี่ยนลำดับของพารามิเตอร์ในเครื่องกำจัดที่สร้างขึ้นโดยอัตโนมัติ แต่นั่นไม่ใช่เรื่องใหญ่

สิ่งที่ฉันสงสัยคือถ้าเป็นไปได้ที่จะเขียนประกาศเช่นนี้

Inductive typewhereordermatters :=
  | cons1 : type1
  | cons2 : type2.

ซึ่งtype2เป็นชนิดที่ขึ้นอยู่ขึ้นอยู่กับcons1? (และในกรณีนี้เขียนคำประกาศในลำดับอื่นจะไม่มีความหมายใด ๆ เพราะtype2จะหมายถึงcons1สิ่งที่ยังไม่มีอยู่)

คำตอบ:


10
  1. คำสั่งไม่สำคัญ ฉันไม่สามารถนึกถึงกรณีที่มันจะ ในฐานะที่เป็นAndrej Bauerชี้ให้เห็นในความคิดเห็นถ้าคุณเปลี่ยนลำดับผลที่ได้คือ canonically isomorphic ไปที่เดิม

  2. กรณีหนึ่งไม่สามารถขึ้นอยู่กับกรณีอื่น องค์ประกอบของผลรวมนั้นแทนตัวเลือกดังนั้นจึงไม่สมเหตุสมผลที่ตัวเลือกที่ทำขึ้นอยู่กับตัวเลือกที่ไม่ได้ใช้


2
คุณสามารถเจาะจงมากขึ้นเกี่ยวกับจุดแรกของคุณ คำสั่งไม่สำคัญ หากคุณเปลี่ยนลำดับผลที่ได้คือมาตรฐาน isomorphic แบบดั้งเดิม
Andrej Bauer

2
@ เดฟ: ขอบคุณ! ฉันถามคำถามนี้เพราะ (ทฤษฎีการทดลองสูง) ประเภทอุปนัยที่สูงขึ้นซึ่งปรากฏการณ์นี้ดูเหมือนจะเกิดขึ้นและฉันต้องการที่จะรู้ว่าสิ่งนี้สามารถเป็นกรณีที่มีประเภทอุปนัยปกติ
Guillaume Brunerie

1
@ Guillaume: ฉันไม่แน่ใจว่าปรากฏการณ์ที่คุณกำลังชี้ไปที่มีลิงก์ ส่วนกำหนดที่แตกต่างกันของคำนิยามประเภทข้อมูลไม่สามารถขึ้นอยู่กับแต่ละอื่น ๆ หรือไม่ว่ามันเป็นประเภทข้อมูลที่สั่งซื้อที่สูงขึ้น บางทีคุณอาจกำลังคิดถึงระเบียนที่ต้องพึ่งพา (ซึ่งใช้ที่ลิงก์และมีอยู่ใน AgdaและCoq )
Noam Zeilberger

1
@ Noam: ในตัวอย่างของประเภทอุปนัยที่สูงขึ้นcircleประเภทของตัวloopสร้างขึ้นอยู่กับตัวbaseสร้าง
Guillaume Brunerie

2
@ Guillaume: ฉันเห็นแล้ว (พวกเขากำลังแนะนำซินแท็กซ์ทดลอง) ไม่รู้ว่าฉันพลาดมันไปได้อย่างไร
Noam Zeilberger

6

การสั่งซื้อมีความสำคัญในแบบที่คุณถามหรือไม่? เลขที่

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

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

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

ฉันเข้าใจว่าแม้ว่าฉันจะไม่แน่ใจ Coq ก็ทำสิ่งที่คล้ายกัน

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