Tout en essayant de prouver certaines propriétés de base à l'aide de types coinductifs dans Coq, je continue à rencontrer le problème suivant et je ne peux pas le contourner. J'ai distillé le problème dans un simple script Coq comme suit.
Le type d' arbre définit des arbres peut - être infini avec des branches marquées avec des éléments de type A . Une branche ne doit pas être défini pour tous les éléments de A . La valeur Univ est l'arbre infini avec toutes les branches A toujours définies. isUniv teste si un arbre donné est égal à l' Univ . Le lemme affirme que Univ ne fait satisfaire 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.
À ce stade, j'abandonne la preuve. L'objectif actuel est:
CH : isUniv Univ
============================
isUniv (cofix Univ : Tree := Node (fun _ : A => Some Univ))
Je ne sais pas quelle tactique appliquer pour éliminer le cofix dans le but de produire (Node something) afin que je puisse appliquer isuniv .
Quelqu'un peut-il aider à prouver ce lemme?
Quels sont les moyens standard d'éliminer le cofix dans une telle situation?
la source
Réponses:
Vous pouvez éliminer le cofix en utilisant une fonction auxiliaire dont le modèle correspond à Tree.
Vous obtiendrez cet objectif, qui est une étape non déroulée.
J'ai adapté cette technique de http://adam.chlipala.net/cpdt/html/Coinductive.html
la source
la source