Намагаючись довести деякі основні властивості за допомогою коіндуктивних типів у Coq, я продовжую стикатися з наступною проблемою, і я не можу її обійти. Я перегнав проблему в простий сценарій Coq наступним чином.
Типу дерево визначає , можливо , нескінченні дерева з гілками , мічених з елементами типу A . Гілка не обов'язково бути визначена для всіх елементів A . Значення Univ - це нескінченне дерево з усіма визначеними гілками A. isUniv перевіряє, чи задане дерево рівне Univ . Лема стверджує, що Univ справді задовольняє цеUniv .
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.
У цей момент я відмовляюся від доказів. Поточна мета:
CH : isUniv Univ
============================
isUniv (cofix Univ : Tree := Node (fun _ : A => Some Univ))
Я не знаю, яку тактику застосувати, щоб усунути кофікс у меті виробляти ( Вузень щось), щоб я міг застосувати isuniv .
Хтось може допомогти довести цю лему?
Які стандартні способи усунення кофіксу в такій ситуації?