“长度索引向量是按自然数索引的归纳族,可写作 $\operatorname{Vec}(A,n)$; 只构造 $\operatorname{Vec}(A,0)$, 则把长度索引从 $n$ 推进到…”
形式陈述 ​
归纳类型由一组构造器的引入规则生成,并取满足这些规则的最小闭合类型。若用类型算子表示,可把它写成
自然数的引入规则为
参数化列表则有
这些是声明式类型规则:它们规定什么可作为值的证据,不等同于编译器的内存布局或模式匹配算法。消去、递归与归纳原则由构造器的完备性导出,但其计算规则应另行陈述,不能仅凭“有构造器”省略。
为使定义保持良基,递归变量通常必须在
直觉 ​
归纳类型不是任意一个“提到自身”的类型方程,而是一份有限的出生证明。自然数只有两种来源:zero 直接生成一个值,succ 从已经生成的自然数再生成一个值。于是每个居民都带着有限构造历史,可以沿最后一个构造步骤拆解,并把问题递归地交给更早生成的部分。
这也解释了最小性。方程 zero、succ zero、succ (succ zero) 等有限层对象。最大不动点式的共归纳解释才用于无限流等可持续观察的对象。
例子与边界 ​
每个自然数都形如 add zero m = m,add (succ n) m = succ (add n m)。递归调用面对的是构造器内部严格更小的
无限流 1,1,1,… 没有有限的最终构造树,因而不是上述列表归纳类型的一个普通值;它需要惰性逐步生产,或使用共归纳类型及生产性条件。另一个失败边界是
一般递归类型中的 fold/unfold 只在类型与其一层展开之间转换。它们本身不说明居民是否由有限构造器生成,也不自动提供归纳假设。反过来,归纳类型的构造器往往由实现编译成标签和字段,但其理论含义是引入规则及最小性,而不是某个固定的运行时编码。
推论与应用 ​
归纳类型为结构递归、覆盖检查和归纳证明提供共同骨架。代数数据类型若采用严格正递归并取良基的最小解释,就得到常见的归纳数据;证明助理还可把构造器生成相应的递归子和依赖消去原则。
依赖类型进一步允许归纳族由索引区分精确形状,例如长度索引向量。此时构造器不仅生成值,还约束结果索引;核心思想仍是有限生成与正性,但消去时必须让目标命题随索引变化,不能退化成普通固定结果类型的 fold。
参考资料
- Per Martin-Löf, Intuitionistic Type Theory, Bibliopolis, 1984,inductive definitions and elimination。
- Robert Harper, Practical Foundations for Programming Languages, 2nd ed., Cambridge University Press, 2016,inductive and coinductive types。
- Thierry Coquand and Christine Paulin, “Inductively Defined Types,” COLOG-88, 1990,strict positivity and inductive definitions。