├── .github └── workflows │ └── main.yml ├── .gitignore ├── README.md ├── abstract.tex ├── chapters ├── beginnings.tex ├── category.tex ├── curry-howard.tex ├── hott.tex ├── introduction.tex ├── martin-lof.tex └── prospect.tex ├── history.bib ├── history.tex ├── images ├── difficulty1.png ├── difficulty2.png ├── difficulty3.png ├── difficulty4.png ├── external-internal-small.png └── infinity.png └── quiver.sty /.github/workflows/main.yml: -------------------------------------------------------------------------------- 1 | name: Build document 2 | 3 | # Controls when the workflow will run 4 | on: 5 | push: 6 | branches: [ main ] 7 | pull_request: 8 | workflow_dispatch: 9 | 10 | jobs: 11 | dependencies: 12 | name: Build dependencies 13 | runs-on: ubuntu-latest 14 | outputs: 15 | version: ${{ steps.version.outputs.version }} 16 | 17 | steps: 18 | - name: Set up Git repository 19 | uses: actions/checkout@v3 20 | with: 21 | fetch-depth: 1 22 | 23 | - name: Create global variables 24 | id: version 25 | run: echo "version=$(git rev-parse --short HEAD)" >> $GITHUB_OUTPUT 26 | 27 | build_latex: 28 | runs-on: ubuntu-latest 29 | needs: [dependencies] 30 | steps: 31 | - name: Set up Git repository 32 | uses: actions/checkout@v3 33 | - name: Compile LaTeX document 34 | uses: xu-cheng/latex-action@v3 35 | with: 36 | # root_file: "*.tex" 37 | # glob_root_file: true 38 | root_file: "history.tex" 39 | latexmk_use_xelatex: true 40 | latexmk_shell_escape: true 41 | - name: Upload PDF file 42 | uses: actions/upload-artifact@v4 43 | with: 44 | name: history 45 | path: | 46 | *.pdf 47 | 48 | - name: Release (${{ needs.dependencies.outputs.version }}) 49 | uses: softprops/action-gh-release@v1 50 | with: 51 | tag_name: v${{ github.run_number }}-${{ needs.dependencies.outputs.version }} 52 | name: Version ${{ github.run_number }} (${{ needs.dependencies.outputs.version }}) 53 | prerelease: true 54 | files: history.pdf 55 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *.aux 2 | *.bbl 3 | *.bcf 4 | *.blg 5 | *.fdb_latexmk 6 | *.fls 7 | *.log 8 | *.out 9 | *.pdf 10 | *.xml 11 | *.gz 12 | *.toc 13 | *.xdv 14 | .DS_Store 15 | /_minted-history 16 | /.vscode 17 | title.tex -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # History of type theory 类型论简史 2 | 3 | [![CC BY-NC-SA 4.0][cc-by-nc-sa-shield]][cc-by-nc-sa] 4 | 5 | **你可以在[此](https://github.com/Trebor-Huang/history/releases)下载编译好的文件**. 6 | 7 | **You can download the artifacts at [the releases page](https://github.com/Trebor-Huang/history/releases)**. 8 | 9 | 本文停止更新,唯一没有完成的部分是类型论的模型。读者可以移步[此处](https://github.com/Trebor-Huang/model). 10 | 11 | ## License 12 | 13 | This work is licensed under a 14 | [Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License][cc-by-nc-sa]. 15 | 16 | [![CC BY-NC-SA 4.0][cc-by-nc-sa-image]][cc-by-nc-sa] 17 | 18 | [cc-by-nc-sa]: http://creativecommons.org/licenses/by-nc-sa/4.0/ 19 | [cc-by-nc-sa-image]: https://licensebuttons.net/l/by-nc-sa/4.0/88x31.png 20 | [cc-by-nc-sa-shield]: https://img.shields.io/badge/License-CC%20BY--NC--SA%204.0-lightgrey.svg 21 | -------------------------------------------------------------------------------- /abstract.tex: -------------------------------------------------------------------------------- 1 | \documentclass[UTF8, zihao=-4]{ctexart} 2 | \usepackage[T1]{fontenc} 3 | \usepackage[b5paper]{geometry} 4 | \usepackage{graphicx} 5 | \usepackage[dvipsnames]{xcolor} 6 | \usepackage{amssymb,amsmath,amsthm} 7 | \usepackage{fancyhdr} 8 | \usepackage{biblatex} 9 | \usepackage{hyperref} 10 | \usepackage{quiver} 11 | 12 | \newcommand\myshade{85} 13 | \colorlet{mylinkcolor}{violet} 14 | \colorlet{mycitecolor}{orange} 15 | \colorlet{myurlcolor}{Aquamarine} 16 | 17 | \hypersetup{ 18 | linkcolor = mylinkcolor!\myshade!black, 19 | citecolor = mycitecolor!\myshade!black, 20 | urlcolor = myurlcolor!\myshade!black, 21 | colorlinks = true, 22 | } 23 | 24 | \newcommand{\cons}[1]{\textsf{#1}} 25 | \newcommand{\slogan}[1]{\begin{center}% 26 | \fcolorbox{red!80!green}{red!10}{% 27 | \large\textbf{#1}% 28 | }% 29 | \end{center}} 30 | 31 | \theoremstyle{plain} 32 | \newtheorem*{lemma}{引理} 33 | \newtheorem*{theorem}{定理} 34 | \newtheorem*{corollary}{推论} 35 | 36 | \theoremstyle{definition} 37 | \newtheorem*{definition}{定义} 38 | 39 | \theoremstyle{remark} 40 | \newtheorem*{remark}{注} 41 | 42 | \addbibresource{history.bib} 43 | 44 | % \pagestyle{fancy} 45 | % \fancyhead[L]{\nouppercase{\kaishu\rightmark}} 46 | % \fancyhead[R]{\nouppercase{\kaishu\leftmark}} 47 | % \setlength{\headheight}{14pt} 48 | \title{类型论简史 (摘要)} 49 | \date{} 50 | \author{黄栩} 51 | \begin{document} 52 | \maketitle 53 | 54 | 这篇论文是前一次提交的 《类型论简史》 的续写与扩充. 55 | 主要增添了当代更加关注的类型论的历史脉络, 与类型论 56 | 语义学的沿袭与发展, 包括其与范畴逻辑之间的关系. 57 | 58 | 在类型论中, 一切数学对象的含义都由它们从属的类型决定. 59 | 如类型 \(\mathbb N\) 的元素是自然数, 而类型 \(\alpha \times \beta\) 60 | 的元素是有序对, 类型 \(\alpha \to\beta\) 的元素 61 | 是映射, 等等. 而这些类型可以相互组合, 表达出复杂的含义, 62 | 这使得类型论有能力作为数学的基础, 与集合论的地位类似. 63 | 另一方面, 计算机科学中也有利用类型描述程序的传统. 因此, 类型论 64 | 可以看作是数学与计算机之间的桥梁. 这也使得计算机定理 65 | 验证成为了有可行性的工作: 传统的使用一阶逻辑与集合论数学 66 | 基础中, 一个初等的定理也可能需要冗长的说明才能完全 67 | 严格的写出来, 因此只有理论上的可能性. 68 | 类型论的定理验证不仅可以验证数学定理, 69 | 在实际应用上还可以验证各种需要低出错率的 70 | 软硬件(如军事、医用、宇航电子仪器)设计无误. 71 | 72 | \section*{简单类型论} 73 | 类型论是Russell在1903年为了解决以他命名的悖论而提出的. 74 | 如果有集合 \(R = \{x \mid x \notin x\}\), 那么考察 75 | \(R \in R\) 的真假就会发现矛盾. 为了解决这个矛盾, 76 | Russell提出了类型的概念. 77 | 78 | 我们可以发现, 数学中我们根本不会需要讨论 \(x \in x\) 这样的 79 | 命题. 实数 \(x\) 属于实数集 \(\mathbb R\), 而一些实数的 80 | 集合 (如开集) 构成集合族 \(\Omega\). 这些数学对象之间都有明确的层级, 81 | 层级混乱的命题一般没有数学意义. 82 | 更严格来说, 对象之间是有分类的. 譬如虽然二维的点 \((\pi, 3)\) 83 | 和三维空间的点 \((0,1,-1)\) 都是同一个层级的, 但是我们也基本不会 84 | 把它们放在同一个集合中. 85 | 86 | 从这个观察出发, 我们可以把这种分类的概念严格化. 我们设当前研究 87 | 的最基本的个体的分类称作 \(\iota\). 如我们研究数论的时候 88 | \(\iota\) 代表全体自然数, 研究分析学的时候就是全体实数, 等等. 89 | 其次我们需要有一类数学对象表示命题, 因此我们把所有命题构成的分类 90 | 称作 \(o\). 91 | 其次, 我们需要从基本的分类出发组成更复杂的分类. 譬如说可以用 92 | \(\iota \to \iota\) 表示自然数到自然数的函数. 93 | 最后, 我们引入各种逻辑连词, 如 \(\wedge : o \to o \to o\), 94 | \(\forall : (\iota \to o) \to o\) 等等, 并且 95 | 添加相关的推理规则. 这样就得到了简单类型论的逻辑系统. 96 | 97 | 人们依据这种形式系统, 写出了计算机程序 Isabelle, 98 | 用计算机的准确性验证数学证明. 已经有不少数学理论被 Isabelle 形式化. 99 | 譬如质数定理. 这说明类型论与集合论一样, 有形式化数学的基本能力. 100 | 101 | \section*{Curry--Howard 对应} 102 | 观察类型系统的规则, 103 | 假如我们有 \(f : \alpha \to \beta\), 以及 \(a : \alpha\), 104 | 那么我们就能求值得到 \(f(a) : \beta\). 这其实和逻辑里 105 | 最古老的推理有些相像: 假如我们证明了 \(p\Rightarrow q\), 106 | 并且我们证明了 \(p\), 那么我们就可以证明 \(q\). 107 | 在1934年, Curry 注意到了这一相似之处. 随后越来越多 108 | 的对应关系表明, 逻辑中的命题与类型论中的类型表现得非常 109 | 相似. 这就是 Curry--Howard 对应. 因此, 如果我们为 110 | 每一种逻辑关系找到对应的类型, 那么就不需要再额外添加推理 111 | 规则, 直接使用类型作为命题即可. 112 | 113 | 1967年, 利用这些想法, Nicolaas Govert de Bruijn 114 | 设计了一门依值类型论的计算机语言, 称为 Automath. 115 | 1976年, Jutting 在学位论文中使用 Automath 116 | 形式化了 Landau 的《分析学基础》. Automath 没有 117 | 被大规模使用, 不过它的设计影响到了许多后继的类型论. 118 | 119 | F系统在 1972 年由逻辑学家 Jean-Yves Girard 120 | 与 1974 年由计算机科学家 J. C. Reynolds 独立发现. 121 | 这说明 Curry--Howard 对应不仅仅是一个刻意构造的对应, 122 | 而是深刻而直接地影响到了两个学科的发展. 123 | 124 | Bishop 用行动展示了数学的许多重要的部分都能在构造主义中发展, 并且只需要对经 125 | 典数学的理论做较小的修改. 我们只需要选取一种优雅的姿态, 就能 126 | 在构造主义中轻松地完成经典数学中可以做到的事情. 行胜于言, Bishop 极大地推动了构造 127 | 主义数学的发展. 128 | 129 | \section*{同伦类型论} 130 | 131 | 1998年, Hofmann给出了类型论的群胚模型. 这为类型论 132 | 的发展提供了新的启示, 最终产生了同伦类型论的概念. 133 | 134 | 基于拓扑空间的同伦论中, 拓扑空间不满足许多理应满足的性质. 135 | 譬如连续函数构成的空间并不一定能使得求值态射 136 | \(\cons{ev} : [(X \Rightarrow Y) \times X] \to Y\) 连续; 137 | 不是所有空间都有万有覆叠, 等等. 因此使用拓扑空间时 138 | 必须花费精力将性质不好的部分剔除. 139 | 140 | 同伦类型论则从全新的角度解决了这个问题. 正如《几何原本》并不是 141 | 利用实数构造坐标系来研究几何, 而是直接从一系列基本的事实 142 | 出发推导复杂的定理, 同伦类型论不使用实数区间 \([0,1]\) 而是 143 | 直接从类型规则出发刻画同伦的概念. 譬如 144 | \(\pi_4(\mathbb S^3) = \mathbb Z/2\mathbb Z\) 145 | 等性质可以直接在同伦类型论中得到证明. 目前有许多同伦论的 146 | 结论已经可以在同伦类型论中复现. 147 | 148 | 2012--2013年, 由Princeton高等研究院发起了 149 | “泛等数学基础特别年”, 邀请了拓扑学、计算机科学、范畴论、逻辑学 150 | 等等领域的数学家参加. 其中由 Peter Aczel 提议, 尝试使用 151 | 同伦类型论书写非形式化的数学. 这次尝试很快获得了 152 | 初步成功, 最终写出了《同伦类型论:泛等数学基础》这本书. 153 | 它从零出发, 整理了泛等数学基础中的结论, 从同伦类型论 154 | 的角度重新叙述了集合论与范畴论, 并且给出了 155 | 实数的定义与主要性质的证明. 156 | 157 | \section*{类型论的语义} 158 | 159 | 起初, 类型论的语义 160 | 常常使用的是一阶逻辑和集合论现成的语义学工具. 161 | Scott 等人尝试使用拓扑空间与偏序关系等数学对象为 162 | 更一般的类型论提供模型. 1984年, 163 | Seely在一篇文章中指出, 局部积闭范畴可以和 164 | 类型论中的许多东西找到对应. 165 | 这使得类型论的语义学与范畴逻辑学相联系. 166 | 随后, 范畴论与类型论之间的 167 | 关联逐步被发展起来. 各种不同的类型论可以视作是各类不同 168 | 的范畴的语言. 169 | 170 | 类型论模型的一个极重要的特征就是其 (广义的) 代数性. 171 | 代数结构通常满足一系列性质, 例如同态定理, 三条同构定理等. 172 | 对代数结构可以推广得到本质代数结构或者广义代数结构. 173 | 而类型论的模型一般都可以写 174 | 成这种形式, 进而可以运用代数结构的一般结论. 175 | 176 | 有一类类型论在近年来得到了许多关注, 它们称为模态类型论. 177 | 这起源于逻辑学中的模态逻辑. 例如可以用模态 $\lozenge p$ 178 | 表示“可能 $p$”, 进而研究关于可能性与必然性的逻辑. 179 | 模态逻辑可用于研究可能性、时态、知识、道德等等在哲学与逻辑学中有意义的话题. 180 | 而在数学方面, 许多重要的概念都可以统一到类型论中的模态框架下, 181 | 同时一些综合数学系统中也会遇到适合用模态公理化的对象. 182 | 模态类型论可能可以将各种优势各异的类型系统统一到同一个类型论中. 183 | 184 | \vspace*{\fill} 185 | 186 | \emph{参考文献见完整版.} 187 | \end{document} -------------------------------------------------------------------------------- /chapters/beginnings.tex: -------------------------------------------------------------------------------- 1 | \chapter{起源} 2 | \section{Russell的类型论} %(1900 -- 1927) 3 | 1899年, Zermelo 发现了 Russell 悖论, 4 | 但是他并没有发表这个结论. 5 | 1901年这个悖论由 Russell 独立发现. 6 | 它的论证非常简洁. 7 | \begin{theorem}[Russell] 8 | 以下说法不可能成立: 任给一个含有变量 \(x\) 的命题 \(P(x)\), 9 | 都有一个集合 \(y = \{x \mid P(x)\}\), 使得 10 | \(z \in y\) 当且仅当 \(P(z)\) 成立. 11 | \end{theorem} 12 | \begin{proof} 13 | \(P(x) = (x \notin x)\) 是含有变量 \(x\) 的命题. 14 | 而如果 \(R = \{x \mid x \notin x\}\) 是集合, 15 | 那么 \(z \in R\) 当且仅当 \(z \notin z\). 16 | 特别地, \(R \in R\) 当且仅当 \(R \notin R\). 17 | 矛盾. 18 | \end{proof} 19 | 因此, 我们习以为常的集合记号 \(\{x \mid P(x)\}\) 是 20 | 直接导致矛盾的. 这个悖论急迫要求数学家重新审视数学和逻辑 21 | 的基础. 在这个基础上 Zermelo 等提出并逐渐完善的 ZFC 集合 22 | 论, 大家或许已经有所了解. 但是 Russell 本人提出的解决 23 | 方案则走了另一条思路. 这里我们介绍一个由 Alonzo Church 简化的版本.% 24 | ~\cite{sep:2022:typetheory} 25 | 26 | 我们可以发现, 数学中我们根本不会需要讨论 \(x \in x\) 这样的 27 | 命题. 实数 \(x\) 属于实数集 \(\mathbb R\), 而一些实数的 28 | 集合 (如开集) 构成集合族 \(\Omega\). 我们偶尔还会讨论集合族 29 | 的集合, 如所有超滤的集合 \(\beta X\), 这在拓扑学的 30 | Stone 表示定理中有提到. 注意这些数学对象之间都是有明确的层级的, 31 | 这一级的对象属于上一级的对象, 层级混乱的命题一般没有数学意义. 32 | 更严格来说, 对象之间是有分类的. 譬如虽然二维的点 \((\pi, 3)\) 33 | 和三维空间的点 \((0,1,-1)\) 都是同一个层级的, 但是我们也基本不会 34 | 把它们放在同一个集合中. 35 | 36 | 从这个观察出发, 我们可以把这种分类的概念严格化. 我们设当前研究 37 | 的最基本的个体的分类称作 \(\iota\). 如我们研究数论的时候 38 | \(\iota\) 代表全体自然数, 研究分析学的时候就是全体实数, 等等. 39 | (对于更复杂的理论, 完全可以有多个基本个体的分类, 如平面几何学可能 40 | 把点、直线、圆各分一类.) 这里我们不妨就考虑是自然数的情况. 41 | 其次我们需要有一类数学对象表示命题, 因此我们把所有命题构成的分类 42 | 称作 \(o\). 43 | 44 | 其次, 我们需要从基本的分类出发组成更复杂的分类. 譬如说可以用 45 | \(\iota \to \iota\) 表示自然数到自然数的函数. 为什么选择 46 | 函数而不是集合呢? 注意要描述 \(A\) 的一个子集, 就等同于描述 47 | 各个元素是否属于这个子集. 换句话说, 我们给每个元素赋予一个命题. 48 | 因此 \(\iota \to o\) 恰好就是自然数的子集的分类. 这样, 49 | 集合就可以看成是函数的特殊情况. 50 | 51 | % TODO Currying later? 52 | 多元函数如何呢? 我们可以再引入一个代表集合Descartes乘积的分类. 53 | 但是由数学家 Moses Sch\"onfinkel 提出了一种方便 54 | 的技巧. 注意从 \(m\) 元集到 \(n\) 55 | 元集的函数恰好有 \(n^m\) 个. 而 \((n^m)^p = n^{mp}\). 56 | 而集合也有类似的等式: 值域是函数的函数 \(A \to (B \to C)\) 57 | 和二元函数 \(A \times B \to C\) 是一一对应的. 这其实在 58 | 数学中出现过许多次. 譬如向量空间的张量积满足 59 | \(A \otimes B \to C\) 和 \(A \to (B \to C)\) 是同构的. 60 | 带点拓扑空间上也有 \(A \wedge B \to C\) 和 \(A \to (B \to C)\) 61 | 同构, 这里 \(\wedge\) 是压缩乘积 (smash product), 而 62 | \(\to\) 是连续函数空间. 因此, 我们不需要额外引入 63 | 多元函数的概念. 这个技巧由 Haskell Curry 的使用而受到推广, 64 | 因此今天我们将其称作\textbf{Curry化}. 65 | 66 | 当然, 这只是一套能实现所有功能的方案. 我们也可以选择其他的组合. 67 | 譬如规定 \((s_1, s_2, \dots, s_n), n\in\mathbb N\) 为 68 | \(n\) 元关系的分类, 即含有 \(n\) 个变量的命题组成的分类. 69 | 其中第 \(i\) 个变量的分类是 \(s_i\). 这样的话, 表示零元关系 70 | 的 \(()\) 就是命题的分类, 而函数则在建立起逻辑之后定义为特殊的 71 | 二元关系. 72 | 73 | 这些分类, 就是我们所称的类型. 这个类型论以及其变体被称为% 74 | \textbf{简单类型论}. 当然, 只有类型还不行, 我们需要能 75 | 谈论类型里的元素. 这里需要注意的是, 元素并不能独立于类型而存在. 76 | 我们不能先假设有一个元素, 然后讨论它属于什么类型. 这在ZFC集合论中 77 | 是一样的, 我们不能假设有一个物体, 然后讨论它是不是集合, 因为 78 | 一切可讨论的物体都是集合.\footnote{实际上确实可能有这种语言, 79 | 例如有时会提到“真类”的概念. 但在ZFC中严格来说这就和 80 | 我们现代使用 “设 \(\epsilon\) 是任意小的正实数” 一样, 81 | 是严谨用语的一种缩写简化.} 在类型论中一切都首先归属于某个类型, 82 | 而后才能开始讨论其性质. 我们把 “\(E\) 的类型是 \(s\)” 写作 83 | \(E : s\). 84 | 85 | 在简单类型论中, 构造和使用元素的方法也非常简单. 首先, 对于函数类型, 86 | 我们可以用数学中常见的方法构造一个函数 ------ 写出其解析式. 这种 87 | 方法早在Euler的时代就已经熟知了: 88 | \[x \mapsto \sin x^2 + 1.\] 89 | 这就规定了一个函数. 在逻辑学中, 我们更习惯用这样的符号: 90 | \[\lambda x. \sin x^2 + 1.\] 91 | 不过这只是具体记号的细微差别. 更严格的说, 如果假设 \(x\) 是 92 | \(s_1\) 类型的变量, 有一个含有 \(x\) 的表达式 \(E\) 是 93 | \(s_2\) 类型的; 那么 \(\lambda x. E\) 就是 \(s_1 \to s_2\) 94 | 类型的表达式. 95 | 96 | 反过来, 我们有了一个函数, 要如何使用它呢? 唯一的方法当然是 97 | 代入其自变量. 因此如果 \(F : s_1 \to s_2\), 并且 98 | \(A : s_1\), 那么 \(F(A) : s_2\). 这里因为我们经常会 99 | 使用函数, 我们把 \(a \to (b \to c)\) 简写为 \(a \to b \to c\), 100 | 即默认是右结合的 (减法则是左结合的: \(a - b - c = (a - b) - c\)). 101 | 同时, 我们省略函数求值的括号, 并且默认左结合: \(FAB = (F(A))(B)\). 102 | 103 | 除了函数, 我们还有命题. 这时候我们就可以引入熟悉的逻辑结构了. 104 | 譬如说 “且” 命题就是 \(\wedge : o \to o \to o\). 105 | 如上面所述这里表示一个二元函数. 而 “对于所有” 就是 106 | \(\forall : (s \to o) \to o\). 譬如说我有 107 | 一族关于 \(n\) 的命题 \(n^2 \ne 2\), 108 | 那么 \(\forall (\lambda n. n^2 \ne 2)\) 109 | 就接受这一族命题作为参数, 而产生一个命题, 表示 “对于所有的 110 | \(n\) 这些命题都成立”. 还有一个非常重要的东西是 111 | \(\epsilon : (\iota \to o) \to \iota\). 如果 112 | \(P : \iota \to o\) 是一族命题, 并且存在一个对象满足 113 | 这个命题, 那么 \(\epsilon(P)\) 表示某一个满足条件的对象. 114 | 有些版本中需要把这里的 “存在” 改成 “存在唯一”, 因为 115 | 这里实际上默认了选择公理. 116 | 117 | 我们这里说的, 譬如 \(\wedge\) 表示且命题, 是靠添加逻辑公理 118 | 来保证的. 这和集合论是类似的: 集合论除了集合的公理之外, 119 | 也是默认了所有的逻辑公理的. 例如 “如果证明了 120 | \(p \Rightarrow q\), 并且证明了 \(p\), 那么就可以 121 | 证明 \(q\)”, 等等. 这些公理不涉及具体的数学对象. 122 | 123 | 至于那些涉及具体数学对象的公理, 就称为非逻辑公理. 譬如说在 124 | 研究数论的时候, 我们就会规定一个元素 \(0 : \iota\), 125 | 并且有一个函数 \(S : \iota \to \iota\) 表示自然数的后继. 126 | 那么 \(S(S(S(0)))\) 就表示 \(3\). 我们还会添加数学归纳法 127 | 作为公理: 128 | \[\forall (\lambda P. P(0) \wedge 129 | \forall(\lambda n. P(n)\Rightarrow P(S(n))) 130 | \Rightarrow \forall (\lambda n. P(n))).\] 131 | 具体公理的细节比较乏味, 这里就省略了. 读者可以参考\cite{farmer:2008:virtues}. 132 | 据笔者的阅读它关于命题逻辑的公理是有瑕疵的, 但是无伤大雅. 133 | 134 | 人们依据这种形式系统, 写出了计算机程序 Isabelle~\cite{tobias:2002:isabelle}, 135 | 用计算机验证数学证明, 从而达到极高的准确性. 136 | 已经有不少数学理论被 Isabelle 形式化. 137 | 譬如质数定理~\cite{eberl:2018:pnt}. 138 | 这说明类型论与集合论一样, 有形式化数学的基本能力. 139 | 140 | \section{标准语义与Henkin语义}\label{beginning:henkin} 141 | %为什么叫做高阶逻辑 142 | 简单类型论常常被称作\emph{高阶逻辑}. 这是相对于一阶逻辑 143 | 说的. 一阶逻辑中一切的 \(\forall, \exists\) 量词, 其 144 | 作用的变量都是取值于同一个论域的. Peano 公理中这个论域 145 | 就是自然数, ZFC 集合论中这个论域就是集合. 因此, Peano公理 146 | 对于归纳法做了特殊处理: 归纳法说的是 “对于所有含变量 147 | \(n\) 的\emph{命题}\footnote{含有变量的命题称作\textbf{谓词}, 148 | 有 \(k\) 个变量就称为 \(k\)元谓词.} 149 | \(P(n)\), 如果 \(P(0)\) 成立, 150 | 并且 \(\forall n. P(n) \Rightarrow P(n+1)\), 那么 151 | 就有 \(\forall n. P(n)\).” 这里出现了 \(\forall P\) 152 | 的表达. Peano 公理系统在一阶逻辑中无法做出这个表达, 因此 153 | 实际上并不是添加了一条公理, 而是无数多条, 对于每一种 154 | 可能的 \(P(n)\) 都添加了一条独立的公理. 如果某个逻辑系统 155 | 允许这样的量词, 就称之为\textbf{二阶逻辑}. 这里 156 | 的命题含有谓词变量 \(P\), 也就是关于谓词的谓词. 157 | 进一步, 二阶逻辑允许讨论关于谓词的谓词, 那么就会 158 | 有关于“关于谓词的谓词”的谓词. 这就是三阶逻辑. 159 | 160 | 简单类型论中, 由于 \(\forall : (s \to o) \to o\) 中 161 | \(s\) 是任意的类型, 如果 \(s = \iota\), 则这是一阶逻辑 162 | 的量词; 如果 \(s = (\iota \to o)\), 那么这就是二阶量词; 163 | 以此类推. 因此简单类型论包含了任意高阶的逻辑, 从而有非常 164 | 强的表达力. 165 | 166 | %语义, Henkin model 167 | 与其它的高阶逻辑一样, 简单类型论有两种语义, 标准语义与Henkin语义. 168 | 其中前者是后者的特殊情况. 169 | 170 | \begin{definition} 171 | 简单类型论的一个\textbf{Henkin 模型} \(M_\bullet\) 满足 172 | \begin{itemize} 173 | \item 对于每个类型 \(s\), 选择一个集合 \(M_s\); 174 | \item 对于函数类型 \(s_1 \to s_2\), 选择的集合 \(M_{s_1 \to s_2}\) 175 | 是函数集 \(M_{s_1} \to M_{s_2}\) 的子集. 176 | \end{itemize} 177 | \textbf{标准模型}中要求 \(M_{s_1 \to s_2} = 178 | (M_{s_1} \to M_{s_2})\). 这些集合的选取需要满足所有的公理. 179 | \end{definition} 180 | 因为语言是有限长的, 至多可以表达出可数个 181 | \(\mathbb N \to \mathbb N\)函数, 182 | 绝大部分函数都是无法表达的. 因此 Henkin 模型更加灵活, 183 | 可以不包含不需要的函数, 在证明相关性质的时候更加有用. 184 | 每个命题在Henkin模型中都有一个真值. 对于了解逻辑学的 185 | 读者, 这些事情应该不算新奇. 186 | 187 | 注意模型是在形式系统 188 | 的\emph{外部}进行的. 换句话说, 我们现在正在研究这个 189 | 形式系统, 而不是使用这个形式系统; 因此我们研究时使用的形式 190 | 系统可以任意选取, 比如选择ZFC. 因此命题的真值也都是 191 | 在这个外部的形式系统(也叫\textbf{元逻辑})中得到的. 192 | 这个真值选取的正确性由一条定理保证: 193 | \begin{theorem}[Henkin可靠性] 194 | 如果某个命题在系统中可证, 那么它在所有Henkin模型中为真. 195 | \end{theorem} 196 | 一个重要的应用就是其逆否命题: 197 | 如果构造了某个Henkin模型, 其中我们 198 | 关心的命题为假, 那么在系统中就不可证明这个命题. 注意“不可 199 | 证明”与“可证明其否定”的区分. 类似的, 如果某个Henkin模型中 200 | 我们关心的命题为真, 那么在系统中就不可证伪这个命题. 201 | 202 | 反过来的性质通常更难证明, 但是更加有用: 203 | \begin{theorem}[Henkin完备性] 204 | 某个命题在所有Henkin模型中都为真, 那么这个命题可证. 205 | \end{theorem} 206 | 我们在 \ref{intro:semantics}~节已经提到过这两个性质. 207 | 208 | \section{\texorpdfstring{\(\lambda\)}{Lambda}-演算与组合子逻辑} 209 | \subsection{\texorpdfstring{\(\lambda\)}{Lambda}-演算}\label{beginning:lambda} 210 | 上面我们介绍了简单类型论. 而简单类型论中最核心的内容 211 | 其实是关于如何形成和使用函数. 我们不妨把这部分内容抽象出来 212 | 进一步研究其性质. 这一部分工作是由 Church 从他提出的类似的 213 | 一套数学基础\cite{church:1932:untyped}中进一步提取出来 214 | 的; 在\cite{church:1936:lambda}中他研究了 \(\lambda\)-演算 215 | 的递归论性质. 216 | 217 | 剥去其他无关的细节后, 我们得到的系统尤其简洁. 它只有变量, 218 | 函数构造 \(\lambda x. M\), 以及函数求值 \(M(N)\). 219 | 它满足 220 | \[(\lambda x. A)(B) = A[x/B].\] 221 | 其中 \(A[x/B]\) 表示将 \(A\) 中包含的 \(x\) 变量全部 222 | 代换成 \(B\). 这个等式称作 \textbf{\(\boldsymbol\beta\)-等价}. 223 | 正如我们在前言中所述, 这个描述看似简单, 但是变量的处理 224 | 会引起一些麻烦, 在这里我们不做处理. 这个等式描述了构造一个函数, 225 | 而后马上对它求值, 会得到什么. 有时候我们也可以反过来考虑, 226 | 对一个函数求值, 然后以此构造一个函数, 会得到什么呢? 227 | \[\lambda x. f(x) = f.\] 228 | 因为这实际上只是把原先 \(f\) 代表的函数包装了一下, 并没有 229 | 改变它的实际性质, 因此我们认为这仍然是等于 \(f\) 的. 230 | 这个等式称作 \textbf{\(\boldsymbol\eta\)-等价}. 231 | 当然, 这里也有变量处理的细节: \(f\) 的表达式中不能含有 \(x\) 本身. 232 | 233 | 仅仅有这些东西, 我们就能构造出一套非常丰富的结构了. 譬如说, 234 | 我们可以编码自然数: 将自然数 \(n\) 编码为 235 | \[\lambda f. \lambda x. \underbrace{f(f(f(...(}_{n\text{个}}x))))\] 236 | 它的意义是 “把函数 \(f\) 迭代 \(n\) 次”, 用迭代次数 237 | 来编码自然数. 那么我们可以立刻实现加法: 238 | \[\cons{add} = \lambda m. \lambda n. \lambda f. \lambda x. mf(nfx).\] 239 | 这是什么意思呢? 给定两个自然数 \(m, n\) 以及一个函数 \(f\), 240 | 它先把 \(f\) 迭代了 \(n\) 次得到 \(nfx\) (因为 \(n\) 的定义 241 | 就是把函数迭代 \(n\) 次的函数), 然后在此基础上又将 242 | \(f\) 迭代了 \(m\) 次. 因此这就编码了两个自然数的加法. 243 | 244 | 乘法也是类似的, 我们有了一个函数 \(g\) 等于 \(f\) 的 \(n\) 245 | 次迭代后, 我们可以把 \(g\) 进行 \(m\) 次迭代, 就得到了 246 | \(f\) 的 \(m\cdot n\) 次迭代: 247 | \[\cons{mul} = \lambda m. \lambda n. \lambda f. \lambda x. m(nf)x.\] 248 | 这里连着的 \(\lambda\) 已经有些多了, 我们把这些简写成 249 | \(\lambda mnfx. m(nf)x\), 即只用一个 \(\lambda\) 符号. 250 | 读者可以自行构造指数函数 \(m^n\). Church 在论文~\cite{church:1936:lambda}中, 251 | 进一步构造了判定自然数是否相等的函数, 从而能够在 \(\lambda\)-演算 252 | 中编码 Diophantus 方程. 而在\cite{church:1932:untyped}中, 253 | 他与上面类似地添加了逻辑运算, 从而得到了逻辑的基础. 254 | 255 | \subsection{组合子逻辑} 256 | 另一方面, 在1920年左右, 数学家 Moses Sch\"onfinkel 提出了\textbf{组合子逻辑}~\cite{schonfinkel:1924:combinator}. 257 | 上面我们提到的简单类型论, 以及我们熟知的一阶逻辑等等, 其中 258 | 一个最基本也是最容易被忽视的概念是\emph{变量}. 在前言 259 | 中, 我已经说明了处理变量的一部分困难. Sch\"onfinkel 试图 260 | 找到一种方式, 能够不使用变量而描述函数, 进而给出逻辑的更方便 261 | 的定义. 原始论文中用的具体字母有些不同, 但是其余内容和我们 262 | 下面介绍的是一致的. 263 | 264 | 既然我们关注的是如何不靠变量表达一切函数, 那么我们自然要先把 265 | 具体的函数, 如 \(\log, \sin\) 等等先放到一边, 关注函数 266 | 运算本身的抽象结构. 我们语言中需要有函数求值, 把两个表达式拼合 267 | 成更大的表达式. 因为函数求值 \(f(x)\) 本质上是个二元运算, 268 | 所以这里和乘法写得像一些: \((fx)\), 强调其运算属性. 因为 269 | 这里所有表达式都将不再有变量, 我们称它们为\textbf{组合子}. 270 | 注意这里的 \(x,y\) 等等都是代表一个完整的表达式. 它们并不是 271 | 语言本身的变量, 而是为了描述语言而引入的记号. 我们称其为\textbf{元变量}. 272 | 273 | 首先我们有恒同函数: 它满足 274 | \[(\cons{I}x) = x.\] 275 | 这很好理解. 那么譬如有 \((\cons{I}\cons{K}) = \cons{K}\), 276 | 等等. 277 | 278 | 其次, 我们有常数函数: 对于任何表达式 \(x\), 我们都希望有一个 279 | 表达式, 它代表恒等于 \(x\) 的常函数. 换句话说, 如果这个表达式 280 | 是 \(K_x\) 的话, 那么我们希望有等式 281 | \((K_xy) = x\). 282 | 因此我们引入第一个原始组合子 \(\cons{K}\), 使得对于任何 283 | \(x\), \((\cons{K}x)\) 就是满足要求的常函数. 换句话说, 284 | \[((\cons{K}x)y) = x.\] 285 | 这里括号已经开始有点多了. 我们和上面一样, 规定函数求值运算 286 | 是左结合的. 上面的表达式也可以写成 \(\cons{K}xy\), 287 | 表达相同的意思. 288 | 289 | 我们再引入函数复合: 给定两个函数 \(f, g\), 我们需要能表述 290 | 其复合 \(h\), 满足 \(hx = f(gx)\). 因此我们引入组合子 \(\cons{B}\), 291 | 使得 \(\cons{B}fg\) 就是其复合. 换句话说, 292 | \[\cons{B}fgx = f(gx).\] 293 | 294 | 再者, 对于一个二元函数 \(fxy\), 我们希望能把它的第二个参数 295 | 代入 \(gx\). 换句话说, 我们希望找到函数 \(h\) 296 | 使得 \(hx = fx(gx)\). 因此我们引入组合子 \(\cons{S}\), 297 | 使得 \[\cons{S}fgx = fx(gx).\] 298 | 299 | 这些东西有些无穷无尽了. 对于我们所希望的一切函数 300 | 操作, 能不能只由有限个组合子互相组合表达呢? Sch\"onfinkel 301 | 接下来指出, 只需要 \(\cons{S}, \cons{K}\) 两者就足够 302 | 表达剩余的所有操作. 举个最简单的例子, 如何用它们表示 \(\cons{I}\) 303 | 呢? 请看: 304 | \[\begin{aligned} 305 | &\quad~\cons{S}\cons{K}\cons{K}x\\ 306 | \text{(\(\cons{S}\) 的定义) }&= \cons{K}x(\cons{K}x)\\ 307 | \text{(\(\cons{K}\) 的定义) }&= x. 308 | \end{aligned}\] 309 | 换句话说, \(\cons{S}\cons{K}\cons{K}\) 这个函数, 310 | 在任何表达式 \(x\) 处求值的时候得到的都是 \(x\) 自身. 311 | 所以这个函数就是恒同函数! 关于这些组合子的更多性质, 312 | 读者可以参阅这本十分有趣的逻辑谜题书~\cite{schonfinkel:1924:combinator}. 313 | 314 | 这些组合子在 1927 年被 Haskell Curry 重新发现. 315 | 后来, 它们被计算机科学借鉴, 用来作为程序运行的一种简洁而 316 | 完备的模型. 事实上, 当代计算机中有一类编程语言, 称为 317 | 函数式语言, 它们在编译成程序的时候就经常会使用组合子作为 318 | 中间步骤. 319 | 320 | 有了这些组合子, 我们就可以加入具体的函数来表达丰富的数学对象了. 321 | 对于逻辑来说, 我们可以加入组合子 \(\forall\), 使得 322 | \(\forall A\) 表示 (在常规的有变量的语言中的) \(\forall x. A(x)\). 323 | 作为例子, 现在我们可以重新表述我们在一阶逻辑中一条常见的公理: 324 | \[(\forall x. A(x)) \implies A(c),\] 325 | 其中 \(c\) 是某个常数. 在组合子逻辑中, 这就可以写作 326 | \[\cons{Im}(\forall A)(A c)\] 327 | 其中 \(\cons{Im}\) 组合子接受两个参数 \(p, q\), 表示命题 328 | \(p \Rightarrow q\). 这样, 我们就完全避免了需要严格描述诸如 329 | “将 \(x\) 代换为 \(c\)” 之类的麻烦. 这里再度提醒读者, 330 | \(A, c, p, q\) 在这里都是元变量, 只有 \(x\) 是真正的语言内 331 | 变量. 332 | 333 | \subsection{Curry悖论} 334 | 然而, 把组合子或者 \(\lambda\)-演算直接用于逻辑基础是 335 | 不可行的. 首先由 S. C. Kleene 与 J. B. Rosser 在 1935 年提出了 336 | 组合子逻辑的悖论; 其次这个悖论被 Curry 简化. 为了理解这个悖论, 我们首先来 337 | 看一个数学中经常会遇到的问题: 不动点问题. 338 | 339 | 假设我有一个任意的函数 \(f\), 我希望求解方程 \(x = f(x)\). 340 | 事实上, 递归函数也能这么定义. 假如我有递归定义 \(f(x) = M\), 341 | 其中 \(M\) 是某个含有 \(f\) 的表达式, 那么我们就能写成 342 | \(f(x) = g(f,x)\). 换言之, 我们需要找到 \(f = \lambda x. g(f,x)\) 343 | 的解; 再重写一下, 就是需要求 \(G(f) = \lambda x. g(f,x)\) 344 | 的不动点. 由此可见, 能够求解不动点问题, 是语言表达力强的体现. 345 | 这里就体现了 \(\lambda\)-演算的强大能力. 346 | 347 | \begin{theorem} 348 | 对于任何函数 \(f\), 存在表达式 \(M\) 满足 \(M=f(M)\). 349 | \end{theorem} 350 | \begin{proof} 351 | 取 352 | \[M = (\lambda m. f(mm))(\lambda m. f(mm))\] 353 | 根据\(\beta\)-相等的等式 \((\lambda x. A)B = A[x/B]\), 354 | 代入就得到 355 | \[M = f(mm)[m/\lambda m.f(mm)] 356 | = f((\lambda m. f(mm))(\lambda m.f(mm))) 357 | = f(M).\] 358 | 恰好满足要求. 359 | \end{proof} 360 | 这种递归的技巧的确非常天才, 读者可以再仔细研究这个表达式, 361 | 揣摩产生它的动机. 既然对于任何一个 \(f\), 这个表达式都是 362 | 其不动点, 那么我们自然可以提取出一个映射来: 363 | \[\cons{fix}(f) = (\lambda m. f(mm)) (\lambda m. f(mm)).\] 364 | 换句话说, \(\cons{fix} = \lambda f. (\lambda m. f(mm)) (\lambda m. f(mm))\) 365 | 就是\textbf{不动点组合子}.\footnote{虽然这并不是组合子演算的 366 | 表达式, 但是广义来说, 我们把所有不含自由变量 367 | 的 \(\lambda\)-表达式都称作组合子.} 368 | 上一节中我们说过, 组合子演算可以表达所有的函数运算, 这个也 369 | 不例外. 它对应的组合子为 370 | \[\cons{Y} = \cons{S}(\cons{K}(\cons{S}\cons{I}\cons{I})) 371 | (\cons{S}(\cons{S}(\cons{K}\cons{S})\cons{K})) 372 | (\cons{K}(\cons{S}\cons{I}\cons{I})).\] 373 | 这个复杂的表达式则是由将 \(\lambda\)-演算和组合子演算 374 | 机械地互相转换的算法得到的. 375 | 376 | 读到这里, 谨慎的读者可能有疑问了: 万一某个表达式没有不动点 377 | 怎么办? 如果有多个不动点, 算出来的会是哪一个呢? 我们来验证几个 378 | 具体的例子. 379 | 380 | 首先对于常函数 \(K_x(y) = x\), 我们计算 381 | \[\cons{fix}(K_x) = K_x(\cons{fix}(K_x)) = x.\] 382 | 因此它计算出的的确是其唯一的不动点. 而对于恒同函数 383 | \(\lambda x. x\), 一切都是其不动点. 计算得到 384 | \[\cons{fix}(\lambda x.x) = (\lambda x.xx)(\lambda x.xx).\] 385 | 我们记右边两个重复的表达式为 \(\omega\), 令 \(\Omega = \omega\omega\). 386 | 那么能不能继续把这个表达式的具体值求出来呢? 读者如果自行试图 387 | 继续化简的话, 就会发现无论怎么化简, 都会立刻兜圈回到原本 388 | 的表达式. 换句话说, 这种表达式的求值操作是\textbf{不停机}的. 389 | 390 | 在逻辑中, 最简单的不存在不动点的函数是什么呢? 当然是命题的否定! 391 | 换句话说, 如果我们记 \(\cons{not}\) 接受一个命题, 表示 392 | 其否定, 那么 \(\cons{fix}(\cons{not})\) 就等于其自己的否定, 393 | 从而导出了矛盾. 这就是 Curry 悖论. 394 | 395 | \section{简单类型 \texorpdfstring{\(\lambda\)}{Lambda}-演算的典范化} 396 | \label{beginning:ccc} 397 | \begin{center} 398 | \begin{tcolorbox}[text width=0.8\textwidth, title=关于译名] 399 | 对于已经了解这部分内容的读者, 有必要 400 | 在这里澄清相关术语的翻译问题. 在重写系统下 401 | 不可归约(reduce)的表达式称为既约形式(normal form); 402 | 有强/弱停机性(strong/weak normalization)的概念. 403 | 而在类型论中, 一般而言有典范形式(normal form), 无变量时 404 | 称作闭典范形式(canonical form). 注意英文中相同的单词 405 | 有不同的含义, 我们翻译为不同的中文词汇. 406 | \end{tcolorbox} 407 | \end{center} 408 | 409 | 我们上面已经看到, 不停机的 \(\lambda\)-演算或组合子 410 | 很难成为逻辑的载体. 不过 Russell 的简单类型论目前来看还 411 | 没有受到影响: 诸如 \(\cons{fix}\) 的表达式在简单类型论 412 | 中是不符合类型规则的. 那么对于添加了类型的演算, 能不能保证 413 | 它不出现类似的问题呢? 在这个时期, 诞生了很多类型论以及对应 414 | 研究它们的技术.简单类型组合子或 \(\lambda\)-演算的相关 415 | 性质可以用初等组合学的手段加以证明\cite{loader:1998:stlc}, 416 | 但是我们这里选择更加展示其结构的一种思路\cite[\S4.2]{sterling:2021:thesis}. 417 | 418 | 首先, 我们想要的性质的精确定义是什么? Sterling 419 | 在 \cite[\S5.1]{sterling:2021:thesis} 中有非常 420 | 精当的论述. 421 | 422 | 我们最常见到的概念是\textbf{停机性}. 使用 423 | 有向图来描述“化简”(术语是\textbf{归约})的方向, 我们 424 | 可以定义不能进一步化简的表达式为\textbf{既约形式}. 如果 425 | 对于每个表达式, 都存在一条路径达到既约形式, 则称这个有向图 426 | 代表的归约系统是\textbf{弱停机}的; 如果所有的路径都必须 427 | 在有限步内达到既约形式, 则称归约系统\textbf{强停机}. 428 | 假如从同一个表达式出发的任意两条归约路径, 都可以延长至共同 429 | 的终点, 则称这个归约系统有\textbf{合流性}(confluence). 430 | 431 | 具体到类型论中, 我们可以规定一些归约的规则. 与上面抽象地 432 | 使用有向图表示归约不同, 这里的规则可以对任何子表达式使用. 433 | 例如有规则 \(1 + 1 \rightsquigarrow 2\), 那么就可以 434 | 得到 \((1+1)+3 \rightsquigarrow 2 + 3\). 这样, 我们 435 | 得到的就是一套\textbf{重写系统}. 我们可以给组合子演算写出一套重写系统: 436 | \[\begin{aligned} 437 | \cons{I}x & \rightsquigarrow x\\ 438 | \cons{K}xy &\rightsquigarrow x\\ 439 | \cons{S}xyz &\rightsquigarrow (xz)(yz) 440 | \end{aligned}\] 441 | 那么设 \(\omega = \cons{S}\cons{I}\cons{I}\), 442 | 它对应 \(\lambda\)-演算中的 \(\omega = \lambda x. xx\), 443 | 因为由归约规则得到 444 | \[\omega x = \cons{S}\cons{I}\cons{I}x \rightsquigarrow (\cons{I}x)(\cons{I}x) \rightsquigarrow xx.\] 445 | 请读者动笔归约表达式 \(\Omega = \omega\omega\). 446 | 如果计算无误就会发现, \(\Omega\) 无论如何归约, 几步之后 447 | 就会回到自己. 因此 \(\Omega\) 无法归约到既约形式. 448 | 换句话说, 无类型的组合子演算不是弱停机的, 从而也不可能是 449 | 强停机的. 450 | 451 | 用重写系统处理简单类型组合子与 \(\lambda\)-演算, 452 | 最终可以证明它们是强停机的, 参见~\cite{loader:1998:stlc}. 453 | 然而, 许多规则难以用重写系统表述. 譬如我们希望 454 | 对于无序数对有 \(\{x,y\} = \{y,x\}\). 使用重写系统 455 | 处理这种等式显然有些困难. 当代研究的不少类型论无法使用 456 | 重写系统描述. 所以我们有必要考虑别的方式. Sterling 457 | 在\cite{sterling:2021:thesis}中考虑了更加广义的概念, 458 | 在英文中仍然使用了 normalization 一词, 我们改译 459 | 为\textbf{典范化}. 460 | 461 | 类型系统之间千差万别, 因此也极难对“典范化”一词做通用定义. 462 | 这里我们看几个例子. 463 | 464 | \subsection{简单类型组合子演算的典范化} 465 | 在组合子演算中, 我们可以定义\textbf{典范形式}的概念. 466 | 典范化即为“一切表达式都等价于某个典范形式”. 我们定义 467 | 不含 \(\cons{S}ABC\) 或者 \(\cons{K}AB\) 的表达式 468 | 为典范的, 其中 \(A,B,C\) 为子表达式. 因此类似 469 | \(\cons{S}(\cons{K}(\cons{K}x))\cons{S}\) 的表达式 470 | 是典范的. 471 | 472 | 我们类比简单类型 \(\lambda\)-演算的方案定义类型系统. 473 | \[\cons{S} : (\alpha \to \beta \to \gamma) 474 | \to (\alpha \to \beta) \to (\alpha \to \gamma)\] 475 | \[\cons{K} : \alpha \to \beta \to \alpha.\] 476 | 其中 \(\alpha,\beta,\gamma\) 可以任意取值. 我们添加 477 | 一个类型 \(\mathbb B\) 作为基础类型, 有两个元素 478 | \(\cons{y}, \cons{n} : \mathbb B\). 注意这个 479 | 类型中还有有其他元素, 如 \(\cons{K}\cons{y}\cons{n}\) 等. 480 | 但是在我们之前规定的运算的等价关系下, \(\cons{K}\cons{y}\cons{n}\) 等价于 \(\cons{y}\). 481 | 最后我们有规则 482 | \[\frac{A : \alpha \to \beta \quad B : \alpha}{AB : \beta}\] 483 | 回忆分数线上方是前提, 下方是结论. 因为组合子演算中没有变量, 484 | 定义比 \(\lambda\)-演算方便许多. 直接对表达式长度归纳, 485 | 不难证明\(\mathbb B\)类型中的典范形式只有\(\cons{y}\) 486 | 与 \(\cons{n}\). 487 | 488 | 由于无类型组合子演算没有典范化的性质, 我们必然需要 489 | 在证明中利用类型. 因此我们可以对类型归纳: 如果命题 490 | 对 \(\alpha,\beta\) 均成立可以推出对 \(\alpha\to\beta\) 491 | 成立, 并且命题对 \(\mathbb B\) 成立, 那么命题就 492 | 对所有的类型均成立. 这种归纳法称为\textbf{结构归纳法}. 493 | 一般的归纳是沿着自然数的结构归纳, 而这里是沿着类型的结构归纳. 494 | 495 | \begin{theorem} 496 | 简单类型组合子演算中, 一切表达式都有一个等价的典范 497 | 表达式.\footnote{之前所说的“相等”实际上是表达式之间的一个等价 498 | 关系, 如 \(\cons{K}xy\) 等价于 \(x\), 我们介绍时为了 499 | 方便写作 \(\cons{K}xy = x\). 它们作为表达式显然是不相同的.} 500 | \end{theorem} 501 | \begin{proof} 502 | 对于任何类型 \(\alpha\), 设 \(R_\alpha\) 是这个类型中 503 | 可典范化的表达式, \(T_\alpha\) 为所有表达式. 我们需要 504 | 证明的就是 \(R_\alpha = T_\alpha\). 但是直接对 \(\alpha\) 505 | 归纳是无法完成证明的, 我们需要加强归纳假设. 506 | 507 | 对于基础类型 \(\mathbb B\), 我们设 \(M_{\mathbb B} = R_{\mathbb B}\). 508 | 对于函数类型 \(\alpha \to \beta\), 考虑 509 | \[M_{\alpha \to \beta} = \{F : \alpha \to \beta \mid 510 | \forall A \in M_\alpha, FA \in M_\beta\}.\] 511 | 这样 \(M_{\alpha \to \beta}\) 中的元素都对应 512 | 一个 \(M_\alpha \to M_\beta\) 函数. 可以发现这就是 513 | 一个Henkin模型. 这样定义的 \(M_\bullet\) 使得对类型 514 | 的归纳可以顺利进行. 读者可以自行对类型归纳验证 \(M_\alpha\) 515 | 均保持表达式上的等价关系. 对表达式长度归纳就可以证明 516 | \(M_\alpha = T_\alpha\). 最后只需要证明 \(M_\alpha = R_\alpha\) 517 | 即可. 而这对类型归纳也很简单. 518 | \end{proof} 519 | 520 | 可以注意到, 对表达式的长度归纳在这里实际上也是对表达式 521 | 的结构归纳法: 如果命题对 \(\cons{S}, \cons{K}\) 都 522 | 成立, 并且如果对 \(A,B\) 成立则对 \(AB\) 成立, 那么命题 523 | 对一切组合子表达式都成立. 524 | 525 | \subsection{简单类型\texorpdfstring{\(\lambda\)}{Lambda}-演算的闭典范化} 526 | \label{beginning:stlc:canonicity} 527 | \berry{2} 528 | 我们同样规定有一个基本类型 \(\mathbb B\), 含有两个 529 | 元素 \(\cons{y}, \cons{n}\). 简单类型 \(\lambda\)-演算 530 | 中可以含有自由变量, 为了严格说明这些自由变量的类型, 我们需要 531 | 引入\textbf{语境}(context)的概念. 532 | 在简单类型的情况下, 语境就是一些变量的列表, 附上每个 533 | 变量的类型. 因此语境形如 \(x{:}\alpha, y{:}\beta, \dots, z{:}\gamma\). 534 | 我们用大写希腊字母表示语境. 如果某个表达式 \(M\) 535 | 在语境 \(\Gamma\) 中有类型 \(\alpha\), 536 | 那么我们写作 \(\Gamma \vdash M : \alpha\). 537 | 538 | 我们可以将类型规则用这个记号写出来: 539 | \[\frac{(x{:}\alpha) \in \Gamma}{\Gamma \vdash x : \alpha} 540 | \quad\frac{\Gamma, x{:}\alpha \vdash M : \beta}{\Gamma \vdash \lambda x^\alpha. M : \alpha \to \beta} 541 | \quad\frac{\Gamma \vdash M : \alpha \to \beta 542 | \quad \Gamma \vdash N : \alpha}{\Gamma \vdash MN : \beta}.\] 543 | 注意这里严格来说 \(\lambda x. M\) 实际上需要标注变量的类型, 544 | 但是一般情况下我们都省略了. 545 | 546 | 其次, 我们添加乘积类型. 有乘积类型的 \(\lambda\)-演算 547 | 有闭典范化性质, 显然意味着不使用乘积类型的子集也有闭典范化 548 | 性质. 而加入了乘积类型更能展现其本质结构. 549 | \[ 550 | \frac{\Gamma \vdash M : \alpha \quad \Gamma \vdash N : \beta}{\Gamma \vdash (M, N) : \alpha \times \beta} 551 | \quad\frac{\Gamma \vdash M : \alpha\times\beta}{\Gamma\vdash\pi_1(M) : \alpha} 552 | \quad\frac{\Gamma \vdash M : \alpha\times\beta}{\Gamma\vdash\pi_2(M) : \beta} 553 | \] 554 | 乘积类型就是有序对的类型. 我们有 \(\pi_1(M, N)\) 等价于 555 | \(M\), \(\pi_2(M, N)\) 等价于 \(N\). 反过来, 任何有序对 556 | \(M\) 都等价于 \((\pi_1(M), \pi_2(M))\). 这两个 557 | 等价关系与函数一样, 分别称作 \(\beta\)- 与 \(\eta\)-等价. 558 | 559 | \textbf{闭典范化}说的是任何一个不含自由变量的表达式 560 | \(\vdash M : \mathbb B\) 都 561 | 等价于 \(\cons{y}, \cons{n}\) 其中之一. 562 | 而更强一些的\textbf{典范化}说的是任何一个表达式 563 | \(\Gamma \vdash M : \alpha\) 都等价于某个典范表达式. 564 | 我们互相递归地定义典范表达式和中性表达式: 565 | \begin{definition}\label{beginning:normal} 566 | \textbf{典范表达式}要么是类型为 \(\mathbb B\) 的中性表达式, 567 | 要么是 \(\cons{y},\cons{n}\) 之一, 568 | 要么形如 \(\lambda x. M\) 或 \((M, N)\), 569 | 其中 \(M, N\) 是典范表达式. \textbf{中性表达式}要么是 570 | 变量, 要么形如 \(M(N)\) 或 \(\pi_i(M)\), 571 | 其中 \(M\) 是中性表达式, \(N\) 是典范表达式. 572 | \end{definition} 573 | 为什么要如此定义呢? 这是从表达式的特征中总结的规律, 我们 574 | 举一些例子来说明. 先不考虑乘积类型. 575 | \((\lambda x. x) y\) 很明显不能是典范的, 576 | 因为它可以化简为 \(y\). 因此典范表达式不能形如 577 | \((\lambda x. M)N\). 这样看来, \(\lambda\) 578 | 必须出现在外侧. 因此典范表达式最外层应该形如若干层 579 | \(\lambda x. \square\) 嵌套. 580 | 嵌套到最里层, 则可以出现函数求值操作 \(M(N)\). 581 | 这里 \(M\) 不能含有 \(\lambda\), 因此只能是进一步 582 | 函数求值. 到最末层则是一个变量. 而 \(N\) 则可以是任何 583 | 典范表达式. 换句话说, 只考虑函数类型时, 典范表达式应当形如 584 | \[\lambda x_1. \lambda x_2. \lambda x_3. \cdots 585 | \lambda x_n. ((x_iN_1)N_2) \cdots N_k,\] 586 | 其中 \(N_i\) 都是典范表达式. 把这个规律严格写出来 587 | 就是定义~\ref{beginning:normal} 将关于 \(\mathbb B\) 588 | 与乘积类型的部分去掉剩下的部分. 589 | 类似地对乘积类型进行分析, 就能导出完整的定义. 590 | 591 | 这里还有一个细节, 就是定义~\ref{beginning:normal} 592 | 要求上面的 \(((x_iN_1)N_2) \cdots N_k\) 这个部分 593 | 整体类型必须是 \(\mathbb B\). 这是因为 \(\eta\)-等价. 594 | 如果变量 \(f : \mathbb B \to \mathbb B\), 那么 595 | \(f\) 等价于 \(\lambda x. f(x)\). 我们认为后者才是 596 | 真正的典范形式, 因为每个函数都是由 \(\lambda\) 构造的. 597 | 这在乘积类型中更加清晰: 每个有序对显然都应该形如 \((M, N)\), 598 | 因此如果有变量 \(p : A \times B\), 它的典范形式也 599 | 应当是 \((\pi_1(p), \pi_2(p))\). 600 | 601 | 无论是证明闭典范化还是典范化性质都需要不少功夫, 因为 602 | 与组合子的情况类似, 简单地直接归纳是行不通的. 603 | 我们需要先通过归纳法证明一个更强的命题. 604 | 大致思路仍然是在每个类型 \(\sigma\) 上定义一个谓词 605 | \(R_\sigma\), 并归纳证明其性质. 因为集合\(X\)上 606 | 的谓词\(P\)等价于它的子集 \(\{x\in X\mid P(x)\}\), 607 | 所以这两者可以交换使用. 如 608 | \[R_{\sigma \to \tau} = \left\{(\Gamma, f) \,\middle|\, 609 | \begin{matrix} 610 | \Gamma \vdash f:\sigma\to\tau, \\ 611 | \forall (\Delta, s) \in R_\sigma, 612 | \Gamma \subseteq \Delta \implies 613 | (\Delta, f(s)) \in R_\tau 614 | \end{matrix} 615 | \right\}.\] 616 | 这比较不直观, 而且很难想到. 617 | 利用范畴语言, 可以给出更加系统的表述, 其中这些略微复杂的 618 | 构造其实都是自然而唯一的. 619 | 620 | 为此, 我们首先需要将简单类型\(\lambda\)-演算的语法 621 | 表达为范畴语言. 我们令所有的语境 \(\Gamma\) 为范畴 622 | \(\mathcal T\) 中的对象, 而 \(\Gamma\) 到 \(\Delta\) 623 | 的态射就是从 \(\Gamma\) 到 \(\Delta\) 624 | 的\textbf{代换} (substitution). 例如从 625 | \(\Gamma = (x{:}A, y{:}A \to B)\) 到 626 | \(\Delta = (u{:}B, v{:}\mathbb B)\) 的代换可以将 627 | \(u\) 代换为 \(y(x)\), 将 \(v\) 代换为 \(\cons{y}\). 628 | 我们把这个代换写作 \(\sigma = [u/y(x), v/\cons{y}]\). 629 | 整体写作 \(\Gamma \vdash \sigma : \Delta\). 630 | 631 | 如果 \(\Gamma, \Delta\) 都只有一个类型, 632 | 那么 \(\Gamma\) 到 \(\Delta\) 的代换就类似于 633 | 这两个类型之间的函数. 使用语境与代换构成范畴, 634 | 与使用类型和函数构成范畴, 实际上是等价的. 但是前者 635 | 在后续的理论中更加优雅, 并且能够推广. 比如某些类型论 636 | 中可能没有函数类型, 等等. 637 | 638 | 我们认为\(\beta\eta\)-等价的表达式给出相同的代换. 639 | 空的语境 \(()\) 在这个范畴中就是终对象, 因为一个代换 640 | \(\Gamma \vdash \sigma : ()\) 只需要给出零个表达式, 641 | 从而显然是唯一的. 因此我们也把空的语境按照终对象的 642 | 记号写作 \(1\). 643 | 644 | 我们实际上有非常好的方式刻画这个范畴. 我们已经介绍过了 645 | 范畴中的Descartes乘积. 而函数也有范畴定义. 646 | \begin{definition} 647 | 假设范畴中存在相关的乘积对象. 两个对象 \(A, B\) 648 | 的\textbf{函数对象} \(C\), 或称为指数对象、幂对象, 649 | 配备了\textbf{求值态射} \(\cons{ev}:A \times C \to B\), 650 | 使得对任何对象 \(C'\) 配备态射 \(e : A \times C' \to B\), 651 | 都有唯一的态射 \(u : C' \to C\) 使得以下图表交换. 652 | \[\begin{tikzcd} 653 | {C'} & C \\ 654 | {C' \times A} & {C\times A} \\ 655 | B 656 | \arrow["u", from=1-1, to=1-2] 657 | \arrow["{u\times \cons{id}}", from=2-1, to=2-2] 658 | \arrow["e", from=2-1, to=3-1] 659 | \arrow["\cons{ev}", from=2-2, to=3-1] 660 | \end{tikzcd}\] 661 | 函数对象一般记作 \(B^A, A \to B, [A, B]\) 等. 662 | \end{definition} 663 | 等价来说, 函数对象是满足 \(\hom(-, B^A)\) 自然同构于 664 | \(\hom(- \times A, B)\) 的对象. 665 | \begin{definition} 666 | 如果一个范畴包含所有的二元乘积、终对象与函数对象, 那么 667 | 称这个范畴为\textbf{积闭范畴}. 如果一个函子 \(F\) 668 | 保持有限乘积结构, 同时 669 | \[F(A) \times F(B^A) \xrightarrow{\cong} 670 | F(A \times B^A) \xrightarrow{F\cons{ev}} 671 | F(B)\] 这个复合态射由函数对象的性质 672 | 诱导的态射 \(F(B^A) \to F(B)^{F(A)}\) 是同构, 673 | 则称这个函子保持积闭结构, 即其为\textbf{保积闭函子}. 674 | \end{definition} 675 | \begin{lemma}\label{beginning:lambda:initial} 676 | \(\mathcal T\) 是由图表 \(1 \rightrightarrows \mathbb B\) 677 | 生成的自由积闭范畴. 678 | \end{lemma} 679 | “自由生成”在这里的含义或许需要阐明. 我们定义这样一种数学 680 | 结构, 其中包含一个积闭范畴以及选定一个对象 \(B\) 681 | 和两个态射 \(1\rightrightarrows B\). 这些数学结构之间 682 | 可以定义一些态射, 即保持选定的对象和态射的保积闭函子. 683 | 那么这就构成了一个范畴,\footnote{实际上这是一个2-范畴, 684 | 因为函子之间有自然变换, 也就是态射之间的态射. 我们考虑 685 | 函子的时候一般不考虑相等, 而是自然同构.} 姑且称作 686 | \(\cons{CartClosedCat}_{1\rightrightarrows B}\). 687 | 那么其中的始对象就是我们所说的被自由生成的范畴. 688 | 689 | \begin{proof} 690 | 把这个定理展开, 就可以发现它整齐地打包了很多预备的引理. 691 | 在这里我们只提到重要的引理, 其余部分都是直接展开定义即可. 692 | \begin{itemize} 693 | \item 首先我们需要证明 \(\mathcal T\) 构成范畴, 需要验证 694 | 结合律. 这就是\textbf{代换引理}. (很不幸的是 695 | 这个词可以指代两个不同的引理.) 这可以通过对表达式的结构做 696 | 归纳得到. 697 | \item 其次我们需要证明 \(\mathcal T\) 是积闭范畴. 这实际上就是 698 | 简单类型\(\lambda\)-演算的语法决定的, 而其中那些自然同构 699 | 的等式则是由 \(\beta,\eta\) 规则保证. 700 | \item 我们接下来需要证明, 对于任意一个这样的范畴 \(\mathcal C\), 701 | 都能找到保持选定的对象和态射的保积闭函子 702 | \(F : \mathcal T \to \mathcal C\). 这之中需要证明 703 | 的是代换与\(\beta\eta\)-等价是可交换的. 而这函子 704 | 的唯一性来源于其所有类型都是用 705 | \(\mathbb B, \times, \to\) 三者生成的.\qedhere 706 | \end{itemize} 707 | \end{proof} 708 | 709 | 一个\textbf{范畴模型}就是从语法范畴出发的保持语法结构的函子. 710 | 在我们这里, 简单类型\(\lambda\)-演算的模型就是从 711 | 语法范畴 \(\mathcal T\) 出发的保持 712 | \(\mathbb B,\cons{y},\cons{n}\) 713 | 以及积闭结构的函子. 回顾上文, 就会发现我们刚刚已经证明的 714 | 引理~\ref{beginning:lambda:initial} 可以表述 715 | 成 “\(\mathcal T\) 是简单类型\(\lambda\)-演算 716 | 的范畴模型构成的2-范畴中的始对象”. 特别地, 语法范畴 717 | 本身也是模型之一. 718 | 719 | 我们现在就可以迅速证明 \(\cons{y}\ne\cons{n}\). 720 | 考虑所有集合的范畴 \(\mathsf{Set}\), 它是积闭的. 721 | 我们再选择 \(1 \rightrightarrows B\) 为 722 | \(1=\{0\}\) 到 \(2=\{0, 1\}\) 的两个态射即可. 723 | 如果 \(\cons{y}=\cons{n}\), 724 | 那么说明引理~\ref{beginning:lambda:initial} 产生的函子 725 | \(\mathrm s:\mathcal T \to \mathsf{Set}\) 726 | 满足 \(\mathrm{s}(\cons{y}) = \mathrm{s}(\cons{n})\), 727 | 进一步得到集合 \(2\) 的两个元素相等, 矛盾. 注意这个模型 728 | 仍然无法证明闭典范性, 因为 \(\mathrm{s}\) 仍然有可能 729 | 把不相等的表达式 \(M,N \in 730 | \hom_{\mathcal T}(1, \mathbb B)\) 731 | 映射到相等的函数. 732 | 733 | 为了研究闭典范性, 我们需要先找出类型论中的闭元素, 即不包含 734 | 自由变量的表达式. 这很容易, 我们只需要要求语境为空即可. 735 | 因此我们考虑 \(\boldsymbol\Gamma(X) = \hom_{\mathcal T}(1, X)\). 736 | 这是一个 \(\mathcal T \to \mathsf{Set}\) 的函子. 737 | 738 | 如上文所述, 我们一般的思路是为每一个类型赋予一个谓词. 739 | 在范畴论中, 我们可以使用一个 \(f : Y \to X\) 的态射作 740 | 为\(X\)上的“谓词”. 大致来说, 我们认为如果 \(f^{-1}(x)\) 非空, 741 | 那么这个谓词就取值为真, 否则为假. 当然这个大致说法只在 742 | 集合范畴里成立, 其他范畴中只能起启发作用. 通常我们还需要 743 | 对这些态射做一些要求, 但是这里不做任何要求更简洁. 因此, 744 | 我们考虑这样一个范畴 \(\mathcal G\), 它的对象是 745 | 形如 \(f:\Sigma' \to \boldsymbol\Gamma(\Sigma)\) 的态射,% 746 | \footnote{准确地说, 是一个三元组 \((\Sigma', f, \Sigma)\).} 747 | 其中 \(\Sigma\) 是 \(\mathcal T\) 中的对象, \(\Sigma'\) 748 | 是集合. 这个范畴里的态射是这样的交换图: 749 | \[ 750 | \begin{tikzcd} 751 | \Sigma' \ar[r, "\sigma'"] \ar[d] & \Delta' \ar[d] \\ 752 | \boldsymbol\Gamma(\Sigma) \ar[r, "\boldsymbol\Gamma(\sigma)"] & \boldsymbol\Gamma(\Delta) 753 | \end{tikzcd} 754 | \] 755 | 其中 \(\sigma\) 是 \(\Sigma \vdash \Delta\) 的 756 | 一个代换, \(\sigma'\) 是某个函数. 这样, \(\mathcal G\) 757 | 就是每个类型的闭表达式集上所有可能的谓词的范畴. 758 | 如果读者熟悉范畴论, 就应该知道这是逗号范畴的特例 759 | \(\mathcal G = \mathrm{Id}_{\mathsf{Set}}\downarrow \boldsymbol\Gamma\). 760 | 它也可以看成是下面这个拉回: 761 | \[ 762 | \begin{tikzcd} 763 | \mathcal G \ar[r, dashed] \ar[d, dashed, "\mathrm{gl}"'] \ar[dr, phantom, "\lrcorner", very near start] & \mathsf{Set}^{\to} \ar[d, "\mathrm{cod}"] \\ 764 | \mathcal T \ar[r, "\boldsymbol\Gamma"'] & \mathsf{Set} 765 | \end{tikzcd} 766 | \] 767 | 注意这时候我们自动有了一个函子 \(\mathrm{gl}\), 它把 768 | \(\mathcal G\) 中的对象 \(\Sigma' \xrightarrow f \boldsymbol\Gamma(\Sigma)\) 769 | 映射到 \(\Sigma\). 我们希望能够取 \(\mathcal G\) 770 | 为一个模型. 回顾模型的定义, 我们的第一步当然是要证明: 771 | \begin{lemma} 772 | \(\mathcal G\) 是积闭范畴, 并且 \(\mathrm{gl}\) 773 | 是保积闭函子. 774 | \end{lemma} 775 | 这个证明实际上对应的就是通常的证明中在类型上递归定义谓词. 776 | 但是注意这个命题本身已经完全限制了构造的可能性, 因此无需 777 | 任何不自然的想法, 仅仅是展开定义即可. 778 | 这其中用到的一个重要性质是 779 | \(\boldsymbol\Gamma(1) \cong 1\) 与 780 | \(\boldsymbol\Gamma(\Sigma \times \Delta) \cong \boldsymbol\Gamma(\Sigma) \times \boldsymbol\Gamma(\Delta)\). 781 | 这可以抽出一条引理. 782 | \begin{lemma}\label{beginning:glue} 783 | 如果 \(\mathcal C, \mathcal D\) 都有有限乘积, 784 | \(F : \mathcal C \to \mathcal D\) 保持有限乘积, 785 | 那么 \(\mathcal G = \mathrm{Id}_{\mathcal{D}} \downarrow F\) 也有有限乘积, 786 | 并且两个投影函子 \(\mathcal G \to \mathcal C\), \(\mathcal G \to \mathcal D\) 都保持有限乘积. 787 | 如果 \(\mathcal C, \mathcal D\) 还有指数对象, 788 | 那么 \(\mathcal G\) 也有指数对象, 并且 \(\mathcal G \to \mathcal C\) 保持指数对象. 789 | \end{lemma} 790 | 注意这里不要求 \(F\) 保持指数对象, 并且 \(\mathcal G \to \mathcal D\) 一般不保持指数对象. 791 | \begin{proof} 792 | 参考\cite[例子 A2.1.12]{johnstone:2008:elephant}. 793 | 考虑对象 \((1 \to F(1)) \in \mathcal G\). 794 | 因为 \(F(1) \cong 1\), 795 | 显然任何对象 \(A' \to F(A)\) 到它都只有唯一的映射. 796 | 因此 \(\mathcal G\) 有终对象, 并且两个投影函子保持终对象. 797 | 798 | 对于二元乘积, 如果有 \(A' \to F(A), B' \to F(B)\), 799 | 那么这自然诱导映射 \(A' \times B' \to F(A) \times F(B) \cong F(A \times B)\), 800 | 并且有两个投影 801 | \[\begin{tikzcd} 802 | {A'} & {A' \times B'} & {B'} \\ 803 | {F(A)} & {F(A\times B)} & {F(B)} 804 | \arrow[from=1-2, to=1-1] 805 | \arrow[from=1-1, to=2-1] 806 | \arrow[from=1-2, to=1-3] 807 | \arrow[from=1-3, to=2-3] 808 | \arrow[from=1-2, to=2-2] 809 | \arrow[from=2-2, to=2-1] 810 | \arrow[from=2-2, to=2-3] 811 | \end{tikzcd}\] 812 | 我们验证这就是 \(\mathcal G\) 中的二元乘积. 813 | 考虑交换图表 814 | \[\begin{tikzcd} 815 | {A'} & {C'} & {B'} \\ 816 | {F(A)} & {F(C)} & {F(B)} 817 | \arrow[from=1-2, to=1-1] 818 | \arrow[from=1-1, to=2-1] 819 | \arrow[from=1-2, to=1-3] 820 | \arrow[from=1-3, to=2-3] 821 | \arrow[from=1-2, to=2-2] 822 | \arrow[from=2-2, to=2-1] 823 | \arrow[from=2-2, to=2-3] 824 | \end{tikzcd}\] 825 | 则由上下两个乘积的泛性质分别得到唯一的映射 \(C' \to A'\times B'\), 826 | \(F(C) \to F(A \times B)\), 使得图表交换. 827 | 因此 \(A' \times B' \to F(A \times B)\) 的确满足 828 | \(\mathcal G\) 中乘积的泛性质. 829 | 并且由构造得到两个投影函子也保持乘积. 830 | 831 | 对于函数对象来说, 考虑如图的拉回. 832 | \[\begin{tikzcd} 833 | W && {{Y'}^{X'}} \\ 834 | {F(Y^X)} & {F(Y)^{F(X)}} & {F(Y)^{X'}} 835 | \arrow[from=2-1, to=2-2] 836 | \arrow[from=2-2, to=2-3] 837 | \arrow[from=1-3, to=2-3] 838 | \arrow["p", from=1-1, to=2-1] 839 | \arrow[from=1-1, to=1-3] 840 | \arrow["\lrcorner"{anchor=center, pos=0.125}, draw=none, from=1-1, to=2-2] 841 | \end{tikzcd}\] 842 | 其中左下的映射来自复合 \(F(X) \times F(Y^X) \xrightarrow\cong F(X \times Y^X) \to F(Y)\). 843 | 不难验证 \(p\) 满足函数对象的泛性质. 844 | 由于一般而言 \(W \ncong {Y'}^{X'}\), 因此投影映射 845 | \(\mathcal G \to \mathcal D\) 不保持指数对象; 846 | 但是 \(\mathcal G \to \mathcal C\) 仍然是保持的. 847 | \end{proof} 848 | 849 | 接下来, 我们只需要在 \(\mathcal G\) 中选择一个对象 850 | \(B\) 和两个态射 \(1 \rightrightarrows B\). 选择了 851 | 之后, 根据定理~\ref{beginning:lambda:initial} 852 | 我们立刻得知有唯一的保持它们的函子 853 | \(\mathrm{s}:\mathcal T \to \mathcal G\). 854 | 如果 \(\mathrm{gl}\) 也保持它们的话, 那么 855 | 这两个函子都在 \(\cons{CartClosedCat}_{1\rightrightarrows B}\) 856 | 中. 根据始对象的性质, \(\mathrm{gl} \circ \mathrm{s} : \mathcal T \to \mathcal T\) 857 | 必然等于恒同函子 \(\mathrm{Id}_{\mathcal T}\). 知道 858 | 了这个, 我们自然要选择合适的对象. 这也不难, 如图构造即可: 859 | \[ 860 | \begin{tikzcd} 861 | 1 \ar[r, "\cons{y}"] \ar[d] & \{\cons{y}, \cons{n}\} \ar[d, hook] & \ar[l, "\cons{n}"'] 1 \ar[d] \\ 862 | \boldsymbol\Gamma(1) \ar[r, "\boldsymbol\Gamma(\cons{y})"'] & \boldsymbol\Gamma(\mathbb B) &\ar[l, "\boldsymbol\Gamma(\cons{n})"] \boldsymbol\Gamma(1) 863 | \end{tikzcd} 864 | \] 865 | 注意整个交换图都在 \(\mathsf{Set}\) 中. 866 | 867 | 我们需要证明的是任何一个表达式 \(M \in \boldsymbol\Gamma(\mathbb B) 868 | = \hom_{\mathcal T}(1, \mathbb B)\) 都一定恰好是 869 | \(\cons{y},\cons{n}\) 其中之一. 870 | 因此我们考虑 \(\mathrm{s}(M) \in \hom_{\mathcal G}(\mathrm{s}(1), \mathrm{s}(\mathbb B))\), 871 | 根据 \(\mathcal G\) 中态射的定义, 这对应一个交换图: 872 | \[ 873 | \begin{tikzcd} 874 | 1 \ar[r, dashed, "M'"] \ar[d] & \{\cons{y}, \cons{n}\}\ar[d]\\ 875 | \boldsymbol\Gamma(1) \ar[r, "\boldsymbol\Gamma(M)"'] & \boldsymbol\Gamma(\mathbb B) 876 | \end{tikzcd} 877 | \] 878 | 由于 \(\mathrm{gl} \circ \mathrm{s} = \mathrm{Id}\), 879 | 得到交换图的下沿必须是 \(\boldsymbol\Gamma(1) \to \boldsymbol\Gamma(\mathbb B)\). 880 | 而由于 \(\mathrm{s}\) 保持终对象, 得到左上角是 \(1\). 881 | 右侧则是因为 \(\mathrm{s}\) 按照定义需要保持范畴中选定的 \(B\) 对象. 882 | 虚线表示的映射就选出了 \(\cons{y}, \cons{n}\) 的其中一个. 883 | 而由于正方形交换, 我们可以得出结论: 884 | \(M\) 必然是 \(\cons{y}, \cons{n}\) 其中之一. 885 | 886 | \subsection{简单类型\texorpdfstring{\(\lambda\)}{Lambda}-演算的典范化}\berry{3} 887 | 888 | 证明典范化显然要更加困难一些. 889 | 因为我们需要处理一切语境中的表达式, 因此 890 | \(\boldsymbol\Gamma(\Sigma) = \hom(1, \Sigma)\) 891 | 明显是不够的. 另一个自然的想法是改成使用 892 | \(\yo(\Sigma) = \hom(-, \Sigma)\): 893 | 既然 \(1\) 不够, 就让它取遍所有的对象吧! 894 | 这样构造的新范畴 \(\mathcal G = \mathrm{Id} \downarrow \yo\) 的对象 895 | 是形如 \(\Sigma' \to \yo(\Sigma)\) 896 | 的自然变换, 其中 \(\Sigma'\) 是某个函子 897 | \(\mathcal T\op \to \mathsf{Set}\). 898 | 899 | 但是这样, 需要选定的对象 \(B\) 就难以构造了. 900 | 我们需要一个函子 \(B' : \mathcal T\op \to \mathsf{Set}\) 901 | 与自然变换 \(B' \to \yo(\mathbb B)\), 902 | 我们仿照前面的做法希望 \(B'(\Sigma)\) 应当是 903 | \(\Sigma\) 下类型 \(\mathbb B\) 中的典范表达式. 904 | 但是这样一来它的函子性就难办了. 例如若 905 | \(\Sigma = (f : \mathbb B \to \mathbb B)\), 906 | 那么 \(f(\cons{yes})\) 就属于典范形式. 907 | 但是考虑代换 \(\sigma : 1 \to \Sigma\), 908 | 将 \(f\) 代入为 \(\lambda x. x\), 那么 909 | \((\lambda x.x)(\cons{yes})\) 就不再属于典范形式, 910 | 需要化简成 \(\cons{yes}\). 然而我们这里不能化简, 911 | 因为当前正是在证明这样的化简总是存在! 912 | 913 | 这里, 关键之处在于典范形式在代换下不稳定. 914 | 不过, 我们可以限制到一类特殊的代换, 使得它们稳定. 915 | 这种代换称作\textbf{更名代换}, 即只允许将变量换成别的变量, 916 | 不允许代换成更复杂的表达式. 语境与语境之间的更名代换构成 917 | \(\mathcal T\) 的宽\footnote{即包含全体对象.}子范畴, 918 | 记作 \(\mathcal A\), 记含入函子为 919 | \(\rho : \mathcal A \hookrightarrow \mathcal T\). 920 | 921 | 上面提到了 \(\boldsymbol\Gamma\) 不足, 而 \(\yo\) 有余. 922 | 因此我们可以取折中的 \(\mathbf N(\Sigma) = \hom(\rho(-), \Sigma)\). 923 | 这是一个函子 \(\mathcal T \to (\mathcal A\op \to \mathsf{Set})\). 924 | 一般来说, 形如 \(N(X) = \hom(F(-), X)\) 的函子在几何中称作\textbf{脉} (nerve) 函子. 925 | 定义范畴 \(\mathcal G = \mathrm{Id} \downarrow \mathbf N\). 926 | 927 | \(\mathcal G\) 是积闭范畴仍然可以同理证明. 928 | 这是因为引理 \ref{beginning:glue} 中用到的关键性质仍然成立, 929 | 即 \(\mathbf N\) 保持终对象和二元乘积. 930 | 最后, 我们需要选择 \(1 \rightrightarrows B\). 931 | 依葫芦画瓢, 定义 \(B'(\Sigma)\) 932 | 为 \(\Sigma\) 下类型 \(\mathbb B\) 的典范形式集合 933 | \(\mathrm{nf}(\Sigma, \mathbb B)\). 934 | 因为典范形式在更名代换下稳定, 不难证明 \(B'\) 构成函子 935 | \(\mathcal A\op \to \mathsf{Set}\). 936 | 而典范形式 \(B'\) 到全体表达式的集合有显然的含入映射. 937 | 这就构造了 \(B' \to \mathbf N(\mathbb B)\). 938 | 因为 \(\cons{y}, \cons{n}\) 是一切语境下的典范元素, 939 | 也不难给出两个箭头 \(1 \rightrightarrows B\). 940 | 这样, 由 \(\mathcal T\) 的泛性质, 我们就得到了函子 941 | \(\mathrm{s} : \mathcal T \to \mathcal G\). 942 | 943 | 同理, 对于任何表达式 \(M \in \hom(\Sigma, \alpha)\) 944 | 都可以应用函子 \(\mathrm s\), 945 | 就得到一个 \(\mathcal A\op \to \mathsf{Set}\) 中的交换图. 946 | \[\begin{tikzcd} 947 | {\Sigma'} & {\alpha'} \\ 948 | {\mathbf N(\Sigma)} & {\mathbf N(\alpha)} 949 | \arrow[from=1-1, to=2-1] 950 | \arrow["{\mathbf N(M)}"', from=2-1, to=2-2] 951 | \arrow[from=1-2, to=2-2] 952 | \arrow["{M'}", from=1-1, to=1-2] 953 | \end{tikzcd}\] 954 | 注意下方是由于 \(\mathrm{gl}\circ\mathrm{s} = \mathrm{Id}\) 锚定的. 955 | 回忆 \(\mathbf N(\Sigma) = \hom(\rho(-), \Sigma)\), 956 | 并且 \(\rho : \mathcal A \to \mathcal T\) 是含入函子. 957 | 如果取它在 \(\Sigma\) 处的值 (因为括号太多, 写成下标), 就得到集合的映射 958 | \(\mathbf{N}_{\Sigma}(M) : \hom(\Sigma, \Sigma) \to \hom(\Sigma, \alpha)\), 959 | 具体来说是 \(\sigma \mapsto M \circ \sigma\). 960 | 再代入 \(\sigma = \cons{id}_{\Sigma}\) 就可以得到 \(M\). 961 | 因此, 如果存在 \(r \in \Sigma'_{\Sigma}\) 使得它 962 | 被向下的映射对应到 \(\cons{id}_{\Sigma} \in \mathbf N_{\Sigma}(\Sigma)\), 963 | 就可以得到 \(M'(r) \in \alpha'_{\Sigma}\) 使得它对应到 \(M \in \mathbf N_{\Sigma}(\alpha)\). 964 | 另一方面, 我们还需要利用归纳法确定上方的 \(\Sigma', \alpha'\) 是什么. 965 | 966 | 既然我们要证明典范性, 自然是希望能够归纳证明 967 | \(\alpha'\) 的元素对应 \(\alpha\) 类型中的典范元素. 968 | 更精确的说, 我们希望给出一个映射 969 | \(\Reify_\Sigma^\alpha : \alpha'_{\Sigma} \to \mathrm{nf}(\Sigma, \alpha)\) 970 | 使得纵向的映射 \(\operatorname{\downarrow}_\Sigma^\alpha : \alpha'_{\Sigma} \to \mathbf N_{\Sigma}(\alpha)\) 可以拆分成 971 | \[\alpha'_{\Sigma} \xrightarrow{\Reify_\Sigma^\alpha} \mathrm{nf}(\Sigma, \alpha) \hookrightarrow 972 | \hom(\Sigma, \alpha) = \mathbf N_{\Sigma}(\alpha).\] 973 | 对于 \(\mathbb B\) 来说这已经成立了, 取恒同映射即可. 974 | 而对于 \(\alpha \times \beta\) 来说, 975 | 根据引理 \ref{beginning:glue} 中的构造, 976 | 在上方的函子就是 \(\alpha' \times \beta'\). 977 | 由归纳假设, \(\alpha',\beta'\) 各自已经有了这种映射. 978 | 那么取 979 | \[\Reify_\Sigma^{\alpha \times \beta}(m, n) 980 | = (\Reify_\Sigma^\alpha(m), \Reify_\Sigma^\beta(n)).\] 981 | 而对于函数类型则困难一些. 我们可以填入部分答案 982 | \[\Reify_\Sigma^{\alpha \to \beta}(m) = 983 | \lambda x. \Reify_{\Sigma, x{:}\alpha}^\beta(m(?)).\] 984 | 其中输入 \(m \in (\alpha \to \beta)'_\Sigma\) 985 | 按照引理 \ref{beginning:glue} 的构造是 986 | \(\hom(\yo_{\mathcal A}(\Sigma) \times \alpha', \beta')\) 的元素.% 987 | \footnote{实际上是一个二元组 \((m, M)\), 其中 \(M\) 是 988 | 表达式 \(\Sigma \vdash M : \alpha \to \beta\), 并且满足 989 | 对于任何更名代换 \(\sigma : \Delta \to \Sigma\) 与 \(a \in \alpha'_\Delta\), 990 | \(M(\operatorname{\downarrow}_\Delta^\alpha(a)) = 991 | \operatorname{\downarrow}_\Delta^\beta(m(\sigma, a))\). 992 | 我们直接用 \(m\) 表达 \(\hom(\yo_{\mathcal A}(\Sigma) \times \alpha', \beta')\) 993 | 的元素, 忽略 \(M\). 同时 \(m\) 的第一个参数 \(\sigma\) 明确时也省略不写.} 994 | 我们需要依靠 \(m\) 得到某个 \(\beta'_{\Sigma, x{:}\alpha}\) 的元素, 995 | 因此我们需要想办法输入某个 \(\alpha'_{\Sigma, x{:}\alpha}\) 的元素. 996 | 997 | 事实上在归纳定义 \(\Reify\) 的同时, 998 | 我们需要同时归纳定义一个反向的映射 999 | \(\Reflect_{\Sigma}^\alpha : \mathrm{ne}(\Sigma, \alpha) \to \alpha'_{\Sigma}\), 1000 | 从中性表达式映射到 \(\alpha'_\Sigma\). 同样这需要满足 1001 | 复合 \(\mathrm{ne}(\Sigma, \alpha) \to \alpha'_\Sigma \to 1002 | \mathbf N_\Sigma(\alpha) = \hom(\Sigma, \alpha)\) 1003 | 恰好是中性表达式到全体表达式的含入映射. 1004 | 对于 \(\alpha = \mathbb B\) 来说 \(\alpha'_\Sigma\) 1005 | 就是典范表达式的集合, 因此 \(\Reflect_\Sigma^{\mathbb B}\) 1006 | 应当取从中性表达式映射到典范表达式的显然的映射. 1007 | 对于乘积类型, 由归纳假设我们有 \(\Reflect_\Sigma^\alpha, \Reflect_\Sigma^\beta\). 1008 | 给定一个中性表达式 \(\Sigma \vdash M : \alpha \times \beta\), 1009 | 那么 \(\pi_1(M), \pi_2(M)\) 各自也是中性表达式. 1010 | 因此取 1011 | \[\Reflect_\Sigma^{\alpha \times \beta}(M) = 1012 | (\Reflect_\Sigma^\alpha(\pi_1(M)), \Reflect_\Sigma^\beta(\pi_2(M)))\] 1013 | 即可. 最后, 对于函数类型, 取 1014 | \[\Reify_\Sigma^{\alpha \to \beta}(m) = 1015 | \lambda x. \Reify_{\Sigma, x{:}\alpha}^\beta(m(\Reflect_{\Sigma, x{:}\alpha}^\alpha(x))),\] 1016 | \[\Reflect_\Sigma^{\alpha \to \beta}(M) = 1017 | (\sigma, n) \mapsto \Reflect_\Sigma^\beta(M(\Reify_\Delta^\alpha(n)[\sigma])).\] 1018 | 或许记号上有些令人眼花缭乱, 但是不难看出是唯一符合条件的答案. 1019 | 注意上面用了 \(\lambda\), 因为需要构造一个表达式. 1020 | 而下面用了 \(\mapsto\), 因为需要构造的是集合之间的映射: 1021 | 输入任何 \(\sigma : \Delta \to \Sigma\) 与 \(n \in \alpha'_\Delta\), 1022 | 我们需要输出 \(\beta'_\Sigma\) 的元素. 1023 | 我们将 \(n\) 变为典范表达式后, 1024 | 使用了更名代换, 仍然得到一个典范表达式 \(\Reify_\Delta^\alpha(n)[\sigma]\). 1025 | 1026 | 有了这两种映射, 我们现在可以完成证明的最后一步. 1027 | 对于语境 \(\Sigma = (x_1{:}\alpha_1, \dots, x_n{:}\alpha_n)\), 1028 | 它同构于乘积 \(\alpha_1 \times \dots \times \alpha_n\). 1029 | 考虑 \[r_\Sigma = (\Reflect_\Sigma^{\alpha_1}(x_1), \dots, \Reflect_\Sigma^{\alpha_n}(x_n)) \in \Sigma'.\] 1030 | 由于构造中保证了 \(\Reflect_\Sigma^\alpha\) 复合上 1031 | \(\operatorname{\downarrow}_\Sigma^\alpha : \alpha'_\Sigma \to \mathbf N_\Sigma(\alpha)\) 1032 | 后等于含入映射, 我们得到 \(r_\Sigma\) 在竖直映射下 1033 | 恰好对应到 \((x_1, \dots, x_n) = \cons{id}_\Sigma\), 1034 | 是恒同态射. 因此按照前面给出的交换图, 就得到 1035 | \(M'(r_\Sigma) \in \alpha'_\Sigma\) 在竖直映射下 1036 | 对应 \(M\). 而又因为这个竖直映射可以拆分成 \(\Reify_\Sigma^\alpha\) 1037 | 复合上含入映射 \(\mathrm{nf}(\Sigma, \alpha) \hookrightarrow \hom(\Sigma, \alpha)\), 1038 | 这就得到了与 \(M\) 等价的正规形式 \(\Reify_\Sigma^\alpha(M'(r_\Sigma))\). 1039 | 1040 | \section{论域论}\label{beginning:domain}\berry{1} 1041 | 1042 | 这一节主要参考~\cites{abramsky:1995:domain}{cartwright:2016:domain}. 1043 | 尽管无类型的 \(\lambda\)-演算与组合子演算不能直接用于 1044 | 逻辑, 但是仍然可以用来表示计算. 因此寻找它的一套语义表示 1045 | 也是有意义的. 一个非常重要的观察是, 无类型的本质是\textbf{单类型}. 1046 | 换句话说, 实际上所有的表达式都有一个相同的类型. 1047 | 在这里, 我们需要有一个函数类型 \(\alpha \to \beta\), 1048 | 但是一切的类型都相同, 所以我们就顺理成章地得到了一个等式: 1049 | \[(D \to D) \cong D.\] 1050 | 因此, 无类型 \(\lambda\)-演算的语义大致上是要找到一个数学 1051 | 对象 \(D\), 使得 \(D \to D\), 也就是某种函数或者映射 1052 | 的空间, 满足这个同构. 其中我们的 \(\lambda\) 1053 | 语法是从左往右的对应, 而函数求值则是从右往左的对应. 1054 | 1055 | 但是这种对象并不常见: 如果 \(D\) 是集合, 那么函数集 1056 | \(D \to D\) 1057 | 和 \(D\) 有双射, 当且仅当 \(D\) 只有一个元素. 因为如果 1058 | \(D\) 有至少两个元素, 那么 1059 | \(D^D \ge 2^D > D\). 1060 | 这里第二个不等式来源于 Cantor 的对角线论证. 1061 | 而只有一个元素的集合过于平凡. 1062 | 1063 | 但是, 其他数学对象仍然是有机会的. 譬如假设 \(D\) 是一个 1064 | 拓扑空间, 那么 \(D \to D\) 是连续函数构成的空间. 它至少 1065 | 在集合元素数量上是可以和 \(D\) 有双射的. 那么能不能构造 1066 | 一个拓扑空间使得 \(D \to D\) 和 \(D\) 之间有同胚呢? 1067 | 1960年代, Dana Scott 为了解决这个问题, 提出了一系列数学对象, 主要 1068 | 来自于拓扑空间, 以及各种各样的序和格结构. 1069 | 研究这些结构的理论被称为\textbf{论域论}(domain theory). 1070 | 1071 | 在此简单介绍一下这些数学对象的直观. 1072 | \begin{definition}[{\cite[\S\S2.1.5--2.1.6]{abramsky:1995:domain}}] 1073 | 给定一个集合 \(D\) 上的偏序 \(\succeq\), 它 1074 | 的\textbf{定向子集}(directed subset)为那些满足对于所有 \(x,y\in A\), 1075 | 存在 \(z \in D\) 使得 \(z \succeq x, y\) 的非空子集 1076 | \(A\). 如果每个定向子集 \(A\) 的上确界都存在, 则称其 1077 | 为\textbf{定向完备偏序}(directed-complete partial order, 简写dcpo). 1078 | 两个dcpo之间的\textbf{Scott-连续函数}为满足 1079 | \[f\left(\sup A\right) = \sup f(A)\] 1080 | 的单调函数. 其中 \(A\) 取遍所有的定向子集. 注意单调函数满足 1081 | 定向子集的像仍然是定向子集. 1082 | \end{definition} 1083 | 可以给dcpo赋予一种拓扑, 称为 \textbf{Scott拓扑}, 1084 | 使得 Scott-连续函数就是在这些拓扑下连续的函数. 1085 | Scott-连续函数的集合 \([A \to B]\) 逐点使用 \(B\) 上的 1086 | 偏序可以诱导出一个偏序. 在这个偏序下定向子集也都有上确界, 1087 | 即逐点的上确界. 1088 | 1089 | 我们还可以在dcpo上添加各种各样的要求, 比如有最小元 \(\bot\), 1090 | 有连续性, 代数性等等; 就像环论中我们也会研究满足各种条件 1091 | 的环. 这些空间统称为\textbf{论域}(domain).\footnote{和哲学或者逻辑学中的论域不同.} 1092 | 而大致来说, 这些空间在求解类似 \([D \to D] \cong D\), 1093 | 或者更一般的 \(F(D) \cong D\) 方程时都表现了优良的性质. 1094 | 我们可以找到最小的\(D\)满足这样的方程. 具体在 \(\lambda\)-演算 1095 | 上, 我们得到的偏序中每个点表示一组信息, 而在偏序中越大表示 1096 | 信息越详细. 而上面所说的 \(\Omega = (\lambda x. xx) (\lambda x.xx)\) 1097 | 则对应最小元 \(\bot\). 我们甚至可以给出 \(\cons{Y}\) 1098 | 组合子的一种刻画. 1099 | \begin{lemma}[{\cite[定理2.1.19]{abramsky:1995:domain}}] 1100 | 对于有最小元 \(\bot\) 的dcpo \(A\), 1101 | 存在Scott-连续函数 1102 | \[\cons{fix} : [A \to A] \to A\] 1103 | 取出每个函数的最小不动点. 1104 | \end{lemma} 1105 | \begin{proof} 1106 | 对于每个Scott-连续函数, 1107 | 考虑 \(\bot, f(\bot), f(f(\bot)),\dots\) 构成的序列. 1108 | 由最小元的定义有 \(\bot \preceq f(\bot)\). 再反复使用 1109 | \(f\) 的单调性得到 \(f^{(n)}(\bot) \preceq f^{(n+1)}(\bot)\). 1110 | 因此这是一条升链, 从而是定向子集. 它有上确界 1111 | \(f^{(\infty)}(\bot) = \sup_{n\in\mathbb N}f^{(n)}(\bot).\) 1112 | 那么由 \(f\) 的 Scott 连续性有 1113 | \[f(f^{(\infty)}(\bot)) = f(\sup_{n\in\mathbb N}f^{(n)}(\bot)) 1114 | = \sup_{n\in\mathbb N} f(f^{(n)}(\bot)) = f^{(\infty)}(\bot).\] 1115 | 故这的确是不动点, 并且不难看出这是最小的不动点. 1116 | 另一方面, 考虑 \(n\) 次迭代操作 \(f \mapsto f^{(n)}(\bot)\), 1117 | 这是Scott-连续函数, 从而这些迭代函数对 \(n\) 取逐点上确界 1118 | 也是Scott-连续的, 所以 \(\cons{fix}\) 是连续函数. 1119 | \end{proof} 1120 | 1121 | 我们构造出满足 \([D \to D] \cong D\) 的对象后, 1122 | 可以证明\(\cons{Y}\)的语义就是 \(\cons{fix}\) 函数. 1123 | 回忆我们认为dcpo中元素越大表示信息越详细, 1124 | 而 \(\cons{fix}\) 是\emph{最小}不动点. 换句话说, 尽管 1125 | 某个函数可能有很多不动点, 但是 \(\cons{Y}\) 1126 | \emph{总是取出定义最“不明确”的那个}. 譬如 \(\lambda x.x\) 1127 | 的不动点为全体表达式. 而 \(\cons{Y}(\lambda x. x) = \Omega\), 1128 | 选出了信息“最少”的那个, 即 \(\bot\). 1129 | 1130 | 论域论不仅提供了一种框架, 还将计算机科学、数学与逻辑学联系 1131 | 起来. 特别是计算机科学中经常需要处理不停机的递归, 以及 1132 | 集合论难以处理的函数. 最经典的例子就是下一章马上会介绍的 1133 | F 系统, 而不少编程语言正是以 F 系统为蓝本构建的. 1134 | -------------------------------------------------------------------------------- /chapters/category.tex: -------------------------------------------------------------------------------- 1 | \chapter{范畴语义} 2 | 3 | 本章介绍类型论的范畴语义. 注意我们研究类型论的 4 | 语义时, 类型论是被研究的数学对象, 而不是正在使用的数学语言. 5 | 此时使用的语言可以自由选择, 例如自然语言、集合论甚至类型论本身. 6 | 这个外部的语言称作\textbf{元语言}, 而被研究的类型论语言就直接 7 | 称作“语言”. 切忌混淆元语言中的概念与语言内的概念. 另一个 8 | 容易混淆的事情, 在于语义中的许多概念都是为了与语法中的事物 9 | 相对应, 因此二者会用相近的名称与记号, 但是它们也不应当混同. 10 | 11 | 类型论模型的一个极重要的特征就是其(广义的)代数性. 何为代数性? 12 | 最狭义来说, 一个代数结构就是某集合上配备一些运算, 并且满足 13 | 形如 \(\forall x_1, x_2, \dots, M = N\) 的公理. 例如 14 | 群、环、\(\Bbbk\)-向量空间等等. 代数结构通常满足一系列性质, 15 | 例如同态定理, 三条同构定理等. 对代数结构可以推广 16 | 得到\textbf{本质代数结构}或者\textbf{广义代数结构}. 而类型论 17 | 的模型一般都可以写成这种形式, 进而可以运用代数结构的一般结论. 18 | 19 | 历史上提出了很多描述类型论语义的方案. 为了使叙述更加清晰, 20 | 我们先介绍 Awodey 提出的自然模型~\cite{awodey:2018:natural}, 21 | 再简单补充一些历史源流. 22 | \cite{newstead:2018:natmod-poly} 也有较为详细的讲解. 23 | 24 | \section{范畴与模型} 25 | 26 | 我们先来思考最类型论最直观的模型, 将类型解释为集合. 27 | 函数类型对应函数集合, 乘积类型对应乘积集合, 等等. 28 | 如果有依值类型 \(x{:}A \vdash B(x)\), 那么 \(B(x)\) 29 | 应当对应 “依值集合”, 也就是一族集合 \(Y_x\), 其中 \(x\) 30 | 取遍 \(A\) 所对应的集合. 31 | 不过, 在一般情况下, \(\Gamma \vdash B\) 依赖于语境 32 | \(\Gamma\) 中的多个类型. 因此我们应该将语境解释为集合, 33 | 而类型解释为集合族. 如果 \(\Gamma\) 解释为集合 \(X\), 34 | \(\Gamma \vdash B\) 解释为集合族 \(Y_{x \in X}\), 35 | 那么新语境 \(\Gamma, y{:}B\) 应该解释为集合族的不交并 36 | \(\coprod_{x \in X} Y_x\). 37 | 38 | 这是定义依值类型论的模型时出现的一般现象. 我们先直观地认为 39 | 类型应该解释为某物, 而后对于依值类型我们提出对应的“依值某物”, 40 | 最后完整的解释是将语境对应为某物, 而类型对应于依值某物. 41 | 42 | \berry{2} 43 | 一般来说, 这里提到的“某物”往往构成一个范畴, 并且许多语义上的 44 | 操作都对应范畴论中早有研究的概念, 因此便有了范畴语义的研究. 45 | 直觉上, 类型之间的箭头应该是函数. 但参考前文所说, 我们应当 46 | 考虑语境之间对应的箭头. 不难看出, 既然语境是一列类型 47 | \(\Gamma = (x_1{:}A_1, \dots, x_n{:}A_n)\), 48 | 那么若 \(\Delta = (y_1{:}B_1, \dots, y_m{:}B_n)\), 49 | 则合适的箭头 \(\Gamma \to \Delta\) 应当是一列表达式 50 | \((M_1, \dots, M_m)\), 使得 \(\Gamma \vdash M_k : B_k\). 51 | 对于 $m = n = 1$ 的情况, 这就与函数是一致的. 52 | 不过, 因为有依值类型, \(B_k\) 中可能用到了变量 \(y_1, \dots, y_{k-1}\). 53 | 这时候要将它们对应地替换成 \(M_1, \dots, M_{k-1}\). 54 | 我们将这列表达式 \(M_k\) 记作 \(\sigma\), 55 | 整体写作 \(\Gamma \vdash \sigma : \Delta\). 56 | 这些在 \ref{beginning:stlc:canonicity} 中已有提及, 57 | \(\sigma\) 称作从 \(\Gamma\) 到 \(\Delta\) 的\textbf{代换}. 58 | 59 | 给定任何语境 \(\Gamma\), 我们应该有一个集合 \(\mathrm{Tp}(\Gamma)\), 60 | 表示这语境下合法的类型构成的集合. 如果再有一个代换 61 | \(\Delta \vdash \sigma : \Gamma\), 那么就可以得到 62 | 函数 \(\mathrm{Tp}(\Gamma) \to \mathrm{Tp}(\Delta)\). 63 | 注意这里方向是相反的. 64 | 所有这些函数合在一起就构成了函子 65 | \(\mathcal{C}\op \to \mathsf{Set}\), 也就是一个预层. 66 | 因此, 对于一般的模型来说, 我们也应当有一个范畴 67 | \(\mathcal{C}\) 与其上的预层 \(\mathrm{Tp}\). 68 | 69 | 对于类型的元素来说, 有多种等价的提法. 70 | 其中最简单的办法是考虑某个语境中所有类型的元素的不交并 71 | \(\mathrm{Tm}(\Gamma)\), 以及映射 72 | \(\pi : \mathrm{Tm}(\Gamma) \to \mathrm{Tp}(\Gamma)\) 73 | 为每个元素赋予类型. 74 | 这就构成了两个预层之间的映射 \(\pi : \mathrm{Tm} \to \mathrm{Tp}\). 75 | 如果读者不喜欢将不同类型的元素放在同一个集合中, 之后会讨论 76 | 一些避免这种情况的等价的表述. 77 | 78 | 给定语境 \(\Gamma\) 与类型 \(A \in \mathrm{Tp}(\Gamma)\),\footnote{ 79 | 需要时刻注意的是, 我们正在使用语法中的现象来启发语义的定义. 80 | 因此这里的“语境”既可以指语法中的一个具体的语境, 也可以指 81 | 其模型中的一个对象 \(\Gamma \in \mathcal{C}\). 82 | 以集合模型为例, 语法是能具体写出表达式的东西, 而语义中 83 | 这些则对应集合与集合之间的函数. 显然并不是所有集合都能写出 84 | 具体的表达式, 因此这两者需要区分. 85 | } 我们应当能构造出语境 \(\Gamma, x{:}A\). 86 | 因为变量名无关紧要, 我们也写作 \((\Gamma, A)\). 87 | 正如范畴论中的大部分构造一样, 我们应当找出语法中它的泛性质, 88 | 并将其作为模型的定义中的一条需要满足的性质. 89 | 90 | 泛性质无非二者居其一: 描述从该对象出发的箭头有哪些, 91 | 或者描述指向该对象的箭头有哪些. \((\Gamma, A)\) 的泛性质是后者. 92 | 要构造 \(\Delta \to (\Gamma, A)\) 的代换, 93 | 就需要先构造 \(\Delta \to \Gamma\) 的代换 \(\sigma\), 94 | 再构造一个元素 \(\Delta \vdash t : A[\sigma]\).\berry{3} 95 | 换句话说, 这是说我们有一个拉回方 96 | \[\begin{tikzcd} 97 | {\hom(\Delta, (\Gamma, A))} & {\mathrm{Tm}(\Delta)} \\ 98 | {\hom(\Delta, \Gamma)} & {\mathrm{Tp}(\Delta)} 99 | \arrow["\pi", from=1-2, to=2-2] 100 | \arrow["{\sigma \mapsto A[\sigma]}"', from=2-1, to=2-2] 101 | \arrow[from=1-1, to=2-1] 102 | \arrow[from=1-1, to=1-2] 103 | \arrow["\lrcorner"{anchor=center, pos=0.125}, draw=none, from=1-1, to=2-2] 104 | \end{tikzcd}\] 105 | 这就完全定义了 \((\Gamma, A)\). 106 | 由于对每个 \(\Delta\) 都有这样的拉回方, 我们可以将其 107 | 综合为预层上的拉回操作. 这就得到了自然模型的定义. 108 | 109 | \begin{comment} 110 | \section{族与丛, 分类空间} 111 | 112 | 我们先从集合出发, 描述一个一般的现象. 113 | 假如我希望描述一族集合, 最直接的方法就是给定一个指标集 \(B\), 114 | 然后对每个 \(b \in B\), 指定一个集合 \(E_b\). 115 | 换句话说就是有 \(E_\bullet : B \to \mathsf{Set}\). 116 | 但是另一方面, 我也可以将所有的 \(E_b\) 聚合起来 117 | 成为一个大集合 \(E\), 再用一个函数 \(p : E \to B\) 指出 118 | 每个元素所属的指标 \(b\) 是哪一个. 这两种描述方式是等价的. 119 | 120 | \begin{center} 121 | \begin{tikzpicture} 122 | \draw (2,0) ellipse (0.9 and 0.6); 123 | \node at (3.3,0) {\(B\)}; 124 | \node (C) at (2.4,-0.1) {\(\bullet\)}; 125 | \node (D) at (1.7,-0.3) {\(\bullet\)}; 126 | \node (E) at (1.9,0.25) {\(\bullet\)}; 127 | 128 | \draw (0.9,1.1) rectangle (1.6,2.9); 129 | \node (Do) at (1.25, 2.3) {\(E_a\)}; 130 | \draw (1.6,1.1) rectangle (2.3,2.9); 131 | \node (Eo) at (1.95, 1.7) {\(E_b\)}; 132 | \draw (2.3,1.1) rectangle (3,2.9); 133 | \node (Co) at (2.65, 2) {\(E_c\)}; 134 | \draw (1.25,1.1) edge[->, out=-90] (D); 135 | \draw (1.95,1.1) edge[->, out=-90, in=85] (E); 136 | \draw (2.65,1.1) edge[->, out=-90, in=70] (C); 137 | \end{tikzpicture} 138 | \end{center} 139 | 140 | 事实上还有更加简单的例子. 考虑子集 \(E \subseteq B\). 141 | 它可以等价的描述为 \(B \to \{\cons{yes}, \cons{no}\}\), 142 | 因为只需要知道全集中的每个元素是否在这个子集里, 就完全确定了子集. 143 | 这是一种一般的现象, 即同一个概念可以描述为某种族 \(B \to U\), 144 | 也可以描述为某种丛 ------ 丛就是满足某条件的态射 \(p : E \to B\), 145 | 在子集的情况下就是单射 \(E \rightarrowtail B\), 146 | 而在集合族的情况下就是任何从集合到集合的映射. 147 | 148 | 下面的表格描述了数学中出现的许多族与丛的对应关系. 149 | 表格中画横线表示有这种构造, 但是没有通用的名字. 150 | 读者不必明白每个例子. 151 | 152 | \begin{center} 153 | \begin{tabular}{c c c c}\hline 154 | 族 & 族至丛 & 丛至族 & 丛\\\hline 155 | \(\varphi : B \to \{\cons{yes}, \cons{no}\}\) & 156 | \(E = \{b \in B \mid \varphi(b)\}\) & 157 | \(\varphi(b) = (b \in E)\)& 158 | 子集 \(E \subseteq B\) \\ 159 | \(F : B \to \mathsf{Set}\) & 160 | \!\!不交并 \(E = \coprod_{b} F(b)\)\!\! & 161 | 原象 \(F(b) = p^{-1}\{b\}\) & 162 | \(p : E \to B\)\\ 163 | \(F : \mathcal C \to \mathsf{Set}\) & 164 | 元素范畴 \(\int^{\mathcal C}F\) & 165 | 原象 & 166 | 离散纤维化 \(\mathcal E \to \mathcal C\)\\ 167 | \!群同态 \(G \to \mathrm{Aut}(H)\)\!& 168 | 半直积 \(H \rtimes G\) & 169 | ------ & 170 | 分裂扩张 \(\hat G \to G\)\\ 171 | \(F : \mathcal C \to \mathsf{Cat}\) & 172 | \!Grothendieck 构造\! & 173 | 原象 & 174 | \!Grothendieck 纤维化\! \\ 175 | 连续映射 \(B \to \mathbf{B}G\) & 176 | ------ & 177 | 分类映射 & 178 | \(G\)-主丛 \(E \to B\) 179 | \\\hline 180 | \end{tabular} 181 | \end{center} 182 | \berry{2} 183 | 184 | \(\{\cons{yes}\} \subseteq \{\cons{yes}, \cons{no}\}\) 185 | 可以看作是\textbf{万有}的子集, 因为对任何子集 \(E \subseteq B\), 186 | 以下交换方是拉回. 187 | \[\begin{tikzcd} 188 | E & {\{\cons{yes}\}} \\ 189 | B & {\{\cons{yes}, \cons{no}\}} 190 | \arrow[hook, from=1-1, to=2-1] 191 | \arrow[hook, from=1-2, to=2-2] 192 | \arrow[from=1-1, to=1-2] 193 | \arrow[from=2-1, to=2-2] 194 | \arrow["\lrcorner"{anchor=center, pos=0.125}, draw=none, from=1-1, to=2-2] 195 | \end{tikzcd}\] 196 | 从这个角度看, 一切子集都源于 197 | \(\{\cons{yes}\} \subseteq \{\cons{yes}, \cons{no}\}\), 198 | 或者说, 这个子集包含了一切其他子集可能出现的情况. 199 | 更严格来说, 有如下性质. 200 | \begin{theorem} 201 | 对于集合 \(B\), 它的子集与映射 \(B \to \{\cons{yes}, \cons{no}\}\) 202 | 一一对应, 并且对应关系是上图的拉回关系. 203 | \end{theorem} 204 | 因此, 我们说 \(\{\cons{yes}\} \subseteq \{\cons{yes}, \cons{no}\}\) 205 | \textbf{分类}了全体子集. 206 | 这可以类推到集合族上. 207 | 考虑 \(\mathsf{Set}_*\) 为全体形如 208 | \((A, a)\) 的有序对, 其中 \(a \in A\).% 209 | \footnote{这里为了避免处理真类的问题, 可以不考虑全体集合. 210 | 例如可以固定一个较大的集合 \(U\), 只考虑这个集合的子集.} 211 | 有显然的映射 \(\mathsf{Set}_* \to \mathsf{Set}\), 212 | 将 \((A, a)\) 映射到 \(A\). 213 | 这样, 如果有集合族 \(E_\bullet : B \to \mathsf{Set}\), 214 | 那么也不难验证这是拉回. 215 | \[\begin{tikzcd} 216 | E & {\mathsf{Set}_*} \\ 217 | B & {\mathsf{Set}} 218 | \arrow[from=1-1, to=2-1] 219 | \arrow[from=1-2, to=2-2] 220 | \arrow[from=1-1, to=1-2] 221 | \arrow["{E_\bullet}"', from=2-1, to=2-2] 222 | \arrow["\lrcorner"{anchor=center, pos=0.125}, draw=none, from=1-1, to=2-2] 223 | \end{tikzcd}\] 224 | 类似地可以说 \(\mathsf{Set}_* \to \mathsf{Set}\) 分类了全体集合族. 225 | 226 | 当然, 上面的说法有一些不严谨, 因为两个不同的 \(E_\bullet\) 227 | 可能给出同构的 \(E \to B\). 因为态射之间是直接比较相等, 228 | 而对象之间比较的是同构的概念, 这种情况难免出现. 229 | 子集能避免这个问题, 是因为两个子集之间至多有一种方法同构. 230 | 如果有 \(X_* \to X\), 使得在 \(E \to B\) 与某个 231 | \(B \to X\) 之间有拉回的对应关系, 232 | 不过多个 \(B \to X\) 可能对应同构的 \(E \to B\), 233 | 就称 \(X_* \to X\) \textbf{弱分类}了 \(E \to B\) 的态射. 234 | \end{comment} 235 | 236 | \section{类型论的自然模型}\label{category:naturalmodel} 237 | \begin{definition}\label{category:naturalmodeldef} 238 | 一个\textbf{自然模型}是任意一个有终对象的范畴 \(\mathcal C\), 239 | 配备两个预层与其间的态射 \(\pi : \mathrm{Tm} \to \mathrm{Tp}\), 240 | 使得对于任何 \(\Gamma \in \mathcal C\) 241 | 与 \(A \in \mathrm{Tp}(\Gamma) \cong \hom(\yo(\Gamma), \mathrm{Tp})\), 242 | 有对象表出以下拉回预层: 243 | \[\begin{tikzcd} 244 | \bullet & {\mathrm{Tm}} \\ 245 | {\yo(\Gamma)} & {\mathrm{Tp}} 246 | \arrow["\pi", from=1-2, to=2-2] 247 | \arrow["A"', from=2-1, to=2-2] 248 | \arrow[from=1-1, to=2-1] 249 | \arrow[from=1-1, to=1-2] 250 | \arrow["\lrcorner"{anchor=center, pos=0.125}, draw=none, from=1-1, to=2-2] 251 | \end{tikzcd}\] 252 | 此对象记作 \((\Gamma, A)\). 满足这种条件的态射也称作\textbf{可表态射}. 253 | 另外, 将态射 \((\Gamma, A) \to \Gamma\) 记作 \(\cons{p}_A\), 254 | 交换图上沿的态射记作 \(\cons{q}_A\). 255 | \end{definition} 256 | 257 | 当然, 无需范畴论语言也可以等价地表达这一定义. 258 | 但本文不是类型论的教材, 因此就按下不表. 259 | 260 | 考虑所有合法语境在判值相等关系下构成的范畴 \(\mathcal C\), 261 | 语境之间的态射 \(\sigma \in \hom(\Delta, \Gamma)\) 是代换, 262 | % 即一列类型与 \(\Gamma\) 相符的表达式, 其中包含 \(\Delta\) 的变量. 263 | 并且判值相等的代换视为相同. 这里, 终对象是空语境. 264 | 对于每个语境 \(\Gamma\), 265 | 考虑允许包含 \(\Gamma\) 中的变量的合法的类型构成的集合 \(\mathrm{Tp}(\Gamma)\), 266 | 同样将判值相等的类型视为相同. 267 | 这些类型的元素的不交并记作 \(\mathrm{Tm}(\Gamma)\). 268 | 这样, 如果 \(\Gamma\) 下 \(A\) 是合法的类型, 269 | 又有代换 \(\sigma \in \hom(\Delta, \Gamma)\), 270 | 那么就可以将 \(A\) 中的变量代换得到 \(A[\sigma]\), 271 | 是 \(\Delta\) 下合法的类型. 272 | 这就证明了 \(\mathrm{Tp}\) 是预层. 同理 \(\mathrm{Tm}\) 也是预层. 273 | \(\pi\) 将每个 \(a \in \mathrm{Tm}(\Gamma)\) 映射到它所属的类型. 274 | 275 | 我们来计算定义中提到的拉回. 我们知道预层的拉回是逐点计算的, 276 | 因此拉回 \(F\) 满足 277 | \begin{align*} 278 | F(\Delta) 279 | &\cong \hom(\Delta, \Gamma) \times_{\mathrm{Tp}(\Delta)} \mathrm{Tm}(\Delta)\\ 280 | &= \{(\sigma, a) \mid \pi(a) = A[\sigma]\}\\ 281 | &= \hom(\Delta, (\Gamma, A)). 282 | \end{align*} 283 | 因此 \(F\) 的确可表, 并且其表出对象就对应语境的扩展操作 \((\Gamma, A)\). 284 | 285 | 以上就证明了类型论的语法范畴构成自然模型, 记作 \(\mathbf T\).% 286 | \footnote{当然, 因为我们还没有引入任何类型, 语法范畴其实是平凡的. 287 | 但是上面的证明可以随着加入新的类型而随时拓展.} 288 | 以此为模板, 就可以找到类型论语法中许多概念的语义对应. 289 | 例如, 类型论中的语境对应自然模型中 \(\mathcal C\) 的对象, 290 | 语境之间的代换对应 \(\mathcal C\) 中的态射. 291 | 语境中的类型对应 \(\mathrm{Tp}(\Gamma)\) 的元素. 292 | 给定 \(A : \mathrm{Tp}(\Gamma)\), 293 | 类型论中 \(A\) 的元素对应模型中的 294 | \[\{a \mid a \in \mathrm{Tm}(\Gamma), \pi(a) = A\}.\] 295 | 由拉回的性质, 可以看出这等价于 296 | \[\{\alpha \mid \alpha \in \hom(\Gamma, (\Gamma, A)), \cons{p}_A \circ \alpha = \cons{id}_\Gamma\}.\] 297 | 对于 \(A : \mathrm{Tp}(\Gamma), \sigma : \Delta \to \Gamma\), 298 | 由于 \(\mathrm{Tp}\) 是预层, 我们可以得到 \(A[\sigma] : \mathrm{Tp}(\Delta)\). 299 | 这是类型论中代换的对应. 而由于下图中右侧的正方形与外侧的正方形均是拉回, 300 | \[\begin{tikzcd} 301 | {\yo(\Delta, A[\sigma])} & {\yo(\Gamma,A)} & {\mathrm{Tm}} \\ 302 | {\yo(\Delta)} & {\yo(\Gamma)} & {\mathrm{Tp}} 303 | \arrow[from=2-2, to=2-3] 304 | \arrow[from=1-3, to=2-3] 305 | \arrow[from=1-2, to=2-2] 306 | \arrow[from=1-2, to=1-3] 307 | \arrow[from=2-1, to=2-2] 308 | \arrow[from=1-1, to=2-1] 309 | \arrow[curve={height=-9pt}, from=1-1, to=1-3] 310 | \arrow[dashed, from=1-1, to=1-2] 311 | \end{tikzcd}\] 312 | 我们得到虚线的箭头也存在, 使得整体构成交换图并且左侧的正方形是拉回. 313 | 因此在 \(\mathcal C\) 中有这样一个拉回. 314 | \[\begin{tikzcd} 315 | {(\Delta, A[\sigma])} & {(\Gamma,A)} \\ 316 | \Delta & \Gamma 317 | \arrow[from=1-2, to=2-2] 318 | \arrow[from=2-1, to=2-2] 319 | \arrow[from=1-1, to=2-1] 320 | \arrow[dashed, from=1-1, to=1-2] 321 | \end{tikzcd}\] 322 | 在一些其他的类型论的模型的定义中, 323 | 不涉及预层范畴, 而是直接将这个拉回作为类型论中代换的定义. 324 | 325 | 如何说明自然模型的确是合适的概念呢? 326 | 模型最重要的作用, 是语法中的概念可以解释到所有模型中. 327 | 用范畴的语言来说, 对于任何模型 \(\mathbf M\), 328 | 都有唯一的保持结构的态射 \(\mathbf T \to \mathbf M\). 329 | 这一点可以靠对语法归纳来证明. 330 | 我们之后会定义带有 \(\Pi\)-类型的模型, 带有 \(\Sigma\)-类型的模型, 等等. 331 | 它们各自也有对应的性质: 332 | 考虑带有 \(\Pi\)-类型的类型论构成的语法模型, 333 | 它到任何带有 \(\Pi\)-类型的模型都有唯一的保持结构的态射, 334 | 以此类推. 335 | 336 | 上面还没有定义何为保持结构的态射. 337 | 以下为了方便, 对于模型 \(\mathbf M\), 338 | 记它对应的范畴为 \(\mathcal C_{\mathbf M}\), 339 | 配备的预层是 \(\mathrm{Tm}_{\mathbf M}, \mathrm{Tp}_{\mathbf M}\), 340 | 有可表态射 \(\pi_{\mathbf M}\). 341 | 假如有函子 \(F : \mathcal C \to \mathcal D\), 342 | 那么复合上这个函子, 就给出了预层范畴之间的映射 343 | \(F^* : \mathsf{Psh}(\mathcal D) \to \mathsf{Psh}(\mathcal C)\). 344 | 345 | \begin{definition} 346 | 给定两个自然模型 \(\mathbf M, \mathbf N\), 347 | 定义一个\textbf{态射} \(F : \mathbf M \to \mathbf N\) 为 348 | 一个函子 \(F : \mathcal C_{\mathbf M} \to \mathcal C_{\mathbf N}\), 349 | 两个态射 \(F_{\mathrm{Tp}} , F_{\mathrm{Tm}}\) 使得以下图表交换: 350 | \[\begin{tikzcd} 351 | {\mathrm{Tm}_{\mathbf M}} & {F^*\mathrm{Tm}_{\mathbf N}} \\ 352 | {\mathrm{Tp}_{\mathbf M}} & {F^*\mathrm{Tp}_{\mathbf N}} 353 | \arrow["{F_{\mathrm{Tp}}}"', from=2-1, to=2-2] 354 | \arrow["{F_{\mathrm{Tm}}}", from=1-1, to=1-2] 355 | \arrow["{\pi_{\mathbf M}}"', from=1-1, to=2-1] 356 | \arrow["{F^* \pi_{\mathbf N}}", from=1-2, to=2-2] 357 | \end{tikzcd}\] 358 | 此时对于任何 \(\Gamma \in \mathcal C_{\mathbf M}\) 与 359 | \(A \in \mathrm{Tp}_{\mathbf M}(\Gamma)\), 有 360 | \(F(\Gamma) \in \mathcal C_{\mathbf N}\) 与 361 | \(F_{\mathrm{Tp}}(A) \in \mathrm{Tp}_{\mathbf N}(F(\Gamma))\), 362 | 并且自然诱导一个态射 \(F(\Gamma, A) \to (F(\Gamma), F_{\mathrm{Tp}}(A))\). 363 | 我们要求这个态射是同构. 364 | \end{definition} 365 | 366 | 其中, 最后这个条件是在要求自然模型之间的态射保持 \((-,-)\) 这个运算. 367 | 如果这不仅是同构, 而是直接严格相等, 就说\(F\)是自然模型之间的\textbf{严格态射}. 368 | 369 | \subsection{自然模型中的类型} 370 | 371 | 自然模型仅仅是搭建起了类型论模型的基本框架. 372 | 接下来, 我们要为这个框架加入具体的类型. 373 | 先从最简单的单元素类型开始. 374 | 375 | 我们同样从语法范畴寻找启发. 对于有单元素类型的类型论, 376 | 在任何语境 \(\Gamma\) 下都有 \(\Gamma \vdash \cons{Unit}\,\text{type}\). 377 | 因此应当有预层的态射 \(1 \to \mathrm{Tp}\), 378 | 在 \(\mathrm{Tp}\) 中指出单位类型. 379 | 而单位类型在任何语境下都恰好有一个元素. 因此如果考虑拉回 380 | \[\begin{tikzcd} 381 | \bullet & {\mathrm{Tm}} \\ 382 | 1 & {\mathrm{Tp}} 383 | \arrow[from=1-2, to=2-2] 384 | \arrow["{\cons{Unit}}"', from=2-1, to=2-2] 385 | \arrow[from=1-1, to=2-1] 386 | \arrow[from=1-1, to=1-2] 387 | \arrow["\lrcorner"{anchor=center, pos=0.125}, draw=none, from=1-1, to=2-2] 388 | \end{tikzcd}\] 389 | 那么其左上角应当也是 \(1\). 390 | \begin{definition} 391 | 给定自然模型, 392 | 如果有一个映射 \(\cons{Unit} : 1 \to \mathrm{Tp}\), 393 | 使得它与 \(\pi\) 拉回得到的也是终对象, 那么就称 394 | \(\cons{Unit}\) 是该自然模型的\textbf{单位类型结构}. 395 | \end{definition} 396 | 注意单位类型是\emph{结构}而不是\emph{性质}, 397 | 也就是说同一个自然模型可能有两种不同的单位类型结构, 398 | 这是因为两个不同的单位类型可以仅仅是同构而不严格相等. 399 | 400 | 更复杂的类型也是相似的. 接下来考虑 \(\Pi\)-类型. 401 | 它的规则是 402 | \[\frac{\Gamma \vdash A\,\text{type} 403 | \quad\Gamma, x{:}A \vdash B\,\text{type}} 404 | {\Gamma \vdash \prod_{x : A} B\,\text{type}}\] 405 | 因此我们需要考虑一个预层 406 | \[F(\Gamma) = \{(A, B) \mid 407 | A \in \mathrm{Tp}(\Gamma), B \in \mathrm{Tp}(\Gamma, A)\}.\] 408 | 这个定义的自然性来自 \(\mathrm{Tp}\) 与 \((-,-)\) 的自然性. 409 | 与单位类型类似, 我们需要寻找预层的态射 \(\cons{Pi} : F \to \mathrm{Tp}\), 410 | 指出由 \(A, B\) 构成的 \(\Pi\)-类型. 411 | \(\Pi\)-类型的元素, 可以通过 \(\Gamma, x{:}A \vdash b : B\) 构造. 412 | 因此考虑另一个预层 413 | \[G(\Gamma) = \{(A, B, b) \mid b \in \mathrm{Tm}(\Gamma, A), \pi(b) = B\},\] 414 | 其中 \(A, B\) 取值范围与 \(F\) 中相同. 415 | 有自然变换 \(G \to F\). 至此, 我们应当希望有一个交换方 416 | \[\begin{tikzcd} 417 | G & {\mathrm{Tm}} \\ 418 | F & {\mathrm{Tp}} 419 | \arrow[from=1-1, to=2-1] 420 | \arrow["{\cons{Pi}}"', from=2-1, to=2-2] 421 | \arrow["\pi", from=1-2, to=2-2] 422 | \arrow[from=1-1, to=1-2] 423 | \end{tikzcd}\] 424 | 这就编码了 \(\Pi\)-类型的引入规则, 即 \(\lambda\) 操作. 425 | % 接下来需要考虑消去规则, 即函数求值操作. 426 | % \[ 427 | % \frac{\Gamma \vdash f : \prod_{x:A} B 428 | % \quad \Gamma \vdash a : A}{ 429 | % \Gamma \vdash f(a) : B[x/a]} 430 | % \] 431 | % 在模型中, 这对应一个元素 \(f : \mathrm{Tm}(\Gamma)\), 432 | % 满足 \(\pi(f) = \cons{Pi}(A, B)\). 画成交换图是 433 | % \[\begin{tikzcd} 434 | % {\yo(\Gamma)} \\ 435 | % & G & {\mathrm{Tm}} \\ 436 | % & F & {\mathrm{Tp}} 437 | % \arrow["\pi", from=2-3, to=3-3] 438 | % \arrow[from=2-2, to=3-2] 439 | % \arrow["{\cons{Pi}}"{description}, from=3-2, to=3-3] 440 | % \arrow[from=2-2, to=2-3] 441 | % \arrow["f"{description}, curve={height=-6pt}, from=1-1, to=2-3] 442 | % \arrow[curve={height=6pt}, from=1-1, to=3-2] 443 | % \end{tikzcd}\] 444 | % 这里左侧的映射指出了 \((A,B) \in F(\Gamma)\). 445 | 接下来, 我们要求这个交换方是拉回. 446 | \begin{definition} 447 | 给定自然模型, 如果有一个映射 \(\cons{Pi} : F \to \mathrm{Tp}\), 448 | 使得它与 \(\pi\) 拉回得到的是 \(G \to F\), 那么就称 449 | \(\cons{Pi}\) 是该自然模型的 \textbf{\(\Pi\)-类型结构}. 450 | \end{definition} 451 | 这就同时得到了 \(\Pi\)-类型的消去规则 (即函数求值), 452 | 还有 \(\beta\) 与 \(\eta\) 等式. 453 | 更加详细的解释与证明, 可以参考 \cite[定理 8]{awodey:2018:natural}. 454 | \(\Sigma\)-类型也可以类似操作. 455 | \(F\) 不变, 定义预层 456 | \[H(\Gamma) = \{(A, B, a, b) \mid 457 | a,b \in \mathrm{Tm}(\Gamma), 458 | \pi(a) = A, 459 | \pi(b) = B[a]\}\] 460 | 其中 \(B[a]\) 是将 \(a\) 看作对应的代换 \(\Gamma \to (\Gamma,A)\). 461 | \begin{definition} 462 | 给定自然模型, 如果有一个映射 \(\cons{Sigma} : F \to \mathrm{Tp}\), 463 | 使得它与 \(\pi\) 拉回得到的是 \(H \to F\), 那么就称 464 | \(\cons{Sigma}\) 是该自然模型的 \textbf{\(\Sigma\)-类型结构}. 465 | \end{definition} 466 | 467 | % 上村太一~\cite{uemura:2019:general} 提出了一种逻辑框架, 468 | % 可以方便地叙述范畴语义而不必如上操作繁杂的预层. 469 | % Gratzer~\cite{gratzer:2021:syntactic} 进一步发展了这种工具. 470 | 471 | 我们证明集合范畴构成含有 \(\Sigma\)-类型与 \(\Pi\)-类型结构的自然模型. 472 | 大致上说, \(\Sigma\)-类型结构就是集合族的不交并, 473 | 而 \(\Pi\)-类型就是集合族的乘积. 474 | 475 | 不过, 我们需要避免 Russell 悖论相关的问题, 不能直接取全体集合构成的范畴. 476 | 考虑一个强不可达基数 \(\kappa\), 477 | 也就是一个很大的基数, 像如来神掌, 使得用 \(\Sigma\) 和 \(\Pi\) 都逃不出这个基数. 478 | 这样集合论宇宙 \(V_\kappa\) 中的集合构成一个范畴 \(\cons{Set}_{\kappa}\), 479 | 从我们的目的来看, 就如全体集合的范畴一样的无垠, 480 | 在 \(\Sigma, \Pi\) 操作下都封闭. 481 | 但是从集合的视角来看, 它只是一个小范畴, 因此避免了处理真类的麻烦. 482 | 如果读者暂时不关心真类的问题, 可以直接取 \(\cons{Set}\). 483 | 484 | 对于任何 \(\Gamma \in \cons{Set}_\kappa\), 485 | 取 \(\mathrm{Tp}(\Gamma)\) 为映射集 \(\Gamma \to \cons{Set}_\kappa\). 486 | 换句话说, 一个包含 \(\Gamma\) 中变量的类型对应一个集合族. 487 | 而一个类型 \(A\) 的元素就是这个集合族中的元素族. 换句话说是 488 | \(\prod_{x\in\Gamma}A(x)\). 489 | 这样, \(\mathrm{Tm}(\Gamma)\) 为不交并 490 | \[\coprod_{A \in (\Gamma \to \cons{Set}_\kappa)} \prod_{x \in \Gamma} A(x).\] 491 | 有显然的态射 \(\mathrm{Tm} \to \mathrm{Tp}\). 492 | 我们还需要证明此态射可表. 493 | 对于任何 \(\Gamma \in \cons{Set}_\kappa\) 494 | 与 \(A : \Gamma \to \cons{Set}_\kappa\), 495 | 计算可表态射定义中的拉回 496 | \[[\yo(\Gamma) \times_{\mathrm{Tp}} \mathrm{Tm}](\Delta) 497 | = \{(\sigma, B, f) \mid A \circ \sigma = B\} 498 | = \coprod_{\sigma \in (\Delta \to \Gamma)} \prod_{x \in \Delta} A(\sigma(x)) 499 | \] 500 | 其中 \(\sigma \in \hom(\Delta, \Gamma), B \in (\Delta \to \cons{Set}_\kappa), f \in \prod_{x \in \Delta} B(x)\). 501 | 使用集合乘积的分配律就得到 502 | \[\coprod_{\sigma \in (\Delta \to \Gamma)} \prod_{x \in \Delta} A(\sigma(x)) 503 | \cong \Delta \to \coprod_{x \in \Gamma} A(x).\] 504 | 因此定义 \((\Gamma, A) = \coprod_{x \in \Gamma} A(x)\), 505 | 则上面的拉回预层被 \((\Gamma, A)\) 表出, 故 \(\mathrm{Tm} \to \mathrm{Tp}\) 的确是可表态射. 506 | 507 | 接下来, 我们证明这个模型上有 \(\Pi\)-类型结构. 508 | 考虑上面的预层 \(F(\Gamma) = \{(A,B) \mid A \in \mathrm{Tp}(\Gamma), B \in \mathrm{Tp}(\Gamma, A)\}\). 509 | 在集合中 \(A \in \Gamma \to \cons{Set}_\kappa\), 510 | \(B \in (\Gamma, A) \to \cons{Set}_\kappa\) 都是集合族. 511 | 我们想要给 \((A, B)\) 赋予它们对应的 \(\Pi\)-类型, 512 | 在集合中这就是集合乘积 513 | \[\cons{Pi}(A, B) = x \mapsto \prod_{a \in A(x)} B(x, a).\] 514 | 注意 \(\cons{Pi}(A,B) \in \Gamma \to \cons{Set}_\kappa\) 515 | 也是集合族. 由于 \(\kappa\) 是强不可达基数, 这个集合乘积仍然在 \(\cons{Set}_\kappa\) 中. 516 | 验证这的确给出了 \(\Pi\)-类型结构, 就是简单的集合操作了. 517 | 类似地, 我们可以给出 \(\Sigma\)-类型结构 518 | \[\cons{Sigma}(A, B) = x \mapsto \coprod_{a \in A(x)} B(x, a).\] 519 | 520 | % \subsection{相等类型} 521 | 522 | % \subsection{外延类型论与局部积闭范畴} 523 | 524 | % \subsection{内涵相等类型} 525 | 526 | \section[融贯问题]{融贯问题\protect\berry{1}} 527 | 528 | 尽管从类型论的角度, 自然模型的定义的确很自然, 529 | 但是我们寻找模型时, 往往找到的东西会相差一个细节. 530 | 这个细节就是\textbf{融贯问题}. 531 | 在数学中, 往往难以直接定义“依值某物”. 例如 532 | 假设 \(b \in B\) 是拓扑空间中的一个点, 533 | 我们难以定义一族拓扑空间 \(A(b)\) 如何随着 \(b\) 534 | 的变化而连续变化. 535 | 536 | 在类型论出现之前, 数学家就早已注意到这个问题. 537 | 一般而言, 数学家对此的解决方案是转而考虑如何定义 538 | \(E = \sum_{b \in B} A(b)\). 539 | 这就是一个普通的对象, 不存在依值的问题. 540 | 同时, 它显然应该带有投影函数 \(E \to B\). 541 | 对 \(A(b)\) 的研究都可以转而改为对 \(p : E \to B\) 的性质的研究. 542 | 假如我希望描述一族集合, 最直接的方法就是给定一个指标集 \(B\), 543 | 然后对每个 \(b \in B\), 指定一个集合 \(E_b\). 544 | 换句话说就是有 \(E_\bullet : B \to \mathsf{Set}\). 545 | 但是另一方面, 我也可以将所有的 \(E_b\) 聚合起来 546 | 成为一个大集合 \(E\), 再用一个函数 \(p : E \to B\) 指出 547 | 每个元素所属的指标 \(b\) 是哪一个. 这两种描述方式是等价的. 548 | 549 | \begin{center} 550 | \begin{tikzpicture} 551 | \draw (2,0) ellipse (0.9 and 0.6); 552 | \node at (3.3,0) {\(B\)}; 553 | \node (C) at (2.4,-0.1) {\(\bullet\)}; 554 | \node (D) at (1.7,-0.3) {\(\bullet\)}; 555 | \node (E) at (1.9,0.25) {\(\bullet\)}; 556 | 557 | \draw (0.9,1.1) rectangle (1.6,2.9); 558 | \node (Do) at (1.25, 2.3) {\(E_a\)}; 559 | \draw (1.6,1.1) rectangle (2.3,2.9); 560 | \node (Eo) at (1.95, 1.7) {\(E_b\)}; 561 | \draw (2.3,1.1) rectangle (3,2.9); 562 | \node (Co) at (2.65, 2) {\(E_c\)}; 563 | \draw (1.25,1.1) edge[->, out=-90] (D); 564 | \draw (1.95,1.1) edge[->, out=-90, in=85] (E); 565 | \draw (2.65,1.1) edge[->, out=-90, in=70] (C); 566 | \end{tikzpicture} 567 | \end{center} 568 | 569 | 再如, 向量丛理应是依赖于流形上一点 \(x \in M\) 的向量空间 \(V(x)\), 570 | 但我们改将其定义为流形之间的连续映射 \(p : E \to M\). 571 | 这种技术在代数几何中达到巅峰, 以 Grothendieck 的相对视角 572 | (relative point of view) 为典型. 573 | 例如希望表达每个 \(A(x)\) 都是紧空间, 则说 \(p\) 是紧合映射; 574 | 希望表达每个 \(A(x)\) 都是仿射空间, 则说 \(p\) 是仿射映射.% 575 | \footnote{一般来说, 在代数几何中也可以直接考虑前者, 即 576 | 要求 \(p^{-1}\{x\}\) 是仿射空间, 等等. 但是这样往往无法得到正确 577 | 的定义, 因为这样仅仅要求每个点处 \(A(x)\) 都满足条件, 578 | 并没有要求不同点之间要求的融洽性.} 579 | 具体到类型论的语义中, 就是不考虑语境中的类型集合 \(\mathrm{Tp}(\Gamma)\), 580 | 而是指定一系列特殊箭头 \(\Delta \to \Gamma\) 的集合. 581 | 这里 \(\Delta\) 在直观上对应 \((\Gamma, A)\). 582 | 我们称这类映射为\textbf{形式丛} (display map).% 583 | \footnote{这里不直译英文术语, 而是翻译 584 | 一个不常见的等价说法 (formal bundle) 作为中文术语. 585 | 这里的 display 有特殊含义, 类似 “依值 (dependent)” 586 | 但用法又不全相同. 若读者有更好的中文翻译, 尽可提出.} 587 | 588 | 然而, 想要将这类定义变为类型论中的模型时, 就会遇到严重的问题. 589 | 在原本的写法 \(A(x)\) 中, 若有函数 \(f : Y \to X\), 590 | 那么可以直接代入 \(A(f(y))\), 就得到依赖 \(y \in Y\) 的依值对象. 591 | 这样, 先代入 \(f : Y \to X\), 再代入 \(g : Z \to Y\), 592 | 与直接一次性代入 \(f \circ g\) 显然按定义是相同的, 593 | 都等于 \(A(f(g(z)))\). 594 | 然而, 如果使用 \(p : E \to X\) 的写法, 那么代入操作在 595 | 转换之后就得到拉回 \(p' : E \times_X Y \to Y\). 596 | 然而, 两次拉回与一次性拉回基本不会直接相等, 它们仅仅是同构. 597 | 这一现象在数学中很常见. 例如集合之间 598 | \(A \times (B \times C) \ne (A \times B) \times C\), 599 | 因为前者的元素形如 \((a, (b, c))\), 而后者形如 600 | \(((a, b), c)\), 显然不相等. 601 | 一个简单的想法是我们想办法商去一个等价关系, 使得它们相等. 602 | 这也是不可取的. 例如 \(A \times B\) 与 \(B \times A\) 是同构的, 603 | 但是如果我们将它们视作相同, 即令 \((a, b) = (b, a)\), 604 | 那么当 \(A = B = \mathbb{R}\) 时, 605 | 就有 \((1, 2) = (2, 1) \in \mathbb{R}^2\), 故 \(1 = 2\), 矛盾. 606 | 607 | 对此, 又能提出补救的办法. 608 | 第一个想法是试图证明在类型论中具体需要的相等关系里, 609 | 不会涉及上面提到的交换律这样有问题的情况. 610 | 再者, 可以给范畴添加一些与已有的对象同构的新对象, 611 | 这样不会改变范畴本身, 但是使得上面的商操作得以进行. 612 | 这些技巧统称为\textbf{融贯定理}. 613 | 614 | 由于这类问题在技术上比较复杂, 但是在直观上又应当总是成立, 615 | 在一般的研究中, 往往不愿在此事上花费过多笔墨. 616 | 因此往往有许多不同的办法定义类型论的模型, 617 | 有一些与数学中遇到的对象比较接近, 因此便于构造具体的模型, 618 | 但是不满足上面提到的严格等式; 619 | 另一些与类型论中的语法比较接近, 因此便于证明与类型论的关系, 620 | 但是自然的数学对象往往不构成这种模型. 621 | 这种情况可以画出图表, 从横线的上方到下方需要解决一个融贯问题: 622 | 623 | \begin{center} 624 | \begin{tikzpicture} 625 | \node at (-3, 2) {局部积闭范畴}; 626 | \node at (-1.2, 2.6) {意象}; 627 | \node at (0.4, 0.8) {概括范畴}; 628 | \node at (3, 1.6) {形式丛范畴}; 629 | \draw (-5, 0) -- (5, 0); 630 | \node at (-2.9, -1) {具族范畴}; 631 | \node at (-2.9, -1.5) {自然模型}; 632 | \node at (-0.3, -1.9) {具集范畴}; 633 | \node at (2.7, -0.7) {分裂概括范畴}; 634 | \end{tikzpicture} 635 | \end{center} 636 | 637 | % LCCC/topos, compcat, display map cat 638 | 639 | % CwF (NatMod), CwA, split compcat 640 | 641 | \section{范畴语义的历史} 642 | 643 | 在 1984 年, Seely~\cite{seely:1984:lccc} 提出了依值类型与范畴论的一种对应关系. 644 | 之前我们提到在数学中往往借形如 \(p : E \to B\) 的态射的研究 645 | 间接表达依值对象的概念. 646 | Seely 考虑的情况中所有态射都属于这样的态射. 647 | 例如对于集合范畴, 所有函数 \(p : E \to B\) 有对应的 648 | 集合族 \(E_b = p^{-1} \{b\}\). 649 | 给定这样的 \(p : E \to B\) 表示依值于 \(B\) 的类型, 650 | 若有另一个箭头 \(\sigma : A \to B\) 表达代换, 651 | 那么代换结果就是拉回 \(A \times_B E \to A\).\berry{2} 652 | 653 | Seely 发现, \(\Sigma\) 与 \(\Pi\)-类型在这个框架下 654 | 可以简洁地表述为一对伴随. 655 | 若我们将关于 \(\sigma\) 的拉回函子 656 | \(\mathcal{C}/B \to \mathcal{C}/A\) 657 | 写作 \(\sigma^*\), 658 | 那么它的左伴随 \(\sigma_!\) 就对应 \(\Sigma\)-类型, 659 | 而右伴随 \(\sigma_*\) 对应 \(\Pi\)-类型. 660 | 这一点可以类比一个更简单的例子. 661 | 考虑集合 \(X\) 的所有子集构成的偏序 \(\mathcal{P}(X)\). 662 | 给定函数 \(f : X \to Y\), 就有原像操作 663 | \(f^* = f^{-1} : \mathcal{P}(Y) \to \mathcal{P}(X)\). 664 | 如果将这两个偏序看成范畴, 那么直接套用伴随的定义可以 665 | 算出其左右伴随分别是 666 | \[\begin{aligned} 667 | f_! (U) &= \{y \in Y \mid \exists x \in f^{-1}(y).\,x \in U\} = f(U) \\ 668 | f_* (U) &= \{y \in Y \mid \forall x \in f^{-1}(y).\,x \in U\} 669 | \end{aligned}\] 670 | 可以看到二者分别用到了 \(\exists\) 和 \(\forall\). 671 | 而子集 \(V \in \mathcal{P}(X)\) 可以看作 672 | 依赖于 \(x \in X\) 的命题, 表达 \(x\) 是否在这个集合中. 673 | \(\Sigma\) 与 \(\Pi\) 类型的情况则是这个现象对类型的版本. 674 | 675 | 如果一个范畴中任何态射都有这样三个伴随函子 676 | \(\sigma_! \vdash \sigma^* \vdash \sigma_*\), 677 | 那么就称这个范畴是\textbf{局部积闭范畴}. 678 | 这个名字来源于其等价定义, 即要求所有 679 | 俯范畴 \(\mathcal{C}/A\) 构成积闭范畴. 680 | Seely 提出利用局部积闭范畴作为依值类型论的模型. 681 | 正如我们之前所说, 这不完全是正确的, 因为有融贯问题. 682 | 这一点稍后会再次提到. 683 | 684 | 1986 年, Cartmell~\cite{cartmell:1986:contextualcat} 685 | 提出了具集范畴 (category with attributes) 及有语境性的变体. 686 | 随后在文献中陆续出现了许多稍有变化的定义. 687 | 1993 年, Bart Jacobs~\cite{jacobs:1993:comprehensioncat} 688 | 提出了概括范畴 (comprehension category), 这统一了之前的诸多概念. 689 | 大体来说, 我们希望考虑范畴 \(\mathcal{C}\) 中的一些特殊的箭头, 690 | 这就是在考虑一个满子范畴 \(\mathcal{E} \hookrightarrow \mathcal{C}^\to\). 691 | 在概括范畴中这不限为满子范畴, 可以改用任意的函子. 692 | 这些不同的变体定义就是对这个函子做各种要求. 693 | 值得注意的是, 具集范畴中的限制足够强, 使得它与自然模型完全等价, 694 | 从而出现在上面融贯问题的图表中的下侧, 而一般的概括范畴则在上侧. 695 | 这是因为预层 \(\mathsf{Psh}(\mathcal{C})\) 与 696 | 一种特殊的函子 \(\mathcal{E} \to \mathcal{C}\) 一一对应, 697 | 这种特殊的函子称作\textbf{离散纤维化}. 698 | 由于预层是到集合范畴的函子, 我们将这个概念翻译做具\emph{集}范畴. 699 | 700 | 1995 年, Dybjer~\cite{dybjer:1995:internal} 701 | 为了在类型论内研究类型论, 提出了具族范畴 (category with families) 的概念. 702 | 这基本上与自然模型的定义相同, 但是没有用到预层等范畴语言表述, 703 | 而是用集合的语言表达了所有需要的泛性质. 704 | 705 | Seely 论文中融贯问题的细节一直未受人注意. 706 | 直到 1993 年 Curien~\cite{curien:1993:coherence} 与 707 | 1995 年 Hofmann~\cite{hofmann:1995:lccccoh} 708 | 首次讨论了融贯问题, 并给出了解决方案. 709 | 对于每个概括范畴, 都可以修改得到另一个等价的范畴, 710 | 但是其中可以巧妙地选择拉回, 使得其满足严格的等式 \((f \circ g)^* = f^* \circ g^*\). 711 | 这可以扩展到别的等式, 例如类型论中代换满足 712 | \((\sum_{x : A} B(x))[\sigma] = \sum_{x : A[\sigma]} B(x)[\sigma]\), 713 | 也可以在修改后的概括范畴中得到满足. 714 | 715 | 2014 年, Clairambault~\cite{clairambault:2014:biequivalence} 716 | 给出了 Hofmann 等人对融贯问题的处理的进一步分析, 717 | 即将所有的概括范畴合为一个 2-范畴 \(\mathsf{CompCat}\), 718 | 并将 Hofmann 的构造写成 2-函子. 719 | 这在 \cite{curien:2014:revisit} 中有总结. 720 | 读者可以阅读这些更晚的文献了解上面提到的内容. 721 | 722 | 不过, 这还不是融贯问题的完整答案. 723 | 这仅仅处理了 \(\Sigma, \Pi\) 等具体的类型, 724 | 并没有统一的办法可以处理所有的类型构造. 725 | 事实上, 对于内涵 Martin-Löf 类型论中的相等类型, 726 | 没有很好的办法处理融贯问题. 727 | 2015 年, 由 Voevodsky 的相关工作启发了 728 | 融贯问题的新解决方案~\cite{lumsdaine:2015:universes}, 729 | 给出了对内涵相等类型, 与一大类类型构造的满意处理. 730 | 731 | 2018 年, 具族范畴被 Awodey~\cite{awodey:2018:natural} 和 Fiore 各自独立重新表述为自然模型. 732 | 2019 年, 上村太一~\cite{uemura:2019:general} 733 | 提出了通用的框架, 给出了一大类类型论的语法与语义的关系. 734 | 735 | \section{范畴语义与内语言}\label{category:inner} 736 | 737 | 用类型论表达范畴中的构造 738 | 739 | 给一些例子 740 | 741 | 谓词, 子对象与代数性的破坏 742 | 743 | -------------------------------------------------------------------------------- /chapters/curry-howard.tex: -------------------------------------------------------------------------------- 1 | \chapter{Curry--Howard对应} % (1934 -- 1969) 2 | \section{简单类型\texorpdfstring{\(\lambda\)}{Lambda}-演算与命题逻辑} 3 | 4 | 经过上面的一些研究, 或许有些读者会产生一种模糊的感觉. 5 | 假如我们有 \(f : \alpha \to \beta\), 以及 \(a : \alpha\), 6 | 那么我们就能求值得到 \(f(a) : \beta\). 这其实和逻辑里 7 | 最古老的推理有些相像: 假如我们证明了 \(p\Rightarrow q\), 8 | 并且我们证明了 \(p\), 那么我们就可以证明 \(q\). 9 | 10 | 这是否能推广一下呢? 完全可以! \(p \wedge q\) 就对应了 11 | Descartes 乘积 \(\alpha \times \beta\). 这个类型的 12 | 元素形如 \((a, b)\), 其中 \(a : \alpha, b : \beta\). 13 | 并且有两个投影函数 \(\pi_1(a, b) = a, \pi_2(a, b) = b\). 14 | 它们的类型写出来就是 \(\alpha \times\beta \to \alpha\) 15 | 以及 \(\alpha\times\beta \to \beta\). 对应到逻辑里面, \(\pi_1\) 16 | 恰好就是 “如果 \(p \wedge q\) 成立, 那么 \(p\) 成立”. 17 | 18 | 对偶地, \(p\vee q\) 则对应了类型的不交并, 记作 19 | \(\alpha + \beta\). 它的元素要么形如 \(\iota_1(a)\), 20 | 要么形如 \(\iota_2(b)\). 而我们有一个函数对此分类讨论: 21 | 如果有 \(f : \alpha \to \gamma\) 与 \(g : \beta \to \gamma\) 22 | 分别处理两种情况, 那么 23 | \[\cons{case}(f,g,c) = \begin{cases} 24 | f(a) & c = \iota_1(a)\\ 25 | g(b) & c = \iota_2(b). 26 | \end{cases}\] 27 | 而 \(\cons{case}\) 的类型就是 28 | \((\alpha \to \gamma) \to (\beta \to \gamma) 29 | \to (\alpha + \beta \to \gamma)\). (回忆我们之前 30 | 说的用 \(\alpha \to \beta\to \gamma\) 表示一个二元函数的技巧.) 31 | 32 | 我们总结一下上面的相似性, 可以发现可以把类型和命题做类比. 33 | 类型的元素就和命题的证明差不多, 因此命题的真假就可以解释为 34 | 对应的类型是否有元素. 我们可以定义一个类型 \(\mathbf 0\) 35 | 没有任何元素, 代表假命题. 则 \(\alpha \to \mathbf 0\) 36 | 代表命题的否定, 缩写成 \(\neg \alpha\). 我们对 \(\mathbf 0\) 37 | 的元素可以分类讨论, 但是由于只有零种情况, 因此得到 38 | \[\cons{exfalso} : \mathbf 0 \to \gamma.\] 39 | 可以把这个与前面的 \(\cons{case}\) 对比. \(\cons{exfalso}\) 40 | 对应逻辑中的爆炸原理: 从假命题出发可以推出一切命题. 41 | 42 | 另一方面, (简单类型)组合子演算也有类似的现象. 这更加明显: 43 | \(\cons{S}\) 的类型是 \((\alpha \to\beta\to\gamma)\to(\alpha\to\beta)\to(\alpha\to\gamma)\); 44 | 而 \(\cons{K}\) 则是 \(\alpha \to \beta \to \alpha\). 45 | 这刚好是 Hilbert 公理系统里面的两条公理! Curry 在 46 | 1934 年初步注意到组合子的这个性质\cite{curry:1934:combinatorCH}. 47 | 这个想法在后来几十年中逐步被推广. 人们发现, 用于计算、为数学对象 48 | 分类的类型, 与用于证明、只有真假的命题, 在许多方面上有着惊人的相似性: 49 | \begin{itemize} 50 | \item 组合子对应 Hilbert 命题逻辑演绎系统; 51 | \item \(\lambda\)-演算对应自然演绎系统;\footnote{这是与 Hilbert 系统不同的另一个演绎系统.} 52 | \item \(\lambda\)-演算可以转换成组合子, 对 53 | 应演绎定理.\footnote{演绎定理说的是, 54 | 如果假设 \(\varphi\) 成立, 在 Hilbert 系统中 55 | 可以证明 \(\psi\), 那么不需要任何假设就能在 Hilbert 56 | 系统中证明 \(\varphi \Rightarrow \psi\).} 57 | \end{itemize} 58 | 59 | 我们或许可以大胆一些, 把这种相似性升格为\emph{同一性}: 60 | 61 | \slogan{类型是命题.} 62 | 63 | 这就是 Curry--Howard 对应. 它体现了逻辑学和类型论 64 | (进而与计算机科学) 有着深刻的内在联系. 65 | 需要注意的是, 之前介绍的简单类型论可以表达高阶逻辑, 但是 66 | 这个表达能力是额外加入的: 我们添加了命题的类型 \(o\), 67 | 并且加入了逻辑连词与公理. 但是在这里简单类型\(\lambda\)-演算 68 | 并没有加入任何关于逻辑的内容, 直接通过 Curry--Howard 对应 69 | 即可表达命题逻辑. 我们下面看看能从这之中挖掘出哪些有价值的数学. 70 | 71 | \section{依值类型} 72 | 73 | 有了命题逻辑, 下一步自然是一阶逻辑, 或者称作谓词逻辑. 74 | 这里有形如 \(\forall x. P(x)\) 的命题. 直观上看, 75 | 它对应 “输入 \(x\), 输出 \(P(x)\) 的元素” 的函数 76 | 构成的类型. 但是这有一点小问题: 对于不同的输入\emph{值}, 77 | 输出的\emph{类型}是不同的. 换句话说, 类型可以取决于值. 78 | 我们称陪域取决于输入值的函数为\textbf{依值函数}. 79 | 80 | 事实上, 这种函数我们在数学中早就见过了. 向量场就是 81 | 对流形上的每个点 \(x \in M\), 给出一个向量 \(\vec v \in \mathrm{T}_xM\) 82 | 的函数. 这里随着输入不同, 输出的向量所处的向量 83 | 空间也不同. 对于普通的集合也有这样的构造: 给定定义域 \(B\) 84 | 与一族集合 \(F_x, x \in B\), 累乘 85 | \(\prod_{x\in B} F_x\) 就可以看作一种依值函数. 86 | 87 | 对偶地, 命题 \(\exists x. P(x)\) 对应的类型就是 88 | 有序对 \((x,p)\), 其中第二个分量 \(p : P(x)\) 89 | 类型取决于前一个分量. 它类似于向量丛的全空间 90 | \(\mathrm{T}M\). 对于普通的集合, 这对应一族集合 91 | \(F_x\) 的不交并 \(\coprod_{x \in B} F_x\). 92 | 93 | 当然, 在通常数学中对依值函数的定义一般采取另一种方法. 94 | 考虑全空间 \(E = \coprod_{x\in B} F_x\), 我们有一个 95 | 映射 \(\pi : E \to B\) 投影到 \(B\) 上. 依值函数 96 | 集合 \(\prod_{x:B} F_x\) 定义为 97 | \[\{f : B \to E \mid \pi \circ f = \cons{id}\}.\] 98 | 这个定义在集合上和上面是等价的, 而在拓扑空间上这就类似 99 | 纤维丛的截面. 这样定义的优点是只使用了普通的映射, 因此 100 | 容易推广到拓扑空间、流形等事物. 101 | 102 | 我们接下来会采用 \(\Pi, \Sigma\) 来指代这两种 103 | 类型. 它们的规则和函数、 Descartes乘积非常类似. 104 | 如果有变量 \(x : A\) 与表达式 \(M : B\), 其中 105 | \(M, B\) 可以包含 \(x\) (注意在普通的函数类型定义 106 | 中, \(B\) 不得包含 \(x\)). 107 | 那么 \(\lambda x. M\) 的类型是 \(\prod_{x:A}B\). 108 | 反过来, 如果有表达式 \(N : A\), \(F : \prod_{x:A} B\), 109 | 那么 \(F(N)\) 的类型就是 \(B[x/N]\), 其中 \([x/N]\) 110 | 表示把变量 \(x\) 代入为 \(N\). 111 | 用 \(\Gamma \vdash A \,\text{type}\) 112 | 表示“在语境 \(\Gamma\) 中, 表达式\(A\)是合法的类型”, 那么 113 | 可以将规则写出来: 114 | \[\frac{\Gamma \vdash A\,\text{type} 115 | \quad\Gamma, x{:}A \vdash B\,\text{type}} 116 | {\Gamma \vdash \prod_{x : A} B\,\text{type}}\] 117 | 注意 \(B\) 在语境 \(\Gamma, x{:}A\) 中, 因此可以 118 | 包含变量 \(x\), 以及一切在 \(\Gamma\) 中的变量. 119 | \[\frac{\Gamma, x{:}A \vdash M : B}{\Gamma \vdash \lambda x. M : \prod_{x:A}B} 120 | \quad\frac{\Gamma \vdash F : \prod_{x:A}B 121 | \quad \Gamma \vdash N : A} 122 | {\Gamma \vdash M(N) : B[x/N]}\] 123 | 这里的 \(\lambda x. M\) 实际上也应当标上类型, 即 124 | \(\lambda x^A. M\) 或者 \(\lambda x{:}A. M\), 125 | 但是一般类型明确时都省略. 126 | 我们仍然有 \(\beta\)-等价 \((\lambda x.M)(N) = M[x/N]\) 127 | 与 \(\eta\)-等价 \(\lambda x. M(x) = M\), 其中 128 | 后者的 \(M\) 不含变量 \(x\). 129 | 130 | 对于 \(\Sigma\) 类型也可以类似操作. 131 | \[\frac{\Gamma \vdash A\,\text{type} 132 | \quad\Gamma, x{:}A \vdash B\,\text{type}} 133 | {\Gamma \vdash \sum_{x : A} B\,\text{type}}\] 134 | \[\frac{\Gamma \vdash M : A 135 | \quad \Gamma \vdash N : B[x/M]} 136 | {\Gamma \vdash (M, N) : \sum_{x:A}B} 137 | \quad\frac{\Gamma \vdash P : \sum_{x:A}B} 138 | {\Gamma \vdash \pi_1(P) : A} 139 | \quad\frac{\Gamma \vdash P : \sum_{x:A}B} 140 | {\Gamma \vdash \pi_2(P) : B[x/\pi_1(P)]}.\] 141 | 对于更详细的介绍, 读者可以参阅\cite{ufp:2013:hottbook}~的 142 | 第一章. 143 | 144 | 1967年, 利用这些想法, 数学家 De Bruijn 145 | 设计了一门依值类型论的计算机语言, 称为 Automath. 146 | 1976年, Jutting 在他的学位论文~\cite{automath:1994:automath}中使用 Automath 147 | 形式化了 Landau 的《分析学基础》. Automath 没有 148 | 被大规模使用, 不过它的设计影响到了许多后继的类型论. 149 | 150 | F系统\footnote{这个名字是因为Girard的论文中用F 151 | 缩写法语单词\emph{ferm\'e} (闭), 阴差阳错成为了 152 | 现在普遍指代这个系统的名字.} (这严格来说不属于依值类型) 153 | 在 1972 年由逻辑学家 Jean-Yves Girard~\cite{girard:1972:systemf} 154 | 与 1974 年由计算机科学家 J. C. Reynolds~\cite{reynolds:1974:systemf} 独立发现. 155 | 一边是逻辑学, 一边是计算机科学, 这说明 Curry--Howard 156 | 对应不仅仅是一个巧合, 而是切实深刻地影响了两个学科的发展. 157 | 158 | F 系统的规则对简单类型 \(\lambda\)-演算做了一点扩展. 159 | 它的类型除了函数类型 \(\alpha \to \beta\) 之外, 160 | 还有形如 \(\forall X. \beta\) 的类型, 其中 161 | \(X\) 是类型变量, 表达式 \(\beta\) 可以 162 | 包含 \(X\). 这个类型表示 “不论 \(X\) 是什么, 163 | 都能充当 \(\beta\) 的元素” 的类型. 具体来说, 164 | 如果有一个可以包含 \(X\) 的表达式 \(M\), 165 | 对于任何类型 \(\alpha\), \(M[X/\alpha]\) 都是 166 | \(\beta[X/\alpha]\) 类型的元素, 那么 167 | \(\Lambda X. M\) 就是 \(\forall X. \beta\) 的元素. 168 | 而反过来, 如果 \(f\) 是 \(\Lambda X. M\) 的元素, 169 | 那么 \(f \alpha\) 就是 \(M[X/\alpha]\) 的元素. 170 | 171 | 举个例子, \(\Lambda X. \lambda x. x\) 172 | 就是 \(\forall X. X \to X\) 的元素.\footnote{在一些形式 173 | 中要求在 \(\lambda x\) 上标注出 \(x\) 的类型, 174 | 比如 \(\Lambda X. \lambda x^X. x\). 而在一些 175 | 形式中甚至不要求写出 \(\Lambda X\). 这些差别会对语言 176 | 的性质起到一定的影响, 但是我们这里不过多停留.} 177 | F系统包含很多奇特的构造. 比如我们可以像无类型 178 | \(\lambda\)-演算中那样编码自然数. 定义类型 179 | \(\mathbb N = \forall X. (X \to X) \to (X \to X)\), 180 | 那么之前构造的自然数 \(\lambda f. \lambda x. f(f(\dots(f(x))))\) 181 | 就可以在 F 系统里面写成 182 | \[\Lambda X. \lambda f^{X\to X}. \lambda x^X. f(f(\dots(f(x)))).\] 183 | 可以同样写出上面介绍过的加法、乘法、幂等等运算. 184 | 请读者思考为什么在简单类型 \(\lambda\)-演算中无法做到 185 | 这一点. 186 | 187 | Girard 在他的论文~\cite{girard:1972:systemf}中 188 | 证明了二阶逻辑\footnote{这里其实移除了排中律, 下一节就 189 | 会提到相关内容.}中可以证明是全函数的递归函数\footnote{有一些 190 | 递归定义并不能产生处处有定义的函数, 比如 \(f(0) = 0, 191 | f(n) = f(n-2)\), 这在奇数处就没有定义. 我们把处处有 192 | 定义的函数称为\textbf{全函数}.}在 F 系统中都能定义. 193 | Reynolds 则从计算机科学的视角给出了一个反向的对应, 194 | F 系统中能定义的 \(\mathbb N \to \mathbb N\) 的函数 195 | 都能在二阶逻辑中找到对应的逻辑关系. 这被称为 196 | \textbf{Girard--Reynolds同构}. 197 | 198 | F系统非常强大, 它可以构造很多类型. 譬如 \(\mathbf 1 = 199 | \forall X. X \to X\), 可以证明它的唯一元素就是 \(\Lambda X. \lambda x. x\), 200 | 因此可以看作是单元素类型的定义. 而 \(\mathbf 2 = 201 | \forall X. X \to X \to X\) 则恰好有两个元素 (请读者思考 202 | 是哪两个元素; 具体的证明则比较复杂, 需要语义工具). 203 | 上面我们构造了自然数类型, 这是递归类型的特殊情况. 204 | F系统里面可以直接构造出大量的递归类型~\cite{wadler:1990:free}. 205 | 它甚至可以构造一个类型 \(V\), 206 | 使得 \(V\) 和 \((V \to \mathbf 2) \to \mathbf 2\) 同构. 207 | 这在集合的世界中是不可想象的: 一个集合永远比自己的幂集要 208 | 小, 更不用说自己的幂集的幂集了! 209 | Reynolds~\cite{reynolds:1984:polymorphism}在1984年证明了 210 | 简单类型 \(\lambda\)-演算的集合论模型不能扩展到 F 系统. 211 | 因此, \ref{beginning:domain}~节中讨论的技巧在这里 212 | 构造语义就非常重要. 213 | 214 | 1988年, Coquand与Huet提出了构造演算 (Calculus of 215 | Constructions, 缩写为 CoC). 这与上面提到的一些类型系统 216 | 很快被总结到同一个框架下, 统称为\textbf{纯类型系统}~\cite{barendregt:1992:lambda}. 217 | 需要向初学者说明的是, 这一族类型论 (包括其特殊情况, 即 $\lambda$-立方) 218 | 的定义非常整齐划一, 因此往往吸引人试图将别的类型论都改装到这个框架下. 219 | 然而, 这么做往往是违背其数学本质的. 220 | 同时, 这个框架也有不少问题, 见 \cite{jacobs:1996:cubism} 中的讨论. 221 | 本文并不是类型论教程, 因此念其历史意义仍然加以介绍, 222 | 但在当代的教科书中则应完全不提到纯类型系统与 $\lambda$-立方. 223 | 224 | 225 | 正常的依值函数类型的规则是 226 | \[\frac{x{:}A \vdash B(x)\,\text{type}}{\prod_{x:A}B(x)\,\text{type}}\] 227 | 换句话说, 假设含有 228 | 变量 \(x : A\) 的表达式 \(B(x)\) 是合法的类型, 229 | 那么 \(\prod_{x:A}B(x)\) 也是合法的类型. 当然, 230 | 如果 \(B\) 不含变量 \(x\), 这就退化到普通的函数类型 231 | \(A \to B\). 而F系统中的 \(\forall\) 类型只需要做 232 | 一点修改: 233 | \[\frac{X{:} \blacksquare \vdash B(X)\,\text{type}}{\forall X. B(X)\,\text{type}}\] 234 | 但是这里 \(\blacksquare\) 中应该填入什么呢? 注意这里 235 | \(X\) 是一个类型, 如 \(\forall X. X \to X\). 因此 236 | 我们需要一个符号表示\emph{类型的类型}. 即 \(X : \cons{type}\). 237 | 这样, 我们也不需要 \(A\,\text{type}\) 这样的声明, 238 | 而只需要 \(A : \cons{type}\) 就可以了. 那么F系统中的 239 | 规则就是 240 | \[\frac{X{:}\cons{type} \vdash B(X):\cons{type}}{\forall X. B(X) : \cons{type}}.\] 241 | 我们甚至可以与上面依值函数类型的记号类比, 把 \(\forall X. B(X)\) 242 | 写成 \(\prod_{X : \cons{type}} B(X)\). 243 | 244 | 当然, 这立刻就会产生一个问题: \(\cons{type}\) 自己的类型 245 | 是什么呢? 在F系统里面, 由于 \(\forall X\) 中的 \(X\) 246 | 本身不能代入 \(\cons{type}\), 因此我们可以直接规定 247 | \(\cons{type}\) 没有类型. 当然, 我们也可以引入一个 248 | 符号 \(\cons{kind}\), 满足 \(\cons{type} : \cons{kind}\). 249 | 这样因为上面的规则中要求 \(X : \cons{type}\), 250 | 所以 \(X\) 本身不能取值为 \(\cons{type}\). 这样我们的 251 | 改写仍然是等价的. 252 | 253 | 纯类型系统就是对这个观察的一个推广. 一般来说, 我们有 254 | \[\frac{A : s_1 \quad x{:}A \vdash B(x) : s_2}{\prod_{x:A}B(x) : s_3}.\] 255 | 上面的依值函数就是 \((s_1,s_2,s_3) = (\cons{type}, \cons{type}, \cons{type})\) 256 | 的情况, 而 F 系统中的 \(\forall\) 则可以写成 257 | \((s_1,s_2,s_3) = (\cons{kind}, \cons{type}, \cons{type})\) 258 | 的情况. 补上其他的规则, 我们可以总结出一个一般的定义. 259 | \begin{definition} 260 | \textbf{纯类型系统}是一族类型系统, 由三个参量决定: 261 | 一个集合 \(\mathcal S\), 262 | 其上有二元关系 \(\mathcal A\) 与 263 | 三元关系 \(\mathcal R\). 类型系统的规则有 264 | \[\frac{}{\Gamma\vdash s_1 : s_2} \quad (s_1, s_2) \in \mathcal A\] 265 | 对于每组\((s_1,s_2,s_3)\in \mathcal R\), 266 | 类型系统中都添加两条规则: 267 | \[\frac{\Gamma \vdash A : s_1 \quad \Gamma, x{:}A \vdash B(x) : s_2}{\Gamma \vdash \prod_{x:A} B(x) : s_3}\] 268 | \[\frac{\Gamma \vdash A : s_1 \quad \Gamma, x{:}A \vdash B(x) : s_2\quad 269 | \Gamma, x{:}A \vdash F(x) : B(x)} 270 | {\Gamma \vdash \lambda x. F(x) : \prod_{x:A}B(x)}.\] 271 | 如果条目 \(x : A\) 在列表 \(\Gamma\) 中出现, 则有 272 | \[\frac{}{\Gamma \vdash x : A}.\] 273 | 最后有 274 | \[\frac{\Gamma \vdash F : \prod_{x:A}B(x) \quad 275 | \Gamma \vdash M : A}{\Gamma \vdash FM : B(A)}\] 276 | 这里严格来说应该写成 \(B[x/A]\). 277 | \end{definition} 278 | 在上面的例子中 \(\mathcal S = \{\cons{type}, \cons{kind}\}\), 279 | \(\mathcal A = \{(\cons{type}, \cons{kind})\}\). 280 | 281 | 这里有一个非常重要的问题需要注意: 既然类型中可以包含 282 | 普通的值, 譬如 \(P(n)\) 表示 \(n\) 维的向量的类型, 283 | 那么如果我有一个向量 \(v : P(1+1)\), 是否可以说 284 | \(v : P(2)\) 呢? 我们当然需要允许这样的推断, 否则 285 | 依值类型的意义就不大了. 因此我们需要修改上面类型系统的定义, 286 | 加入一条规则: 287 | \[\frac{\Gamma \vdash M : A \quad A = B}{\Gamma \vdash M : B}\] 288 | 这里的等号与上面说的一样, 实际上是在表达式上定义的一个等价 289 | 关系, 如 \((\lambda x. x)y\) 与 \(y\) 等价. 290 | 在定义更加复杂的类型论时, 我们经常会发现这个等价关系附带上 291 | 类型信息会更加方便. 换句话说, 我们对于每对 \(\Gamma, T\), 292 | 在所有满足\(\Gamma \vdash A : T\) 的表达 293 | 式 \(A\) 构成的集合 \(U_{\Gamma, T}\) 上各自定义一个 294 | 等价关系, 而不是在全集 \(\bigcup_{\Gamma, T} U_{\Gamma, T}\) 上定义. 295 | 技术上的细节可以参考~\cite{barendregt:1992:lambda}. 296 | 297 | 如果我们设 \(\cons{type} : \cons{type}\) 会如何呢? 298 | 换句话说, 我们试图让 \((\cons{type}, \cons{type}) \in \mathcal A\). 299 | 结果或许并不令人意外: Russell悖论重新回到了类型论中! 300 | 因此我们不能设定存在所有类型的类型, \(\cons{type}\) 自身 301 | 的类型必须是别的东西. 然而, 即使 \(\mathcal A\) 中没有 302 | 这样的循环, 我们仍然可以导出矛盾. 1972年, Girard构造出了 303 | U系统. 304 | 这个系统中 \(\mathcal S\) 有三个元素, 305 | \(\cons{type}, \cons{kind}, \cons{Kind}\). 306 | \(\mathcal A = \{(\cons{type}, \cons{kind}), (\cons{kind}, \cons{Kind})\}\). 307 | 也就是说这里只有 \(\cons{type} : \cons{kind} : \cons{Kind}\), 308 | 没有循环. 然而, 这个系统中仍然能够构造出类似的悖论, 我们称为 309 | Girard悖论. 因此, 设计纯类型系统时必须小心. 310 | 311 | \textbf{构造演算}中, \(\mathcal S = \{\cons{type}, \cons{kind}\}\), 312 | 并且 \(\cons{type} : \cons{kind}\). 而 313 | \[\mathcal R = \{(s_1,s_2,s_2) \mid s_1, s_2 \in \mathcal S\}.\] 314 | 因此构造演算包含了普通的依值函数类型与F系统中的\(\forall\)类型, 315 | 还包含了两种新的依值函数类型. 这个系统已经证明是没有类似的悖论的. 316 | 事实上它有很好的典范性. 它包含了F系统, 所以自然地携带了 317 | F系统中强大的编码能力, 如可以直接使用\(\forall\)类型定义 318 | 自然数类型, 等等. 因为继续扩展这个系统很容易导致 Girard 悖论 319 | 出现, 构造演算以及其各种子系统成为了纯类型系统中应用最广泛的系统. 320 | 321 | \section{经典逻辑} 322 | 323 | 前面我们提到简单类型 \(\lambda\)-演算与命题逻辑之间 324 | 有对应关系, 称作Curry--Howard对应. 实际上, 这个对应 325 | 并不完美, 唯一的差异就在于排中律: 对于任何命题 \(p\), 326 | \(p \vee \neg p\) 都是真命题. 注意这和矛盾律的区别: 327 | 对于任何命题 \(p\), \(p \wedge \neg p\) 都是假命题. 328 | 当然, 我们仍然可以证明 \(\neg \neg (p \vee \neg p)\), 329 | 但是我们不能消去双重否定.\footnote{注意这和 330 | \(\neg\neg (\forall p. p \vee \neg p)\) 不同, 331 | 我们无法证明这个命题.} 332 | 333 | 为什么简单类型 \(\lambda\)-演算无法推出排中律呢? 我们 334 | 可以看一个模型. 给定一个拓扑空间 \(X\), 其上的开集代表 335 | 命题. 全集是真命题, 空集则是假命题. 并集与交集分别表示 336 | \(p\lor q, p\land q\). \(p\)的否定应当是与\(p\)矛盾 337 | 的命题中最弱的, 因此在拓扑上则是与开集 \(U\) 不相交的 338 | 开集中最大的, 换句话说是 \(X\setminus U\) 的内部. 339 | 类似地, 如果 \(U,V\) 分别表示命题 \(p,q\), 那么 340 | \(p \to q\) 则是 \(V \cup (X \setminus U)\) 341 | 的内部. 对于所有的逻辑规则 342 | \(\frac{p_1\,p_2\cdots}{q}\), 可以验证它们对应的 343 | 开集总是满足 \((U_1 \cap U_2 \cap \cdots)\subseteq V\). 344 | 因此如果从逻辑规则中可以推导出排中律, 那么应当有 345 | \(U \cup \mathrm{int}(X\setminus U)\) 等于全集. 346 | 然而很明显一个开集并上其补集的内部不一定是全集. 从这个 347 | 模型看来, 排中律不成立有一些几何的内涵. 我们之后会进一步阐述. 348 | 349 | 我们还有另一种方法. 在简单类型 \(\lambda\)-演算中, 可以证明 350 | 不含自由变量的类型为 \(\alpha + \beta\) 的元素, 351 | 必然等价于形如 \(\iota_i(M)\) 的表达式. 这也就是说, 352 | 在简单类型 \(\lambda\)-演算中, 没有其他条件的情况下 353 | 证明命题 \(p\vee q\), 就必须要确定地构造出具体哪一边是成立的. 354 | 而排中律 \(p \vee \neg p\) 自然不能直接确定哪一边成立, 355 | 因此是无法证明的. 上面这两种方法, 前者是通过观察语义, 356 | 而后者是通过直接分析语法. 357 | 358 | 我们在 \ref{ch:classical}~节会讨论如何在类型论的 359 | Curry--Howard 对应中加入排中律. 但是 360 | 我们首先不妨来看看缺少排中律 361 | 会引发什么变化. 我们将含有排中律的逻辑 362 | 称作\textbf{经典逻辑}.\footnote{经典逻辑的不少定义中, 363 | 排中律是作为其它规则的推论存在的, 364 | 正如Zorn引理一般是作为选择公理的推论存在的. 因此在这些定义 365 | 下无法谈论直接“去掉”排中律. 因为我们不会涉及定义的细节, 366 | 这里不讨论具体如何从形式系统中去掉排中律.} 367 | \begin{theorem} 368 | 排中律有如下的等价形式. 369 | \begin{itemize} 370 | \item 排中律: \(p \vee \neg p\). 371 | \item 双重否定消去: \(\neg\neg p \to p\). 372 | \item 逆否命题: \(\neg p \to \neg q\) 等价于 \(q \to p\). 373 | \item Peirce定律: \(((p \to q) \to p) \to p\). 374 | \item Peirce定律的特殊情况: \((\neg p\to p) \to p\). 375 | \end{itemize} 376 | \end{theorem} 377 | \begin{theorem}[Diaconescu]\label{ch:diaconescu} 378 | 选择公理可以推出排中律. 379 | 事实上排中律可以表述为“\(\{0,1\}\)满足 380 | 选择公理”.\footnote{集合\(Y\)满足选择公理, 当且仅当 381 | 对于任何集合 \(X\) 与关系 \(R \subseteq X \times Y\), 如果对于 382 | 任何 \(X\) 的元素 \(x\) 都存在 \(Y\) 的元素 \(y\) 383 | 满足 \(xRy\), 那么存在一个函数 \(f : X \to Y\) 使得 384 | \(xRf(x)\). 完整的选择公理说的就是所有集合都满足选择公理.} 385 | \end{theorem} 386 | 387 | 一个最经典的使用排中律的证明是这样的. 388 | \begin{theorem} 389 | 存在无理数 \(a,b\) 使得 \(a^b\) 是有理数. 390 | \end{theorem} 391 | \begin{proof} 392 | 考虑 \({\sqrt2}^{\sqrt2}\). 它要么是有理数要么是无理数. 393 | 如果是前者, 则命题成立. 如果是后者, 设 \(a = {\sqrt2}^{\sqrt2}, 394 | b = \sqrt 2\), 则 395 | \[a^b = \left({\sqrt2}^{\sqrt2}\right)^{\sqrt2} = {\sqrt2}^{\sqrt2\times\sqrt2} = 2.\] 396 | 因此无论 \({\sqrt2}^{\sqrt2}\) 是有理数还是无理数, 397 | 都存在 \(a^b\) 满足条件. 398 | \end{proof} 399 | \begin{remark} 400 | 一个不使用排中律的方法是考虑 \(a = \sqrt 2, b = \log_2(9)\). 401 | 另一个避免排中律的方法是花费功夫证明 \({\sqrt2}^{\sqrt2}\) 确实 402 | 是无理数, 这需要非常复杂的数论证明. 403 | \end{remark} 404 | 405 | 那么正常的数学研究中多大程度上需要排中律呢? 实际上直到 406 | Hilbert之前的绝大部分数学研究都完全可以绕过排中律. 407 | Hilbert之后的数学也可以发展无需排中律的版本. 408 | 现在已经有不少不使用排中律发展数学的努力, 409 | 包括代数、几何、分析等等. 在没有排中律时, 410 | 会出现很多有趣的现象: 很多数学概念 411 | 会分裂成多个不等价的概念 (实际上会分裂出无数个不同的概念, 但是 412 | 正如正常数学中我们一般只会取有意义的概念研究, 在这里我们 413 | 也只会谈比较重要的版本). 譬如域在没有排中律的时候会出现% 414 | \emph{离散域}与\emph{连续域}的变体, 有理数 415 | \(\mathbb Q\) 是离散域, 而用 Cauchy 列构造的 416 | 实数 \(\mathbb R\) 则是连续域. 注意这里完全没有 417 | 涉及任何拓扑信息! 离散域的定义中, 任何非零元素都可逆. 418 | 而连续域 (Heyting field) 中, 如果某个元素不可逆 419 | 则它为零, 并且如果 \(a + b\) 可逆则 \(a, b\) 至少 420 | 有一个可逆. 注意离散域都是平凡的连续域. 421 | 在有排中律时, 离散域与连续域 422 | 都等价于通常的域的定义, 这样这个非常有意思的区分就被抹平了. 423 | 424 | 另一方面, 事实上去掉排中律完全没有使得能够发展的数学受到限制, 425 | 恰好相反, 去掉排中律使得数学变得更丰富了. 这是因为 426 | 对于任何一个命题 \(p\), 都存在一个命题 \(p^{\cons{N}}\), 427 | 使得这个命题在无排中律下 \(p^{\cons{N}}\) 可证当且仅当 428 | \(p\) 在使用排中律时可证, 并且在有排中律时 \(p^{\cons{N}}\) 429 | 与 \(p\) 等价. 例如 \(\forall x. p(x) \vee q(x)\) 430 | 会被翻译为 \(\neg \neg \forall x. \neg (\neg p(x) \wedge \neg q(x))\). 431 | 因此无排中律时的数学严格包含了 432 | 有排中律时的数学. 换个说法, 排中律使得大量原先不等价的 433 | 命题变得等价, 所以不加入排中律会让数学更加丰富, 同时不会 434 | 有任何损失. Hilbert 说过:“将数学家的排中律夺走, 就好比 435 | 禁止拳击手使用拳头.” 在这个意义下, 这句话自然是不正确的. 436 | 437 | 仅仅是去掉排中律, 得到的是\textbf{中性数学}. 因为排中律 438 | 仅仅是不可证明或证伪, 中性数学中随时可以重新加入排中律. 439 | 反过来说, 这留出了额外的空间, 让我们可以加入\emph{与排中律相 440 | 矛盾的公理}. 即加入一些公理使得 \(\neg (\forall p. p \vee \neg p)\) 441 | 成立. 例如我们可以加入“所有函数 \(\mathbb R \to \mathbb R\) 442 | 都是连续函数”. 这样的公理被称为\textbf{反经典}的. 443 | 444 | \subsection{构造主义} 445 | 446 | 前一节中已经提示了, 在没有排中律时, 任何数学对象都必须 447 | 构造出来才可以认为存在. \(p \vee q\) 的证明必须明确 448 | 给出哪一边成立, 而 \(\exists x. p(x)\) 必须具体给出 449 | 一个 \(x\).\footnote{不过, 需要注意的是它们不需要\emph{显式}写出 450 | 这样的构造. 正如一般数学中一样, 我们只需要保证理论上可以给出构造即可, 451 | 不需要将构造的每一个细节都写出来才能算作证明.} 452 | 因此, 我们将这种逻辑以及相关的各类数学哲学 453 | 思想称为\textbf{构造主义}. 如果读者对放弃排中律仍然有怀疑, 454 | 可以阅读《接受构造主义的五个阶段》\cite{bauer:2016:fivestage}. 455 | 这篇简短的文章借用了心理学上人们接受悲痛与失去的 456 | 五个阶段 ------ 否认、愤怒、恳求、沮丧、接受 ------ 来 457 | 探讨对构造主义的一些常见误解, 以及构造主义对数学的贡献. 458 | 下面的介绍主要参考了~\cites{carl:1998:brouwer}{sep:2022:constructive}. 459 | 460 | \subsubsection{直觉主义} 461 | 462 | 在19世纪, 数学家逐渐开始将许多过去定义模糊的概念 463 | 严格化. 我们发现可以将实数定义为有理数的Cauchy列. 464 | Cantor的工作为无穷数列、无穷集合等等概念夯实了基础, 465 | 并且区分了仅仅是稠密的集合(如有理数)与真正的实数连续统. 466 | Frege将自然数也使用集合做了定义 ------ 自然数\(n\) 467 | 就是所有恰好有\(n\)个元素的集合构成的集合; 自然数集 468 | \(\mathbb N\) 就是所有有限集在双射下构成的等价类的集合. 469 | Kronecker与Poincar\'e等数学家在19世纪末期对此 470 | 提出了质疑. 他们认为这些使用无穷集合, 并且在许多情况下 471 | 都是非构造性质的概念是无法作为数学的根基的. 472 | 473 | 在世纪之交, Russell悖论的发现动摇了这套基础. 474 | (我们最终因为这个原因抛弃了Frege对自然数的定义, 475 | 但是Cauchy列, Cantor的连续统等等概念仍然保留了下来.) 476 | Hilbert为了应对这次危机, 提出了一套纲领. Hilbert 477 | 认为我们可以信任有限的算数与组合, 希望能给出 478 | 一套描述无限集合的公理系统, 并且用纯有限的方法证明这套 479 | 公理系统的自洽性. 这样就可以将无限的概念从数学危机 480 | 中拯救出来. Hilbert认为, 我们可以将关于无限的数学 481 | 化归为对命题机械地按照形式系统的规则操作的过程. 482 | 483 | 我们现在知道, 以G\"odel的不完备性定理为代表的对 484 | 形式系统更进一步的研究粉碎了Hilbert原本的愿望, 不过 485 | 在当时这还并未明晰. Brouwer 继承了 Kronecker 的思想, 486 | 对Hilbert纲领发起了抨击. 关于Brouwer与Hilbert的论争 487 | 的历史, 读者可以参阅~\cite{carl:1998:brouwer}. 488 | Brouwer认为, 数学是人类的精神活动. 489 | 数学思想先于语言而存在, 仅仅对命题进行机械操作 490 | 是不可能完全囊括数学的全部内涵的. 这些数学哲学观点 491 | 就是\textbf{直觉主义}. 遵循这些思想, Brouwer构建了 492 | 一套直觉主义数学基础. 493 | 494 | 直觉主义作为构造主义的一个分支, 拒绝排中律无限制的使用. 495 | Brouwer认为, 只有关于有限个事物的命题, 才能使用排中律 496 | ------ 因为对于有限个事物我们可以逐一检查命题是否成立. 497 | 我们不能随意地推广到无限的集合. 譬如考虑命题 \(p\): 498 | “对于所有偶数 \(n \ge 4\), \(n\) 可以表示为两个质数的和”. 499 | 并没有理由认为 \(p \vee \neg p\) 成立, 因为 500 | 不可能在有限的时间内穷尽所有的偶数. 我们将来可能会给出 501 | 一个无法被表示为两个质数之和的偶数; 也有可能得到一个算法, 502 | 保证任意给定一个偶数都能找出对应的两个质数. 但是在那一刻 503 | 到来之前, 我们不能从对有限集合的经验出发, 直接认为这两者 504 | 之一一定成立. 505 | 506 | 不过, 直觉主义数学并不严格要求一切数学对象都需要被完全 507 | 确定地构造出来. 508 | \begin{quotation} 509 | 允许两种创造数学对象的方法: 第一种是无穷序列, 每一个元素 510 | 都可以从已经得到的数学对象中自由选择[...]; 第二种是集合, 511 | 之前构造出的数学对象中, 满足某个性质的所有对象构成一个集合, 512 | 前提是如果一个对象满足该性质, 那么 513 | 与这个对象按照定义“相等”的其他对象也满足该性质.~\cite{brouwer:1981:intuitionism} 514 | \end{quotation} 515 | 在其他风格的构造主义中, 对于一个无限数列通常要求存在 516 | 一个算法能够给定 \(n\), 计算出这个数列的第 \(n\) 项. 517 | 但是 Brouwer 的直觉主义中允许所谓的\emph{自由选择序列}, 518 | 即不需要确定的算法, 可以自由选择. 利用这些自由选择序列, 519 | Brouwer构造出了直觉主义的实数集. 520 | 521 | 拒绝排中律使得实数集表现得更像延绵连续的整体. 在经典数学中, 522 | 实数集是“脆”的, 因为可以随时定义不连续的函数: 523 | \[f(x) = \begin{cases} 524 | 1 & (x > 0)\\ 525 | 0 & (x \le 0). 526 | \end{cases}\] 527 | 经典数学中必须在实数集的基础上定义拓扑, 才能将 528 | 连续性这样直观的概念恢复出来. 由于没有排中律, 直觉主义的 529 | 实数并不能证明 \((x < 0) \vee (x = 0) \vee (x > 0)\) 530 | 一定成立, 因此无法随意地分割实数. Brouwer 采用了更加 531 | 适合构造主义的\textbf{分离性}(apartness), 即定义一个 532 | 关系 \(x \mathrel{\#} y\) 为“存在 \(\epsilon > 0\) 533 | 使得 \(|x - y| > \epsilon\)”. 在经典数学中, 这与 534 | \(x \ne y\) 等价, 但是在构造主义数学中这给出了具体的 \(\epsilon\) 的 535 | 构造, 因此比 \(x \ne y\) 更强. 譬如可以证明任何 536 | 实数 \(x \mathrel{\#} 0\) 都有倒数, 但是将条件换为 537 | \(x \ne 0\) 就无法证明. 538 | 539 | 由直觉主义的数学哲学出发, Brouwer进一步提出了一些公理. 540 | 从这些公理出发, 直觉主义脱离了仅仅是移除排中律的中性数学 541 | 的范畴, 而是与经典逻辑中的结论相矛盾, 对实数连续统建立 542 | 起了迥然不同的理论体系. 例如 543 | 著名的一致连续性定理: 544 | \begin{theorem}[Brouwer] 545 | 给定度量空间 \(X,Y\), 其中 \(X\) 完备并且完全有界. 546 | 则任何映射 \(X\to Y\) 都是一致连续的. 547 | \end{theorem} 548 | \begin{corollary}\label{ch:brouwer:funny} 549 | 任何函数 \(f : [0,1] \to [0,1]\) 都是一致连续函数. 550 | \end{corollary} 551 | 但是需要注意的是, 此时 552 | 可以认为Brouwer的实数已经与经典数学中的实数不是同一个概念了, 553 | 因此不能简单的说直觉主义数学与经典数学是“互斥”或者“矛盾”的. 554 | 它们仅仅是在命题的形式上有表面的互斥关系, 而实际情况需要 555 | 对各自的数学哲学进行更细致的解读. 556 | 557 | 1930年, Brouwer 的学生 Arend Heyting 提出了一套形式逻辑系统, 558 | 试图刻画直觉主义中使用的逻辑. 这套形式系统大致就是一阶逻辑 559 | 去掉排中律. 因此, 许多文献中也用\textbf{直觉主义逻辑}一词 560 | 来指代去掉排中律的逻辑. 我们前文中已经提到, 这类 561 | 逻辑更准确的名字是中性逻辑. 562 | 563 | \subsubsection{俄罗斯构造主义} 564 | 565 | 在1940年代末, 俄罗斯数学家 Andrey A. Markov 566 | ({\tempfont Андре́й Андре́евич Ма́рков}, 与他的父亲同名; 他的父亲 567 | 是提出Markov链的人) 构建了构造主义逻辑的另一个 568 | 分支 ------ 俄罗斯构造主义, 也称作递归构造主义. 569 | 在这个流派中, 一切数学对象都使用适当的递归函数构造. 570 | 571 | 递归函数的概念在1933年由G\"odel与Jacques Herbrand在 572 | 研究形式系统的性质时提出, 是一类特殊的自然数上的 573 | 多元函数 \(\mathbb N^n \to \mathbb N\); 574 | 在1936年Church的(无类型) \(\lambda\)-演算中, 使用 \ref{beginning:lambda}~节 575 | 中提到的编码自然数的方式, 也可以考虑能够在 \(\lambda\)-演算 576 | 中写出来的自然数上的多元函数; 同年, Alan Turing 试图 577 | 刻画“存在有效的方法计算”的概念时, 提出了 Turing 机. 令人惊讶的是, 578 | 这三者给出的是等价的定义. 我们现在将这些定义统称 579 | 为\textbf{可计算函数}或者\textbf{一般递归函数}. 580 | 如输入自然数 \(n\), 输出第 \(n\) 个质数的函数, 581 | 就是一个可计算函数.\footnote{不可计算的函数反而在一般数学 582 | 中比较少见, 其中一个例子是将所有的命题用自然数做(合理的)编号, 583 | 对于编号 \(n\) 的命题, 如果它在ZFC公理系统下可以证明, 584 | 那么定义函数 \(f(n) = 1\); 否则定义 \(f(n) = 0\). 585 | 这种命题的编号称作 \textbf{G\"odel 编码}.} 586 | 587 | 一般递归函数对某些输入可能会无限地计算下去, 如定义 588 | \[f(n) = \begin{cases} 589 | f\left(\left\lceil \frac n2 \right\rceil\right) & (n \ge 1)\\ 590 | 0 & (n = 0). 591 | \end{cases}\] 592 | 那么计算 \(f(1)\) 时就会无限递归下去. 此时我们认为 593 | \(f(1)\) 是未定义的. 如果某个函数对一些输入是未定义的, 594 | 我们则称其为\textbf{部分函数}. 除法就是我们最熟悉的部分函数, 595 | 它对除以零的情况没有定义. 对所有输入都有定义的函数 596 | 称为\textbf{全函数}. 在讨论可计算函数时, 除非额外强调, 597 | “函数”一词通常指代部分函数. 598 | 599 | 递归函数就是那些能通过明确的方法计算的函数, 符合构造主义的 600 | 大致方向. 需要注意的是, 算法都是有限长的, 因此 601 | 能够写出的算法只有可数个, 所以 \(\mathbb N \to \mathbb N\) 602 | 的可计算函数也只有可数个. 603 | 在俄罗斯构造主义中定义的实数, 对应着经典数学中的\textbf{可计算实数}. 604 | 尽管可计算实数只有可数个, 但是我们遇到的绝大部分实数都是 605 | 可计算的, 如 \(\pi, e, \tan\sqrt{114514}\), 等等. 606 | 这使得构造主义中很多看似离奇的命题有了合理的解释: 将实数 607 | 改为为可计算实数, 函数改为为可计算函数, 以此类推, 这样得到的 608 | 命题在经典数学中也合理了起来. 609 | 610 | \subsubsection{Bishop构造主义}\label{ch:bishop} 611 | 612 | 然而, 上面提到的构造主义流派在一段时间内都没有产出 613 | 其他数学家看来有重大意义的成果. 同时, 有很多类似 614 | 推论~\ref{ch:brouwer:funny} 的, 看起来完全是 615 | 稀奇古怪或者自相矛盾的结论. 616 | 在当时看来, Hilbert 所评价的 “将数学家的排中律夺走, 617 | 就好比禁止拳击手使用拳头” 确实显得有些道理. 618 | 在1967年, Errett Bishop 出版了一本构造主义分析学的书. 619 | \begin{quotation} 620 | Bishop的工作的意义在于证明了原本Hilbert与Brouwer都同意 621 | 的一个重要观点是错误的. 两人都认为, 如果真的要发展构造主义数学, 622 | 那么就必须 “放弃” 许多现代数学中关键的部分(例如测度论或者复分析). 623 | Bishop展示了这完全是错误的. [...] 只不过我们需要选择 624 | 使用一种优雅的方式进行研究, 而不是用Hilbert所谓 625 | 的“拳击手的拳头”.~\cite{beeson:1985:constructive} 626 | \end{quotation} 627 | 628 | Bishop认为, 要构造一个集合, 只需要说明如何构造它的元素, 629 | 并且说明构造出的两个元素如何判断相等. 这种定义集合的方式 630 | 现在被称为 \textbf{Bishop 集合}. 在现代 631 | 类型论\footnote{Bishop并没有使用类型论, 这是后人的工作.}的语境下, 632 | 这就是一个类型上配备了一个等价关系, 称作\textbf{广集} (setoid). 633 | 我们可以紧接着将“广集函数”定义为尊重这个等价关系的函数. 634 | 换句话说, 给定广集 \((A, \sim_A),(B, \sim_B)\), 635 | 要构造广集 \(A \Rightarrow B\)的元素, 只需要给出一个 636 | 对应法则 \(f : A \to B\), 使得 \(x \sim_A y\) 时 637 | \(f(x) \sim_B f(y)\). 给定两个这样的元素 \(f,g\), 638 | 我们要说明如何判断它们相等, 也即定义等价关系 639 | \(f \sim_{A\Rightarrow B} g\). 为此, 我们规定 640 | \[(f \sim_{A\Rightarrow B} g) \iff \forall x, f(x) \sim_B g(x).\] 641 | 读者可以验证这确实是等价关系. 642 | 643 | Bishop用行动展示了数学的许多重要的部分都能在构造主义中发展, 644 | 并且只需要对经典数学的理论做较小的修改. 正如前面的引文所说, 645 | 我们只需要选取一种优雅的姿态, 就能在构造主义中轻松地完成 646 | 经典数学中可以做到的事情. 行胜于言, Bishop极大地推动了 647 | 构造主义数学的发展. 648 | 649 | \subsubsection{Martin-L\"of构造主义} 650 | 1970年代, Martin-L\"of提出了一种构造主义的类型论, 651 | 我们现在称作\textbf{构造主义类型论}或者\textbf{Martin-L\"of 类型论} 652 | (Martin-L\"of type theory, 缩写为MLTT). 653 | 我们会留出一章专门讲述, 这里按下不表. 从 Martin-L\"of 的 654 | 理论开始, 构造主义与类型论变得密不可分. 不过需要提醒读者, 655 | 类型论在Russell起初提出时, 完全是经典逻辑的. 所以说 656 | 尽管类型论与构造主义有很强的关联, 但是并没有包含关系. 657 | 658 | \subsubsection{构造主义的几何意义} 659 | \begin{figure}[ht] 660 | \centering 661 | \includegraphics[width=0.5\textwidth]{images/external-internal-small.png} 662 | \end{figure} 663 | 在当代的几何研究中, 构造主义又被赋予了新的内涵. 664 | 一些复杂的几何对象与简单的代数结构在操作上 665 | 有相似之处, 例如有限型的模层(sheaf of modules of finite type)是 666 | 非常复杂的对象, 而它对应的就是有限生成模. 667 | 668 | 我们可以使用这种相似的对应关系大大简化一些证明. 669 | 但是仔细考察这个对应关系, 会发现排中律没有对应. 670 | 几何学家可以选择在经典逻辑中写下繁琐且难以阅读的证明, 671 | 或者选择在一种构造主义的语言中写出简洁的证明. 这种 672 | 语言是\textbf{内语言}, 我们会在 \ref{category:inner}~节 673 | 介绍. 注意这并不是说放弃了排中律. 即使我们认为排中律成立, 674 | 这也仅仅是在外部成立, 而在外部进行证明时, 我们就要处理 675 | 譬如“有限型的模层”等概念. 在内语言中, 我们只需要处理 676 | 有限生成模, 而代价是不能使用排中律. 在内语言中写下的证明, 677 | 都可以翻译成外部语言中对复杂几何对象的操作. 有代数几何 678 | 基础的读者可以参阅~\cite{blechschmidt:2021:internal}. 679 | \footnote{插图取自\href{https://github.com/iblech/internal-methods}{此处}, 680 | 这里也含有\cite{blechschmidt:2021:internal}的一份 681 | 副本, 以及许多相关的讲座幻灯片.} 682 | 683 | \subsection{经典逻辑的Curry--Howard对应}\label{ch:classical} 684 | 685 | 除了研究不含排中律的逻辑之外, 另一个方向自然的问题就是 686 | 经典逻辑是否有 Curry--Howard 对应. 答案是肯定的. 687 | 首先, 我们可以直接将排中律强行加入作为公理, 也就是直接 688 | 加入一个没有定义的常量 \(\cons{lem}\). 但是这样的缺陷是 689 | 只有排中律一条规则是公理, 其余的逻辑规则都是自然从类型论 690 | 中导出的. 同时其余的逻辑规则都有对应类型论中的判值相等. 691 | 而由于 \(\cons{lem}\) 未定义, 它没有对应的判值相等规则. 692 | 这使得类型论的性质受到一定的破坏. 693 | 694 | 那么有没有将排中律自然地加入到类型论中的方法呢? 695 | 将排中律(或者其等价形式)直接对应到类型, 我们得到的就是 696 | 计算机科学中\textbf{计算续体}的概念. 697 | 698 | 在计算机语言中, 699 | 有时候需要将控制权的流向倒转, 方便组织程序. 700 | 计算续体用数学语言描述, 就是有一个“洞”的表达式, 701 | 如 \(2 \times (3 + \sin \square)\). 702 | 它表达了\emph{后继计算}的概念. 即将 \(\square\) 算出来 703 | 之后, 后继的计算是取正弦, 加\(3\) 并乘以 \(2\). 704 | 在一些计算机语言中, 提供了一个用于获取计算续体的功能, 705 | 称作 \(\cons{call/cc}\). 考虑表达式 706 | \[2 \times [3 + \sin(\cons{call/cc}(f))],\] 707 | 其中 \(f\) 是某个函数. 708 | 此时计算机会将\(\cons{call/cc}\)的计算续体, 也就是 709 | \(u = 2 \times (3 + \sin \square)\) 提取出来. 710 | 紧接着, 计算机会求值 \(f(u)\). 711 | 如果 \(f\) 的程序中使用了 \(u\), 即给 712 | \(u\) 这个计算续体提供了一个数值 \(x\), 713 | 那么程序就会开始计算 \(u[x]\), 也就是 714 | \(2 \times (3 + \sin x)\). 我们设整个程序最终的 715 | 类型是 \(\beta\), 计算续体的洞的类型是 \(\alpha\), 716 | 那么计算续体本身的类型就应该是 \(\alpha \to \beta\), 717 | 因为给它提供一个 \(x : \alpha\), 它就会继续计算得出 718 | 一个 \(\beta\) 类型的值. \(f\) 需要接收一个计算续体, 719 | 计算出 \(\alpha\) 类型的值, 因此 720 | \(f : (\alpha \to \beta) \to\alpha\). 最后, 721 | \(\cons{call/cc}\) 接收 \(f\), 输出一个 \(\alpha\) 722 | 类型的值, 所以 723 | \[\cons{call/cc} : ((\alpha \to \beta)\to\alpha)\to\alpha.\] 724 | 细心的读者可以发现, 这就是前文讲述的Peirce定律! 由于 725 | Peirce定律与排中律等价, 我们就可以得到排中律的 726 | Curry--Howard 对应. 727 | 728 | 还有另一个直接得到排中律的对应方法. 我们需要 729 | \(\cons{lem} : \alpha + (\alpha \to \mathbf 0)\), 730 | 回忆 \(\mathbf 0\) 是空类型, 对应假命题. 731 | 对此, 程序直接给出第二种可能, 即 \(\alpha \to \mathbf 0\). 732 | 如果接下来我们始终没有利用这个函数, 则 733 | 这个函数是什么都不影响结果. 假如在某个时刻我们利用了 734 | 这个函数, 那么这必然是因为我们提供了一个元素 \(x : \alpha\) 735 | 作为参数. 此时, 程序跳转到一开始, 并且“反悔”, 736 | 给出第一种可能. 因为此时程序已经得到了一个元素 \(x : \alpha\), 737 | 因此它只需要直接给出这个元素即可. 738 | 739 | 注意到, 尽管这确实给出了一种类型论的解释, 但是它引入了“反悔”的可能, 740 | 或者说引入了\emph{不确定性}. 因此这就破坏了一些好的性质. 741 | 我们还有一些其他的引入经典逻辑的方式, 如 \(\lambda\mu\)-演算, 742 | 极化逻辑等等. 它们都是对好性质的权衡: 每一种都会保留 743 | 一些类型论的好性质, 而破坏另一些性质. 744 | 这显然是不可避免的. 停机问题无法判定, 因此无论如何修改类型论, 745 | 都不可能得出一个能解决停机问题的程序. 746 | 所以要么该类型论中无法证明一个程序要么停机要么不停机, 即 747 | 限制排中律可使用的范围, 要么该类型论中对此命题的证明无法计算出结果, 748 | 即弱化了构造主义数学的可计算性质. 749 | -------------------------------------------------------------------------------- /chapters/hott.tex: -------------------------------------------------------------------------------- 1 | \chapter{同伦类型论} 2 | \section{K原理的独立性}\label{hott:independent} 3 | 我们之前已经看到相等类型的归纳子, 也就是 J 原理. 它直觉上大致说的是 4 | “每个 \(a = b\) 类型都只有 \(\cons{refl}\) 一个 5 | 构造器”. 但是想要表达这个直觉, 还有一个看起来很自然的写法: 6 | \[\prod_{a,b : A} \prod_{p,q : a = b} p = q,\] 7 | 或者写成 8 | \[\prod_{a : A} \prod_{p : a = a} p = \cons{refl},\] 9 | 注意这里不能写 \(p : a = b\), 因为这样它与 10 | \(\cons{refl}\) 的类型不同, 就不能表达相等了. 11 | 当然, 也可以用上面的 \(\Sigma\)-类型补救一下, 写成 12 | \[\prod_{a,b : A} \prod_{p: a = b} (a,b,p) =_{\sum_{a,b : A}a = b} (a,a,\cons{refl}).\] 13 | 上面的三个命题都是等价的. 我们将它们统称为 14 | \textbf{K 原理}\footnote{这个名字是因为 15 | 其提出者Thomas Streicher顺承J原理的名字, 使用了下一个字母K.~\cite{streicher:1993:K}}. 16 | 令人惊讶的是, 很长一段时间中并没有人能从 J 原理推 17 | 出 K 原理. 在第\ref{martinlof}章介绍的集合模型中, 18 | K 原理显然是成立的, 因此加入 K 公理后类型论仍然无矛盾. 19 | 进而无法证伪 K 原理. 那么反过来, 是否能证明 K 呢? 20 | 21 | 在 Martin-L\"of 类型论提出之后, K原理是否能 22 | 从 J 原理中推出, 是一个重大的未解问题. 23 | 这个问题直到1998年才被 Hofmann 等人解决~\cite{hofmann:1998:groupoid}. 24 | 而这一解决方案, 对认识类型论的内禀结构提供了重要的 25 | 方向 ------ 类型可以是群胚! 26 | 27 | \begin{definition}\label{hott:groupoid:definition} 28 | \textbf{群胚}包含以下结构: 29 | 给定一些元素 \(C\), 对于每对元素 \(x,y\in C\) 30 | 都取一个集合 \(\hom(x,y)\), 并且有乘法运算 31 | \(a * b\) 为二元函数 \(\hom(y,z) \times \hom(x,y) \to \hom(x,z)\). 32 | 每个元素 \(x \in C\) 都有对应的单位元 33 | \(\cons{id}_x \in \hom(x,x)\), 乘法运算满足单位律与结合律. 34 | 每个元素 \(a \in \hom(x,y)\) 都有逆元 35 | \(a^{-1} \in \hom(y,x)\). 36 | \end{definition} 37 | 读者可以很快验证, 每个群都是使得 \(C = \{\star\}\) 38 | 为一元集的群胚. 而另一个极端的例子, 对于任何集合 \(C\), 39 | 直接令 \(\hom(x,x) = \{\cons{id}_x\}\) 为一元集, 其它 \(\hom(x,y)\) 40 | 均为空集. 这则被称为\textbf{离散群胚}. 41 | 42 | 还有一族更加有启发性的例子: 43 | \begin{example} 44 | 任给一个拓扑空间 \(X\), 令其点集为 45 | \(C\), \(\hom(x,y)\) 为从点 \(x\) 到点 46 | \(y\) 的道路的集合, 商去同伦关系, 47 | 乘法运算为道路拼接操作, 那么它构成一个群胚. 48 | \end{example} 49 | 容易看出这是基本群的推广. 因此我们可以将群胚看成是“允许取 50 | 多个基点的群”. 另一个角度, 也可以把群胚看作是所有态射均可逆 51 | 的范畴, 不过需要注意的是, 许多书中 52 | 群胚的乘法运算记号的左右顺序一般 53 | 与范畴中相反, 因为范畴中常常把态射理解为类似函数的东西, 因此 54 | 函数复合 \((f \circ g)(x) = f(g(x))\) 是先作用者在右侧. 55 | 但是在群胚中往往将态射看作道路, 因此两条道路 56 | \(x \xrightarrow p y \xrightarrow q z\) 57 | 拼接自然是从左到右写为 \(p * q\). 当然这仅仅是记号区别. 58 | 59 | 我们回过头来看类型论, 用 J 原理可以很容易证明, 60 | 每个类型上都自带一个群胚结构. 61 | 我们有 \(\cons{refl} : x = x\) 为单位元, 对称性 62 | \[\prod_{x, y : A} x = y \to y = x\] 63 | 与传递性 64 | \[\prod_{x,y,z : A} x = y \to y = z \to x = z\] 65 | 之前也已经提到过. 66 | 67 | 因为这些全都只需要 J 原理, 因此我们可以试着构造类型论 68 | 的一个模型, 使得每个类型被解释为一个群胚. 这之中乘积 69 | 类型被解释为群胚的乘积, 等等. 最重要的是, 相等类型 70 | \(x = y\) 被解释为集合 \(\hom(x,y)\) 上的\emph{离散}群胚. 71 | 因为当前的模型中 \(\hom(x,y)\) 只是一个集合, 没有 72 | 其他结构. 最终可以验证, 这个模型满足J原理. 具体的理论 73 | 在 \ref{hott:semantics}~节会介绍. 74 | 75 | 构造了这个模型之后, K 原理在这个模型中的解释是什么呢? 76 | 我们可以发现它对应 “所有群胚都是离散群胚” 这个命题. 77 | 显然是不成立的. 从而我们构造了 K 原理的反模型. 上面的 78 | 讨论即证明了如下命题: 79 | \begin{theorem} 80 | 在只有 J 原理的 Martin-L\"of 类型论中, 无法证明或者 81 | 证伪 K 原理. 82 | \end{theorem} 83 | 84 | % (...) pattern matching (with/without K) 85 | \section{同伦类型论} 86 | 在上面的模型中, 每个类型都是群胚. 而由于群胚的 \(\hom\) 集合 87 | 只有集合结构, 取相等类型之后我们就得到了一个集合, 也就是 88 | 离散群胚. 但是仅仅从语法上来看, 相等类型作为群胚也有可能 89 | 是非平凡的. 换句话说, 尽管我们确定了 K 原理 (解释为“所有类型 90 | 都是离散群胚”)是不可证明的, 我们却马上有了高一层的问题, 也 91 | 就是“所有类型上的相等类型都是离散群胚”. 写成语法, 我们可以 92 | 对比一下. K原理是 93 | \[\prod_{a,b : A} \prod_{p,q:a=b} p = q.\] 94 | 而这里说的高一层的K原理就是 95 | \[\prod_{a,b : A} \prod_{p,q:a=b} \prod_{\alpha,\beta:p=q} \alpha = \beta.\] 96 | 很明显这可以一直继续下去. 我们不妨做个编号, K\(_{-1}\) 原理 97 | 就是 98 | \[\prod_{a,b : A} a = b,\] 99 | K\(_0\) 原理就是 K 原理, 而 K\(_1\) 原理就是上面说的 100 | 高一层的K原理. 以此类推有 K\(_n\) 原理. 101 | 102 | 我们已经知道用群胚模型可以得到 K\(_0\) 原理不可证明. 103 | 那么以此类推, 是否构造一个 \(\hom\) 不是集合而是群胚 104 | 的 “2-群胚”,就能得到 K\(_1\) 原理不可证明了呢? 答案是 105 | 肯定的. 这引出了 \(n\)-群胚乃至 \(\infty\)-群胚的概念. 106 | 具体的定义虽然简单但是细节繁杂, 这里不再给出. 但是相信 107 | 读者已经有了大致的图像. \(\infty\)-群胚是同伦论研究中 108 | 用到的概念. 事实上, 拓扑空间的道路就可以看 109 | 作\(\infty\)-群胚: 我们取所有的道路, \emph{不商去同伦}. 110 | 那么所有道路(也就是1-道路)并不是严格构成群胚, 因为结合律 111 | 等等式只在道路的同伦意义下成立. 换句话说结合律是道路的道路, 112 | 也就是2-道路. 而进一步, 2-道路之间也有等式. 考虑五条道路 113 | 之间的2-道路: 114 | \[\begin{tikzcd} 115 | & {(p * q) * (r * s)} \\ 116 | {((p * q) * r) * s} && {p * (q * (r * s))} \\ 117 | {(p * (q * r)) * s} && {p * ((q * r) * s)} 118 | \arrow[no head, from=2-1, to=1-2] 119 | \arrow[no head, from=2-1, to=3-1] 120 | \arrow[no head, from=3-1, to=3-3] 121 | \arrow[no head, from=3-3, to=2-3] 122 | \arrow[no head, from=2-3, to=1-2] 123 | \end{tikzcd}\] 124 | 在拓扑空间中可以证明这五条2-道路复合形成的2-道路到平凡 125 | 的2-道路一定有一条3-道路, 这些3-道路之间又会有更高的道路 126 | (本书的封面图就是一些3-道路之间的4-道路示意图), 127 | 以此类推到任意高的 \(n\)-道路. 128 | 对于每个 \(n\), \(n\)-道路商去 \((n+1)\)-道路的同伦, 129 | 就得到了 \(\pi_n\) 同伦群. 因此提到 \(\infty\)-群胚时, 130 | 读者可以大致理解为拓扑空间. 为了强调 \(\infty\)-群胚 131 | 的几何属性 (同时也因为它名字有些长), 提出了一个新的术语, 132 | 称为\textbf{生象}(anima). 133 | 134 | 由此, 我们对类型的崭新理解就是 135 | \slogan{类型是空间.} 136 | 在\cite{ufp:2013:hottbook}中对此有详细的论述. 137 | \emph{类型不是命题}! 我们之前的口号“类型是命题”并不是 138 | 最好的描述, 事实上只有一部分类型应该作为命题理解. 139 | 具体来说, 恰好是那些满足 K\(_{-1}\) 原理的类型. 140 | 这条原理实际上非常符合我们的观念. 141 | 譬如考虑偶数集 \(\{x \in \mathbb Z \mid x \equiv 0 \pmod 2\}\). 142 | 我们不会认为\(x\)是偶数的两种不同思路的证明会给出两个 143 | 不同的偶数. 这两个证明作为数学对象比较的时候永远是 144 | 相等的. 换句话说, 同一个命题的任何两个证明 (如果存在的话) 145 | 一定是相等的. 因此我们可以做一个定义: 146 | \begin{definition} 147 | 称一个类型\(A\)为\textbf{命题}, 当且仅当可以证明 148 | \[\prod_{x,y:A} x = y.\] 149 | \end{definition} 150 | 由此, 我们之前定义的排中律 151 | \(\prod_{A : \cons{Type}} A + \neg A\) 152 | 就不再适合了. 取而代之的是 153 | \[\prod_{A : \cons{Type}} \cons{isProp}(A) \to 154 | (A + \neg A),\] 其中 \(\cons{isProp}(A)\) 155 | 是 “\(A\) 为命题” 的缩写. 为了强调其不同, 这可以 156 | 称作\textbf{命题排中律}, 原先的版本则是\textbf{类型排中律}. 157 | 158 | 如果满足 K\(_0\) 原理, 这个类型应该称作什么呢? 159 | 由上面群胚模型的启发, 这些应该称为\textbf{集合}: 每个 160 | 集合都可以看作一个离散群胚 (或者离散拓扑空间). 我们可以 161 | 证明自然数类型是一个集合, 162 | K\(_0\) 原理说的就是“所有类型都是集合”. 进一步, 满足 163 | K\(_1\) 原理的被称为群胚; 满足 K\(_n\) 的则被称为 \(n\)-群胚. 164 | 165 | \subsection{泛等公理} 166 | 认识到这些性质之后, 自然有了一些将类型论用于研究同伦论的 167 | 努力. Voevodsky 在 2006 年已经提出了与泛等公理相关 168 | 的性质, 但是直到 2009 年才意识到这可以直接作为公理加入 169 | Martin-L\"of 类型论中. 170 | 171 | 这条公理来源于 \(\infty\)-群胚模型的启发, 但是我们这里只 172 | 讲述它的形式以及推论. 173 | 174 | 首先, 我们有某个函数 \(f\) 是\textbf{等价}的定义. 读者 175 | 可以参考\cite{escardo:2018:univalence}中的定义细节. 176 | 对于每个 \(f\), \(\cons{isEquiv}(f)\) 都是命题. 将 177 | 类型视作空间时, 这个定义就代表\emph{同伦等价}. 在集合上, 178 | 同伦等价就是双射. 显然我们应当有 \(\cons{isEquiv}(\cons{id})\). 179 | 我们定义 \(X\simeq Y\) 为 \(\sum_{f : X \to Y}\cons{isEquiv}(f)\), 180 | 即两个类型之间所有的等价构成的类型. 181 | 182 | 显然有 \((X = Y) \to (X \simeq Y)\). 183 | \textbf{泛等公理}说的是, 这个函数本身是一个等价. 184 | 一个立即的推论就是 185 | \[(X = Y) \simeq (X \simeq Y).\] 186 | 直观上来看, 它说的是“等价的类型都相等”. 事实上它有非常多 187 | 深刻的推论. 188 | \begin{corollary}[命题外延] 189 | 等价的命题都相等: 如果有两个命题满足 190 | \(p \iff q\), 那么 \(p = q\). 191 | \end{corollary} 192 | \begin{corollary}[函数外延] 193 | 如果两个函数逐点相等, 那么两个函数相等: 194 | \[\left[\prod_{x:A} f(x) = g(x)\right] \to f = g.\] 195 | \end{corollary} 196 | 这解决了我们在Martin-L\"of类型论中留下的问题. 但是我们 197 | 还有更加奇妙的结论: 198 | \begin{corollary} 199 | 如果两个群同构, 那么它们相等.\footnote{更准确的说, 两个群 \(G, H\) 之间的不同同构 200 | 与类型 \(G = H\) 中的元素一一对应.} 201 | \end{corollary} 202 | 注意我们的泛等公理中完全没有提到群同构, 这是自然导出的定理! 203 | 这也非常符合我们的数学实践: 长方形的对称群、 模8奇数的乘法群, 204 | 与 \(\mathbb Z/2\mathbb Z \oplus 205 | \mathbb Z/2\mathbb Z\) 是完全等同, 随时可以 206 | 互相替换的. 这也使得有了泛等公理之后, 在类型论里的形式化 207 | 数学比起集合论等等更加接近我们实际使用的非形式化数学语言. 208 | 这也与\textbf{数学结构主义}相合. 大致来说, 数学结构主义 209 | 关心数学对象在其结构中的位置, 而不关心对象内在的属性. 例如 210 | Klein 群并不是四个矩阵, 四个对称变换或者其他什么东西组成的, 211 | 而是四个抽象的元素. 除了这些元素上的群结构之外, 它们没有 212 | 别的属性.~\cite{awodey:2013:structuralism} 泛等公理 213 | 可以看成“一切操作都必须尊重同构”. 214 | \begin{corollary} 215 | 类型排中律不成立. 216 | \end{corollary} 217 | 这是因为类型排中律 \(\prod_{A:\cons{Type}} A + \neg A\) 218 | 从每个非空类型中选出了一个元素. 这个选择不可能尊重同构 219 | 关系, 譬如有两个元素的类型 \(\boldsymbol 2\) 有一个 220 | 自同构, 交换这两个元素. 那么类型排中律的选择函数 221 | 在这个同构意义下显然不可能不变, 从而与泛等公理相矛盾. 222 | 223 | 不过这个性质常常带来一些误解, 即认为泛等数学基础无法与 224 | 排中律相容. 注意\emph{命题排中律与泛等公理仍然是相容的}, 225 | 并且由于我们已经加入了泛等公理, 因此将排中律再作为公理加入 226 | 类型论也不会破坏更多性质. 同样的, 选择公理也与泛等公理相容, 227 | 可以加入同伦类型论中. 228 | 不过需要承认, 当前的同伦类型论研究的绝大部分没有假设排中律, 这是应当改变的. 229 | 230 | 泛等数学基础的出现, 为那些非泛等的类型论的发展也提供了重要的指导. 231 | (...举两个例子?) 232 | 233 | \subsection{高阶归纳类型} 234 | 我们之前已经见过了许多归纳类型, 如自然数, 二叉树等等. 235 | 而在认识到类型的\(\infty\)-群胚解释后, 自然就可以对 236 | 归纳类型做出推广. 2011年 Oberwolfach 数学研究所的 237 | 一次研讨会上, Voevodsky 等人提出了许多重要的研究问题. 238 | 高阶归纳类型的想法就是在这里首次出现的. 239 | 240 | \begin{definition} 241 | \textbf{圆}类型有两个构造器, \(\cons{base} : \mathbb S^1\) 242 | 与 \(\cons{loop} : \cons{base} = \cons{base}\). 243 | \end{definition} 244 | 这个类型中, \(\cons{loop}\) 就是道路的自由生成元. 245 | 这与CW复形的圆定义非常相似: 有一个点 \(\cons{base}\), 246 | 将一条线段 \(\cons{loop}\) 的两个端点都粘在这个点上. 247 | 利用泛等公理, 我们可以证明各种类似于同伦论中圆的性质, 248 | 如它的基本群是 \(\mathbb Z\), 等等. 249 | Guillaume Brunerie~\cite{brunerie:2016:number}在类型论 250 | 中证明了 \(\pi_4(\mathbb S^3) = \mathbb Z / 2\mathbb Z\). 251 | 由此看来, 高阶归纳类型真正使得类型论 252 | 变成了可以研究同伦论的工具. 253 | 除了同伦之外, \textbf{商类型}也可以作为高阶归纳 254 | 类型的特殊情况存在. 因此我们完全解决了Martin-L\"of类型论 255 | 的诸多不便之处. 256 | 257 | 我们将这些方向的类型论的各种变体统称为\textbf{同伦类型论}. 258 | 这个词没有严格定义, 但是一般会包含泛等公理与一定量的 259 | 高阶归纳类型. 260 | 261 | \subsection{泛等数学基础} 262 | 在 Oberwolfach 会议之后, 参会者搭建了% 263 | \href{http://homotopytypetheory.org/}{同伦类型论的网站与博客}, 264 | 由此进行同伦类型论的推广. 265 | 同伦类型论理论上已经可以作为数学基础使用. 正如上面所说, 它与 266 | 通常的数学语言更加接近. 此时已经有初步的形式化努力. 267 | 268 | 2012--2013年是泛等数学基础最重要的一年. 由Princeton高等研究院发起了 269 | “泛等数学基础特别年”, 邀请了拓扑学、计算机科学、范畴论、逻辑学 270 | 等等领域的数学家参加. 其中由 Peter Aczel 提议, 尝试使用 271 | 同伦类型论书写\emph{非形式化}的数学. 这次尝试很快获得了 272 | 初步成功, 最终写出了《同伦类型论:泛等数学基础》~\cite{ufp:2013:hottbook}这本书. 273 | 它从零出发, 整理了泛等数学基础中的结论, 从同伦类型论 274 | 的角度重新叙述了集合论与范畴论, 并且给出了 275 | 实数的定义与主要性质的证明. 一方面, 写出实数理论证明 276 | 了泛等数学基础在实操上可以有效地书写一般数学; 另一方面, 277 | 这开创了\textbf{综合同伦论}(synthetic homotopy theory) 278 | 这门学科. 正如Euclid的《几何原本》中并没有将平面定义为 279 | \(\mathbb R^2\), 而是直接从公理出发推导结论, 280 | 综合同伦论直接由类型论的基本规则刻画同伦关系, 281 | 而无需依赖拓扑空间的区间 \([0,1]\) 乃至CW复形等等. 282 | 书中复现了许多传统同伦论中的结论. 283 | 284 | 阅读这本书不需要类型论基础, 并且内容是开源的. 读者可以自行 285 | 下载阅读. 286 | 287 | \section{同伦类型论的语义} 288 | \label{hott:semantics} 289 | 290 | 我们承接 \ref{hott:independent}~节, 详细 291 | 描述 \cite{hofmann:1998:groupoid} 中的群胚语义. 292 | 我们要以群胚 (定义~\ref{hott:groupoid:definition}) 293 | 解释类型论中的语境, 294 | 那么依照之前的讨论, 需要定义 “依值群胚” 的概念解释语境中的类型. 295 | 这就是将集合族的定义推广到“群胚族”. 296 | \begin{definition} 297 | 给定群胚 \(\Gamma\), \textbf{依值群胚} \(A\) 包含以下资料: 298 | \begin{itemize} 299 | \item 对于 \(\Gamma\) 中的每个元素 \(x\), 都有集合 \(A_x\). 300 | \item 对于 \(\Gamma\) 中的道路 \(p : \hom(x, y)\) 与 301 | \(\alpha \in A_x\), \(\beta \in A_y\), 都有集合 302 | \(\hom_p (\alpha, \beta)\), 表示 \(A\) 中的依值道路. 303 | \item 有单位元 \(\mathrm{id} \in \hom_{\mathrm{id}} (\alpha, \alpha)\) 304 | 与道路拼接 \(\hom_p (\beta, \gamma) \times \hom_q (\alpha, \beta) \to \hom_{p * q} (\alpha, \gamma)\), 305 | 满足单位律与结合律. 306 | \end{itemize} 307 | \end{definition} 308 | 假如 \(\Gamma = 1\) 是平凡群胚, 则依值群胚的概念就退化为普通的群胚. 309 | 如果有群胚的同态 \(\sigma : \Delta \to \Gamma\), 310 | 那么给定 \(\Gamma\) 上的依值群胚 \(A\), 就能得到 \(\Delta\) 上的依值群胚 \(B\). 311 | 对 \(\Delta\) 里的元素 \(x\), 定义 \(B_x = A_{\sigma(x)}\), 等等. 312 | 这对应于类型论中的代换操作, 因此我们将它记作 \(A[\sigma]\) 313 | 强调这一联系. 314 | 315 | \begin{comment} 316 | 回忆 \ref{category:naturalmodel}~节中对自然模型的定义, 317 | 即一个范畴 \(\mathcal C\) 与两个预层之间的可表态射 318 | \(\pi : \mathrm{Tm} \to \mathrm{Tp}\). 319 | 对于群胚语义来说, 我们自然希望 320 | \(\mathcal C = \mathsf{Grpd}\) 是群胚与群胚同态构成的范畴.% 321 | \footnote{这里需要防止出现 Russell 悖论, 322 | 因此我们取一个较大的基数 \(\kappa\), 323 | 然后令 \(\mathsf{Grpd}\) 为大小不超过 \(\kappa\) 的群胚构成的范畴.} 324 | 325 | 在群胚语义中, 类型的集合 326 | \(\mathrm{Tp}(\Gamma)\) 的元素应该是 \(\Gamma\) 之上的 327 | 群胚族. 换句话说, 对 \(\Gamma\) 的每个对象 \(x\) 都 328 | 配备一个群胚 \(G_x\), 并且对于 \(\Gamma\) 中两个对象 329 | \(x,y\) 之间的每条道路 \(p\) 配备一个同构 \(G_p : G_x \cong G_y\), 330 | 保持道路的复合等. 用更紧凑的语言说, 这些数据就是一个函子 331 | \(G_\bullet : \Gamma \to \mathsf{Grpd}\), 其中把 \(\Gamma\) 332 | 看作一个范畴. 333 | 334 | \begin{center} 335 | \begin{tikzpicture}[xscale=1.2] 336 | \filldraw[thick, fill=blue, fill opacity=0.2] (0,0) ellipse (1.5 and 0.7); 337 | \node (x) at (-0.9, -0.1) {\(x\)}; 338 | \node (y) at (0, 0.3) {\(y\)}; 339 | \node (z) at (0.8, -0.2) {\(z\)}; 340 | \node at (1.8, 0) {\(\Gamma\)}; 341 | 342 | \draw (x) edge node[below, font=\scriptsize] {\(p\)} (y); 343 | \draw (y) edge node[below, font=\scriptsize] {\(q\)} (z); 344 | 345 | \node[circle, draw=black, fill=yellow] (X) at (-1.8,1.7) {\(G_x\)}; 346 | \node[circle, draw=black, fill=yellow] (Y) at (0,2.2) {\(G_y\)}; 347 | \node[circle, draw=black, fill=yellow] (Z) at (1.7,1.8) {\(G_z\)}; 348 | 349 | \draw (X) edge node[sloped, above] {\(\cong\)} (Y); 350 | \draw (Y) edge node[sloped, above] {\(\cong\)} (Z); 351 | 352 | \draw[->, gray] (X) -- (x); 353 | \draw[->, gray] (Y) -- (y); 354 | \draw[->, gray] (Z) -- (z); 355 | \end{tikzpicture} 356 | \end{center} 357 | 358 | 我们可以把 \(\Gamma\) 上的群胚族 \(G_\bullet\) 融为一个 359 | 大群胚, 这与 \(\Sigma\)-类型类似, 在范畴论中称为% 360 | \textbf{Grothendieck构造}, 记作 \({\int} G_\bullet\). 361 | 具体来说, 它的对象是每个 \(G_x\) 的对象的不交并. 362 | 而对于两个元素 \(u \in G_x, v \in G_y\), 它们之间的 363 | 道路集合 \(\hom_{{\int} G_\bullet}(u,v)\) 是 364 | \[\{(p, \wp) \mid p \in \hom_G(x,y), \wp \in \hom_{G_y}(G_p(u), v)\}.\] 365 | 请读者思考为什么这是唯一自然的选择, 可以参考下面的插图. 366 | \({\int}G_\bullet\) 到 \(\Gamma\) 有明显的群胚同态, 367 | 抛弃 \(G\) 的信息. 368 | 369 | 对于某个群胚族 \(G_\bullet \in \mathrm{Ty}(\Gamma)\), 370 | 我们希望这一族群胚中的“一族元素”. 换句话说, 对每个 371 | \(x \in \Gamma\), 给出群胚 \(G_x\) 中的某个对象 372 | \(g_x\). 对于任何道路 \(p \in \hom(x,y)\), 前面要求的 373 | 同构 \(G_p : G_x \to G_y\) 将 \(g_x\) 射到 374 | \(G_p(g_x)\), 我们不能直接要求 \(G_p(g_x) = g_y\), 375 | 因为这样过于严格. 但是可以退而求其次, 选择一条道路 376 | \(g_p : G_p(g_x) \to g_y\), 使得 377 | \(g_{\cons{id}} = \cons{id}\), 并且对于连续的两条道路 378 | \(x \xrightarrow p y \xrightarrow q z\), 有 379 | \(g_{p * q} = G_q(g_p) * g_q\). 这实际上就是结合律的要求. 380 | 381 | \begin{center} 382 | \begin{tikzpicture}[xscale=1.2, yscale=1.3] 383 | \filldraw[fill=yellow] (-2,0) ellipse (0.8 and 1); 384 | \filldraw[fill=yellow] (0,0.1) ellipse (0.9 and 1); 385 | \filldraw[fill=yellow] (2,0) ellipse (0.8 and 1); 386 | \node (Gx) at (-2,-1.4) {\(G_x\)}; 387 | \node (Gy) at (0,-1.4) {\(G_y\)}; 388 | \node (Gz) at (2,-1.4) {\(G_z\)}; 389 | \draw[->, gray] (Gx) edge node [above] {\(G_p\)} (Gy); 390 | \draw[->, gray] (Gy) edge node [above] {\(G_q\)} (Gz); 391 | 392 | \node (x) at (-2, -0.3) {\(\bullet\)}; 393 | \node (px) at (0, -0.3) {\(\bullet\)}; 394 | \node (y) at (0.1, 0.5) {\(\bullet\)}; 395 | \node (py) at (1.7, -0.1) {\(\bullet\)}; 396 | \node (ppx) at (2.2, -0.6) {\(\bullet\)}; 397 | \node (z) at (2.1, 0.6) {\(\bullet\)}; 398 | 399 | \draw[gray, |->] (x) edge[bend left=10] (px); 400 | \draw[gray, |->] (y) edge[bend right=5] (py); 401 | \draw[gray, |->] (px) edge[bend right=5] (ppx); 402 | \draw[->] (px) edge node[left, font=\scriptsize] {\(g_p\)} (y); 403 | \draw[->] (py) edge node[left, font=\scriptsize] {\(g_q\)} (z); 404 | \draw[->] (ppx) -- (py); 405 | \draw[->] (ppx) edge node[right, font=\scriptsize] {\(g_{p*q}\)} (z); 406 | \end{tikzpicture} 407 | \end{center} 408 | 409 | 有了这样的构造, 就不难定义 \(\mathrm{Tm}(\Gamma)\). 410 | 考虑所有形如 \((G_\bullet, g_\bullet)\) 的有序对构成的集合, 411 | 其中 \(G_\bullet \in \mathrm{Ty}(\Gamma)\), 412 | \(g_\bullet\) 是 \(G_\bullet\) 中的一族元素. 413 | 这样, 就自然带有投影映射 \(\pi : \mathrm{Tm}(\Gamma) \to \mathrm{Tp}(\Gamma)\). 414 | 415 | 以上就定义了群胚范畴上配备的函子 416 | \(\mathrm{Tp}, \mathrm{Tm} : \mathsf{Grpd}\op \to \mathsf{Set}\) 417 | 在对象上的映射, 我们还需要给出它们在态射上的作用. 418 | 考虑群胚的同态 \(\sigma : \Delta \to \Gamma\), 419 | 由于 \(\mathrm{Tp}(\Gamma)\) 就是 \(\Gamma\) 上的 420 | 全体群胚族 \(\Gamma \to \mathsf{Grpd}\), 因此与 \(\sigma\) 421 | 复合就得到 422 | \[(-\circ\sigma) : \mathrm{Tp}(\Gamma) \to \mathrm{Tp}(\Delta).\] 423 | 而 \(\mathrm{Tm}(\Gamma) \to \mathrm{Tm}(\Delta)\) 424 | 的态射也由复合给出. 不难验证这使得 \(\pi\) 构成预层之间的自然变换. 425 | 426 | 对于 \(\Gamma\) 与 \(G_\bullet \in \cons{Ty}(\Gamma)\), 427 | 我们最后还需要找到一个对象 \(\Gamma'\) 与态射 428 | \(p : \Gamma' \to \Gamma\) 使得 429 | \(\hom(-, \Gamma')\) 自然同构于 430 | \(\yo(\Gamma) \times_{\mathrm{Tp}} \mathrm{Tm}\). 431 | 只需要取 \(\Gamma'\) 为 \({\int}G_\bullet\) 即可. 432 | 请读者验证满足条件. 433 | 证明群胚范畴上具备 \(\Pi,\Sigma\)-类型的结构与在 434 | 集合范畴上的证明基本相同. 更详细的构造相信读者可以 435 | 自己写出, 也可以参阅~\cite{hofmann:1998:groupoid}. 436 | 437 | \subsection{相等类型} 438 | 439 | \subsection{无穷群胚} \berryinf 440 | \end{comment} 441 | 442 | \section[立方类型论]{立方类型论\protect\berry{1}} 443 | 444 | 泛等公理有很多好的结论, 但是它也有一个问题: 它是一条公理. 445 | 而前面已经多次强调过, 如果往类型论中强行加入公理, 就会 446 | 破坏它的性质. 这些不好的性质会对形式化数学带来一些困难 447 | ------ 尽管不会造成本质性的阻碍, 但是仍然会增加许多工作量. 448 | 例如可以在同伦类型论中定义一个自然数, 它不等价于任何一个 449 | 具体的自然数, 但是也无法继续化简. (我们仍然可以用相等类型 450 | 证明它等于某个具体的自然数, 譬如上文提到的 Brunerie 就 451 | 定义了一个自然数为 \(\pi_4(\mathbb S^3)\) 的阶数, 452 | 并且证明了这个自然数等于 \(2\). 但是在判值相等关系下 453 | 它并不等价于 2.) 454 | 有没有办法设计一个类型论, 使得泛等公理成为一个按照 455 | 类型规则可以证明的\emph{定理}呢? 答案是肯定的. 456 | 457 | 这里, 我们需要设计一套类型规则, 这是类型论的纯语法操作. 但是, 458 | 因为语法与语义的研究是一体两面的, 对同伦类型论的语义研究 459 | 能启发新类型规则的设计. 这正是立方类型论的来源. 460 | 461 | 在类型论开始使用\(\infty\)-群胚之前, 拓扑学家已经 462 | 对此有了大量的研究. 拓扑学中已经有利用单形(simplex)\footnote{单形就是三角形、四面体等的\(n\)维推广.} 463 | 刻画拓扑空间的传统. 我们可以用许多单形拼接成一个拓扑空间, 464 | 也可以直接抽象地考虑单形, 将它们看作类似图论或者 465 | 组合学的对象处理. 当然, 也有一些使用其他基础形状的研究, 466 | 如使用\(n\)维立方体, 或者使用树形等等. 事实上, Daniel Kan 467 | 最早的工作就是使用立方体而不是单形. 然而, 这些形状在后续 468 | 的研究中发现了它们在一些技术细节上的困难. 因此在拓扑学 469 | 研究中\(\infty\)-群胚最常用的还是使用单形的定义. 470 | 471 | 但是, 对于类型论的研究来说, 基于单形的理论有致命的问题: 472 | 它大量使用了排中律和选择公理等非构造性的方法. 2015 473 | 年, Bezem与Coquand~\cite{bezem:2015:simplicial} 474 | 指出当时的理论中非构造性是无法消除的.% 475 | \footnote{后续研究~\cite{henry:2019:constructive} 476 | 中发现可以修改理论去除非构造性. 这与Bezem等人的工作 477 | 并不矛盾, 但是这一点的解释超出了本文的范畴.} 478 | 进一步的研究发现, 基于立方体的理论的技术困难是可以克服的, 479 | 并且我们能够建构一套完全构造性的理论. 在 2013 年, 480 | Marc Bezem, Thierry Coquand, Simon Huber 三人提出 481 | 用立方集合构建同伦类型论的模型. 在 2017 年他们正式给出了 482 | 相关证明~\cite{bch:2017:cubical}. 这套模型由他们的 483 | 姓氏首字母称为BCH模型. 根据模型启发了类型论的规则设计, 484 | 得到的就是\textbf{立方类型论}. 485 | 486 | 然而, 这个模型虽然支持泛等公理, 但是由于一些技术原因\footnote{他们 487 | 选择的立方体只有最基础的结构, 是由一维的线段直接(在对称张量积下)生成的, 488 | 因此没有对角线.}不能支持高阶归纳类型. 在 2017 年, 489 | Cyril Cohen, Thierry Coquand, Simon Huber, Anders M\"ortberg 490 | 在论文《立方类型论: 泛等公理的构造性模型》~\cite{abcfhl:2021:cubical}中 491 | 四人提出了一个新的模型. 其中立方体的结构由 de Morgan 代数 492 | 表示. 根据这个模型(缩写为CCHM模型), 他们构造了一套新的类型论语法. 这 493 | 套类型论被称为\textbf{de Morgan立方类型论}. 494 | 2019年, Carlo Angiuli等六人提出用区间的Descartes乘积 495 | 生成的立方体作为基础, 得到了ABCFHL模型 496 | 与\textbf{积立方类型论}. 497 | 498 | 2021年, Sterling等人发展了范畴论工具, 证明了立方类型论的 499 | 典范性. 在他的学位论文~\cite{sterling:2021:thesis}中, 500 | Sterling进一步描述了这些范畴论工具, 并且指出语法与语义研究 501 | 之间的关系. 对类型论的范畴语义感兴趣的读者也可以阅读这篇论文. 502 | 503 | 立方类型论不完全是同伦类型论的子学科. Sterling等人 504 | 提出了XTT类型论~\cite{sterling:2019:xtt}, 属于立方类型论, 505 | 但是不支持泛等公理, 属于集合 (即满足 K 原理) 层面的理论. 506 | 507 | \subsection{立方类型论简介} 508 | 509 | 立方类型论中, 引入了一个类型 \(\mathbb I\) 表示同伦论的区间. 510 | 它有两个端点 \(0,1\). 一个变量 \(i : \mathbb I\) 则表示 511 | 区间上的一个点. 如果有多个变量 \(i,j,k : \mathbb I\), 512 | 则它们共同表示立方体中的某个坐标. 在同伦类型论中, 相等类型的 513 | 直观是两点之间道路的空间. 在立方类型论中, 如果有一条道路 514 | \(p : x =_A y\), 那么就允许我们取出这条道路上的某一点 515 | \(p(i) : A\). 因此, \(\lambda i. p(i)\) 就是某个函数 516 | \(\mathbb I \to A\), 而道路空间就可以看成是端点给定的函数空间. 517 | 518 | 这样, 我们立刻就可以证明一些定理. 519 | 520 | \begin{theorem} 521 | 给定函数 \(f : A \to B\), 如果有两个元素 \(x = y\), 那么 522 | \(f(x) = f(y)\). 523 | \end{theorem} 524 | \begin{proof} 525 | 我们有 \(p : x = y\). 我们需要证明 \(f(x) = f(y)\). 526 | 由于道路空间可以看成端点固定的函数空间, 我们只需要给出一个函数 527 | \(q : \mathbb I \to B\) 使得两个端点 \(q(0) = f(x), 528 | q(1) = f(y)\) 即可. 由于 \(p(i)\) 是道路上的一个点, 有 529 | \(p(i) : A\). 因此 \(f(p(i)) : B\). 我们定义 \(q(i) = f(p(i))\), 530 | 验证端点 \(q(0) = f(p(0)) = f(x), q(1) = f(p(1)) = f(y)\) 531 | 满足条件. 532 | \end{proof} 533 | 534 | \begin{theorem} 535 | 如果两个函数逐点相等, 那么它们相等. 536 | \end{theorem} 537 | \begin{proof} 538 | 我们有 \(p : \prod_{x : A} f(x) =_B g(x)\). 我们需要证明 539 | \(f =_{A\to B} g\). 由于道路空间可以看成端点固定的函数空间, 540 | 我们只需要给出一个函数 \(q : \mathbb I \to (A \to B)\), 使得 541 | 两个端点 \(q(0) = f, q(1) = g\) 即可. 我们定义 542 | \(q(i)(x) = p(x)(i)\). 由于 \(p(x) : f(x) =_B g(x)\) 是一条 543 | 道路, 因此 \(p(x)(i)\) 就是这条道路上的一个点, 并且其端点符合要求. 544 | \end{proof} 545 | 546 | 可以看到, 将相等类型使用道路空间的方式定义, 使得证明更加简洁直观. 547 | 同时函数外延性在用泛等公理证明时十分复杂, 而使用立方类型论则是最基础的结论. 548 | 549 | % 立方类型论版本的闭典范性, 又叫立方闭典范性, 是指将传统意义上的闭典范性中的 550 | % 空语境换成完全由类型 \(\mathbb I\) 拼成的语境 551 | % \(x_1:\mathbb I, x_2:\mathbb I, \cdots, x_n : \mathbb I\). 552 | % 在 2018 年由 553 | % Huber~\cite{huber:2018:canonicity} 提出并证明. 554 | 555 | 希望继续了解立方类型论的读者可以 556 | 参考\href{https://1lab.dev/1Lab.intro.html}{这篇文章}~\cite{amelia:2023:1lab}. 557 | -------------------------------------------------------------------------------- /chapters/introduction.tex: -------------------------------------------------------------------------------- 1 | \chapter{前言}\label{intro} 2 | 2020年12月, Peter Scholze发布了\href{https://xenaproject.wordpress.com/2020/12/05/liquid-tensor-experiment/}{一项挑战}~\cite{scholze:2020:liquid}. 3 | 在他的凝聚态数学前沿研究中有一条技术性定理, 对于这个领域有 4 | 至关重要的作用: 5 | \begin{theorem}[Clausen, Scholze] 6 | 设 \(0 < p' < p \le 1\) 为实数, 令 \(S\) 为投射有限集, 7 | \(V\) 为 \(p\)-Banach 空间. 记 \(\mathcal M_{p'}(S)\) 8 | 为 \(S\) 上的 \(p'\)-测度构成的空间. 那么对于 \(i \ge 1\) 有 9 | \[\mathrm{Ext}_{\mathsf{Cond}(\mathsf{Ab})}^i( 10 | \mathcal M_{p'}(S), V 11 | ) = 0.\] 12 | \end{theorem} 13 | Scholze希望这条定理的证明可以被完全严格形式化, 并且通过 14 | 计算机的检查. 2022年7月, Lean 15 | 社区\href{https://leanprover-community.github.io/blog/posts/lte-final/}{宣布}这个挑战正式完成. 16 | 换句话说, 即使是数学最尖端的结论, 也可以在一年半的时间内 17 | 被转化成计算机可以理解并验证的代码. 18 | 这种成就是如何达成的呢? 答案是Lean的类型论. 19 | 20 | 在类型论中, 一切数学对象的含义都由它们从属的类型决定. 21 | 如类型 \(\mathbb N\) 的元素是自然数, 而类型 \(\alpha \times \beta\) 22 | 的元素是有序对, 类型 \(\alpha \to\beta\) 的元素 23 | 是映射, 等等. 而这些类型可以相互组合, 表达出复杂的含义, 24 | 这使得类型论有能力作为数学的基础, 与集合论的地位类似. 25 | 另一方面, 计算机科学中也有利用类型描述程序的传统. 因此, 类型论 26 | 可以看作是数学与计算机之间的桥梁. 这也使得计算机定理 27 | 验证成为了有可行性的工作: 证明可以写成计算机能解析的语言, 28 | 并且交由计算机验证正确性. 传统的使用一阶逻辑与集合论数学 29 | 基础中, 一个初等的定理也可能需要冗长的说明才能完全 30 | 严格的写出来, 因此尽管理论上可能, 实操上却非常困难. 31 | 类型论不仅可以验证数学定理. 现在, 类型论正广泛用于 32 | 验证各种需要低出错率的软硬件, 如军事、医用、宇航电子仪器等 33 | 设计无误. 34 | 35 | 这篇文章的主要目的是以历史作为连贯的主线将类型论的知识 36 | 串联在一起, 为中文学习者提供些微的参考价值. 37 | \textbf{这不是类型论的教程}, 但是文章中 38 | 介绍各个领域时都会提及其中优秀的参考书目或者其他文献资料, 39 | 供希望进一步了解的读者阅读. 对于一些没有标准翻译的名词, 会 40 | 在括号中附上英文名称. 41 | 42 | 文章不要求任何类型论的前置知识, 并且尽量避免范畴论知识的 43 | 使用, 但是会援引一般数学中的许多例子. 同时, 每一节的内容 44 | 相对独立, 因此如果某一部分使用的前置知识较多, 读者可以直接 45 | 跳过, 不影响后续阅读. 在使用范畴论知识时, 会使用如下的图标 46 | 标示难度: 47 | \begin{center} 48 | \begin{tikzpicture} 49 | \foreach \k in {1,2,3,4} { 50 | \node at ({2*\k},0) {\berryglow{\k}}; 51 | } 52 | \end{tikzpicture} 53 | \end{center} 54 | 草莓籽表示不需要范畴论知识, 或者只需要文内已经提到的知识. 55 | 红色草莓表示需要读者对基础的范畴论定义有熟悉度. 56 | 金草莓意味着读者需要掌握范畴之间的常用操作(米田引理等). 57 | 月莓图标表示读者需要对意象论的各种构造有直观理解. 58 | 59 | 在文章写作过程中, 类型论社区提供了巨大的帮助, 包括查找一些 60 | 事实错误, 提供优秀的参考资料, 修改措辞等等. 特别地, 61 | \href{https://ncatlab.org/}{\(n\)Lab} 上记有许多令人 62 | 醍醐灌顶的观点, 但是由于不是期刊书籍, 它的功劳很难以 63 | 学术通用的形式得到应有的承认. 64 | 65 | 这篇文章按照 \href{https://creativecommons.org/licenses/by-nc-sa/4.0/legalcode}{CC BY-NC-SA 4.0} 协议发布. 66 | 67 | \section{什么是类型论?} 68 | 从最表层的角度说, 类型论研究的是对象和它们的类型之间的 69 | 相互作用. 比如说 \(1\) 的类型是 \(\mathbb N\), 70 | 而函数的类型是 \(\mathbb N \to \mathbb N\); 71 | 一个泛函的类型则可能是 72 | \((\mathbb R \to \mathbb R) \to \mathbb R\). 73 | 大部分类型论的介绍都会采取同一个思路: 74 | 一套类型系统\footnote{类型系统也叫做类型论, 75 | 而上面说的是类型论这门学科, 就像拓扑这门学科研究的 76 | 是拓扑这种数学对象一样.}% 77 | 就是一组规则的集合, 我们应用这些规则推导一些结论. 78 | 这些结论被称为\textbf{断言}(judgement). 譬如 79 | “\(1+1=2\)” 就可以是某个类型论中的断言. 而类型论 80 | 就是研究这些断言的学科. 81 | 82 | 但是纵观类型论120年的历史, 这其实是一个有失偏颇的 83 | 概括. 它只注意到了类型论的\textbf{语法} (syntax), 或者称为 84 | “语形”的研究. 而语法与\textbf{语义} (semantics) 是 85 | 分不开的. 在这里, 我提出这篇论文的中心: 86 | \slogan{类型论是语法与语义研究的对立统一.} 87 | 这就将问题拆分为三个部分: 88 | \begin{itemize} 89 | \item (\ref{intro:syntax}~节) 什么是语法? 90 | \item (\ref{intro:semantics}~节) 什么是语义? 91 | \item (\ref{intro:unity}~节) 二者的研究是如何对立统一的? 92 | \end{itemize} 93 | 这一章剩下的部分将会简要地从当代视角解释这些问题, 94 | 读者也可以直接跳过阅读下一章. 95 | 类型论不仅局限于数学, 它在计算机科学与哲学中都有重要 96 | 的地位. 因此这篇文章会尽可能多地谈及各方面的例子, 97 | 以让读者多了解不同学科视角下的思想. 98 | 99 | \section{朴素的语法}\label{intro:syntax} 100 | 101 | 什么是语法? 最朴素, 也是人们最初的理解, 就是从所有的字符串 102 | (字符串就是某个固定的字母表中的符号组成的有限长的列表)中 103 | 选出一个子集, 规定为 “符合语法” 的. 譬如我规定字母表 104 | 是 \(\{0,1,2,3,4,5,6,7,8,9,+,\times\}\), 然后写 105 | 出一些规则, 使得 \(1 + 3 \times 25\) 是符合语法的, 106 | 而 \(++3\times 03\) 不是. 107 | 108 | 这些规则一般是这样: 109 | \[ 110 | \frac{(n \in \{0,1,\dots,9\})}{n~\textrm{number}}\quad 111 | \frac{n~\textrm{number}\quad (m \in \{1,\dots,9\})}{mn~\textrm{number}} 112 | \] 113 | \[ 114 | \frac{n~\text{number}}{n~\text{valid}}\quad 115 | \frac{n~\text{valid}\quad m~\text{valid}}{n+m~\text{valid}}\quad 116 | \frac{n~\text{valid}\quad m~\text{valid}}{n\times m~\text{valid}} 117 | \] 118 | 119 | 这种写法来自逻辑学的传统, 上面是前提, 下面是结论. 120 | 如果用数学中更常见的写法, 就是譬如 121 | “如果 \(n\) 和 \(m\) 是符合语法的表达式, 那么 122 | \(n \times m\) 也是符合语法的表达式.” 123 | 并且所有符合语法的表达式是在这些规则下封闭的最小集合. 124 | 125 | 这种原始的语法, 优点在于非常简单. 如果我们希望创造一种 126 | 数学基础, 我们当然不希望定义这个基础的时候就用到大量的 127 | 数学概念. 字符串和它们的拼接 ------ 这再简单不过了, 任何 128 | 人都能够确信自己可以正确理解并操作. 类型论创始时正是为了 129 | 解决 Russell 悖论引起的基础危机, 所以这一点尤其重要. 130 | 131 | 然而这种语法的缺陷在正式应用时就会立刻体现出来. 譬如在处理 132 | 变量的时候: 我们都很清楚 \(\int x \,\mathrm dx\) 中 133 | 没有\textbf{自由变量}, 只有\textbf{束缚变量} \(x\). 因此它 134 | 写成 \(\int y \,\mathrm dy\) 是完全一样的. 同样的道理, 135 | 如果 \(f(x) = \int_0^1 xy \,\mathrm dy\), 那么计算 136 | \(f(y^2)\) 的时候, 我们不能简单的代入 137 | \[f(y^2) \stackrel?= \int_0^1 y^2 \cdot y\,\mathrm dy.\] 138 | 正确的做法是先将束缚变量 \(y\) 改成另一个名字, 再代入. 139 | 把数学表达式作为字符串处理时, 这种问题是尤其头疼的. 更不用 140 | 说还需要证明每个字符串至多有一种解读的方式, 等等. 141 | 142 | 然而这些问题都是一些鸡毛蒜皮的小事, 都可以通过机械而繁琐 143 | 的步骤处理. 在度过基础危机时期之后, 144 | 我们理应放下过于谨慎的态度. 对于形式系统的研究, 我们绝大 145 | 部分的精力都不应该放在处理这种事情上, 而应该讨论一些真正 146 | 重要的问题: 这个系统有没有矛盾? 这个系统能不能证明这些重 147 | 要的定理? 这些问题, 与用字符串时产生的这些技术细节是不相干的. 148 | 149 | 那么, 我们应当换一个视角看这个问题: 字符串本身并不是语法. 150 | \emph{它只是表示语法的一种方式}. Klein 群并不是 151 | 四个矩阵; 这四个矩阵只是表示这个群的一种方式. 我们的实数 152 | 并不是Cauchy收敛的数列的等价类; 这些等价类只是编码实数 153 | 的一种方式. 对于语法来说, 我们感兴趣的并不是这些字符串的性质, 154 | 而是这些字符串表示的东西. 换言之, 我们可以认为存在\footnote{当然, 155 | 一个数学对象是否“存在”是一个数学哲学问题, 这里不过多讨论.}一个 156 | “理想”的语法, 而我们使用字符串或者其他什么方式描述的 157 | 只是表示这种语法的一种方式, 我们只不过没有更好的办法描述 158 | 这种理想的语法而已. 这就引出了\textbf{客观语法}的概念. 159 | 160 | \section{客观逻辑与主观逻辑} 161 | 这两个概念源于 Hegel. Hegel 认为逻辑分为两种. 162 | 其中主观逻辑类似于我们数学中称的逻辑, 处理的是重言式 163 | 而没有实质内容. 而客观逻辑则处理的是概念的发生学, 把 164 | 哲学上 (如 Kant) 对概念的划分从任意武断的变为理性 165 | 必然的.\footnote{笔者对哲学不完全了解, 如果有不妥请 166 | 尽管指出.} 我们可以把客观逻辑的研究中遇到的问题编码成 167 | 主观逻辑可以处理的问题, 进而用主观逻辑进行推导; 但是 168 | 由于主观逻辑自身的局限性, 这些终究只是一种编码. 169 | (与之相对地, Russell等人认为仅仅使用形式逻辑就可以 170 | 研究一切的哲学问题, 这开创了分析哲学学派.) 171 | 172 | 数学家 Lawvere 将这两个概念拿到了数学中来. 他认为 173 | 主观逻辑是客观逻辑的一部分, 主观逻辑反映了客观逻辑, 174 | 并且部分指导客观逻辑的构造. 175 | \begin{quotation} 176 | 五十年前, 源于几何学的需求, 范畴论创造了譬如 177 | 伴随函子、意象、纤维化、闭范畴、2-范畴等等的事物. 178 | 这些事物是为了帮助阐明一些复杂但并非随意构造的概念, 179 | 以及这些概念之间的相互作用; 这些概念产生于对空间和 180 | 数量的研究的需要. [...] 如果我们把[上面这句话]其中的 181 | “空间和数量” 替换成 “任何一项严肃的研究”, 那么这就是我 182 | 姑且对\textbf{客观逻辑}的定义.~\cite{lawvere:1994:objective} 183 | \end{quotation} 184 | Lawvere 认为, 范畴论就是客观逻辑的一个数学模型. 我们 185 | 在数学中的定义—定理—证明过程都是由主观逻辑 (即形式逻辑) 186 | 主导的, 但是这些定义的动机、定理的直观、证明的思路, 都是 187 | 来自于客观逻辑. 主观逻辑不能刻画全部的客观逻辑, 而只是其 188 | 一部分, 并且承担着指导作用, 正如铁轨指导火车的运行. 同时, 189 | 我们交流时不能直接交流客观逻辑中的理念, 而只能先将它们编码 190 | 成主观逻辑中的命题. 191 | 192 | 回到语法上来. 我们自然可以如上一节所举的例子那样定义 193 | 一套语法, 但是这一套语法背后反映的实际上是我们对于四则 194 | 运算的概念. 因此譬如括号匹配, 优先级等等概念, 实际上 195 | 都是这种具体的编码 --- 也就是\textbf{主观语法} --- 196 | 中的细节. 而这个主观语法所意图反映的概念才是我们真正 197 | 希望研究的, 也即\textbf{客观语法}. 这与下面提到的语义 198 | 的概念有所区别, \hyperref[intro:semantics]{下一节}介绍 199 | 语义时再详细阐述. 与主客观逻辑 200 | 类似, 客观的语法是不能落脚到计算机上来的, 因此主观语法 201 | 仍然是有必要的. 对于主观语法和客观语法的研究, 构成了对立统一. 202 | 203 | 作为 Lawvere 思想的一种具体化, 客观语法可以由范畴论 204 | 刻画, 特别地, 由意象 (topos) 刻画. 这一思想 (据笔者考证) 205 | 是由 Jonathan Sterling 提出的. 我们在之后的章节里 206 | 会逐步介绍具体的细节. 207 | 当代的类型论研究重点已经逐渐从主观的语法转移到客观的语法 208 | 上来. 正如 Sterling 所说: 209 | 210 | \begin{quotation} 211 | 这篇学位论文立足于一项重要的观察: 212 | 类型论中的定理可以用一种在范畴的等价下不变的方式叙述; 213 | 因此, 我们没有必要过于关注具体的树状表示或者变量绑定的 214 | 等等细节. 现在看来, 对这种细节的过度关注与本科计算机科学 215 | 教育中对所谓 “语法解析 (parsing)”, 或者本科逻辑学 216 | 教育中对括号的匹配计数过度强调的不良风气是一脉相承的. 217 | ~\cite[(4.2\textasteriskcentered3)]{sterling:2021:thesis} 218 | \end{quotation} 219 | 220 | 这一节的最后, 我们举一个例子: 群的语法. 它的主观语法比较 221 | 好理解. 首先我们有一些作为变量的符号 \(x,y,z\) 等. 222 | 每个变量都是一个表达式. 如果 \(M, N\) 是表达式, 那么 223 | \((M \cdot N)\) 和 \(M^{-1}\) 也是表达式. 同时 224 | \(1\) 也是表达式. 这样, 表达式就例如 225 | \((1^{-1} \cdot ((x \cdot y^{-1})^{-1} \cdot x))\) 等等. 226 | 227 | 对于这套简单的理论, 主观语法还是比较好处理的. 我们可以 228 | 归纳定义一个表达式的变量集 \(\mathrm{Var}(M)\). 上面 229 | 那个表达式的变量集就是 \(\{x, y\}\). 我们可以证明每个 230 | 表达式都只有唯一的一种方式从上面的规则中产生. 231 | 232 | 然后我们还需要描述群元素间的相等. 这在一般的类型论中称为% 233 | \textbf{判值相等}(judgemental equality). 是理论中内生的相等 234 | 性. 与它相关的辨析也会在第\ref{martinlof}章中讲述. 235 | 我们定义表达式之间的一个等价关系, 这次使用逻辑学家更熟悉 236 | 的语言: 237 | \[\frac{}{M = M}\quad 238 | \frac{M = N}{N = M}\quad 239 | \frac{M = N \quad N = P}{M = P}\] 240 | 这规定了 \(=\) 是个等价关系. 241 | \[\frac{M = N}{M^{-1} = N^{-1}}\quad 242 | \frac{M_1 = M_2\quad N_1 = N_2} 243 | {(M_1 \cdot N_1) = (M_2 \cdot N_2)}\] 244 | 这规定了判值相等是\textbf{合同}(congruent)关系, 245 | 换言之, 把一个表达式 \(M\) 中的一部分 \(N\) 替换成 246 | 与之相等的另一个表达式 \(N'\), 得到的新表达式 \(M'\) 247 | 也等于原来的表达式 \(M\). 248 | \[\frac{}{(1 \cdot M) = M}\quad 249 | \frac{}{(M \cdot 1) = M}\] 250 | \[\frac{}{((M \cdot N) \cdot P) 251 | = (M \cdot (N \cdot P))} \quad 252 | \frac{}{(M \cdot M^{-1}) = 1}\quad 253 | \frac{}{(M^{-1} \cdot M) = 1}\] 254 | 注意这些规则都是没有前提, 因此是恒成立的. 这就规定了群 255 | 的主观语法. 用代数的眼光看, 这刚好是在构造由变量符号 256 | 生成的自由群. 这个视角是非常深刻的, 后面还会多次碰见. 257 | 258 | 那么客观语法如何呢? 这需要一定的范畴论工具. 我们后面会 259 | 详细介绍范畴论的知识. 这里只预先为读者提供一个大略的图像. 260 | 我们考虑一列群 \(F_n (n \in \mathbb N)\), 即有 261 | \(n\) 个生成元的自由群. 它们之间的群同态构成一个范畴. 262 | 我们取这个范畴的对偶 \(\mathcal T\). 这个范畴代表了 263 | 上面的主观语法的客观化, 也称为群论的\textbf{语法范畴}. 264 | 我们会在下一节更仔细地讲述这个范畴的特性, 以及它如何与 265 | 主观语法相对应. 但是现在可以为已经掌握了一定范畴论 266 | 知识的读者罗列几点:\berry{3} 267 | \begin{itemize} 268 | \item 从 \(\mathcal T\) 到集合 269 | 范畴 \(\textsf{Set}\) 的保积函子与群一一对应. 270 | \item 从 \(\mathcal T\) 到拓扑空间 271 | 范畴 \(\textsf{Top}\) 的保积函子与拓扑群一一对应. 272 | \item 从 \(\mathcal T\) 到光滑流形 273 | 范畴 \(\textsf{Man}\) 的保积函子与Lie群一一对应. 274 | \end{itemize} 275 | 这里保积函子指的是保持 Descartes 乘积的函子. 276 | 277 | \section{类型论的语义}\label{intro:semantics}\berry{1} 278 | % 朴素语义 279 | 语义是什么? 顾名思义, 就是指某种解释语言的方式. 280 | 我们还是以群的语言为例子. 群的语言中有 \(M\times N\) 281 | 与 \(M^{-1}\) 的操作, 那么我们朴素的语义中就可以解释为 282 | 一个集合 \(G\) 以及其上的两个函数 \(m : G\times G\to G, 283 | i : G \to G\). 而表达式 \(1\) 就解释为 \(G\) 中选定的 284 | 某个元素 \(e\). (其实这可以认为是 “零元函数”, 因为 285 | \(G^n \to G\) 就是 \(n\)元函数, 取 \(n = 0\) 得到 286 | \(G^0 \to G\), 即从单点集出发的函数.) 这样, 任何表达式 287 | 就都能通过这些函数解释成具体的运算结果. 288 | 我们进一步要求选定的函数需要满足语法中规定的所有等式. 289 | 这样得到的语义我们已经很熟悉了: 一个群恰好是一种语义. 290 | 同时这也告诉我们, 同一个语言也可以有不同的语义, 甚至不一定有 291 | 典范的语义. 292 | 293 | 当然, 这只是把语言解释成了集合和函数. 我们没有理由把自己限制 294 | 到这些事物上. 譬如说我们把 “集合” 改为 “光滑流形”, 295 | “函数” 改为 “光滑映射”. 读者可以发现这就是 Lie 群的定义. 296 | 这就促使我们思考, 怎样的数学结构就足够支撑语义的定义呢? 297 | 我们需要一个抽象的数学结构, 包含一些对象和它们 298 | 之间的映射. 这就自然的产生了范畴的概念. 299 | \begin{definition} 300 | 一个\textbf{范畴} \(\mathcal C\) 包含 301 | \begin{itemize} 302 | \item 一个集合 \(\mathrm{Obj}(\mathcal C)\), 其中 303 | 的元素称为范畴\(\mathcal C\)的\textbf{对象}.\footnote{有时候我们 304 | 希望考虑如所有集合构成的范畴, 此时由于所有集合的集合不存在, 我们 305 | 需要将这个定义放宽. 这里不考虑这些问题, 但是在严格处理 306 | 的时候这些问题是非常重要的.} 307 | \item 对于每对对象 \(A,B\), 一个集合 \(\hom_{\mathcal C}(A,B)\), 308 | 称为从 \(A\) 到 \(B\) 的\textbf{态射}或者\textbf{箭头}. 309 | 对于每个对象 \(A\), 都有一个态射 310 | \(\cons{id}_A \in \hom_{\mathcal C}(A,A)\), 称作\textbf{恒同态射}. 对于两个态射 311 | \[A \xrightarrow f B \xrightarrow g C\] 312 | 有其\textbf{复合态射} \(g\circ f \in \hom_{\mathcal C}(A, C)\). 313 | \end{itemize} 314 | 它们满足一些等式. 恒同态射与其他箭头的复合满足 315 | \(f \circ \cons{id} = f = \cons{id} \circ f.\) 316 | 并且三个顺次相连的态射复合满足结合律 317 | \(f\circ (g\circ h) = (f\circ g)\circ h.\) 318 | \end{definition} 319 | 320 | 那么集合与函数就构成一个范畴\(\mathsf{Set}\). 读者可以验证 321 | 函数的复合满足所需要的等式. 群与群同态也构成一个范畴 \(\cons{Grp}\), 322 | 等等. 进一步, 范畴之间保持其结构的映射就称为函子. 323 | \begin{definition} 324 | 一个\textbf{函子} \(F : \mathcal C \to \mathcal D\) 包含 325 | 其对象的映射 \(\mathrm{Obj}(\mathcal C) 326 | \to \mathrm{Obj}(\mathcal D)\) 与每对对象之间的 327 | 态射的映射 \(\hom_{\mathcal C}(A,B) \to \hom_{\mathcal D}(F(A), F(B))\). 328 | 它满足 \(F(\cons{id}_A) = \cons{id}_{F(A)}\) 与 329 | \(F(f \circ g) = F(f)\circ F(g)\). 330 | \end{definition} 331 | 再进一步, 函子之间保持其结构的映射称为自然变换. 332 | \begin{definition} 333 | 对于两个函子 \(F,G : \mathcal C \to\mathcal D\), 334 | 一个\textbf{自然变换} \(\eta : F \to G\) 为一族 335 | 态射 \(\eta_X : F(X) \to G(X)\), 满足对于任何 336 | \(f : X \to Y\), 下面的正方形图表交换 (即两条路径复合得到的是相等的态射). 337 | \[\begin{tikzcd} 338 | {F(X)} & {F(Y)} \\ 339 | {G(X)} & {G(Y)} 340 | \arrow["{\eta_X}"', from=1-1, to=2-1] 341 | \arrow["{\eta_Y}", from=1-2, to=2-2] 342 | \arrow["{F(f)}", from=1-1, to=1-2] 343 | \arrow["{G(f)}"', from=2-1, to=2-2] 344 | \end{tikzcd}\] 345 | \end{definition} 346 | 范畴论是非常丰富而深刻的学科. 347 | 读者可以阅读\cite{smith:2018:category}或\cite{maclane:1971:category}进一步学习. 348 | 349 | 我们有一个范畴还不够, 我们需要有对象的乘积来表达二元函数 350 | \(G \times G \to G\). 在范畴中可以直接定义对象之间的 351 | 乘积. 352 | \begin{definition} 353 | 给定一个范畴中的两个对象 \(A,B\), 如果有另一个对象 \(C\) 354 | 以及两个态射 \(\pi_1 : C \to A\), \(\pi_2:C \to B\), 355 | 满足对于任何一对态射 \(f : X \to A\), \(g : X \to B\), 356 | 都存在一个态射 \(u : X \to C\) 使得 \(f = \pi_1 \circ u\), 357 | \(g = \pi_2 \circ u\), 就称 \(C\) 为 \(A,B\) 的\textbf{Descartes乘积}, 358 | 记作 \(A \times B\). 359 | \[\begin{tikzcd} 360 | X \\ 361 | & C && B \\ 362 | \\ 363 | & A 364 | \arrow["f"{description}, curve={height=6pt}, from=1-1, to=4-2] 365 | \arrow["{\pi_1}"{description}, from=2-2, to=4-2] 366 | \arrow["{\pi_2}"{description}, from=2-2, to=2-4] 367 | \arrow["g"{description}, curve={height=-6pt}, from=1-1, to=2-4] 368 | \arrow[dashed, from=1-1, to=2-2] 369 | \end{tikzcd}\] 370 | \end{definition} 371 | 读者可以验证集合的乘积、群的直积、向量空间的直积等等都满足条件. 372 | 因此这个定义恰当地刻画了我们称为积的许多不同定义. 范畴乘积 373 | 在同构意义下是唯一的. 374 | 375 | 同时, 我们还 376 | 需要表达“零元函数”的概念. 377 | \begin{definition} 378 | 如果一个范畴中有一个对象 \(1\) 满足任何对象 \(X\) 到 379 | \(1\) 都有唯一的态射, 那么这个对象称作\textbf{终对象}. 380 | 对偶地, 如果有一个对象 \(0\) 满足它到任何对象都有唯一的态射, 381 | 那么这个对象称作\textbf{始对象}. 382 | \end{definition} 383 | 终对象可以看成是“零元乘积”. 384 | 在集合范畴中, 这就是单点集的定义. 我们有 \(1 \times X\) 385 | 与 \(X\) 同构等性质. 386 | 有了这些工具之后, 我们就可以在任何含有乘积和终对象的范畴 387 | 中定义群的语义了. 我们把群的语义定义为一个对象 \(G\), 388 | 态射\(i : G \to G\), \(m : G \times G \to G\), 389 | \(e : 1 \to G\). 它们需要满足群的等式. 如考虑 390 | \(\cons{id}, i : G \to G\) 这两个态射, 由范畴乘积的定义, 391 | 存在态射 \(\langle\cons{id}, i\rangle : G \to G \times G\). 392 | 这个态射可以与 \(m\) 复合. 另一方面由终对象的定义, 393 | \(G \to 1\) 有唯一的态射, 它可以与 \(e\) 复合. 394 | 我们要求这两个复合映射 \(G \to G\) 相等. 395 | 这在集合范畴里说的就是 \(x \cdot x^{-1} = e\). 396 | 其他的等式也可以类似地重新表述. 397 | 398 | 为什么要花费这么大功夫, 把原来的等式表达得这么复杂呢? 399 | 这是因为我们重新表述了这个等式后, 它就可以立刻解放而 400 | 用到其他范畴中去.\footnote{事实上我们在 401 | 第~\ref{category:inner}~节中会介绍怎么既能得到好处, 402 | 又不使等式的表述过于复杂.} 譬如我们现在可以考虑 403 | 光滑流形与可微映射构成的范畴, 那么就立刻得到Lie群的定义. 404 | 如果在代数簇的范畴中, 就得到代数群的定义. 405 | 406 | 在1963年, Lawvere~\cite{Lawvere:1963:functorial}提出了 407 | 一种更优雅的表述方式. 如果我们希望考虑一个群 \(G\) 中的 408 | 两个元素 \(x,y\) 使得 \(x^2y^2 = e\), 那么我们可以将其 409 | 表述为从 \(\langle x,y \mid x^2y^2 \rangle\) 到 \(G\) 410 | 的群同态. 这是由 \(x,y\) 两个元素在满足我们需要的等式的 411 | 前提下自由生成的群. 如果读者接触过逻辑学, 412 | 那么可以类比 Lindenbaum--Tarski 代数, 它也蕴含着类似的思想. 413 | 类似地, 我们现在希望考虑某个范畴中的一个对象 414 | 以及态射 \(i,m,e\), 满足一些等式. 因此我们应该 415 | 寻找某个范畴 \(\mathcal T\), 它由 \(i,m,e\) 三个态射 416 | 在满足我们需要的等式前提下“自由生成”. 417 | 418 | 我们考虑由一个对象 \(\star\) 419 | 以及它自身的有限次乘积 \(\star^n (n \in \mathbb N)\) 构成的范畴. 420 | 我们考虑这样构成的范畴 \(\mathcal T\) 到其他范畴的 421 | 函子. 如果这个函子保持乘积结构, 那么它就由 \(F(\star)\) 422 | 的值唯一确定. 正如 \(\mathbb Z\) 到环 \(R\) 的环同态 \(f\) 423 | 由 \(f(1)\) 的值唯一确定. 如果我们进一步在范畴 \(\mathcal C\) 424 | 中自由加入一个态射 \(m:\star^2 \to \star\), 同时不破坏乘积结构, 425 | 那么从这个范畴出发的(保乘积结构的)函子就会由 \(F(\star)\) 426 | 与 \(F(m) : F(\star) \times F(\star) \to F(\star)\) 427 | 唯一决定. 如果 \(m\) 在范畴 \(\mathcal T\) 中满足一些 428 | 等式, 那么 \(F(m)\) 就会自然的满足这些等式. 429 | 430 | 那么我们就只需要解决两个问题: 如何具体构造这个范畴 431 | \(\mathcal T\), 以及定义“保持乘积的函子”. 其中后者比较 432 | 简单, 大致来说我们只需要 \(F(A \times B)\) 与 \(F(A) \times F(B)\) 同构即可. 433 | \begin{definition} 434 | 给定两个范畴 \(\mathcal C,\mathcal D\), 如果这两个 435 | 范畴中任意两个对象都有乘积, 那么考虑任何一个函子 \(F : \mathcal C \to \mathcal D\) 436 | 都有态射 \(F(A \times B) \to F(A) \times F(B)\). 437 | 如果这些态射对于任何 \(A,B \in \mathrm{Obj}(\mathcal C)\) 438 | 都是同构, 那么就称 \(F\) \textbf{保持二元乘积结构}. 439 | 如果进一步 \(F(1)\) 也是终对象, 那么就称 \(F\) 440 | \textbf{保持有限乘积结构}, 简称为\textbf{保积函子}. 441 | \end{definition} 442 | 443 | 接下来我们定义 \(\mathcal T\). 这只需要定义 \(\star^m\) 到 444 | \(\star\) 的态射. 根据上面的讨论, 445 | 我们考虑所有使用 \(m\) 个变量 446 | \(x_1,\dots,x_m\), 用乘法、逆元、单位元运算得到的 447 | 任意表达式. 如果有两个表达式 \(M,N\) 根据群满足的 448 | 等式 (结合律等等) 可以证明相等, 就记作 \(M \sim N\). 449 | 那么 \(\sim\) 是一个等价关系, 我们将表达式的集合商去这个 450 | 等价关系, 作为 \(\hom(\star^m, \star)\) 的定义. 451 | 而一般的 \(\hom(\star^m, \star^n)\) 可以定义为 452 | \(n\) 个这样的表达式构成的有序对. 453 | 454 | 读者可能已经注意到了, 这样定义出来的正是 \ref{intro:syntax}~节中 455 | 介绍过的群的语法! 这样看来, 群的语义可以看作是从群的语法 456 | 构成的范畴出发的保积函子. 这就是\textbf{Lawvere函子语义}. 457 | 对于更复杂的理论, 我们也需要更加复杂的范畴结构, 因此考虑的 458 | 函子也相应地需要保持这些结构. 459 | 460 | 在 \ref{intro:syntax}~节中, 我们还提到了另一种构造语法范畴的方式. 461 | 考虑 \(n\) 个生成元的自由群, 它们与其间的群同态构成一个范畴. 462 | 我们将所有的箭头\emph{反向}, 就构成了语法范畴. 读者可以 463 | 验证这样得到的是完全相同的范畴, 不过这种表述更加简练. 464 | 465 | 既然任何一个从群语法范畴出发的保积函子都可以看作是 466 | 语义, 那么恒同函子 \(\mathcal T \to \mathcal T\) 467 | 自然也是一套语义, 也就是说语法本身构成平凡的语义. 468 | 更进一步, 考虑所有的语义构成的范畴.\footnote{这个范畴 469 | 中两个语义 \(F : \mathcal T \to \mathcal S_1, 470 | G : \mathcal T \to \mathcal S_2\)之间的态射是一个 471 | 保积函子 \(H : \mathcal S_1 \to \mathcal S_2\), 472 | 满足 \(H \circ F = G\).} 473 | 在这个范畴中, 语法构成的平凡语义是始对象. 474 | 475 | 使用范畴表述的语法与语义, 在处理非常复杂的类型论 (如立方类型论) 时 476 | 是降低复杂程度, 让证明简洁清晰的有力武器. 不过我们 477 | 当然还需要证明这一套理论与传统的语法是等价的. 这类证明 478 | 一般表现为两个定理, 分别称作\textbf{完备性}与\textbf{可靠性}. 479 | 我们在\ref{beginning:henkin}节会再次提到. 480 | 481 | %realizability \& forcing 482 | %TODO I think we don't need to mention these? 483 | 484 | \section{类型论的历史}\label{intro:unity} 485 | 在类型论研究的历史中, 语法和语义的研究是对立统一的关系. 486 | 起初, 人们写下语法规则, 然后通过分析这些规则试图 487 | 建立类型论的性质. 而选择这些规则的原因, 是人们脑中 488 | 期望这些规则所拥有的语义. 在分析的过程中, 人们会发现 489 | 为了证明类型论的一些性质, 需要考虑比一开始期望的语义更广义 490 | 的其他语义. 而这些新的语义的发现又促使人们写下新的规则, 491 | 构造新的类型论. 这是一个事物走向自身的否定, 进而走向否定 492 | 的否定的过程. 493 | 494 | 事实上, 类型论的发展像很多学科一样, 从某个主干开始 495 | 不断产生不同的分支. 而每个时期中数学家对不同分支投入的精力 496 | 不同. 我们会大致以每个分支产生的时间顺序讲述, 但是并非严格如此. 497 | 譬如较老的分支在后来的应用上产生了成果, 我仍然会在讲述这个分支 498 | 的章节一并介绍. 499 | 500 | 如上文所述, 本文将会以对语法和语义的研究之间的矛盾运动 501 | 为主线. 类型论有非常广泛的分支和应用, 本文不可能面面俱到. 502 | 如在计算机科学中用于对程序的正确性进行检查的类型论, 由于和 503 | 数学中提到的类型论关系较远, 文章中就不做过多介绍. 我们从Russell 504 | 的类型论出发, 以当代研究前沿的立方类型论为终点. 505 | -------------------------------------------------------------------------------- /chapters/martin-lof.tex: -------------------------------------------------------------------------------- 1 | \chapter{Martin-L\"of类型论}\label{martinlof} 2 | 3 | Martin-L\"of 在 70 年代前后提出了多个类似的类型论. 4 | 其中最本质的特征在于接下来介绍的相等类型. 因此我们会把 5 | 具有类似特征的其他类型论也归到此类介绍. 6 | 7 | 我们首先回顾一下之前遇到的类型. 我们有依值函数的 8 | \(\Pi\)-类型, 还有 \(\Sigma\)-类型表示后者的类型依赖于 9 | 前者的值有序对的类型. 一般的函数类型 \(\to\) 与乘积类型 10 | \(\times\) 可以分别表示为它们的特殊情况. 11 | 在纯类型系统中, 我们介绍了类型的 12 | 类型 (如 \(\cons{type}, \cons{kind}\) 等) 对类型系统 13 | 的影响. 接下来我们会称这些对象为\textbf{宇宙}. 14 | 15 | \section{归纳类型} 16 | 17 | 我们可以继续引入类型, 例如自然数. 首先有两种构造自然数 18 | 的方式:一种是 \(\cons{zero} : \mathbb N\); 一种 19 | 是给定一个自然数 \(n : \mathbb N\), 取它的后继 20 | \(\cons{succ}(n) : \mathbb N\). 我们称 21 | \(\cons{zero}\) 与 \(\cons{succ}\) 为\textbf{构造子}. 22 | 除了能够构造自然数之外, 我们还需要能够使用 23 | 自然数.\footnote{构造子就是\emph{输出}是自然数的函数 24 | (\(\cons{zero}\)是有零个参数的函数), 而我们需要\emph{输入}是自然数的函数. 25 | 在数学中我们经常遇到的\emph{泛性质}就是类似的思想.} 26 | Curry--Howard对应在这里又发挥了神奇的作用:用于证明命题的 27 | 归纳法与用于定义函数的递归定义法, 实际上是同一件事情! 28 | 考虑\textbf{消去子} 29 | \[\cons{elim} : 30 | \prod_{P : \mathbb N \to \cons{type}} 31 | P(\cons{zero}) \to 32 | \left[\prod_{m : \mathbb N} P(m) \to P(\cons{succ}(m))\right] 33 | \to \prod_{n : \mathbb N} P(n).\] 34 | 回忆之前提到的使用嵌套的函数类型表示多个参数的函数的技巧. 35 | 同时这里 \(\Pi\)-类型的优先级最低. 如果从逻辑的视角阅读 36 | 这个类型, 我们得到的就是 37 | \begin{quotation} 38 | 对于所有含有变量 \(n : \mathbb N\) 的命题 \(P(n)\), 39 | 如果 \(P(\cons{zero})\) 成立, 并且对于每个 40 | \(m : \mathbb N\), \(P(m)\) 可以推出 \(P(\cons{succ}(m))\), 41 | 那么命题就对所有的 \(n\) 成立. 42 | \end{quotation} 43 | 这无疑就是归纳法. 而另一方面, 如果我们代入 \(P(n) = \mathbb N\), 44 | 那么这个类型就变成了 45 | \[\underbrace{\mathbb N}_{f(0)} \to 46 | [\underbrace{\overbrace{\mathbb N}^{m} \to \overbrace{\mathbb N}^{f(m)} \to \mathbb N} 47 | _{\text{利用 \(m\) 与 \(f(m)\) 表达 \(f(m+1)\)}}] \to 48 | \underbrace{\mathbb N \to \mathbb N}_{\text{得到 \(f\)}}.\] 49 | 这就是递归定义. 作为例子, 如果我们令 50 | \(f(0) = 0\), \(f(m+1) = f(m)+2\), 那么 51 | \(f\) 就是将输入乘以\(2\)的函数. 具体写出来就是 52 | \[\cons{elim}\, P\,\cons{zero}\,\lambda m u. \cons{succ}(\cons{succ}(u))\] 53 | 这里用了类似之前的记号, \(fmn\) 表示函数 \(f\) 接受两个参数 \(m\) 与 \(n\). 54 | 读者可以自行和类型比对. 在\cite{friedman:2018:typer}中 55 | 作者用谈话的形式, 趣味十足地讲解了类似的各种构造, 56 | 读者可以参考. 对于一般的 \(P\), 这就是依值类型下的递归. 57 | 譬如如果定义了向量空间的概念, 我们可以用消去子构造一个函数, 58 | 输入 \(n\), 输出 \(n\)维向量空间中的零向量. 这样就要求 59 | \(P(n)\) 是 “\(n\)维向量空间” 这个类型, 因此依赖于 \(n\). 60 | 61 | 为了递归能够成立, 我们还要引入相关的等式. 我们在之前也 62 | 已经为函数类型引入了等式. 这实际上是表达式上的等价关系. 63 | 如果我们定义了一个函数 \(f = \cons{elim}\,P\,z\,s\), 64 | 那么我们希望 \(f(\cons{zero}) = z\), 并且 65 | \(f(\cons{succ}(n)) = s\,n\,f(n)\). 我们用 66 | 阿拉伯数字简写自然数, 那么就有 67 | \[f(3) = s\,2\,f(2) = s\,2\,(s\,1\,f(1)) = s\,2\,(s\,1\,(s\,0\,z)).\] 68 | 这些类型可以推广到一般的\textbf{归纳类型}, 以及 69 | 更强大的一些变体, 如 Martin-L\"of 引入了 W-类型的概念. 70 | 我们不详细介绍. 71 | 72 | \section{相等类型}\label{martinlof:identity} 73 | 数学中最常见的命题就是两个对象的相等. 因此由 Curry--Howard 74 | 对应, 我们应该有一个类型反映这一点. 对于两个同类型的元素 75 | \(x,y : A\), 我们有\textbf{相等类型} \(x =_A y\).\footnote{这 76 | 在文献中有许多不同的记号. 有些文献使用 \(\equiv\), 77 | 还有一些文献直接使用 \(\cons{Id}_A(x,y)\).} 78 | 如果没有歧义, 可以简写成 \(x = y\). 79 | 80 | 注意这和我们之前使用的等号含义有所区别. 之前使用的等号, 81 | 其描述的相等性都是“不言自明”的. 如将一个复杂的表达式用 82 | 一个字母缩写, 此时我们认为这个缩写并不存在于类型论中, 83 | 只是为了人们实际书写方便而引入的. 还有如 \((\lambda x.x)y = y\) 84 | 的等式; 上面介绍了自然数可以用递归定义加法, 则 85 | \(3 + 5 = 8\) 也是类似的等式. 这些等式在很多情况下 86 | 都是有机械的化简或者判定相等的方法的. 然而, 我们引入的 87 | 相等类型可以描述如 \(m + n =_{\mathbb N} n + m\) 或者 \(\zeta(2) =_{\mathbb R} \frac{\pi^2}{6}\) 88 | 这样的需要证明的定理. 这些显然没有机械的判定方法, 否则 89 | 数学家都要失业了! 90 | 我们称前者为\textbf{判值相等} (judgemental equality), 91 | 而后者(即相等类型)为\textbf{命题相等} (propositional equality). 92 | 自然, 判值相等的东西也命题相等. 93 | 94 | 命题相等还有一个特点, 就是我们可以用它们来构造更复杂的命题, 95 | 如 \(\neg (a^3 + b^3 =_{\mathbb N} c^3)\) 等等. 96 | 判值相等是表达式上的等价关系, 并不是一个类型, 所以不能 97 | 参与构造更复杂的命题. 98 | 99 | 为什么我们需要这样辨析相等的概念呢? 其实前一章中已经暗示 100 | 了这一点. 假如我们有一个 \(\mathbb R^{1+1}\) 类型 101 | 中的元素, 那么我需要能将它用于 \(\mathbb R^2\) 中. 102 | 这就需要类型论中有一个可以机械地判断的相等概念, 否则就无法 103 | 机械地判断某个表达式类型是否正确, 进而在Curry--Howard对应下 104 | 就意味着无法判断某个证明是否真的证明了命题. 一个类型论 105 | 不一定需要有命题相等, 但是一定有判值相等的概念. 当然这个概念 106 | 可以是平凡的, 比如只有字面相等的表达式才判值相等; 这就 107 | 产生了\textbf{弱类型论}(weak type theory). 108 | 在另一个极端, 我们也可以设定一条规则, 让命题相等 109 | 的概念和判值相等的概念重合: 110 | \[\frac{M =_A N}{M = N}.\] 111 | 这就产生了\textbf{外延类型论}(extensional type theory).% 112 | \footnote{相对应的不含这条规则的 Martin-L\"of 113 | 类型论又称作\textbf{内涵类型论}(intensional 114 | type theory). 以后谈到 Martin-L\"of 类型论, 若不 115 | 特别说明, 均指内涵类型论.} 116 | 这样的代价就是判值相等不再可以机械地判定, 因此在其中 117 | 写下一个命题的证明, 也没有明确的办法判断这是否是正确的证明. 118 | 这三种类型论的联系可以参考~\cite{winterhalter:2018:ettwtt}. 119 | 120 | 不过, 我们还得先说明相等类型本身的规则是什么. 首先是 121 | 构造子 122 | \[\cons{refl}_a : a =_A a.\] 123 | 这对应\emph{同一律}: 每个元素都等于其自身. 124 | 我们有对应的消去子 125 | \[\cons{J} : 126 | \prod_{P : \prod_{a,b:A} a = b \to \cons{type}} 127 | \left[\prod_{c : A} P\,a\,a\,\cons{refl}_a\right] \to \prod_{a,b:A}\prod_{p : a=b} P\,a\,b\,p\] 128 | 这说的是“如果 \(P\) 对所有的 \(\cons{refl}\) 都成立, 129 | 那么它就对所有的 \(p : a=_A b\) 成立”. 130 | 在实用的类型论中, 通常会允许省略前面两个参数. 因此可以直接写做 131 | \(P\,\cons{refl}_a\), 可以通过上下文推导出两个省略 132 | 的参数都是 \(a\). 同时我们为了方便也会将 133 | \(\cons{refl}_a\) 省略为 \(\cons{refl}\). 134 | 类似地, 消去子和构造子的组合有一个等式, 这里不再给出. 135 | 读者可以参考~\cite{ufp:2013:hottbook}. 用字母J是因为 136 | Martin-L\"of在论文~\cite{martinlof:1984:J}中的相等 137 | 类型使用了 I, 而下一个字母就是 J. 138 | 139 | 神奇的是, 用 J 原理就足够证明等式的各种性质, 比如对称性 140 | \[\prod_{a,b:A} a = b \to b = a\] 141 | 与传递性 142 | \[\prod_{a,b,c:A} a=b \to b=c \to a=c.\] 143 | 给定任何一个表达式 \(P(x)\), 如果有 \(a=b\), 144 | 那么 \(P(a) = P(b)\). 如果类型 \(A = B\), 那么 145 | 其间有一个双射. 这些性质的证明, 读者可以参考~\cite[\S1.12]{ufp:2013:hottbook}. 146 | 147 | 不过仍然有一些问题无法只靠J原理解决. 其中最简单的例子是 148 | 函数的\textbf{外延性}, 即如果两个函数逐点相等, 那么它们 149 | 相等. 150 | \[\cons{funext} : \prod_{f,g : A \to B} 151 | \left[\prod_{x : A} f(x) = g(x)\right] \to f = g.\] 152 | 这在Martin-L\"of类型论中是无法证明或者证伪的. 153 | 在\cite{boulier:2017:syntacticmodel}中有非常简单易懂的证明. 154 | 这可以看作是Martin-L\"of类型论的一个缺点, 也可以理解为一种优点. 155 | 比如将函数看作算法, 那么尽管两个函数逐点相等, 它们的算法不同, 156 | 计算需要的时间也不同. 因此函数外延性在研究算法复杂度时就的确是不成立的. 157 | 尽管如函数外延性之类的命题无法证明, 我们还是可以 158 | 将这些命题作为额外的公理加入到理论中. 159 | 160 | Martin-L\"of类型论中还有一个重要的缺憾是没有\textbf{商类型}. 161 | 在数学中, 商去一个等价关系是极其常见的操作, 但是在 162 | Martin-L\"of类型论中很难加入对应的类型, 同时保证 163 | 类型论仍然具有好的性质. 注意我们可以直接将商类型作为 164 | 公理加入, 但是其他的类型均不需要公理, 这在审美上有一点 165 | 缺陷. 同时在证明类型论的性质时, 这种任意加入的公理一般 166 | 很难处理. 另外, 对于其他的类型, 我们都有对应的判值相等等式, 167 | 而公理只能影响命题相等, 因此判值相等的性质就被破坏了. 168 | 不过, 使用在 \ref{ch:bishop}~节中提到的广集的概念, 169 | 可以一定程度上规避这个问题. 这样做的缺点是每个广集上都 170 | 自带一个不同的等价关系作为“相等”, 因此需要时刻处理这些 171 | 额外的信息, 在严格书写证明的时候非常繁琐. 172 | 173 | \section{宇宙} 174 | 175 | 在Martin-L\"of类型论最早的版本(于1971年提出, 一般 176 | 被称作MLTT\textsubscript{71})中, 只有一个宇宙 177 | \(\cons{type}\), 满足 \(\cons{type} : \cons{type}\). 178 | 这个系统中存在Russell悖论. 因此后继的几个版本中, 179 | Martin-L\"of对此做出了一些修改. MLTT\textsubscript{73}中, 180 | 引入了一套\textbf{宇宙层级}, 即引入可数个宇宙 181 | \(\cons{type}_i : \cons{type}_{i+1}\). 182 | 其中 \(i\) 不是类型论内部的自然数, 而是我们为了书写 183 | 方便引入的, 实际上有可数个不同的符号. 184 | 185 | 宇宙的规则与之前提到的构造演算有一个重要的不同. 186 | 构造演算有两层宇宙 \(\cons{type} : \cons{kind}\), 187 | 我们写成 \(\cons{type}_i (i = 1,2)\). 那么如果 188 | \(A : \cons{type}_i, B : \cons{type}_j\), 函数类型 189 | 就有 \(A \to B : \cons{type}_j\). 注意函数类型 190 | 一定在后者的宇宙之中, 尽管有可能 \(i > j\). 这意味着 191 | 这里的函数类型表现得与集合论中的函数集合相差甚远, 因为 192 | 考虑函数类型 \(\cons{type}_1 \to A\), 其中 \(A : \cons{type}_1\) 193 | 是任意一个类型. 那么这个函数类型的定义域中也包含 \(\cons{type}_1 \to A\), 194 | 但是如ZFC集合论中函数集合的定义域无论如何也不能包含这个函数集合 195 | 自身! 196 | 197 | 在Martin-L\"of类型论中, 如果 198 | \(A : \cons{type}_i, B : \cons{type}_j\), 函数类型 199 | 就有 \(A \to B : \cons{type}_{\max\{i,j\}}\). 200 | 这使得Martin-L\"of类型论成为一种\textbf{直谓类型论} 201 | (predicative type theory).\footnote{直谓一词有 202 | 多个相关但不等同的含义, 这里只是一种含义.} 这样, 在一般 203 | 数学中的一些非直谓的定义就会出现一些复杂的变化. 譬如在 204 | 拓扑的定义中, 我们需要考虑任何一族开集的并. 假设开集的 205 | 类型是 \(\Omega : \cons{type}_i\), 那么如何描述一族 206 | 开集 \(U_\alpha\) 呢? 我们需要一个指标 \(\alpha : A\), 207 | 因此 \(U\) 可以看作是 \(A \to \Omega\) 的函数. 208 | 这便出现了一个问题: 类型 \(A : \cons{type}_j\) 中, 209 | \(j\) 的取值应该是什么? 并不是任意选择都合理, 因为 210 | 我们可能无法把一个集合 \(S\) 的内部定义成所有开集 \(U \subseteq S\) 211 | 的并, 它的宇宙层级不正确. 212 | 213 | 这些问题在经典数学中其实也有体现, 为了避免Russell悖论, 214 | 一部分数学家(包括Russell本人)提出我们应当避免 215 | 非直谓的操作. 在受到这些限制的情况下发展的数学, 统称 216 | 为\textbf{直谓数学}. 构造主义又给直谓数学增添了新的 217 | 内容: 有些公理与排中律可以共同推出一些非直谓的结论, 因此 218 | 经典直谓数学中拒绝这些公理. 在构造主义直谓数学中却可以 219 | 允许这些公理存在. 读者可以 220 | 阅读\cite{feferman:2000:predicative}进一步 221 | 了解直谓数学. 222 | 223 | 构造演算中允许高度的非直谓性. 这导致轻微的拓展就容易 224 | 出现Russell类的悖论. 作为妥协, 在很多变种中, 225 | 只允许最底层的宇宙有非直谓性. 换言之, 如果 \(A : \cons{type}_i\), 226 | \(B : \cons{type}_j\), 那么 227 | \(A \to B : \cons{type}_{f(i,j)}\), 其中 228 | \[f(i,j) = \begin{cases} 229 | 1 & (j = 1)\\ 230 | \max\{i,j\} & (j > 1) 231 | \end{cases}\] 232 | 最底层的宇宙通常被称为命题宇宙, 写作 \(\cons{prop}\). 233 | 构造演算原本不存在集合论的对应, 但是如此修改之后, 可以 234 | 将 \(\cons{prop}\) 中的类型对应为集合论中的命题. 235 | 这样修改之后, 构造演算就能加入类似Martin-L\"of类型论 236 | 中的归纳类型与相等类型等等. 不过底层的非直谓性仍然会给 237 | 类型论设计带来一些困难, 因此为了避免悖论需要注意很多技术细节. 238 | 这种类型论称为\textbf{归纳构造演算}(Calculus of Inductive 239 | Constructions, 缩写为 CIC). 240 | 241 | \section{自洽性} 242 | 243 | 由于对宇宙的直谓性安排, 很容易证明Martin-L\"of类型论 244 | 有\textbf{自洽性}, 即不存在元素 \(u : \mathbf 0\). 245 | 这里 \(u\) 不能含有自由变量. 根据 Curry--Howard 对应, 246 | 这意味着理论没有矛盾. 247 | 248 | 我们将每个类型解释为集合. 如 \(\mathbf 0\) 是空集, 249 | \(\mathbb{N}\) 是自然数集, 等等. \(\cons{type}_1\) 250 | 则是集合的集合, 并且它在 \(\Sigma\)-类型, 251 | \(\Pi\)-类型, 相等类型等等操作下封闭. 252 | 这在集合论中对应一个熟知的构造. 253 | 考虑一个基数 \(\kappa > \aleph_0\), 254 | 使得任何少于 \(\kappa\) 个小于 \(\kappa\) 的基数相加仍然小于 \(\kappa\), 255 | 并且任何小于 \(\kappa\) 的基数幂集仍然小于 \(\kappa\). 256 | 这种基数称为\textbf{强不可达基数}. 257 | 此时集合论中的 von Neumann 宇宙 \(V_{\kappa}\) 258 | 就包含自然数集合, 并且关于依值函数集等操作封闭. 259 | 因此我们可以将 \(\cons{type}_1\) 解释为 \(V_{\kappa}\) 260 | 接下来, 我们设 \(\cons{type}_2\) 261 | 解释为包含 \(\cons{type}_1\), 并且在同样的操作下 262 | 封闭的集合, 依次类推. 263 | 这也就是说要有一列强不可达基数 \(\kappa_1 < \kappa_2 < \dots\), 264 | 这样就能每个类型都赋予了一个集合. 265 | 并且对于每个类型论的元素 \(x : A\), 我们都能在 \(A\) 266 | 对应的集合中找到一个对应的元素. 而空集没有元素, 因此类型 267 | \(\mathbf 0\) 中没有元素. 268 | 269 | 然而, 依值类型论中只有自洽性是不够的. 因为有自洽性不代表 270 | 存在一个机械的方法判断某个证明是否正确. 我们需要更强的典范性. 271 | Martin-L\"of类型论的典范性证明, 要么初等而极其繁琐, 要么 272 | 需要一定的范畴论知识. 我们在之后会介绍一定的范畴论工具. 273 | 读者也可以参考~\cite[\S5.6]{sterling:2021:thesis}. 274 | 275 | \section{应用} 276 | 277 | Martin-L\"of类型论及其变体有非常广泛的应用, 这里拾取一些介绍. 278 | 279 | \subsection{Coq/Rocq} 280 | 281 | Coq (现已更名为Rocq)是一套交互式定理证明软件. 它基于构造归纳演算, 名字也来源于 282 | 构造演算的缩写 CoC 与其提出者 Coquand 的名字. 它的主要特点是 283 | 允许一种接近自然语言的证明方法. 284 | 285 | 我们假设已经有了自然数的加法操作, 满足 \(0 + n = n\), 286 | \(\cons{succ}(m) + n = \cons{succ}(m+n)\). 回忆这里 287 | \(\cons{succ}\) 指的是自然数的后继. 考虑一个自然语言的证明. 288 | \begin{theorem} 289 | 对于任何自然数 \(m\), \(m+0 = 0\). 290 | \end{theorem} 291 | \begin{proof} 292 | 只需要对 \(m\) 归纳. \(m\) 为 \(0\) 时由于 \(0 + n = n\) 293 | 对任何 \(n\) 成立, 代入 \(0\) 即可. 当 \(m\) 为 294 | \(\cons{succ}(m')\) 时, 根据已知条件有 295 | \(\cons{succ}(m') + 0 = \cons{succ}(m'+0)\), 296 | 再由归纳假设得到 \(m' + 0 = m'\), 从而命题成立. 297 | \end{proof} 298 | 299 | 在 Martin-L\"of 类型论中直接写出这个命题的证明是非常长的, 300 | 并且写完之后难以阅读. 读者可以尝试一下, 用于检测自己对类型论 301 | 的知识是否熟悉. 在 Coq 中提供了\textbf{证明策略}(tactic)的语言, 302 | 此时这个命题的证明可以写成 303 | \begin{minted}{coq} 304 | Proof. 305 | intros m. induction m as [| m' H ]. 306 | - apply add_zero. 307 | - rewrite add_succ. rewrite H. reflexivity. 308 | Qed. 309 | \end{minted} 310 | 这与自然语言几乎完全一致. 第一句话用策略 \texttt{intros} 311 | 引入了变量 \(m\), 第二句话对其进行归纳. 312 | 这里 \(m'\) 就是在第二种情况下 313 | 的变量名, \(H\) 是归纳假设. 接下来的第一种情况 314 | 是 \(m = 0\), 此时我们使用一条已知的定理 \texttt{add\_zero}, 315 | 即 \(0 + n = n\). Coq 自动推断出这里应当取 \(n = 0\). 316 | 第二种情况是 \(m = \cons{succ}(m')\), 此时 317 | 我们有归纳假设 \(H : m' + 0 = m'\). 我们的目标是 318 | 证明 \(\cons{succ}(m') + 0 = \cons{succ}(m')\). 319 | 现在我们使用已知的定理 \(\cons{succ}(m') + n = \cons{succ}(m'+n)\) 320 | 将等式左侧\emph{改写}, 得到 321 | \(\cons{succ}(m' + 0) = \cons{succ}(m')\). 322 | 接下来再使用归纳假设改写得到 \(\cons{succ}(m') = \cons{succ}(m')\). 323 | 而这使用等式的自反性即可. 324 | 325 | 同时, 注意Coq是\emph{交互式}定理证明软件. 在 326 | 输入这个证明时, Coq会时刻告诉我们当前这一步有哪些 327 | 条件, 目前还有哪些目标. 同时, 我们可以自己编写 328 | 强大的自动化证明策略, 如 \texttt{tauto} 策略可以 329 | 自动解决命题逻辑的证明(即不涉及\(\forall, \exists\)的操作). 330 | 不过需要注意的是, Coq 的核心功能是\emph{检查人类的证明}. 331 | 因此它的首要目标是保证检查没有疏漏. 一些其他的软件 332 | 目标在于自动化证明尽可能多的命题, 它们的目标不同, 333 | 因此是无法相互比较的. 334 | 335 | 在2005年, Georges Gonthier 等人在 Coq 中完全形式化了 336 | 四色定理的证明. 这个定理目前人类所知的证明中涉及到了上千 337 | 种情况的讨论, 因此人力几乎不可能保证其正确无误. 在 Coq 形式化 338 | 过程中, 也发现了不少对计算机科学有用的图论技巧. 读者可以阅读 339 | 发表在《美国数学学会通讯》 (\emph{AMS Notices}) 上的 340 | 文章~\cite{gonthier:2008:fourcolor} 中对证明思路与技巧的概述, 341 | 只需要高中数学水平, 不需要任何Coq知识. 342 | 343 | 在计算机领域, Coq也经常用于验证软件代码是否正确. 344 | 2009年, Xavier Leroy 等人开发了完全经由 Coq 验证的 345 | 代码编译器 CompCert~\cite{leroy:2009:compcert}, 346 | 证明了这样规模的形式化验证在实践中是可行的. 347 | 348 | \subsection{Lean} 349 | 350 | Lean 是基于归纳构造演算的通用编程语言与交互式定理证明软件. 351 | 它的社区的主要目标是构建一套完整的数学定理库. 为此, 在大部分 352 | 时候它都使用了排中律作为公理. 同时, 它也直接将商类型作为 353 | 公理加入类型论中. 尽管前文中说过这都会破坏类型论的性质, 但是 354 | 由于Lean社区的主要目标不同, 这并不非常重要. Lean社区注重 355 | 数学家的使用体验, 因此会对许多使用细节针对性优化. 同时, Lean 也有一套 356 | 强大的证明策略语言. 357 | 358 | 正如文章开头提到的, Lean社区在一年半的时间中, 完成了 359 | Fields奖得主Scholze提出的一个挑战, 证明了Lean在数学领域 360 | 的建设是非常成功的. 有本科数学基础的读者如果想要尝试 361 | 上手一款定理证明软件, 那么笔者推荐使用 Lean. Coq 与 Agda 362 | 对有计算机科学背景的读者更加友好. 363 | 364 | \subsection{Agda} 365 | 366 | Agda也是基于类似Martin-L\"of类型系统的交互式定理证明 367 | 软件. 它尽管也有证明策略语言, 但是主要特征是\textbf{类型驱动开发}. 368 | 用户在输入证明时, 可以随时留下一个“洞”. 此时Agda会提示 369 | 这个洞需要填入什么类型的表达式, 与当前有哪些可用的条件. 370 | 用户可以让Agda执行一些操作修改洞附近的代码, 在这个与 371 | 软件合作的过程中逐步完成整个证明. 譬如证明定理 372 | \(\forall n. n + 0 = n\). 373 | \begin{minted}{agda} 374 | theorem : (n : Nat) -> n + 0 == n 375 | theorem = ? 376 | \end{minted} 377 | 这里的问号就是待填入的内容. 此时可以使用快捷键 378 | 命令Agda引入变量, 它便会自动将代码修改为 379 | \begin{minted}{agda} 380 | theorem : (n : Nat) -> n + 0 == n 381 | theorem n = ? 382 | \end{minted} 383 | 接下来, 我们命令Agda对\(n\)归纳, 代码就会变为 384 | \begin{minted}{agda} 385 | theorem : (n : Nat) -> n + 0 == n 386 | theorem zero = ? 387 | theorem (succ x) = ? 388 | \end{minted} 389 | 以此类推. 由于这里类型系统强大的表达能力, 我们可以 390 | 直接使用类型指导应该填入哪些东西. 391 | 392 | Agda实现了非常多前沿的类型论, 如可以开启立方类型论 393 | 模式, 就能在立方类型论中进行定理证明. Agda 还支持 394 | 自定义公理及其重写规则来模拟全新的类型论. 因此, 395 | Agda 对类型论研究者非常友好, 便于进行实验. 396 | 397 | \subsection{其他} 398 | 399 | \textbf{逻辑框架}(logical framework) 虽然规则上 400 | 大体相似, 但是与上文描述的 Martin-L\"of 类型论 401 | 的使用方式风格非常不同. 一个具体的软件实现是Twelf, 402 | 主要用于程序验证等. 403 | 404 | Nuprl 与 Andromeda 是基于外延类型论的计算机辅助证明软件. 405 | 尽管上文中我们说过外延集合论中一个证明是否正确难以机械判定, 406 | 但是这些软件中允许用户手动插入额外的说明, 用于帮助软件进行判断. 407 | Sterling 与 Favonia 等人在 Nuprl 的思想基础上开发了一种 408 | 积立方类型论的原型实现~RedPRL. 409 | -------------------------------------------------------------------------------- /chapters/prospect.tex: -------------------------------------------------------------------------------- 1 | \chapter{展望} 2 | 在最近十几年来, 类型论的研究有了大跨步的发展. 3 | 在理论方面, 我们对类型论的本质结构有了更加深刻的认识. 4 | 在实践层面, 有了许多重要的形式化与非形式化的工作. 5 | 不过, 仍然有许多问题有待回答. 6 | 7 | 利用基于类型论的定理证明检查器形式化了许多著名的成果, 8 | 这足够证明类型论形式化数学的潜力. 9 | 类型论的核心部分往往非常简洁, 使得证明其性质相对方便, 10 | 但是实际使用时会使得写出的证明无比繁琐. 11 | 在这个方向, 我们仍然需要进一步改进定理证明的\textbf{前端}, 12 | 即与使用者直接交互的部分. 13 | 例如, 需要让定理证明的体验与数学家的习惯相契合, 14 | 能让用户使用各个数学领域常用的符号和缩写, 15 | 组织证明时能流畅使用各种常见的证明技巧, 16 | 平凡的计算细节可以自动化处理, 等等. 17 | 2023 年发表的 Sebastian Ullrich~\cite{ullrich:2023:frontend} 的学位论文可以参考. 18 | 19 | 与此相关, 基于神经网络的人工智能在定理证明中也有应用的潜力, 20 | 例如在繁杂的定理库中快速筛选出与当前目标相关的部分. 21 | 由于已经有成熟的组件检查输出的证明是否正确, 22 | 这就避开了最近出现的大语言模型在关于事实准确性方面的短板. 23 | 有不少工作将神经网络整合到定理自动证明体系中, 24 | 如 LeanDojo~\cite{yang:2023:leandojo} 等. 25 | 26 | 有一类类型论在近年来得到了许多关注, 它们称为\textbf{模态类型论}. 27 | 这起源于逻辑学中的模态逻辑. 28 | 例如可以用模态 \(\lozenge p\) 表示“可能 \(p\)”, 29 | 进而研究关于可能性与必然性的逻辑. 30 | 模态逻辑可用于研究可能性、时态、知识、道德等等 31 | 在哲学与逻辑学中有意义的话题.\footnote{例如考虑这个有趣的悖论: 32 | 我认识张三, 我不认识面前这个戴面具的人, 因此张三和面具人不相同.} 33 | 而在数学方面, 许多重要的概念都可以统一到类型论中的模态框架下, 34 | 同时一些综合数学系统中也会遇到适合用模态公理化的对象, 35 | 例如稳定同伦论或者对于递归程序的验证逻辑等. 36 | 模态类型论可能可以将各种优势各异的类型系统统一到同一个类型论中. 37 | 38 | 在同伦类型论方面, 我们知道简单类型论与积闭范畴之间有等价关系; 39 | 而 \cite{clairambault:2014:biequivalence} 中证明了 40 | 带有外延相等类型的 Martin-L\"of 类型论与局部积闭范畴之间有等价关系. 41 | 那么内涵 Martin-L\"of 类型论对应什么呢? 42 | 一个合理的猜想是它与 \((\infty, 1)\)-局部积闭范畴等价. 43 | 但是证明此事困难重重. 第一在于我们尚未了解清楚 Martin-L\"of 类型论 44 | 构成怎样的 \(\infty\)-范畴, 或许这需要合适的 \(\infty\)-自然模型的概念. 45 | 其次是对于二者之间的等价也尚不知道如何构造, 46 | 例如从 \((\infty, 1)\)-局部积闭范畴得到类型论, 47 | 目前只知道局部可表范畴的情况. 48 | 而再进一步, 同伦类型论对应什么呢? 49 | 应当是某种初等 \((\infty, 1)\)-意象的概念. 50 | 但是这连定义都尚未明确, 更不用提证明了. 51 | 52 | 立方类型论解决了同伦类型论的计算问题. 53 | 例如 Brunerie~\cite{brunerie:2016:number} 证明了 54 | 存在自然数 \(n\) 使得 \(\pi_4(\mathbb S^3) = \mathbb Z/n\mathbb Z\). 55 | 因为立方类型论中任何一个自然数表达式都判值相等于某个具体的自然数 56 | \(\cons{succ}(\cons{succ}(\dots (\cons{zero})))\), 57 | 因此理论上我们可以直接在立方类型论中化简, 最后应当得到 58 | \((2, p)\), 其中 \(p\) 是同构的证明. 这样就不再需要额外证明 59 | 这个自然数 \(n = 2\). 然而, 因为所需的计算资源与时间过长, 60 | 目前还没有电脑成功完成这个计算. 61 | 目前有一些旨在改进立方类型论的计算效率的工作, 62 | 但是也可能需要设计全新的类型论才能解决这个问题. 63 | 64 | 关于泛等数学基础, \cite{ufp:2013:hottbook} 65 | 已经发展了许多半形式化的基于泛等数学基础的理论. 66 | 我们需要更多的在泛等基础中半形式化或者非形式化的数学工作. 67 | 并且这些工作不应当限制于类型论的话题中, 68 | 而是应当更加积极地探索泛等数学基础能为更广泛的领域带来怎样的贡献. 69 | 非形式化的数学中, 可以不提及或者模糊处理类型的概念. 70 | 然而, 同伦类型论, 包括立方类型论, 71 | 是目前泛等数学基础唯一的严格形式化方法. 72 | 泛等数学基础是否只能在类型论中实现呢? 这个问题尚待解答. 73 | 74 | -------------------------------------------------------------------------------- /history.bib: -------------------------------------------------------------------------------- 1 | @incollection{abramsky:1995:domain, 2 | title = {Domain theory}, 3 | author = {Abramsky, Samson and Jung, Achim}, 4 | booktitle = {Handbook of logic in computer science (vol. 3) semantic structures}, 5 | year = {1995} 6 | } 7 | @article{automath:1994:automath, 8 | title = {Selected papers on Automath}, 9 | author = {R.P. Nederpelt and J.H. Herman Geuvers and R.C. de Vrijer and L.S. van Benthem Jutting and David Van Daalen}, 10 | journal = {Studies in logic and the foundations of mathematics}, 11 | year = {1994}, 12 | volume = {133}, 13 | pages = {299--301} 14 | } 15 | @misc{cartwright:2016:domain, 16 | url = {https://arxiv.org/abs/1605.05858}, 17 | author = {Cartwright, Robert and Parsons, Rebecca and AbdelGawad, Moez}, 18 | title = {Domain Theory: An Introduction}, 19 | publisher = {arXiv}, 20 | year = {2016} 21 | } 22 | @article{church:1932:untyped, 23 | title = {A Set of Postulates for the Foundation of Logic}, 24 | author = {Alonzo Church}, 25 | journal = {Annals of Mathematics}, 26 | year = {1932}, 27 | volume = {33}, 28 | pages = {346} 29 | } 30 | @article{church:1936:lambda, 31 | title = {An Unsolvable Problem of Elementary Number Theory}, 32 | author = {Alonzo Church}, 33 | journal = {American Journal of Mathematics}, 34 | year = {1936}, 35 | volume = {58}, 36 | pages = {345} 37 | } 38 | @article{curry:1934:combinatorCH, 39 | author = {H. B. Curry}, 40 | title = {Functionality in Combinatory Logic}, 41 | journal = {Proceedings of the National Academy of Sciences}, 42 | volume = {20}, 43 | number = {11}, 44 | pages = {584-590}, 45 | year = {1934}, 46 | url = {https://www.pnas.org/doi/abs/10.1073/pnas.20.11.584} 47 | } 48 | @article{eberl:2018:pnt, 49 | author = {Manuel Eberl and Lawrence C. Paulson}, 50 | title = {The Prime Number Theorem}, 51 | journal = {Archive of Formal Proofs}, 52 | month = {9}, 53 | year = {2018}, 54 | note = {\url{https://isa-afp.org/entries/Prime_Number_Theorem.html}, 55 | Formal proof development} 56 | } 57 | @article{farmer:2008:virtues, 58 | title = {The seven virtues of simple type theory}, 59 | journal = {Journal of Applied Logic}, 60 | volume = {6}, 61 | number = {3}, 62 | pages = {267-286}, 63 | year = {2008}, 64 | url = {https://www.sciencedirect.com/science/article/pii/S157086830700081X}, 65 | author = {William M. Farmer} 66 | } 67 | @book{friedman:2018:typer, 68 | title = {The Little Typer}, 69 | author = {Friedman, Daniel P and Christiansen, David Thrane}, 70 | publisher = {MIT Press}, 71 | series = {The MIT Press}, 72 | month = {9}, 73 | year = {2018}, 74 | address = {London, England} 75 | } 76 | @phdthesis{girard:1972:systemf, 77 | author = {Jean-Yves Girard}, 78 | school = {Universit\'e Paris VII}, 79 | title = {Interpr\'etation fonctionnelle et \'elimination des cou\-pures dans l'arith\-m\'e\-tique d'ordre sup\'erieure}, 80 | url = {http://prl.ccs.neu.edu/img/g-thesis-1972.pdf}, 81 | year = {1972} 82 | } 83 | @book{hartshorne:1977:ag, 84 | author = {Robin Hartshorne}, 85 | editor = {S. Axler and F. W. Gehring and K. A. Ribet}, 86 | publisher = {Springer}, 87 | title = {Algebraic Geometry}, 88 | year = {1977} 89 | } 90 | @incollection{hofmann:1998:groupoid, 91 | author = {Hofmann, Martin and Streicher, Thomas}, 92 | title = {{The groupoid interpretation of type theory}}, 93 | booktitle = {{Twenty Five Years of Constructive Type Theory}}, 94 | publisher = {Oxford University Press}, 95 | year = {1998}, 96 | month = {10}, 97 | url = {https://doi.org/10.1093/oso/9780198501275.003.0008} 98 | } 99 | @book{johnstone:2008:elephant, 100 | place = {Oxford}, 101 | title = {Sketches of an Elephant: A topos theory compendium}, 102 | publisher = {Oxford University Press}, 103 | author = {Johnstone, Peter T.}, 104 | year = {2003}, 105 | volume = {1} 106 | } 107 | @article{joyal:2019:topologie, 108 | title = {Topo-logie}, 109 | author = {Mathieu Anel and Andr{\'e} Joyal}, 110 | year = {2019}, 111 | journal = {New Spaces in Mathematics}, 112 | url = {http://mathieu.anel.free.fr/mat/doc/Anel-Joyal-Topo-logie.pdf} 113 | } 114 | @incollection{lawvere:1994:objective, 115 | editor = {John Macnamara and Gonzalo E. Reyes}, 116 | author = {F. William Lawvere}, 117 | publisher = {Oxford University Press USA}, 118 | pages = {43--56}, 119 | booktitle = {The Logical Foundations of Cognition}, 120 | title = {Tools for the Advancement of Objective Logic: Closed Categories and Toposes}, 121 | year = {1994} 122 | } 123 | @article{lean:2020:mathlib, 124 | title = {The lean mathematical library}, 125 | author = {The mathlib Community}, 126 | journal = {Proceedings of the 9th ACM SIGPLAN International Conference on Certified Programs and Proofs}, 127 | year = {2020} 128 | } 129 | @article{loader:1998:stlc, 130 | title = {Notes on Simply Typed Lambda Calculus}, 131 | author = {Ralph Loader}, 132 | year = {1998}, 133 | url = {http://www.lfcs.inf.ed.ac.uk/reports/98/ECS-LFCS-98-381/ECS-LFCS-98-381.pdf} 134 | } 135 | @inproceedings{maclane:1971:category, 136 | title = {Categories for the working mathematician}, 137 | author = {Saunders Maclane}, 138 | year = {1971} 139 | } 140 | @book{maclane:2012:sheaves, 141 | title = {Sheaves in Geometry and Logic: A First Introduction to Topos Theory}, 142 | author = {MacLane, S. and Moerdijk, I.}, 143 | series = {Universitext}, 144 | year = {2012}, 145 | publisher = {Springer New York} 146 | } 147 | @article{mclarty:1990:toposhistory, 148 | title = {The Uses and Abuses of the History of Topos Theory}, 149 | author = {Colin McLarty}, 150 | journal = {The British Journal for the Philosophy of Science}, 151 | year = {1990}, 152 | volume = {41}, 153 | pages = {351 - 375} 154 | } 155 | @misc{me:2022:lccc, 156 | url = {https://arxiv.org/abs/2202.04543}, 157 | author = {Huang, Xu}, 158 | title = {Locally Cartesian Closed Categories}, 159 | publisher = {arXiv}, 160 | year = {2022} 161 | } 162 | @inproceedings{reynolds:1974:systemf, 163 | title = {Towards a theory of type structure}, 164 | author = {John C. Reynolds}, 165 | booktitle = {Symposium on Programming}, 166 | year = {1974} 167 | } 168 | @inproceedings{reynolds:1984:polymorphism, 169 | title = {Polymorphism is not Set-Theoretic}, 170 | author = {John C. Reynolds}, 171 | booktitle = {Semantics of Data Types}, 172 | year = {1984} 173 | } 174 | @misc{scholze:2020:liquid, 175 | author = {Peter Scholze}, 176 | howpublished = {\url{https://xenaproject.wordpress.com/2020/12/05/liquid-tensor-experiment/}}, 177 | title = {Liquid tensor experiment}, 178 | year = {2020} 179 | } 180 | @article{schonfinkel:1924:combinator, 181 | title = {{\"U}ber die Bausteine der mathematischen Logik}, 182 | author = {Moses Sch{\"o}nfinkel}, 183 | journal = {Mathematische Annalen}, 184 | volume = {92}, 185 | pages = {305-316}, 186 | year = {1924} 187 | } 188 | @article{seely:1984:lccc, 189 | title = {Locally cartesian closed categories and type theory}, 190 | author = {Robert A. G. Seely}, 191 | journal = {Mathematical Proceedings of the Cambridge Philosophical Society}, 192 | year = {1984}, 193 | volume = {95}, 194 | pages = {33 - 48} 195 | } 196 | @incollection{sep:2022:typetheory, 197 | author = {Coquand, Thierry}, 198 | title = {{Type Theory}}, 199 | booktitle = {The {Stanford} Encyclopedia of Philosophy}, 200 | editor = {Edward N. Zalta and Uri Nodelman}, 201 | howpublished = {\url{https://plato.stanford.edu/archives/fall2022/entries/type-theory/}}, 202 | year = {2022}, 203 | edition = {{F}all 2022}, 204 | publisher = {Metaphysics Research Lab, Stanford University} 205 | } 206 | @book{smullyan:1985:mockingbird, 207 | author = {Raymond Smullyan}, 208 | publisher = {Knopf}, 209 | title = {To Mock a Mockingbird and Other Logic Puzzles: Including an Amazing Adventure in Combinatory Logic}, 210 | year = {1985} 211 | } 212 | @phdthesis{sterling:2021:thesis, 213 | author = {Sterling, Jonathan}, 214 | school = {Carnegie Mellon University}, 215 | year = {2021}, 216 | doi = {10.5281/zenodo.6990769}, 217 | note = {Version 1.1, revised May 2022}, 218 | number = {CMU-CS-21-142}, 219 | title = {First Steps in Synthetic {Tait} Computability: The Objective Metatheory of Cubical Type Theory} 220 | } 221 | @book{tobias:2002:isabelle, 222 | author = {Nipkow, Tobias and Paulson, Lawrence and Wenzel, Markus}, 223 | year = {2002}, 224 | month = {01}, 225 | title = {Isabelle/HOL --- A Proof Assistant for Higher-Order Logic}, 226 | journal = {Lecture Notes in Computer Science - LNCS}, 227 | doi = {10.1007/3-540-45949-9}, 228 | publisher = {Springer} 229 | } 230 | @book{ufp:2013:hottbook, 231 | author = {The {Univalent Foundations Program}}, 232 | title = {Homotopy Type Theory: Univalent Foundations of Mathematics}, 233 | publisher = {\url{https://homotopytypetheory.org/book}}, 234 | address = {Institute for Advanced Study}, 235 | year = {2013} 236 | } 237 | @unpublished{wadler:1990:free, 238 | author = {Philip Wadler}, 239 | note = {Unpublished manuscript}, 240 | title = {Recursive Types for Free!}, 241 | year = {1990}, 242 | url = {https://homepages.inf.ed.ac.uk/wadler/papers/free-rectypes/free-rectypes.txt} 243 | } 244 | @misc{escardo:2018:univalence, 245 | url = {https://arxiv.org/abs/1803.02294}, 246 | author = {Escardó, Martín Hötzel}, 247 | title = {A self-contained, brief and complete formulation of Voevodsky's Univalence Axiom}, 248 | publisher = {arXiv}, 249 | year = {2018} 250 | } 251 | @article{awodey:2013:structuralism, 252 | author = {Awodey, Steve}, 253 | title = {Structuralism, Invariance, and Univalence}, 254 | journal = {Philosophia Mathematica}, 255 | volume = {22}, 256 | number = {1}, 257 | pages = {1-11}, 258 | year = {2013}, 259 | month = {10}, 260 | url = {https://doi.org/10.1093/philmat/nkt030} 261 | } 262 | @misc{brunerie:2016:number, 263 | url = {https://arxiv.org/abs/1606.05916}, 264 | author = {Brunerie, Guillaume}, 265 | title = {On the homotopy groups of spheres in homotopy type theory}, 266 | publisher = {arXiv}, 267 | year = {2016} 268 | } 269 | @inproceedings{barendregt:1992:lambda, 270 | title = {Lambda calculi with types}, 271 | author = {Barendregt, Henk P}, 272 | year = {1992}, 273 | publisher = {Oxford: Clarendon Press}, 274 | url = {http://www.cosc.brocku.ca/~mwinter/Courses/5P05/HBKJ.pdf} 275 | } 276 | @misc{winterhalter:2018:ettwtt, 277 | author = {Théo Winterhalter and Matthieu Sozeau and Nicolas Tabareau}, 278 | howpublished = {\url{https://github.com/TheoWinterhalter/ett-to-itt}}, 279 | title = {Eliminating Reflection from Type Theory}, 280 | year = {2018} 281 | } 282 | @thesis{streicher:1993:K, 283 | author = {Thomas Streicher}, 284 | title = {Investigations into Intensional Type Theory}, 285 | type = {Habilitation thesis}, 286 | institution = {Ludwig Maximilian University of Munich}, 287 | year = {2019}, 288 | url = {https://www2.mathematik.tu-darmstadt.de/~streicher/HabilStreicher.pdf} 289 | } 290 | @article{martinlof:1984:J, 291 | title = {Constructive mathematics and computer programming}, 292 | author = {Per Martin-L{\"o}f}, 293 | journal = {Studies in logic and the foundations of mathematics}, 294 | year = {1984}, 295 | volume = {104}, 296 | pages = {167-184}, 297 | url = {https://www.cs.tufts.edu/~nr/cs257/archive/per-martin-lof/constructive-math.pdf} 298 | } 299 | @article{boulier:2017:syntacticmodel, 300 | title = {The next 700 syntactical models of type theory}, 301 | author = {Simon Pierre Boulier and Pierre-Marie P{\'e}drot and Nicolas Tabareau}, 302 | journal = {Proceedings of the 6th ACM SIGPLAN Conference on Certified Programs and Proofs}, 303 | year = {2017} 304 | } 305 | @book{smith:2018:category, 306 | author = {Peter Smith}, 307 | publisher = {Logic Matters, Cambridge}, 308 | title = {Category Theory I: Notes towards a gentle introduction}, 309 | year = {2023}, 310 | url = {https://www.logicmatters.net/resources/pdfs/SmithCat-I.pdf} 311 | } 312 | 313 | @article{Lawvere:1963:functorial, 314 | title = {Functorial Semantics of Algebraic Theories}, 315 | author = {F. William Lawvere}, 316 | journal = {Proceedings of the National Academy of Sciences of the United States of America}, 317 | year = {1963}, 318 | volume = {50}, 319 | pages = {869-872} 320 | } 321 | @article{carl:1998:brouwer, 322 | title = {Brouwer versus Hilbert: 1907–1928}, 323 | author = {J. Posy Carl}, 324 | journal = {Science in Context}, 325 | year = {1998}, 326 | volume = {11}, 327 | pages = {291 - 325} 328 | } 329 | @incollection{sep:2022:constructive, 330 | author = {Bridges, Douglas and Palmgren, Erik and Ishihara, Hajime}, 331 | title = {{Constructive Mathematics}}, 332 | booktitle = {The {Stanford} Encyclopedia of Philosophy}, 333 | editor = {Edward N. Zalta and Uri Nodelman}, 334 | howpublished = {\url{https://plato.stanford.edu/archives/fall2022/entries/mathematics-constructive/}}, 335 | year = {2022}, 336 | edition = {{F}all 2022}, 337 | publisher = {Metaphysics Research Lab, Stanford University} 338 | } 339 | @book{brouwer:1981:intuitionism, 340 | title = {Brouwer's Cambridge lectures on intuitionism}, 341 | author = {Luitzen Egbertus Jan Brouwer}, 342 | editor = {Dirk van Dalen}, 343 | year = {1981}, 344 | publisher = {Cambridge University Press} 345 | } 346 | @article{bauer:2016:fivestage, 347 | title = {Five stages of accepting constructive mathematics}, 348 | author = {Andrej Bauer}, 349 | journal = {Bulletin of the American Mathematical Society}, 350 | year = {2016}, 351 | volume = {54}, 352 | pages = {481-498} 353 | } 354 | @book{beeson:1985:constructive, 355 | author = {Michael J. Beeson}, 356 | publisher = {Springer Berlin, Heidelberg}, 357 | title = {Foundations of Constructive Mathematics}, 358 | year = {1985} 359 | } 360 | @misc{blechschmidt:2021:internal, 361 | url = {https://arxiv.org/abs/2111.03685}, 362 | author = {Ingo Blechschmidt}, 363 | title = {Using the internal language of toposes in algebraic geometry}, 364 | publisher = {arXiv}, 365 | year = {2021} 366 | } 367 | @misc{bch:2017:cubical, 368 | url = {https://arxiv.org/abs/1710.10941}, 369 | author = {Bezem, Marc and Coquand, Thierry and Huber, Simon}, 370 | title = {The univalence axiom in cubical sets}, 371 | publisher = {arXiv}, 372 | year = {2017} 373 | } 374 | @article{cchm:2015:cubical, 375 | title = {Cubical Type Theory: A Constructive Interpretation of the Univalence Axiom}, 376 | author = {Cyril Cohen and Thierry Coquand and Simon Huber and Anders M{\"o}rtberg}, 377 | journal = {FLAP}, 378 | year = {2015}, 379 | volume = {4}, 380 | pages = {3127-3170} 381 | } 382 | @article{abcfhl:2021:cubical, 383 | title = {Syntax and models of Cartesian cubical type theory}, 384 | author = {Carlo Angiuli and Guillaume Brunerie and Thierry Coquand and Robert Harper and Kuen-Bang Hou (Favonia) and Daniel R. Licata}, 385 | journal = {Mathematical Structures in Computer Science}, 386 | year = {2021}, 387 | volume = {31}, 388 | pages = {424 - 468} 389 | } 390 | @article{bezem:2015:simplicial, 391 | title = {A Kripke model for simplicial sets}, 392 | author = {Marc Bezem and Thierry Coquand}, 393 | journal = {Theor. Comput. Sci.}, 394 | year = {2015}, 395 | volume = {574}, 396 | pages = {86-91} 397 | } 398 | @inproceedings{sterling:2021:normalization, 399 | url = {https://doi.org/10.1109%2Flics52264.2021.9470719}, 400 | year = 2021, 401 | month = 6, 402 | publisher = {{IEEE}}, 403 | author = {Jonathan Sterling and Carlo Angiuli}, 404 | title = {Normalization for Cubical Type Theory}, 405 | booktitle = {2021 36th Annual {ACM}/{IEEE} Symposium on Logic in Computer Science ({LICS})} 406 | } 407 | @misc{amelia:2023:1lab, 408 | author = {1Lab contributors}, 409 | howpublished = {\url{https://1lab.dev}}, 410 | title = {1Lab: A formalised, cross-linked reference resource for mathematics done in Homotopy Type Theory}, 411 | year = {2023} 412 | } 413 | @inproceedings{sterling:2019:xtt, 414 | author = {Jonathan Sterling and Carlo Angiuli and Daniel Gratzer}, 415 | title = {{Cubical Syntax for Reflection-Free Extensional Equality}}, 416 | booktitle = {4th International Conference on Formal Structures for Computation and Deduction (FSCD 2019)}, 417 | pages = {31:1--31:25}, 418 | series = {Leibniz International Proceedings in Informatics (LIPIcs)}, 419 | year = {2019}, 420 | volume = {131}, 421 | editor = {Herman Geuvers}, 422 | publisher = {Schloss Dagstuhl--Leibniz-Zentrum fuer Informatik}, 423 | address = {Dagstuhl, Germany}, 424 | url = {http://drops.dagstuhl.de/opus/volltexte/2019/10538} 425 | } 426 | @article{gonthier:2008:fourcolor, 427 | title = {Formal proof--the four-color theorem}, 428 | author = {Gonthier, Georges and others}, 429 | journal = {Notices of the AMS}, 430 | volume = {55}, 431 | number = {11}, 432 | pages = {1382--1393}, 433 | year = {2008} 434 | } 435 | @unpublished{feferman:2000:predicative, 436 | title = {Relationships between Constructive, Predicative and Classical Systems of Analysis}, 437 | author = {Solomon Feferman}, 438 | year = {2000}, 439 | url = {http://math.stanford.edu/~feferman/papers/relationships.pdf} 440 | } 441 | @article{leroy:2009:compcert, 442 | title = {Formal verification of a realistic compiler}, 443 | author = {Xavier Leroy}, 444 | journal = {Commun. ACM}, 445 | year = {2009}, 446 | volume = {52}, 447 | pages = {107-115} 448 | } 449 | @book{oliveri:2022:structure, 450 | editor = {Gianluigi Oliveri, Claudio Ternullo, Stefano Boscolo}, 451 | publisher = {Springer Cham}, 452 | title = {Objects, Structures, and Logics}, 453 | year = {2022} 454 | } 455 | @misc{henry:2019:constructive, 456 | url = {https://arxiv.org/abs/1905.06160}, 457 | author = {Simon Henry}, 458 | title = {A constructive account of the Kan-Quillen model structure and of Kan's Ex$^{\infty}$ functor}, 459 | publisher = {arXiv}, 460 | year = {2019} 461 | } 462 | @article{huber:2018:canonicity, 463 | doi = {10.1007/s10817-018-9469-1}, 464 | journal = {J Autom Reasoning}, 465 | author = {Simon Huber}, 466 | title = {Canonicity for Cubical Type Theory}, 467 | year = {2018} 468 | } 469 | @article{cartmell:1986:contextualcat, 470 | title = {Generalised algebraic theories and contextual categories}, 471 | journal = {Annals of Pure and Applied Logic}, 472 | volume = {32}, 473 | pages = {209-243}, 474 | year = {1986}, 475 | issn = {0168-0072}, 476 | doi = {https://doi.org/10.1016/0168-0072(86)90053-9}, 477 | author = {John Cartmell} 478 | } 479 | @inproceedings{hofmann:1995:lccccoh, 480 | author = {Martin Hofmann}, 481 | editor = {Leszek Pacholski and Jerzy Tiuryn}, 482 | title = {On the interpretation of type theory in locally cartesian closed categories}, 483 | booktitle = {Computer Science Logic}, 484 | year = {1995}, 485 | publisher = {Springer Berlin Heidelberg}, 486 | address = {Berlin, Heidelberg}, 487 | pages = {427--441} 488 | } 489 | @misc{uemura:2019:general, 490 | url = {https://arxiv.org/abs/1904.04097}, 491 | author = {Uemura, Taichi}, 492 | title = {A General Framework for the Semantics of Type Theory}, 493 | publisher = {arXiv}, 494 | year = {2019} 495 | } 496 | @article{awodey:2018:natural, 497 | title = {Natural models of homotopy type theory}, 498 | volume = {28}, 499 | doi = {10.1017/S0960129516000268}, 500 | number = {2}, 501 | journal = {Mathematical Structures in Computer Science}, 502 | publisher = {Cambridge University Press}, 503 | author = {Steve Awodey}, 504 | year = {2018}, 505 | pages = {241–286} 506 | } 507 | @article{curien:2014:revisit, 508 | title = {Revisiting the categorical interpretation of dependent type theory}, 509 | journal = {Theoretical Computer Science}, 510 | volume = {546}, 511 | pages = {99-119}, 512 | year = {2014}, 513 | issn = {0304-3975}, 514 | doi = {https://doi.org/10.1016/j.tcs.2014.03.003}, 515 | author = {Pierre-Louis Curien and Richard Garner and Martin Hofmann} 516 | } 517 | @article{jacobs:1993:comprehensioncat, 518 | title = {Comprehension Categories and the Semantics of Type Dependency}, 519 | author = {Bart Jacobs}, 520 | journal = {Theor. Comput. Sci.}, 521 | year = {1993}, 522 | volume = {107}, 523 | pages = {169-207} 524 | } 525 | @article{castellan:2019:cwf, 526 | title = {Categories with Families: Unityped, Simply Typed, and Dependently Typed}, 527 | author = {Simon Castellan and Pierre Clairambault and Peter Dybjer}, 528 | journal = {ArXiv}, 529 | year = {2019}, 530 | volume = {abs/1904.00827} 531 | } 532 | @misc{sterling:2023:geometry, 533 | title = {Towards a geometry for syntax}, 534 | author = {Jonathan Sterling}, 535 | year = {2023}, 536 | eprint = {2307.09497}, 537 | archiveprefix = {arXiv}, 538 | primaryclass = {cs.LO} 539 | } 540 | @article{curien:1993:coherence, 541 | author = {Pierre--Louis Curien}, 542 | title = {Substitution up to Isomorphism}, 543 | year = {1993}, 544 | issue_date = {Sept./Oct. 1993}, 545 | publisher = {IOS Press}, 546 | address = {NLD}, 547 | volume = {19}, 548 | number = {1–2}, 549 | issn = {0169-2968}, 550 | journal = {Fundamenta Informaticae}, 551 | month = {9}, 552 | pages = {51–85}, 553 | numpages = {35} 554 | } 555 | @article{clairambault:2014:biequivalence, 556 | year = 2014, 557 | month = {4}, 558 | publisher = {Cambridge University Press ({CUP})}, 559 | volume = {24}, 560 | number = {6}, 561 | author = {Pierre Clairambault and Peter Dybjer}, 562 | title = {The biequivalence of locally cartesian closed categories and Martin-Löf type theories}, 563 | journal = {Mathematical Structures in Computer Science} 564 | } 565 | @phdthesis{newstead:2018:natmod-poly, 566 | author = {Clive Newstead}, 567 | school = {Carnegie Mellon University}, 568 | title = {Algebraic models of dependent type theory}, 569 | year = {2018}, 570 | url = {https://arxiv.org/abs/2103.06155} 571 | } 572 | @inproceedings{dybjer:1995:internal, 573 | title = {Internal Type Theory}, 574 | author = {Peter Dybjer}, 575 | booktitle = {Types for Proofs and Programs}, 576 | year = {1995} 577 | } 578 | @article{lumsdaine:2015:universes, 579 | year = 2015, 580 | month = {7}, 581 | publisher = {Association for Computing Machinery ({ACM})}, 582 | volume = {16}, 583 | number = {3}, 584 | pages = {1--31}, 585 | author = {Peter Lefanu Lumsdaine and Michael A. Warren}, 586 | title = {The Local Universes Model}, 587 | journal = {{ACM} Transactions on Computational Logic} 588 | } 589 | @phdthesis{ullrich:2023:frontend, 590 | author = {Sebastian Andreas Ullrich}, 591 | year = {2023}, 592 | title = {An Extensible Theorem Proving Frontend}, 593 | doi = {10.5445/IR/1000161074}, 594 | publisher = {{Karlsruher Institut für Technologie (KIT)}}, 595 | keywords = {interactive theorem proving, Lean, macros, functional programming}, 596 | pagetotal = {243}, 597 | school = {Karlsruher Institut für Technologie (KIT)}, 598 | language = {english} 599 | } 600 | @misc{yang:2023:leandojo, 601 | title = {LeanDojo: Theorem Proving with Retrieval-Augmented Language Models}, 602 | author = {Kaiyu Yang and Aidan M. Swope and Alex Gu and Rahul Chalamala and Peiyang Song and Shixing Yu and Saad Godil and Ryan Prenger and Anima Anandkumar}, 603 | year = {2023}, 604 | eprint = {2306.15626}, 605 | archiveprefix = {arXiv}, 606 | primaryclass = {cs.LG} 607 | } 608 | @misc{gratzer:2021:syntactic, 609 | title = {Syntactic categories for dependent type theory: sketching and adequacy}, 610 | author = {Daniel Gratzer and Jonathan Sterling}, 611 | year = {2021}, 612 | eprint = {2012.10783}, 613 | archiveprefix = {arXiv}, 614 | primaryclass = {cs.LO} 615 | } 616 | @article{jacobs:1996:cubism, 617 | author = {Bart Jacobs}, 618 | journal = {Journal of Functional Programming}, 619 | number = {3}, 620 | title = {On cubism}, 621 | volume = {6}, 622 | year = {1996}, 623 | pages = {379-392} 624 | } 625 | -------------------------------------------------------------------------------- /history.tex: -------------------------------------------------------------------------------- 1 | \documentclass[UTF8]{ctexbook} 2 | \usepackage[T1]{fontenc} 3 | \usepackage[a4paper]{geometry} 4 | \usepackage{graphicx} 5 | \usepackage[dvipsnames]{xcolor} 6 | \usepackage{amssymb,amsmath,amsthm} 7 | \usepackage[lightning]{stmaryrd} 8 | \usepackage{tcolorbox,fancyhdr,marginnote} 9 | \usepackage{mathrsfs,verbatim,quiver} 10 | \usepackage{biblatex} 11 | \usepackage{hyperref} 12 | \usepackage{fontspec} 13 | \usepackage{minted} 14 | 15 | % Chinese font 16 | % \setCJKmainfont{Songti SC}[ 17 | % UprightFont = Songti SC Light, 18 | % ItalicFont = Kaiti SC, 19 | % BoldItalicFont = Kaiti SC Bold, 20 | % ] 21 | 22 | % Load computer modern font for e.g. cyrillic. 23 | % Referring by file name is needed 24 | % to get compatibility on my laptop and GitHub CI. 25 | \newfontfamily\tempfont[ 26 | BoldFont={cmunbx.otf}, 27 | ItalicFont={cmunti.otf}, 28 | BoldItalicFont={cmunbi.otf}, 29 | Ligatures=TeX 30 | ]{cmunrm.otf} 31 | 32 | % Lightning symbols 33 | \DeclareMathOperator\Reflect{\rotatebox[origin=c]{180}{\(\lightning\)}} 34 | \DeclareMathOperator\Reify{\reflectbox{\(\lightning\)}} 35 | 36 | % mathrsfs only supports a set of fixed sizes. 37 | % Fixed by declaring myself. 38 | \DeclareFontFamily{U}{rsfs}{\skewchar\font127 } 39 | \DeclareFontShape{U}{rsfs}{m}{n}{% 40 | <-6.5> rsfs5 41 | <6.5-8.5> rsfs7 42 | <8.5-> rsfs10 43 | }{} 44 | 45 | % Defining some colors for hyperref 46 | \newcommand\myshade{80} 47 | \colorlet{mylinkcolor}{violet} 48 | \colorlet{mycitecolor}{orange} 49 | \colorlet{myurlcolor}{Aquamarine} 50 | 51 | \hypersetup{ 52 | linkcolor = mylinkcolor!\myshade!black, 53 | citecolor = mycitecolor!\myshade!black, 54 | urlcolor = myurlcolor!\myshade!black, 55 | colorlinks = true, 56 | } 57 | 58 | % Small set of macros 59 | \newcommand{\cons}[1]{\textnormal{\textsf{#1}}} 60 | \newcommand{\slogan}[1]{\begin{center}% 61 | \tcbox[colback=red!10, colframe=red!80!green]{% 62 | \large\textbf{\heiti{#1}}% 63 | }% 64 | \end{center}} 65 | % Add a single hiragana "Yo". 66 | \DeclareFontFamily{U}{min}{} 67 | \DeclareFontShape{U}{min}{m}{n}{<-> udmj30}{} 68 | \newcommand{\yo}{\mathop{\!\text{\usefont{U}{min}{m}{n}\symbol{'210}}\!}} 69 | % op 70 | \newcommand{\op}{^\mathrm{op}} 71 | % Tikz \mapsto arrow 72 | \usetikzlibrary{arrows} 73 | \tikzset{|/.tip={Bar[width=.8ex,round]}} 74 | 75 | % Theorems and definitions 76 | \theoremstyle{plain} 77 | \newtheorem{lemma}{引理}[chapter] 78 | \newtheorem{theorem}{定理}[chapter] 79 | \newtheorem{corollary}{推论}[chapter] 80 | \newtheorem{example}{例}[chapter] 81 | 82 | \theoremstyle{definition} 83 | \newtheorem{definition}{定义}[chapter] 84 | 85 | \theoremstyle{remark} 86 | \newtheorem*{remark}{注} 87 | 88 | % Bib resource 89 | \addbibresource{history.bib} 90 | 91 | % Page style 92 | \pagestyle{fancy} 93 | \fancyhead[L]{\nouppercase{\kaishu\rightmark}} 94 | \fancyhead[R]{\nouppercase{\kaishu\leftmark}} 95 | \setlength{\headheight}{14pt} 96 | 97 | % Berries! 98 | \definecolor{berry1}{RGB}{230,255,170} 99 | \definecolor{berry2}{RGB}{255,160,126} 100 | \definecolor{berry3}{RGB}{220,200,40} 101 | \definecolor{berry4}{RGB}{79,53,130} 102 | \newcommand{\berryglow}[1]{ 103 | \begin{tikzpicture} 104 | \useasboundingbox (-0.5cm, -0.5cm) rectangle (0.5cm, 0.5cm); 105 | \draw[inner color=berry#1, draw opacity=0] (-0.6,-0.6) rectangle (0.6,0.6); 106 | \node at (0,0) {\includegraphics[width=1cm]{images/difficulty#1.png}}; 107 | % Pixel size 16x16, 1000% enlarged 108 | \end{tikzpicture} 109 | } 110 | \newcommand{\berryglowinf}{ 111 | % Secret infinity category berry 112 | \begin{tikzpicture} 113 | \useasboundingbox (-0.5cm, -0.5cm) rectangle (0.8cm, 0.5cm); 114 | \draw[inner color=berry3, draw opacity=0] (-0.7,-0.7) rectangle (0.7,0.7); 115 | \node at (0,0) {\includegraphics[width=2.5cm]{images/infinity.png}}; 116 | \node[font=\normalsize] at (0,0.7) {\(\infty\)}; 117 | % This one has a text so we need to ensure size 118 | % Pixel size 40x24, 1000% enlarged 119 | \end{tikzpicture} 120 | } 121 | \newcommand{\berry}[1]{\marginnote[% 122 | \hfill% 123 | \berryglow{#1}% 124 | ]{% 125 | \berryglow{#1}% 126 | \hfill% 127 | }} 128 | \newcommand{\berryinf}{\marginnote[% 129 | \hfill% 130 | \berryglowinf% 131 | ]{% 132 | \berryglowinf% 133 | \hfill% 134 | }} 135 | 136 | \begin{document} 137 | %%% Title Page 138 | \thispagestyle{empty} 139 | \vspace*{\fill} 140 | \begin{flushright} 141 | \zihao{0}\heiti 类型论简史\\ 142 | \Large\sf A Brief History of Type Theory\\ 143 | \vspace{1em} 144 | \LARGE\sf Trebor 145 | \end{flushright} 146 | % A nice cover picture 147 | \begin{tikzpicture}[xscale=-3.6, yscale=3.5, 148 | every node/.style={font=\large}] 149 | \useasboundingbox (-1.3, -0.3) rectangle (1.8, 4); 150 | \node (A) at (0,0) {\((((\bullet\bullet)\bullet)\bullet)\bullet\)}; 151 | \node (B) at (-1, 1) {\(((\bullet\bullet)\bullet)(\bullet\bullet)\)}; 152 | \node (C) at (0,1) {\(((\bullet(\bullet\bullet))\bullet)\bullet\)}; 153 | \node (D) at (0.5, 1.5) {\((\bullet((\bullet\bullet)\bullet))\bullet\)}; 154 | \node (E) at (1, 2) {\((\bullet(\bullet(\bullet\bullet)))\bullet\)}; 155 | \node (F) at (1.5, 1.5) {\(((\bullet\bullet)(\bullet\bullet))\bullet\)}; 156 | \node (G) at (-1, 2) {\((\bullet(\bullet\bullet))(\bullet\bullet)\)}; 157 | \node (H) at (-0.5, 2.5) {\(\bullet(((\bullet\bullet)\bullet)\bullet)\)}; 158 | \node (I) at (1.5, 2.5) {\((\bullet\bullet)((\bullet\bullet)\bullet)\)}; 159 | \node (J) at (-1, 3) {\(\bullet((\bullet\bullet)(\bullet\bullet))\)}; 160 | \node (K) at (0, 3) {\(\bullet((\bullet(\bullet\bullet)\bullet))\)}; 161 | \node (L) at (0.5, 3.5) {\(\bullet(\bullet((\bullet\bullet)\bullet))\)}; 162 | \node (M) at (1.5, 3.5) {\((\bullet\bullet)(\bullet(\bullet\bullet))\)}; 163 | \node (N) at (0.5, 4.5) {\(\bullet(\bullet(\bullet(\bullet\bullet)))\)}; 164 | \draw[black!40!white, line width=2.4pt] 165 | (B) -- (M); 166 | \draw[ultra thick, double=gray, draw=white, double distance=2pt] 167 | (A) -- (B) (A) -- (C) (A) -- (F) 168 | (B) -- (G) 169 | (C) -- (D) (C) -- (G) 170 | (D) -- (E) (D) -- (H) 171 | (E) -- (K) 172 | (F) -- (E) (F) -- (I) 173 | (G) -- (J) 174 | (H) -- (J) (H) -- (K) 175 | (I) -- (L) (I) -- (M) 176 | (J) -- (N) 177 | (K) -- (L) 178 | (L) -- (N) 179 | (M) -- (N); 180 | \end{tikzpicture} 181 | \newpage 182 | %%% Epigraph 183 | \thispagestyle{empty} 184 | \vspace*{0.2\pdfpageheight} 185 | \begin{quotation}\sf 186 | Category theory implements the relative point of 187 | view by means of \emph{slice categories}; but this 188 | language is greatly obfuscated in comparison to 189 | the simplicity of working with non-relative 190 | objects. The goal of type theory is to reconcile 191 | the expressivity of the relative point of view 192 | with the simplicity of the global point of view, 193 | by providing a language that makes movement 194 | between different slices (base change) seamless. 195 | \begin{flushright}\rm 196 | J. Sterling, \emph{Towards a geometry for syntax}.~\cite{sterling:2023:geometry} 197 | \end{flushright} 198 | \end{quotation} 199 | \newpage 200 | %%% Table of contents 201 | \pagenumbering{roman} 202 | \setcounter{tocdepth}{1} 203 | \tableofcontents 204 | \cleardoublepage 205 | %%% Body matter 206 | \pagenumbering{arabic} 207 | % \ziju{0.1} 208 | % \baselineskip=20pt 209 | \include{chapters/introduction.tex} 210 | \include{chapters/beginnings.tex} 211 | \include{chapters/curry-howard.tex} 212 | \include{chapters/martin-lof.tex} 213 | \include{chapters/category.tex} 214 | \include{chapters/hott.tex} 215 | \include{chapters/prospect.tex} 216 | 217 | \emergencystretch=1em 218 | \printbibliography[title=参考文献] 219 | \end{document} 220 | -------------------------------------------------------------------------------- /images/difficulty1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Trebor-Huang/history/cd4a53dda0161f0d2af110608eeb01240e258c1e/images/difficulty1.png -------------------------------------------------------------------------------- /images/difficulty2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Trebor-Huang/history/cd4a53dda0161f0d2af110608eeb01240e258c1e/images/difficulty2.png -------------------------------------------------------------------------------- /images/difficulty3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Trebor-Huang/history/cd4a53dda0161f0d2af110608eeb01240e258c1e/images/difficulty3.png -------------------------------------------------------------------------------- /images/difficulty4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Trebor-Huang/history/cd4a53dda0161f0d2af110608eeb01240e258c1e/images/difficulty4.png -------------------------------------------------------------------------------- /images/external-internal-small.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Trebor-Huang/history/cd4a53dda0161f0d2af110608eeb01240e258c1e/images/external-internal-small.png -------------------------------------------------------------------------------- /images/infinity.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Trebor-Huang/history/cd4a53dda0161f0d2af110608eeb01240e258c1e/images/infinity.png -------------------------------------------------------------------------------- /quiver.sty: -------------------------------------------------------------------------------- 1 | % *** quiver *** 2 | % A package for drawing commutative diagrams exported from https://q.uiver.app. 3 | % 4 | % This package is currently a wrapper around the `tikz-cd` package, importing necessary TikZ 5 | % libraries, and defining a new TikZ style for curves of a fixed height. 6 | % 7 | % Version: 1.2.2 8 | % Authors: 9 | % - varkor (https://github.com/varkor) 10 | % - AndréC (https://tex.stackexchange.com/users/138900/andr%C3%A9c) 11 | 12 | \NeedsTeXFormat{LaTeX2e} 13 | \ProvidesPackage{quiver}[2021/01/11 quiver] 14 | 15 | % `tikz-cd` is necessary to draw commutative diagrams. 16 | \RequirePackage{tikz-cd} 17 | % `amssymb` is necessary for `\lrcorner` and `\ulcorner`. 18 | \RequirePackage{amssymb} 19 | % `calc` is necessary to draw curved arrows. 20 | \usetikzlibrary{calc} 21 | % `pathmorphing` is necessary to draw squiggly arrows. 22 | \usetikzlibrary{decorations.pathmorphing} 23 | 24 | % A TikZ style for curved arrows of a fixed height, due to AndréC. 25 | \tikzset{curve/.style={settings={#1},to path={(\tikztostart) 26 | .. controls ($(\tikztostart)!\pv{pos}!(\tikztotarget)!\pv{height}!270:(\tikztotarget)$) 27 | and ($(\tikztostart)!1-\pv{pos}!(\tikztotarget)!\pv{height}!270:(\tikztotarget)$) 28 | .. (\tikztotarget)\tikztonodes}}, 29 | settings/.code={\tikzset{quiver/.cd,#1} 30 | \def\pv##1{\pgfkeysvalueof{/tikz/quiver/##1}}}, 31 | quiver/.cd,pos/.initial=0.35,height/.initial=0} 32 | 33 | % TikZ arrowhead/tail styles. 34 | \tikzset{tail reversed/.code={\pgfsetarrowsstart{tikzcd to}}} 35 | \tikzset{2tail/.code={\pgfsetarrowsstart{Implies[reversed]}}} 36 | \tikzset{2tail reversed/.code={\pgfsetarrowsstart{Implies}}} 37 | % TikZ arrow styles. 38 | \tikzset{no body/.style={/tikz/dash pattern=on 0 off 1mm}} 39 | 40 | \endinput 41 | --------------------------------------------------------------------------------