很明显,Agda中有一些称为“积极性检查”的功能,可以明显保持系统声音even if type-in-type
is enabled。
我很想知道这是什么,但是the Agda Manual fails to answer the question, and only explains how to turn it off。
我在午餐桌上听到这是关于polarity in type theory的信息,但这仅是我所知道的。我在网上找不到任何可以解释这个概念的原因,以及为什么它对保持健全性很有用。任何可理解的解释将不胜感激。
答案 0 :(得分:5)
首先,我必须清除一个误解:启用类型输入时,积极性检查不能保证合理性。因此,数据类型必须同时满足阳性检查和Universe检查,才能保持健全性。
现在,为了解释阳性检查,让我们先来看一个不进行阳性检查的反例:
-- the empty type
data ⊥ : Set where
-- a non-positive type
data Bad : Set where
bad : (Bad → ⊥) → Bad
假设允许此数据类型,则可以轻松证明⊥
:
bad-is-false : Bad → ⊥
bad-is-false (bad f) = f (bad f)
bad-is-true : Bad
bad-is-true = bad bad-is-false
boom : ⊥
boom = bad-is-false bad-is-true
在Curry-Howard对应关系下,Bad的定义为:当且仅当Bad为假时,Bad才为真。因此,导致不一致的情况就不足为奇了。
阳性检查排除了数据类型,例如Bad。通常,(严格)正则条件表示数据类型为c
的每个构造函数D
的形式都应为
c : (x1 : A1)(x2 : A2) ... (xn : An) → D xs
其中每个参数的类型Ai是非递归的(即,它不引用D
)或形式为(y1 : B1)(y2 : B2) ... (ym : Bm) → D ys
的形式,其中每个Bj
都不引用D
。
Bad
不满足此条件,因为构造函数bad
的参数的类型为Bad → ⊥
,这不是两种允许的形式。
“积极性检查”的名称(与类型理论中的许多事情一样)来自类别理论,特别是积极内在功能的概念。满足正性标准的数据类型的每个定义在类型类别上都是这样的肯定因素。这意味着我们可以构造该endofunctor的initial algebra,在构造类型理论模型(用于证明合理性)时,可以使用它来对数据类型进行建模。