Coq içinde coinductive türleri kullanarak bazı temel özellikleri kanıtlamaya çalışırken, aşağıdaki sorunla karşılaşmaya devam ediyorum ve bunun üstesinden gelemiyorum. Sorunu aşağıdaki gibi basit bir Coq betiğine damıttım.
Ağaç türü , muhtemelen A tipi elemanlarla etiketlenmiş dalları olan sonsuz ağaçları tanımlar . Bir dal tüm unsurları için tanımlanan gerekmez A . Univ değeri , tüm A dallarının daima tanımlandığı sonsuz ağaçtır . isUniv Verilen ağaç eşit olup olmadığını testler Üniv . Lemma şöyle diyor: Üniv Gerçekten de öyle tatmin 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.
Bu noktada kanıtı bırakıyorum. Mevcut hedef:
CH : isUniv Univ
============================
isUniv (cofix Univ : Tree := Node (fun _ : A => Some Univ))
Ben ortadan kaldırmak için uygulanacak taktik hangi bilmiyorum cofix üretmek için golü (Düğüm bir şey) uygulayacağımı bilmiyorum .
Herkes bu lemmayı kanıtlamaya yardımcı olabilir mi? Böyle bir durumda düzeltmeyi
ortadan kaldırmanın standart yolları nelerdir ?