最佳答案
我有以下两个定义,它们导致两个不同的错误消息。 第一个定义由于严格的正性而被否定,第二个定义由于宇宙的不一致而被否定。
(* 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.
在 Gitter 上聊天显示,宇宙(in)一致性首先被检查,也就是说,第一个定义符合这个检查,但是由于严格的积极性问题而失败。
就我对严格正性限制的理解而言,如果 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
现在我的问题有两个方面: 第一,我可以用上述定义来构建什么样的“恶例”?第二,规则中哪一个适用于上述定义?
一些注意事项: