为什么Agda和Coq在严格的积极性上有分歧?


24

我偶然发现了Agda和Coq之间一个令人困惑的分歧,这显然与它们的类型理论之间最众所周知的区别(例如(im)预测性,归纳递归等)没有关系。

特别是,Agda接受以下定义:

  data Ty : Set0 -> Set0 where
    c1 : Ty ℕ
    c2 : Ty (Ty ℕ)

而等效的Coq定义则被拒绝,因为[Ty _]作为c2中其自身的索引的出现被认为违反了严格的积极性。

  Inductive Ty : Set -> Set :=
    | c1 : Ty nat
    | c2 : Ty (Ty nat).

实际上,这种情况几乎完全是Coq'Art第14.1.2.1节中违反严格积极性的一个例子:

  Inductive T : Set -> Set := c : (T (T nat)).

但是我看不出类型理论之间存在这种差异的原因。在构造函数参数中使用类型的否定出现来证明False的经典示例对我来说很清楚,但是我看不到如何从这种索引风格中得出矛盾(不管严格地是肯定的构造函数参数如何)。

Dybjer的早期归纳性家庭论文在文献中四处寻找,对Paulin-Mohring在CID论文中的解决方案提出了副手评论,该方案的限制略有不同,并且隐约地暗示了这些差异可能与易混淆性有关,但不再赘述。Dybjer的论文似乎允许这样做,而Paulin-Mohring的论文显然禁止这样做。

显然,我不是第一个注意到这种观点差异的人,有些人认为,在任何一个系统中都不应允许使用此定义(https://lists.chalmers.se/pipermail/agda/2012/004249.html),但是我还没有找到关于为什么在一个系统中听起来很合理但在另一个系统中没有听起来或者只是观点不同的任何解释。

所以我想我有几个问题:

  1. 这是单调但非严格正数类型的示例吗?(在Coq中;很明显,Agda认为它绝对是积极的)
  2. 为什么在Coq拒绝的同时,Agda允许这样做?在“严格肯定”的解释中,这仅仅是特质的差异,Coq和Agda之间是否存在细微的差异,从而使它在Agda中听起来很不合理,或者在Coq中是不完美的?或者是受特定理论偏好驱动的口味问题?
  3. 上面的第一个定义和下面的等效的归纳-递归定义之间有有意义的区别吗?

归纳递归定义:

  mutual
    data U : Set0 -> Set0 where
      c : (i : Fin 2) -> U (T i)
    T : Fin 2 -> Set0
    T zero = ℕ
    T (suc zero) = U ℕ

我很高兴有相关文献的指导。

提前致谢。


1
据我所知,Coq比基础理论所允许的更为严格,因为它更易于实现并且在实践中足够有用。据我所知,有关一个不同但相关的案例的答案
吉尔斯(Gilles)'所以

1
Agda当前的开发版本不接受此定义:Ty is not strictly positive, because it occurs in an index of the target type of the constructor c2 in the definition of Ty.
gallais

2
是的,您是对的,昨晚有人向我指出了这一点。我一直在使用Debian的2.3.0.1软件包,但是Cabal的2.3.2.1拒绝直接和IR定义。看起来似乎不相关的错误使对索引的阳性检查更加严格:code.google.com/p/agda/issues/detail?id=690 由于在列表中进行了讨论,而没有明确地标记为健全性问题,因此我仍然想知道类型本身是否正确。
Colin Gordon

Answers:


10

这个问题似乎是由两个因素共同导致的混乱:

  1. 我使用的是过时的Agda版本(2.3.0.1)。似乎在2.3.2之前,Agda只是不检查构造函数结果的索引是否严格(请参阅我在线程其他地方链接的错误)。
  2. 仔细阅读Dybjer的归纳家庭论文,可以发现他可能打算在键入构造函数结果的索引时不定义所定义的归纳类型。3.2.1节给出了散文中归纳构造函数的方案,显然我误读了描述方案各部分绑定环境的语言。

当然,这种更仔细的阅读与Coq和(最新版本的)Agda执行的检查一致,该检查禁止T在其自身索引中出现。


4

正如您自己的评论所暗示的,造成这种差异的可能原因是难以置信。Coq历史上具有强制性设置(我相信仍可以作为标志!)

引用亚当·克里帕拉(Adam Chlipala)的书http://adam.chlipala.net/cpdt/html/Universes.html

Coq工具支持命令行标志-impredicative-set,该标志通过将Set强制设置为更基本的方式来修改Gallina。像forall T:Set的术语,T具有Set类型,Set中的归纳定义可以具有构造函数,该构造函数可以对任何类型的参数进行量化。为了保持一致性,必须施加消除限制,类似于对Prop的限制。该限制仅适用于大型归纳类型,其中某些构造函数对Type类型进行量化。在这种情况下,只能对归纳类型的值进行模式匹配,以产生其类型为Set或Prop的结果类型。该规则与Prop规则形成对照,在Prop中,该限制甚至适用于非大归纳类型,并且结果类型只能是Prop类型。在旧版本的Coq中,默认情况下Set是强制性的。以后的版本将Set用作谓语,以避免与某些经典公理不一致。特别是,当使用带有选择公理的强制性Set时,应该当心。结合排除的中间或谓词可扩展性,可能导致不一致。Impredicative Set可以用于对固有的Impedicative数学概念进行建模,但是几乎所有的Coq开发都没有它就可以了。


从上面我发现的错误修复的声音中,听起来好像Agda根本没有在检查构造函数结果的索引正数。这实际上并不能表明我建议的类型是否是单调的,但是表明它与易混淆性无关。
Colin Gordon

2
是的,-impredicative-set使Set在Coq中成为必须。
2013年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.