Coq proof'ta düzeltmeyi ortadan kaldırma


15

Coq içinde coinductive türleri kullanarak bazı temel özellikleri kanıtlamaya çalışırken, aşağıdaki sorunla karşılaşmaya devam ediyorum ve bunun üstesinden gelemiyorum. Sorunu aşağıdaki gibi basit bir Coq betiğine damıttım.

Ağaç türü , muhtemelen A tipi elemanlarla etiketlenmiş dalları olan sonsuz ağaçları tanımlar . Bir dal tüm unsurları için tanımlanan gerekmez A . Univ değeri , tüm A dallarının daima tanımlandığı sonsuz ağaçtır . isUniv Verilen ağaç eşit olup olmadığını testler Üniv . Lemma şöyle diyor: Üniv Gerçekten de öyle tatmin 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.

Bu noktada kanıtı bırakıyorum. Mevcut hedef:

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

Ben ortadan kaldırmak için uygulanacak taktik hangi bilmiyorum cofix üretmek için golü (Düğüm bir şey) uygulayacağımı bilmiyorum .

Herkes bu lemmayı kanıtlamaya yardımcı olabilir mi? Böyle bir durumda düzeltmeyi
ortadan kaldırmanın standart yolları nelerdir ?


1
"İnteraktif kanıtlar" etiketi genellikle karmaşıklık teorik anlamında interaktif kanıtlama sistemlerine atıfta bulunduğu için yeterli değildir. Sanırım doğru terim "interaktif teorem kanıtlama" ya da "teorem kanıtlama" dır.
Iddo Tzameret

"Kanıt yardımcıları" kullanılarak düzeltildi
Dave Clarke

Yanıtlar:


6

Desen ile eşleşen bir yardımcı işlevi kullanarak düzeltmeyi ortadan kaldırabilirsiniz.

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.

Çözülmemiş bir adım olan bu hedefe ulaşacaksınız.

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

Bu tekniği http://adam.chlipala.net/cpdt/html/Coinductive.html adresinden


Bunun için teşekkürler. Bu sayfaya cevabınız geldiğinde aynı anda bakıyordum. Çılgınca, ama işe yarıyor gibi görünüyor ... ve sonra biraz daha sıkışıp kaldım, ama başımı biraz daha uzun süre bastıracağım.
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.

Bu biraz utanç verici yanıt için teşekkürler. A'nın yaşadığı sorunla karşılaştım, ancak bu konuda yolumdan incelik yapmayı başardım. Şaşırtıcı bir şekilde, evren ortaya çıkmadı.
Dave Clarke

Benim cevabımdan utanmıyorum :-) Bir tane verirsem kapsamlı bir cevap verebileceğimi düşündüm.
Andrej Bauer

Cevabınız benim için utanç vericiydi. Ama kesinlikle çok takdir.
Dave Clarke

Ben edildi şaka ... neyse, yaklaşık mahcup bir şey yok. Daha kötü hatalar yaptım. Ayrıca, web insanları düşünmeden yayınlamaya davet eder. Ben burada tanımınızın hatalı bir düzeltmesini yayınladım, ama neyse ki bunu sizden önce fark ettim.
Andrej Bauer
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.