Próbując udowodnić pewne podstawowe właściwości przy użyciu typów koindukcyjnych w Coq, ciągle napotykam na następujący problem i nie mogę go obejść. Wydzieliłem problem na prosty skrypt Coq w następujący sposób.
Rodzaj Drzewo definiuje ewentualnie nieskończone drzew z gałęziami oznaczonych elementów typu A . Oddział nie musi być określone dla wszystkich elementów A . Wartość Univ jest nieskończonym drzewem z zawsze zdefiniowanymi wszystkimi gałęziami A. isUniv sprawdza, czy dane drzewo jest równe Univ . Lemat mówi, że Univ rzeczywiście spełnia 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.
W tym momencie rezygnuję z dowodu. Obecny cel to:
CH : isUniv Univ
============================
isUniv (cofix Univ : Tree := Node (fun _ : A => Some Univ))
Nie wiem, jaką taktykę zastosować, aby wyeliminować kofiks w celu wyprodukowania (Node coś) , abym mógł zastosować isuniv .
Czy ktoś może pomóc udowodnić ten lemat?
Jakie są standardowe sposoby eliminacji kofika w takiej sytuacji?
źródło
Odpowiedzi:
Możesz wyeliminować cofix za pomocą funkcji pomocniczej, której wzór pasuje do drzewa.
Osiągniesz ten cel, który jest krokiem odprężenia.
Dostosowałem tę technikę z http://adam.chlipala.net/cpdt/html/Coinductive.html
źródło
źródło