Skip to content

依赖类型

Dependent type

类型表达式可依赖项值的类型系统构造。

条目类型
定义

形式陈述

依赖类型允许类型表达式含有项变量。它推广了普通函数类型;依赖函数类型写作

Π(x:A).B(x),

其值接收 a:A 并返回 B(a) 型结果;当 B 不依赖 x 时退化为普通函数类型 AB。依赖对类型 Σ(x:A).B(x) 同时携带索引 a:A 与依赖于它的值 b:B(a)。类型检查还需要判断类型中的项何时按定义相等,通常通过受控归约和可判定的转换规则完成。

直觉

普通类型只能说“这是一个整数列表”,依赖类型还能把长度、维度或协议状态写进类型。函数的返回类型可随输入值变化,于是接口本身精确描述输入与输出之间的关系。最有效的心智模型是“类型也能提到程序数据”,而不是“运行时随便计算一个类型”;为了让类型检查可执行,出现在类型中的计算通常受纯度和终止性约束。精确规格带来更强保证,也把原本的测试义务转化为构造证明项的义务。

例子与边界

长度索引向量是按自然数索引的归纳族,可写作 Vec(A,n)nil 只构造 Vec(A,0)cons 则把长度索引从 n 推进到 n+1。连接函数的类型

append:Π(m:N).Π(n:N).Vec(A,m)Vec(A,n)Vec(A,m+n)

保证结果长度由输入长度相加得到。矩阵乘法可把内维相等写进参数类型,从而使维度不匹配无法通过检查。

边界是值相等问题。若类型检查必须判断任意一般递归程序是否返回相同自然数,就会遇到不可判定性;实际系统通过强正规化核心、结构递归、用户提供证明或把复杂相等推迟为命题来控制。依赖类型也不会自动证明实现正确,程序员仍须给出能通过这些精确类型的项。

推论与应用

依赖类型支撑 Lean、Coq、Agda 等证明助理与高度验证的程序库。通过Curry–Howard 对应,命题可作为依赖类型、证明可作为其居民;依赖消去子让 motive 随数据与索引变化,从同一规则得到递归程序和归纳证明。本页只说明这种依赖关系,不重写归纳类型的构造与正性条件。

它扩展类型判断的同时,也依赖严格的正规化性质来保持转换检查可判定。协议状态、数组边界、序列化格式和密码实现都可把关键不变量提升到类型层。

参考资料
  • Per Martin-Löf, Intuitionistic Type Theory, Bibliopolis, 1984,Full monograph, dependent function, pair, and identity types。
  • Bengt Nordström, Kent Petersson, and Jan M. Smith, Programming in Martin-Löf’s Type Theory, Oxford University Press, 1990,Chs. 2–7, Martin-Löf type theory and programming。
关系图谱16 个相邻概念 · 1 类关系

拖动节点调整位置。

显示关系

显示:依赖

  1. 前置三跳
  2. 前置二跳
  3. 前置一跳
  4. 当前条目
  5. 后续一跳
  6. 后续二跳
  7. 后续三跳
文字版关系按与当前条目的最短距离分组