前集(Pre-set)的概念是相对于集合(Set),由数学家 Bishop 提出的。Bishop 认为定义一个集合需要三个步骤:
1. 定义该集合的元素是如何构建的(Construction)。
2. 定义集合中的两元素的相等关系(Equality)。
3. 证明该相等关系是自反的(Reflexive)、对称的(Symmetric)、以及传递的(Transitive)。
如果,在定义一个集合时,只满足了第一步,那么该集合称为前集(Pre-set),即,还未(not yet)称得上是集合(Set)。
那么,对于前集(Pre-set),可以其基础上,像集合一样,定义关系(Relation)与函数(Function),称为 前关系(Pre-relation)与前函数(Pre-function)。其中,最大的区别在于,不保持(preserve)相等关系(Equality),即,a = b ∈ S,f(a) 与 f(b) 不要求相等(equals)。
反过来说,也可以称函数(Function),是保持(preserve)相等关系的前函数。称保持相等关系的前函数满足外延性(Extensionality)。
那么,看看 ZFC in Lean中,是如何定义前集(Pre-set)。
这里,需要抽象地理解上述的定义,就是,通过 PSet 的构建函数 PSet.mk,给定一个类型α,以及 索引函数 A: α → PSet,可以得到一个PSet元素,记 PSet α A。也可以,反过来理解,一个前集(PSet),它包含了一个基类型(underlying type),以及基于其基类(underlying type)的前集索引函数,其中,索引指向的所有前集是正被定义前集的元素(members)。
还有一个注意的地方,就是 PSet: Type (u + 1),这里的 u+1 作用是以免 PSet 包含自身。
那么,就会问,什么样的元素属于 PSet?类似,集合中,其最底层元素是空集,这里也有对于PSet,的空集,定义如下:
然后,看看 PEmpty.elim 的定义:
其中,PEmpty的定义如下:
这样,对照起来看,对于PSet,其 类型α 为 PEmpty,其前集索引函数为 PEmpty.elim。这就是 PSet的空集,也记 ∅。
此时,就有了第一个 PSet 元素了,∅:PSet u,亦 empty: PSet u。
这里,有个有意思的知识点,因为,Lean里的类型宇宙并不累积的(Non-cumulative),因此,对于每层级类型宇宙 u,都会实例化其层级 u 为一个自然数,然后实例化其宇宙层次多态类型(universe-polymorphic type)。也就是,每层次的类型宇宙中,都存在一个实例化后的宇宙层次多态类型。对于 PSet来说,也是一样,即 PSet是宇宙层次多态类型,对于每层次的类型宇宙,都存在一个PSet类型,其中,∅是其元素。记,∅:PSet u。