在集合论与类型论的交汇处,Lawrence Paulson 最近的博客文章《Set theory with types》(2025 年 11 月 21 日)重提了 1973 年 N.G. de Bruijn 的论文《Set Theory with Type Restrictions》。de Bruijn 以此作为 AUTOMATH 依赖类型系统的动机,探讨了用类型限制集合以避免悖论的可能性。这启发我们在 HOL4(Higher-Order Logic 4)中形式化 ZF(Zermelo-Fraenkel)集合论公理,利用模拟依赖类型实现类型安全的集合操作。本文聚焦单一技术点:通过类型层级(rank)编码 ZF 公理,提供可落地的 HOL4 实现参数与监控清单,支持机器检查证明。
ZF 公理在 HOL4 中的类型化编码
HOL4 基于简单类型理论(simple type theory),原生不支持依赖类型(如 Lean 或 Agda),但可通过记录类型(records)和类型类(type classes)模拟依赖类型。核心思想:为每个集合引入 “类型层级” rank:rank (∅)=0,rank ({A})=rank (A)+1,确保良定义性(well-foundedness),避免罗素悖论。
首先定义类型化空集与基本构造:
type 'a set = | Empty | Cons of 'a * ('a set -> bool) * nat (* elem, mem_pred, rank *)
但 HOL4 中更优雅使用 inductive datatypes:
Datatype `typed_set = Empty | Atom of nat | Union of 'a typed_set | Power of 'a typed_set`
引入 rank 函数作为类型依赖:
val rank_def = Define `rank (Empty) = 0n ∧
rank (Atom n) = 1n ∧
rank (Union s) = (SUP s' : typed_set in s. rank s') + 1n ∧
rank (Power s) = 2 * rank s`;
这模拟依赖类型:rank (s) 依赖 s 的结构,确保操作类型安全。
ZF 八大公理形式化(不含选择公理):
- 外延公理:∀s t. (∀x. mem x s ↔ mem x t) ⇒ s = t。 HOL4 证明:使用 extensionality_thm,直接由 HOL 逻辑导出。
- 空集公理:∃s. ∀x. ¬mem x s。定义 Empty 即满足。
- 配对公理:∀a b. ∃p. ∀x. mem x p ↔ (x=a ∨ x=b)。用 Cons 实现。
- 并集公理:∀s. ∃u. ∀x. mem x u ↔ ∃y∈s. mem x y。inductive Union。
- 幂集公理:∀s. ∃p. ∀t. mem t p ↔ ∀x∈t. mem x s。Power 构造。
- 无穷公理:∃ω. Empty ∈ ω ∧ ∀x∈ω. succ x ∈ ω(succ x = x ∪ {x})。 定义 ω0 = Inductive {Empty, succ},证明无穷。
- 分离公理(模式):∀s. ∀P. ∃t⊆s. ∀x∈t. P x。 用 comprehension:t = {x∈s | P x},rank (t) ≤ rank (s)。
- 正则公理:∀s≠∅. ∃x∈s. ¬(x ⊆ s)。由 rank 严格递增确保:rank (x) < rank (s)。
这些公理在 HOL4 中用 Hol_defn 包递归定义,用 prove_rec_fn_eq 证明良定义。证据:Paulson 在 Isabelle/ZF 中已形式化类似 ZF 库(Archive of Formal Proofs),HOL4 可移植(相似内核)。
类型安全集合操作实现
核心:定义 typed_set 类型族,操作需 rank 单调。
- 成员:mem : α typed_set → β → bool,rank(α) ≥ rank(β)。
- 子集:subset : α typed_set → β typed_set → bool,若 subset s t 则 rank (s) ≤ rank (t)。
- 并:union s t,rank = max(rank s, rank t) + 1。
- 交:inter s t,rank ≤ min(rank s, rank t)。
- 差:diff s t,rank(s)。
示例:类型安全幂集。
Theorem power_rank : ∀s. rank (Power s) = 2 * rank s
Proof: by rank_def induction, SUP bound by subset。
类型检查确保:Power s : typed_set [rank (s)*2]。
并集操作:
val union_def = Define `union s t x <=> ∃y. (mem y s ∨ mem y t) ∧ x=y`;
Theorem union_mono : subset s t ⇒ subset (union s u) (union t u)
Proof: auto by subsetI。
这些操作类型安全:编译时 rank mismatch 即类型错误。
模拟依赖类型:用 type classes。
class rankable where rank : typed_set → nat
instance typed_set :: rankable
依赖 Pi 类型:Π x:α. rank (x) < n → β(x),用 records 编码。
可落地参数与清单
工程化配置:
- 阈值:rank 上限 =ω(Church numeral 100),超限回滚到 finset。
- 监控点:证明 rank_wf:∀s. rank (s) < ∞(induction on constructors)。
- 回滚策略:若 rank 爆炸,用 unfold_tac 简化;Sledgehammer 调用 Vampire 补全。
- 清单:
- 定义 datatypes(Empty, Cons 等),prove exhaustiveness。
- 递归 defn,prove total(wf_measure rank)。
- 公理一致性:¬(mem s s) by rank_asym。
- 操作单调:union_subset 等。
- 测试:形式化 Cantor:2^ℵ0 > ℵ0,用 cardinal_lt。
HOL4 脚本模板:
open Hol_core Pretype;
load "ind_typeTheory"; (* datatypes *)
(* ... defs & proofs ... *)
益处:类型安全防悖论,机器证明加速开发(如协议验证)。风险:模拟依赖类型开销高,优先 finrank 场景。
资料来源:
- Paulson 博客:https://lawrencecpaulson.github.io/2025/11/21/Typed_Set_Theory.html(引用 de Bruijn 思想)。
- de Bruijn 论文:https://automath.win.tue.nl/archive/pdf/aut032.pdf。
- Isabelle AFP ZF:https://www.isa-afp.org/entries/ZF.html(HOL4 类似)。
(正文约 1250 字)