ทำไม Agda และ Coq ไม่เห็นด้วยกับความเข้มงวด


24

ฉันพบความขัดแย้งที่สับสนระหว่าง Agda และ Coq ซึ่งไม่เกี่ยวข้องกับความแตกต่างที่รู้จักกันดีที่สุดระหว่างทฤษฎีประเภทของพวกเขา (เช่น (im) predicativity, induction-recursion, ฯลฯ )

โดยเฉพาะอย่างยิ่งคำจำกัดความต่อไปนี้ได้รับการยอมรับโดย Agda:

  data Ty : Set0 -> Set0 where
    c1 : Ty ℕ
    c2 : Ty (Ty ℕ)

ในขณะที่คำจำกัดความ Coq ที่เท่าเทียมกันนั้นถูกปฏิเสธเนื่องจากรูปลักษณ์ของ [Ty _] เป็นดัชนีของตัวเองใน c2 นั้นถือว่าเป็นการละเมิด positivity ที่เข้มงวด

  Inductive Ty : Set -> Set :=
    | c1 : Ty nat
    | c2 : Ty (Ty nat).

ในความเป็นจริงคดีนี้เกือบทุกตัวอย่างจาก Coq'Art หัวข้อ 14.1.2.1 ของการละเมิด positivity ที่เข้มงวด:

  Inductive T : Set -> Set := c : (T (T nat)).

แต่ฉันไม่เห็นสาเหตุของความแตกต่างระหว่างทฤษฎีประเภทนี้ ตัวอย่างคลาสสิกของการพิสูจน์เท็จโดยใช้การลบประเภทในอาร์กิวเมนต์ตัวสร้างชัดเจนกับฉัน แต่ฉันไม่สามารถดูว่าใครจะได้รับความขัดแย้งจากรูปแบบของการทำดัชนีนี้ (โดยไม่คำนึงถึงข้อโต้แย้งเชิงบวกอย่างเคร่งครัดสร้าง)

เมื่อพูดถึงวรรณคดีบทความเกี่ยวกับครอบครัวอุปนัยยุคแรกของ Dybjer ได้แสดงความคิดเห็นอย่างฉับพลันเกี่ยวกับวิธีแก้ปัญหาของ Paulin-Mohring ในกระดาษ CID ซึ่งมีข้อ จำกัด ที่แตกต่างกันเล็กน้อยและแสดงให้เห็นถึงความแตกต่าง กระดาษของ Dybjer ดูเหมือนจะยอมให้สิ่งนี้ในขณะที่ Paulin-Mohring ห้ามอย่างชัดเจน

