Symmetry Book 笔记(1):类型,自然数,恒等类型,积类型

前两天看到一个Unimath 奇书一本:Symmetry Book。看介绍大概是从类型论开始,讲一些数学上的东西。好吧,其实我并没弄清楚这本书到底是讲什么的,但是看群里许多人都很懂,我想学一点类型论,就翻开了这本书。意外的是,前面的内容还算比较友好。接下来我可能会写一系列下面这种简单的笔记,但是看到我看不下去的地方可能就会咕了。总而言之就是自娱自乐的东西了。

什么是类型?

在编程语言中类型是非常常见的东西,我们都知道TrueBool,"abc"是String这些事情。在 Unimath 里,类型被用来给所有数学对象分类。每个数学对象都是某些(唯一)类型中的元素。

我们有一些常见的记号

  • a:Xa的类型是X
  • f:X\rightarrow Yf是一个从类型XY的函数
  • 如果f:X\rightarrow Y,g: Y\rightarrow Z, 那么g\circ f:=(a\mapsto g(f(a))) : X\rightarrow Z函数复合,可以读作"gafterf"
    • 函数复合有结合性:如果f:X\rightarrow Y​,g: Y\rightarrow Z​,h: Z\rightarrow W​, 那么(h \circ g)\circ f​h \circ (g\circ f)​是相同的
  • 单位函数\mathtt{id}_X:= (a\mapsto a): X\rightarrow X​
    • 如果f:X\rightarrow Y​,那么f\circ \mathtt{id}_X​,\mathtt{id}_Y \circ f​f​是相同的

自然数的类型

在类型论中,我们使用下面的皮亚诺规则来构造自然数

  • P1: 有一个类型叫做\mathbb{N},它中的元素被叫做自然数
  • P2:\mathbb{N}​中有一个元素叫做0​
  • P3: 如果m是一个自然数,那它的后继(successor)S(m)​也是自然数
  • P4: 给定一族类型X(m)​,它们依赖于参数m:\mathbb{N}​。只要我们提供X(0)​的一个元素a​,以及对于每个m​,提供一个函数g_m:X(m)\rightarrow X(S(m))​,我们就可以为每个m​定义出f(m):X(m)​。我们可以把结果f​看作是通过f(0):=a​f(S(m)):=g_m(f(m))​归纳定义而得到的。
    • P4给了我们通过“递归定义函数”或是“进行数学归纳”的能力

然后我们通过常用的方法书写自然数:\begin{align} 1&:=S(0)\\ 2&:=S(1)\\ t+1&:=S(t) \end{align}我们也可以定义一些常见的函数,如阶乘函数fact:\mathbb{N}\rightarrow \mathbb{N}

  • 首先我们需要对所有的m,将X(m)定义为\mathbb{N}
  • 然后我们定义fact(0):=1
  • 对于所有mfact(m+1):=(m+1)\cdot fact(m)

这是非常平常的定义。

在这一部分的最后,我们定义一种特殊形式的递归,迭代(iteration):

如果X是一个类型,e:X\rightarrow X,那么我们可以通过归纳的方式定义en次迭代,记作e^n

  • e^0:=\mathtt{id}_X
  • e^{n+1}:=e\circ e^n

这里,我们同样用到了P4,我们让所有的X(m)的类型均为X\rightarrow X,P4中的a我们选取\mathtt{id}_X,P4中的g_m我们选取(X\rightarrow X)\rightarrow (X\rightarrow X)类型的d\mapsto e\circ d。于是我们的得到了f:\mathbb{N}\rightarrow (X\rightarrow X)。我们只要定义e^n:=f(n)就得到了上面的定义。

恒等类型

恒等类型(Identity type) 或者相等类型(Equality type)是用来衡量相等性的类型。我们通过下面的规则来定义恒等类型:

  • E1: 对于任何类型X以及该类型的元素ab,存在一个类型a=b
  • E2: 对于任何类型X以及任何该类型的元素a, 类型a=a有一个元素叫refl_arefl是自反性(reflexivity)的意思,即任何元素都和它自身相等
  • E3: 对于任何类型X以及该类型的任何元素a, 给定一族类型P(b,e),这些类型依赖于X类型的参数ba=b类型的参数e。只要我们提供一个P(a, refl_a)的元素p,我们就可以为这族类型中的每个类型定义出元素f(b,e):P(b,e)。我们可以把结果f看作被单一地定义为f(a,refl_a):=p

我们可以把a=b类型的一个元素i称作ab的一个等化(identification,不确定正式译名)。如果我们知道至多只有一个这样的i,那么i就是ab相等的证明。所以refl_{S(S(0))}fact(2)=2的一个证明(这是平凡的)。

对E3规则的补充说明。这一条规则可能会理解起来有一定困难,这条归纳规则告诉我们,我们只需要提供a和自身相等的情况下的元素,就可以得出所有其他情况下的想要的元素。首先,我们需要知道,这条规则是我们规定的;其次,我们需要知道这样规定就是为了对应“相等”这一概念。首先我们假定已经有了一个关于a的元素p:P(b,e),这个p是和相等其实是没有关系的,由要构造/证明的具体事物决定;但是同时,我们仍然需要为P(b,e)提供一个e:a=a才能补全这个类型,这当然是我们熟悉的refl_a。接着我们考虑另外一个元素b,我们要得到和b相关的f(b,e):P(b,e),其中e:a=b。注意这个类型依赖于e,换句话说,我们必须提供一个a=b的证明。这种情况下,ab已经是相同的元素了,我们自然可以直接令f(b,e):=p。这里我们考虑的b是任意的,所以对于所有的b,只要我们能提供a=b的证明,我们就可以将a的性质,或是某个构造物,完全地挪到b那里去:对于性质而言,a的某个性质p一定也是b的性质;对于构造物而言从a中可以构造出p,一定也可以从b中构造出p​

下面,我们可以用这里的东西做一些简单的证明。

  • 等价性的对称性质首先我们假定a,b:X,如果我们有一个a=b类型的元素p,我们希望从中得到一个b=a类型的元素。回到我们的E3规则,对于所有的X类型元素b这里我们要构造的P(b,e)b=ae的类型则是a=b。通过E3规则我们可以知道,我们只需要找到特殊情形P(a,refl_a),也就是a=a类型的一个值p,我们知道refl_a刚好满足这个要求。于是我们就完成了等价性的交换性质的证明。
  • 等价性的传递性质首先我们假定a,b,c:X,如果我们有a=b类型的元素p,一个b=c类型的元素q,我们希望从中产生出一个a=c类型的元素。同样我们在这里仍然需要使用E3规则。我们要构造的E3中的P(c,e)a=ce的类型是b=c。通过E3规则,我们只需要找到特殊情形P(b,refl_b),也就是类型a=b的一个元素。而我们的p的类型刚好是a=b,所以我们令f(b,refl_b)=p即完成了证明。

现在,我们可以更正式地描述我们的对称性质和传递性质的证明结果:

  • 对任何类型X,任何a,b:Xsymm_{a,b}:(a=b)\rightarrow (b=a)的定义为symm_{a,a}(refl_a):=refl_a
  • 对任何类型X,任何a,b:Xtrans_{a,b,c}:(a=b)\rightarrow ((b=c)\rightarrow (a=c))的定义为trans_{a,b,c}(p):=refl_b\mapsto p

恒等类型可以用来替换:如果X是一个类型,T(x)是一族依赖于参数x:X的类型。假设x,y:Xe:x=y,那么就有一个函数transport_{T,e}:T(x)\rightarrow T(y)。定义如下:

  • transport_{T,refl_x}(t):=t

这个函数可以被称为“类型族T上沿着路径e的传输函数(transport function)”,简称传输函数(transport function,同样也不确定正式译名)。

当类型T(x)中可能有多个元素的时候,这些元素可以看作是为x提供了额外的结构(structure)。这时,我们称传输函数T(x)\rightarrow T(y)是从xy的结构的传输(transport of structure)。

  • 例如,T(x):=(x=x),那么x=x\rightarrow y=y类型的transport_ex的对称性传输给了y

反过来,如果类型T(x)至多只有一个元素,这个元素可以看作是证明了x的某个性质。这时,传输函数T(x)\rightarrow T(y)就可以说明yx有着同样的性质。

最后,我们说明函数保持相等性。对于所有类型X,Y,函数f:X\rightarrow Y,元素x,y:X。我们可以归纳地(通过E3规则)定义函数ap_f:x=y\rightarrow f(x)=f(y)ap_f(refl_x):=refl_{f(x)}(这里的定义和上面类似,略去具体细节)。

更一般地,如果Z(x)是一个类型,x:Xf(x):Z(x)是一个依赖函数,那么我们可以为所有的e:x=y定义依赖函数apd_f:(transport_{Z,e}(f(x)))=f(y)apd_f(refl_x):=refl_{f(x)}

积类型

如果X是类型,Y(x)是一族由x:X索引的类型,那么就有有积类型(product type)\prod_{x:X}Y(x),它的元素是函数f(a):Y(a)。普通的任意X\rightarrow Y类型的函数我们可以看作是\prod_{x:X}Y类型中的元素。

积类型中元素的相等性。如果\prod_{x:X}Y(x)中的两个元素f,g是相等的,那么对于对于所有的x:X,我们都能得到f(x)=g(x)。为了说明这一点,我们需要定义一个f=g\rightarrow \prod_{x:X}f(x)=g(x)类型的函数prodEq

  • 这里我们需要用到之前定义的transport_{T,e},其中T(g)f(x)=g(x)。于是transport_{T,e}通过transport_{T,refl_f}(t):=t定义出。它的完整类型为(f(x)=f(x))\rightarrow(f(x)=g(x))
  • 于是prodEq(e):=a\mapsto transport_{T,e}(refl_{f(a)})​
  • 好吧这里有点虚感觉哪里写的不对

反过来也有一个基本的原则叫做“函数的外延性”(function extensionality),即如果对于所有的x:Xf(x)=g(x)都成立,我们就可以得出f=g的结论。

编辑于 2019-02-17