พิสูจน์การไม่เกี่ยวข้องใน Coq?


18

มีวิธีการพิสูจน์ทฤษฎีบทต่อไปนี้ใน Coq หรือไม่?

Theorem bool_pirrel : forall (b : bool) (p1 p2 : b = true), p1 = p2.

แก้ไข : ความพยายามที่จะให้คำอธิบายสั้น ๆ สำหรับ "สิ่งที่ไม่เกี่ยวข้องพิสูจน์หลักฐาน" (แก้ไขฉันบางคนถ้าฉันผิดหรือไม่ถูกต้อง)

แนวคิดพื้นฐานคือในโลกของข้อเสนอ (หรือPropเรียงลำดับใน Coq) สิ่งที่คุณ (และคุณควร) สนใจจริงๆคือการพิสูจน์ข้อเสนอไม่ใช่ข้อพิสูจน์ของมันอาจมีจำนวนมาก (หรือไม่มี) ในกรณีที่คุณมีการพิสูจน์หลายจากจุด provability ในมุมมองของพวกเขามีความเท่าเทียมกันในแง่ที่ว่าพวกเขาพิสูจน์เรื่องเดียวกัน ดังนั้นความแตกต่างของพวกเขาจึงไม่เกี่ยวข้อง สิ่งนี้แตกต่างจากมุมมองการคำนวณที่คุณสนใจจริง ๆ ถึงความแตกต่างของคำสองคำเช่นโดยทั่วไปคุณไม่ต้องการให้ผู้อยู่อาศัยทั้งสองboolประเภท (หรือSetในคำพูดของ Coq) คือtrueและfalseเท่าเทียมกัน แต่ถ้าคุณใส่ไว้ในPropนั้นพวกเขาจะได้รับการปฏิบัติที่เท่าเทียมกัน


ที่น่าสนใจ ฉันแน่ใจว่าคุณจะได้รับคำตอบภายในไม่กี่นาทีในรายการจดหมาย Coq (อย่าลืมโพสต์คำตอบที่นี่ถ้าคุณทำ)
Dave Clarke

2
สำหรับพวกเราที่สงสัยว่าคำถามของคุณเป็นอย่างไร แต่ไม่คุ้นเคยกับ Coq คุณสามารถเพิ่มประโยคหนึ่งหรือสองประโยคเพื่ออธิบายว่าทฤษฎีบทนั้นมีความหมายเป็นภาษาอังกฤษหรือไม่? (และอาจจะเกี่ยวกับ "หลักฐานที่ไม่เกี่ยวข้อง")
Joshua Grochow

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

6
ABABBA

คำตอบ:


28

การไม่เกี่ยวข้องกับการพิสูจน์โดยทั่วไปไม่ได้บอกเป็นนัยโดยทฤษฎีที่อยู่เบื้องหลัง Coq แม้แต่หลักฐานที่ไม่เกี่ยวข้องกับความเท่าเทียมก็ไม่ได้บอกเป็นนัย มันเทียบเท่ากับ Streicher ของจริง K ทั้งสองสามารถเพิ่มเป็นสัจพจน์

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

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

Require Bool.
Require Eqdep_dec.
Theorem bool_pirrel : forall (b : bool) (p1 p2 : b = true), p1 = p2.
Proof.
  intros; apply Eqdep_dec.eq_proofs_unicity; intros.
  destruct (Bool.bool_dec x y); tauto.
Qed.

สำหรับกรณีพิเศษนี้นี่เป็นข้อพิสูจน์โดยตรง (ได้รับแรงบันดาลใจจากหลักฐานทั่วไปในEqdep_dec.v) ก่อนอื่นให้นิยามคำจำกัดความตามบัญญัติของ canonical true=b(ตามปกติใน Coq ง่ายกว่าที่จะมีค่าคงที่ก่อน) จากนั้นเราก็แสดงให้เห็นว่าหลักฐานการใด ๆ ที่จะต้องมีtrue=brefl_equal true

Let nu b (p:true = b) : true = b :=
  match Bool.bool_dec true b with
    | left eqxy => eqxy
    | right neqxy => False_ind _ (neqxy p)
  end.
Lemma bool_pcanonical : forall (b : bool) (p : true = b), p = nu b p.
Proof.
  intros. case p. destruct b.
  unfold nu; simpl. reflexivity.
  discriminate p.
Qed.

หากคุณเพิ่มตรรกะคลาสสิกให้กับ Coq คุณจะได้รับการพิสูจน์ที่ไม่เกี่ยวข้อง สังหรณ์ใจพูดตรรกะคลาสสิกที่จะช่วยให้คุณตัดสินใจ oracle สำหรับข้อเสนอและที่ดีพอสำหรับความจริง K. Classical_Propมีหลักฐานในโมดูลมาตรฐานห้องสมุด

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