เห็นได้ชัดว่าฉันไม่ใช่คนแรกที่สังเกตเห็นความแตกต่างของความเห็นและบางคนเชื่อว่าคำจำกัดความนี้ไม่ควรได้รับอนุญาตในทั้งสองระบบ ( https://lists.chalmers.se/pipermail/agda/2012/004249.html ) แต่ ฉันไม่ได้พบคำอธิบายใด ๆ ว่าทำไมถึงเป็นเสียงในระบบใดระบบหนึ่ง แต่ไม่ใช่ระบบอื่นหรือเป็นเพียงความคิดเห็นที่แตกต่าง

ดังนั้นฉันคิดว่าฉันมีคำถามหลายข้อ:

  1. นี่เป็นตัวอย่างของเสียงเดียว แต่ไม่ใช่แบบบวกหรือไม่ (ใน Coq; Agda เห็นว่าเป็นบวกอย่างชัดเจน)
  2. เหตุใด Agda อนุญาตให้ทำเช่นนี้ในขณะที่ Coq ปฏิเสธ มันเป็นเพียงความแตกต่างที่แปลกประหลาดในการตีความของ "บวกอย่างเคร่งครัด" มีความแตกต่างเล็กน้อยระหว่าง Coq และ Agda ที่ทำให้ฟังใน Agda และ unsound ใน Coq หรือเป็นเรื่องของรสนิยมที่ขับเคลื่อนโดยการตั้งค่าตามทฤษฎีเฉพาะหรือไม่?
  3. มีความแตกต่างที่มีความหมายระหว่างคำจำกัดความแรกข้างต้นและคำจำกัดความอุปนัยแบบเรียกซ้ำ - ซ้ำด้านล่างหรือไม่?

คำนิยามอุปนัย - ซ้ำ:

  mutual
    data U : Set0 -> Set0 where
      c : (i : Fin 2) -> U (T i)
    T : Fin 2 -> Set0
    T zero = ℕ
    T (suc zero) = U ℕ

ฉันดีใจที่มีพอยน์เตอร์ไปยังวรรณกรรมที่เกี่ยวข้อง

ขอบคุณล่วงหน้า.


1
เท่าที่ฉันทราบ Coq เข้มงวดกว่าที่ทฤษฎีพื้นฐานอนุญาตเพราะมันง่ายต่อการใช้งานและมีประโยชน์เพียงพอในการปฏิบัติ คำตอบเกี่ยวกับกรณีที่แตกต่าง แต่มีความเกี่ยวข้องนี้เท่าที่ฉันเข้าใจ
Gilles 'หยุดชั่วร้าย'

1
คำจำกัดความนี้ไม่ได้รับการยอมรับโดยเวอร์ชัน dev ปัจจุบันของ Agda:Ty is not strictly positive, because it occurs in an index of the target type of the constructor c2 in the definition of Ty.
gallais

2
ใช่คุณพูดถูกคนอื่นชี้ให้ฉันเห็นเมื่อคืนนี้ ฉันใช้แพ็คเกจ 2.3.0.1 ของ Debian แล้ว แต่ 2.3.2.1 จาก Cabal ปฏิเสธทั้งข้อกำหนดโดยตรงและ IR ดูเหมือนว่าข้อผิดพลาดที่ดูเหมือนไม่เกี่ยวข้องทำให้การตรวจสอบดัชนีมีความเข้มงวดมากขึ้น: code.google.com/p/agda/issues/detail?id=690 เนื่องจากมีการพูดคุยในรายการโดยไม่มีการทำเครื่องหมายว่าเป็นปัญหาด้านเสียงอย่างชัดเจนฉันยังคง สงสัยว่าประเภทของตัวเองเป็นเสียง
โคลินกอร์ดอน

คำตอบ:


10

ดูเหมือนว่าปัญหาจะสับสนซึ่งเกิดจากการรวมกันของสองปัจจัย:

  1. ฉันใช้ Agda รุ่นเก่า (2.3.0.1) ปรากฏว่าก่อนหน้า 2.3.2, Agda ไม่ได้ตรวจสอบตำแหน่งดัชนีของผลลัพธ์ของ constructor อย่างเข้มงวด (ดูข้อผิดพลาดที่ฉันเชื่อมโยงที่อื่นในเธรด)
  2. การอ่านอย่างใกล้ชิดของกระดาษครอบครัวอุปนัยของ Dybjer แสดงให้เห็นว่าเขาอาจมีความตั้งใจที่ประเภทอุปนัยที่ถูกกำหนดไม่ถูกผูกไว้เมื่อพิมพ์ดัชนีของผลลัพธ์คอนสตรัค ส่วนที่ 3.2.1 จัดทำโครงการสำหรับผู้สร้างอุปนัยในร้อยแก้วและเห็นได้ชัดว่าฉันเข้าใจผิดภาษาอธิบายสภาพแวดล้อมที่มีผลผูกพันของแต่ละส่วนของโครงการ

การอ่านอย่างใกล้ชิดนี้แน่นอนว่าสอดคล้องกับการตรวจสอบที่ Coq และ (เวอร์ชันล่าสุด) ดำเนินการ Agda ซึ่งห้ามการปรากฏตัวของ T ในดัชนีของตัวเอง


4

เหตุผลที่เป็นไปได้สำหรับความแตกต่างตามคำแนะนำของคุณเองก็คือความกล้าหาญ Coq ในอดีตมีชุดที่ไม่อาจหยั่งรู้ได้ (ยังคงเป็นธงที่ฉันเชื่อ!)

การอ้างอิงหนังสือของ Adam Chlipala http://adam.chlipala.net/cpdt/html/Universes.html

เครื่องมือ Coq สนับสนุนการตั้งค่าสถานะบรรทัดคำสั่ง -impredicative-set ซึ่งปรับเปลี่ยน Gallina ในลักษณะพื้นฐานเพิ่มเติมโดยการตั้ง Set impredicative คำที่เหมือนกับ forall T: Set, T มีประเภท Set และคำจำกัดความอุปนัยใน Set อาจมีคอนสตรัคเตอร์ที่มีปริมาณมากกว่าข้อโต้แย้งของประเภทใด ๆ เพื่อรักษาความมั่นคงต้องมีข้อ จำกัด ในการกำจัดเช่นเดียวกับข้อ จำกัด ของ Prop ข้อ จำกัด นี้ใช้กับประเภทอุปนัยขนาดใหญ่เท่านั้น ในกรณีเช่นนี้ค่าในอุปนัยประเภทนี้อาจถูกจับคู่รูปแบบเฉพาะเพื่อให้ได้ผลลัพธ์ประเภทที่มีประเภทเป็นชุดหรือ Prop กฎนี้ตรงกันข้ามกับกฎสำหรับ Prop ที่ข้อ จำกัด ใช้แม้กับประเภทอุปนัยที่ไม่ใช่ขนาดใหญ่ และในกรณีที่ประเภทผลลัพธ์อาจมีเฉพาะประเภท Prop ใน Coq รุ่นเก่า Set เป็นแบบไม่แสดงผลตามค่าเริ่มต้น รุ่นต่อมาทำให้ตั้งกริยาเพื่อหลีกเลี่ยงความไม่สอดคล้องกับสัจพจน์ดั้งเดิม โดยเฉพาะอย่างยิ่งหนึ่งควรระวังเมื่อใช้ชุด impredicative กับสัจพจน์ที่เลือก เมื่อใช้ร่วมกับส่วนขยายกลางหรือส่วนขยายที่แยกออกไปจะส่งผลให้เกิดความไม่สอดคล้องกัน Impredicative Set จะมีประโยชน์สำหรับการสร้างแบบจำลองแนวคิดทางคณิตศาสตร์ที่มีการคาดการณ์โดยเนื้อแท้


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

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