Saat mencoba membuktikan beberapa sifat dasar menggunakan tipe coinductive dalam Coq, saya terus mengalami masalah berikut ini dan saya tidak bisa mengatasinya. Saya telah menyaring masalahnya menjadi skrip Coq sederhana sebagai berikut.
Jenis Pohon mendefinisikan pohon mungkin tak terbatas dengan cabang diberi label dengan elemen tipe A . Sebuah cabang tidak perlu didefinisikan untuk semua elemen dari A . Nilai Univ adalah pohon tanpa batas dengan semua cabang A selalu ditentukan. isUniv menguji apakah pohon yang diberikan sama dengan Univ . Lemma menyatakan bahwa Univ memang memuaskan 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.
Pada titik ini saya menyerahkan buktinya. Tujuan saat ini adalah:
CH : isUniv Univ
============================
isUniv (cofix Univ : Tree := Node (fun _ : A => Some Univ))
Saya tidak tahu taktik mana yang harus diterapkan untuk menghilangkan cofix di tujuan untuk menghasilkan (Node sesuatu) sehingga saya dapat menerapkan isuniv .
Adakah yang bisa membantu membuktikan lemma ini?
Apa cara standar menghilangkan cofix dalam situasi seperti itu?