Eliminazione del cofix in Coq proof


15

Mentre provo a dimostrare alcune proprietà di base usando tipi coinduttivi in ​​Coq, continuo a riscontrare il seguente problema e non riesco ad aggirare il problema. Ho distillato il problema in un semplice script Coq come segue.

Il tipo di albero definisce eventualmente infinite alberi con rami etichettati con elementi di tipo A . Un ramo non deve essere definito per tutti gli elementi di A . Il valore Univ è l'albero infinito con tutti i rami A sempre definiti. isUniv verifica se un determinato albero è uguale a Univ . Il lemma afferma che Univ soddisfa davvero 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.

A questo punto rinuncio alla prova. L'obiettivo attuale è:

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

Non so quale tattica applicare per eliminare il cofix nell'obiettivo da produrre (Nodo qualcosa) in modo da poter applicare isuniv .

Qualcuno può aiutare a dimostrare questo lemma?
Quali sono i modi standard per eliminare cofix in una situazione del genere?


1
Il tag "prove interattive" non è adeguato, in quanto si riferisce generalmente ai sistemi di prova interattivi nel loro significato teorico della complessità. Suppongo che il termine corretto sia "dimostrazione del teorema interattivo" o "dimostrazione del teorema".
Iddo Tzameret,

Risolto, usando "prove-assistenti"
Dave Clarke,

Risposte:


6

È possibile eliminare cofix utilizzando una funzione ausiliaria che corrisponde al modello Tree.

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.

Otterrai questo obiettivo, che è un passo indietro.

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

Ho adattato questa tecnica da http://adam.chlipala.net/cpdt/html/Coinductive.html


Grazie per questo. Stavo guardando quella pagina più o meno nello stesso momento in cui è arrivata la tua risposta. Pazzo, ma sembra funzionare ... e poi rimango bloccato un po 'più avanti, ma mi batterò la testa per un altro po'.
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.

Grazie per questa risposta alquanto imbarazzante. Mi sono imbattuto nel problema con A abitato, ma sono riuscito a risolverlo. Sorprendentemente, l'universo non si è sviluppato.
Dave Clarke,

Bene, non sono imbarazzato dalla mia risposta :-) Ho pensato che avrei potuto dare una risposta completa se ne avessi una.
Andrej Bauer,

La tua risposta è stata imbarazzante per me. Ma sicuramente molto apprezzato.
Dave Clarke,

Stavo scherzando ... Comunque, non c'è nulla di cui essere imbarazzati. Ho fatto errori peggiori. Inoltre, il web invita le persone a postare prima di pensare. Io stesso ho pubblicato qui una correzione errata della tua definizione, ma per fortuna l'ho notato prima di te.
Andrej Bauer,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.