กำจัด cofix ในการพิสูจน์ Coq


15

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

ประเภทต้นไม้กำหนดอาจจะเป็นต้นไม้ที่ไม่มีที่สิ้นสุดที่มีสาขาที่มีข้อความที่มีองค์ประกอบของประเภท สาขาไม่จำเป็นต้องกำหนดไว้สำหรับองค์ประกอบทั้งหมดของ ค่าUnivเป็นต้นไม้ที่ไม่มีที่สิ้นสุดกับทุกสาขาที่กำหนดไว้เสมอ isUnivทดสอบไม่ว่าจะเป็นต้นไม้ที่ได้รับจะเท่ากับUniv บทแทรกฯ ระบุว่าUnivตอบสนองความต้องการisUnivได้อย่างแน่นอน

Parameter A : Set.

CoInductive Tree: Set := Node : (A -> option Tree) -> Tree.

Definition derv (a : A) (t: Tree): option Tree :=
  match t with Node f => f a end.

CoFixpoint Univ : Tree := Node (fun _ => Some Univ).

CoInductive isUniv : Tree -> Prop :=
  isuniv : forall (nf : A -> option Tree) (a : A) (t : Tree), 
    nf a = Some t -> 
    isUniv t -> 
    isUniv (Node nf).

Lemma UnivIsUniv : isUniv Univ.
Proof.
  cofix CH.    (* this application of cofix is fine *)
  unfold Univ. 

Admitted.

ณ จุดนี้ฉันยอมแพ้หลักฐาน เป้าหมายปัจจุบันคือ:

CH : isUniv Univ
============================
isUniv (cofix Univ  : Tree := Node (fun _ : A => Some Univ))

ฉันไม่รู้ว่าจะใช้กลวิธีใดในการกำจัดcofixในเป้าหมายการผลิต(โหนดบางอย่าง)เพื่อให้ฉันสามารถใช้isunivได้

ใครสามารถช่วยพิสูจน์บทแทรกนี้ได้บ้าง
อะไรคือวิธีมาตรฐานในการกำจัดcofixในสถานการณ์เช่นนี้?


1
แท็ก "การพิสูจน์แบบโต้ตอบ" ไม่เพียงพอเนื่องจากโดยทั่วไปหมายถึงระบบการพิสูจน์แบบโต้ตอบในแง่ของความซับซ้อน - เชิงทฤษฎี คำที่ฉันคิดว่าถูกต้องคือ "interactive-theorem-proving" หรือ "theorem-พิสูจน์"
Iddo Tzameret

แก้ไขโดยใช้ "ผู้ช่วยพิสูจน์"
Dave Clarke

คำตอบ:


6

คุณสามารถกำจัด cofix โดยใช้ฟังก์ชั่นเสริมที่รูปแบบตรงกับต้นไม้

Definition TT (t:Tree) :=
  match t with
    | Node o => Node o
  end.

Lemma TTid : forall t: Tree, t = TT t.
  intro t.
  destruct t.
  reflexivity.
  Qed.

Lemma UnivIsUniv : isUniv Univ.
Proof.
  cofix.
  rewrite TTid.
  unfold TT.
  unfold Univ.

คุณจะได้รับเป้าหมายนี้ซึ่งเป็นขั้นตอนที่ผ่อนคลาย

  UnivIsUniv : isUniv Univ
  ============================
   isUniv
     (Node
        (fun _ : A =>
         Some (cofix Univ  : Tree := Node (fun _ : A => Some Univ))))

ฉันดัดแปลงเทคนิคนี้จากhttp://adam.chlipala.net/cpdt/html/Coinductive.html


ขอบคุณสำหรับสิ่งนี้. ฉันกำลังดูหน้านั้นในเวลาเดียวกันกับคำตอบของคุณเข้ามาบ้า แต่ดูเหมือนว่าจะทำงาน ... แล้วฉันก็ติดอีกเล็กน้อย แต่ฉันจะทุบหัวของฉันกับอีกต่อไปอีกเล็กน้อย
Dave Clarke

9
(* I post my answer as a Coq file. In it I show that supercoooldave's
   definition of a universal tree is not what he intended. His isUniv
   means "the tree has an infinite branch". I provide the correct
   definition, show that the universal tree is universal according to
   the new definition, and I provide counter-examples to
   supercooldave's definition. I also point out that the universal
   tree of branching type A has an infinite path iff A is inhabited.
   *)

