我有以下两个定义,导致两个不同的错误消息。 第一个定义由于严格的正性而被拒绝,第二个定义由于宇宙的不一致性。
(* non-strictly positive *)
Inductive SwitchNSP (A : Type) : Type :=
| switchNSP : SwitchNSP bool -> SwitchNSP A.
Fail Inductive UseSwitchNSP :=
| useSwitchNSP : SwitchNSP UseSwitchNSP -> UseSwitchNSP.
(* universe inconsistency *)
Inductive SwitchNSPI : Type -> Type :=
| switchNSPI : forall A, SwitchNSPI bool -> SwitchNSPI A.
Fail Inductive UseSwitchNSPI :=
| useSwitchNSPI : SwitchNSPI UseSwitchNSPI -> UseSwitchNSPI.
聊天时发现,首先检查了宇宙中(不一致)的一致性,即第一个定义遵循此检查,但由于严格的正性问题而失败。
据我了解严格的正性限制,如果Coq允许非严格的正性数据类型定义,那么我可以不使用fix
来构造非终止函数(这很糟糕)。
为了使之更加混乱,第一个定义在Agda中被接受,第二个定义给出了严格的阳性错误。
data Bool : Set where
True : Bool
False : Bool
data SwitchNSP (A : Set) : Set where
switchNSP : SwitchNSP Bool -> SwitchNSP A
data UseSwitchNSP : Set where
useSwitchNSP : SwitchNSP UseSwitchNSP -> UseSwitchNSP
data SwitchNSPI : Set -> Set where
switchNSPI : forall A -> SwitchNSPI Bool -> SwitchNSPI A
data UseSwitchNSPI : Set where
useSwitchNSP : SwitchNSPI UseSwitchNSPI -> UseSwitchNSPI
现在我的问题有两个方面:首先,用上述定义可以构造的“邪恶的例子”是什么?其次,the rules中的哪一个适用于以上定义?
注1:需要澄清的是,我认为我确实理解为什么不允许对第二个定义进行类型检查,但是当允许该定义时,我仍然觉得这里没有发生“邪恶”。
注2:我首先认为我的示例是this question的实例,但是启用Universe多态性对第二个定义没有帮助。
答案 0 :(得分:0)
我有以下两个定义会导致两个不同的错误消息。第一个定义因为严格的正性而被拒绝,第二个因为宇宙不一致而被拒绝。
(* 非严格正数 *) 电感式 SwitchNSP (A : Type) : Type := | switchNSP : SwitchNSP bool -> SwitchNSP A.
失败感应UseSwitchNSP := | useSwitchNSP : SwitchNSP UseSwitchNSP -> UseSwitchNSP.
(* 宇宙不一致 *) 电感式开关NSPI:类型 -> 类型:= | switchNSPI : forall A, SwitchNSPI bool -> SwitchNSPI A.
失败感应UseSwitchNSPI := | useSwitchNSPI : SwitchNSPI UseSwitchNSPI -> UseSwitchNSPI。