为什么由于严格的积极性而不允许我的定义?

时间:2019-05-15 07:15:40

标签: coq agda type-theory

我有以下两个定义,导致两个不同的错误消息。 第一个定义由于严格的正性而被拒绝,第二个定义由于宇宙的不一致性。

(* 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多态性对第二个定义没有帮助。

1 个答案:

答案 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。