Trong khi cố gắng chứng minh một số thuộc tính cơ bản bằng cách sử dụng các loại cưỡng chế trong Coq, tôi tiếp tục gặp vấn đề sau và tôi không thể khắc phục được. Tôi đã chắt lọc vấn đề vào một kịch bản Coq đơn giản như sau.
Các loại cây xác định cây có thể vô hạn với các ngành, dán nhãn với các yếu tố của loại Một . Chi nhánh không cần phải được định nghĩa cho tất cả các yếu tố của một . Giá trị Univ là cây vô hạn với tất cả các nhánh A luôn được xác định. isUniv kiểm tra xem một cây đã cho có bằng Univ không . Bổ đề nói rằng Univ thực sự thỏa mãn là 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.
Lúc này tôi từ bỏ bằng chứng. Mục tiêu hiện tại là:
CH : isUniv Univ
============================
isUniv (cofix Univ : Tree := Node (fun _ : A => Some Univ))
Tôi không biết nên áp dụng chiến thuật nào để loại bỏ cofix trong mục tiêu cần sản xuất (Node gì đó) để tôi có thể áp dụng isuniv .
Bất cứ ai có thể giúp chứng minh bổ đề này?
Các cách tiêu chuẩn để loại bỏ cofix trong tình huống như vậy là gì?