Set Implicit Arguments.

CoInductive Tree (A : Set): Set := Node : (A -> option (Tree A)) -> Tree A.

Definition child (A : Set) (t : Tree A) (a : A) :=
  match t with
    Node f => f a
  end.

(* We consider two trees, one is the universal tree on A (always
   branches out fully), and the other is a binary tree which always
   branches to one side and not to the other, so it is like an
   infinite path with branches of length 1 shooting off at each node.  *)

CoFixpoint Univ (A : Set) : Tree A := Node (fun _ => Some (Univ A)).

CoFixpoint Thread : Tree (bool) :=
  Node (fun (b : bool) => if b then Some Thread else None).

(* The original definition of supercooldave should be called "has an
   infinite path", so we rename it to "hasInfinitePath". *)
CoInductive hasInfinitePath (A : Set) : Tree A -> Prop :=
  haspath : forall (f : A -> option (Tree A)) (a : A) (t : Tree A),
    f a = Some t ->
    hasInfinitePath t -> 
    hasInfinitePath (Node f).

(* The correct definition of universal tree. *)
CoInductive isUniv (A : Set) : Tree A -> Prop :=
  isuniv : forall (f : A -> option (Tree A)),
    (forall  a, exists t, f a = Some t /\ isUniv t) -> 
    isUniv (Node f).

(* Technicalities that allow us to get coinductive proofs done. *)
Definition TT (A : Set) (t : Tree A) :=
  match t with
    | Node o => Node o
  end.

Lemma TTid (A : Set) : forall t: Tree A, t = TT t.
  intros A t.
  destruct t.
  reflexivity.
  Qed.

(* Thread has an infinite path. *)
Lemma ThreadHasInfinitePath : hasInfinitePath Thread.
Proof.
  cofix H.
  rewrite TTid.
  unfold TT.
  unfold Thread.
  (* there is a path down the "true" branch leading to Thread. *)
  apply haspath with (a := true) (t := Thread).
  auto.
  auto.
Qed.

(* Auxiliary lemma *)
Lemma univChildNotNone (A : Set) (t : Tree A) (a : A):
  isUniv t -> (child t a <> None).
Proof.
  intros A t a [f H].
  destruct (H a) as [u [G _]].
  unfold child.
  rewrite G.
  discriminate.
Qed.

(* Thread is not universal. *)
Lemma ThreadNotUniversal: ~ (isUniv Thread).
Proof.
  unfold not.
  intro H.
  eapply univChildNotNone with (t := Thread) (a := false).
  auto.
  unfold Thread, child.
  auto.
Qed.

(* Now let us show that Univ is universal. *)
Lemma univIsuniv (A : Set): isUniv (Univ A).
Proof.
  intro A.
  cofix H.
  rewrite TTid.
  unfold TT.
  unfold Univ.
  apply isuniv.
  intro a.
  exists (Univ A).
  auto.
Qed.

(* By the way, it need not be the case that a universal tree has
   an infinite path! In fact, the universal tree of branching type
   A has an infinite path iff A is inhabited. *)

Lemma whenUnivHasInfiniteBranch (A : Set):
  hasInfinitePath (Univ A) <-> exists a : A, True.
Proof.
  intro A.
  split.
  intro H.
  destruct H as [f a t _].
  exists a.
  trivial.
  intros [a _].
  cofix H.
  rewrite TTid.
  unfold TT.
  unfold Univ.
  apply haspath with (t := Univ A); auto.
Qed.

ขอบคุณสำหรับคำตอบที่ค่อนข้างน่าอาย ฉันพบปัญหากับการเป็นที่อยู่อาศัย แต่จัดการเพื่อกลเม็ดเด็ดพรายทางของฉันรอบที่ น่าแปลกที่จักรวาลไม่ได้ปรากฏตัวออกมา
Dave Clarke

ฉันไม่อายที่คำตอบของฉัน :-) ฉันคิดว่าฉันอาจให้คำตอบที่ครอบคลุมถ้าฉันให้
Andrej Bauer

คำตอบของคุณน่าอายสำหรับฉัน แต่ชื่นชมอย่างแน่นอน
Dave Clarke

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