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?