Coq上的共归纳,类型不匹配

Coq上的共归纳,类型不匹配,coq,proof,dependent-type,coinduction,corecursion,Coq,Proof,Dependent Type,Coinduction,Corecursion,我一直在尝试共导类型,并决定定义自然数和向量的共导版本(在类型中列出它们的大小)。我将它们和无限数定义为: CoInductive conat : Set := | cozero : conat | cosuc : conat -> conat. CoInductive covec (A : Set) : conat -> Set := | conil : covec A cozero | cocons : forall (n : conat), A -> covec A n

我一直在尝试共导类型,并决定定义自然数和向量的共导版本(在类型中列出它们的大小)。我将它们和无限数定义为:

CoInductive conat : Set :=
| cozero : conat
| cosuc : conat -> conat.

CoInductive covec (A : Set) : conat -> Set :=
| conil : covec A cozero
| cocons : forall (n : conat), A -> covec A n -> covec A (cosuc n).           

CoFixpoint infnum : conat := cosuc infnum.
除了我给一个无限的covector下的定义外,这一切都起了作用

CoFixpoint ones : covec nat infnum := cocons 1 ones.
这导致以下类型不匹配

Error:
In environment
ones : covec nat infnum
The term "cocons 1 ones" has type "covec nat (cosuc infnum)" while it is expected to have type
 "covec nat infnum".

我认为编译器会接受这个定义,因为根据定义,infnum=cosuc infnum。如何使编译器理解这些表达式是相同的?

解决此问题的标准方法在Adam Chlipala的CPDT中进行了描述(请参阅第章)

您可以像这样使用上述定义:

CoFixpoint ones : covec nat infnum.
Proof. rewrite frob_eq; exact (cocons 1 ones). Defined.
或者,也许,以更具可读性的方式:

Require Import Coq.Program.Tactics.

Program CoFixpoint ones : covec nat infnum := cocons 1 ones.
Next Obligation. now rewrite frob_eq. Qed.
Require Import Coq.Program.Tactics.

Program CoFixpoint ones : covec nat infnum := cocons 1 ones.
Next Obligation. now rewrite frob_eq. Qed.