Während ich versuche, einige grundlegende Eigenschaften mithilfe von coinduktiven Typen in Coq zu beweisen, stoße ich weiterhin auf das folgende Problem und kann es nicht umgehen. Ich habe das Problem folgendermaßen in ein einfaches Coq-Skript unterteilt.
Der Typ Tree definiert möglicherweise unendliche Bäume mit Zweigen, die mit Elementen des Typs A gekennzeichnet sind . Eine Verzweigung muss nicht für alle Elemente von A definiert werden . Der Wert Univ ist der unendliche Baum, in dem immer alle A- Zweige definiert sind. isUniv testet, ob ein gegebener Baum dem Univ entspricht . Das Lemma besagt, dass Univ tatsächlich isUniv erfüllt .
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.
An dieser Stelle gebe ich den Beweis auf. Das aktuelle Ziel ist:
CH : isUniv Univ
============================
isUniv (cofix Univ : Tree := Node (fun _ : A => Some Univ))
Ich weiß nicht, welche Taktik ich anwenden soll, um das Cofix im Ziel zu eliminieren (Node etwas), damit ich isuniv anwenden kann .
Kann jemand helfen, dieses Lemma zu beweisen?
Was sind die Standardmethoden, um cofix in einer solchen Situation zu eliminieren ?
quelle
Antworten:
Sie können cofix mit einer Hilfsfunktion entfernen, deren Muster mit Tree übereinstimmt.
Sie erhalten dieses Ziel, das ein Schritt abgewickelt ist.
Ich habe diese Technik von http://adam.chlipala.net/cpdt/html/Coinductive.html angepasst
quelle
quelle