AI4Math · Invited Talk 04 · Sorrachai Yingchareonthawornchai

来源: Invited Talk 04 · Sorrachai Yingchareonthawornchai 播客: ICML 2026 · AI4Math 分类: AI 研究 原文发表: 2026-07-11 纪要生成: 2026-07-13

基本信息

一句话概括

介绍 CSLib——对标 mathlib 的开源 Lean 计算机科学库:两大支柱(形式化 CS 理论基础 + 为日常代码推理提供基础设施),并现场演示如何用其 Time Monad + 自动化(grind / functional induction / simp lemma),以极短、干净的证明验证排序算法的正确性与时间复杂度。核心信条:"好的库 + 好的自动化 → 证明可以很短很干净。"

背景与动机

起点在 2025 年:CS 与编程领域的形式化验证需要"扩规模",因此需要一个大家都能用的良好公共基础设施 / 中央库CSLib 是开源仓库,目标像 mathlib 之于数学那样在 CS 领域产生影响:收录 CS 的基础定义、主要结论、可验证软件组件与基础设施;以 mathlib 为依赖;由领域专家 curated;与 Lean 社区合作。治理结构:

主要内容

CSLib 面向谁

两大支柱(pillar)

设计关键:Time Monad —— 把时间复杂度当"副作用"

设计的关键原则是在稳健性(robustness)与工效(ergonomics)间平衡。为此提供一个非常简单的 API:Time Monad——一个带大量配套 simp lemmawriter monad。它允许你标注(annotate)函数式代码、插入 tick 来计数程序中的操作数,从而把时间复杂度当作"副作用(side effect)"。这样做的关键优势是关注点分离(separation of concern):正确性证明与时间复杂度证明完全独立、互不干扰,代码干净。

time m 的结构:把值的结构、返回类型、以及"时间(一个自然数)"包在一起;有 purebind 等基本操作(都在 CSLib 里、你无需了解细节)。要点是配套大量 simp lemma,用它时可自动化、化简。用法:先写普通 Lean 代码,再用 time m 标注,即可陈述正确性与时间复杂度定理,让 simp lemma 替你做重活。

例子(归并排序 merge sort):从 CSLib 导入复杂度 API,把 merge sort 写成"接受两个 list、输出一个 list",但输出放进 time m 以追踪时间(这里追踪比较次数)——在 merge 内部追踪比较次数、其余代码与普通程序一模一样。然后可陈述正确性定理(merge sort 输出是输入的排列、且有序),再单独陈述时间复杂度(如 merge sort 时间 ≤ n log n)。还计划加入更多验证技术:如用 PMF monad(概率质量函数)+ monad transformer 叠加 time monad 来表达随机算法(如 quicksort)的期望复杂度——同样保持"正确性与时间复杂度分开分析"的原则,例如展示期望代价是 n log n(如调和数)。这些陈述后续会做得更易读。

现场演示:insertion sort(functional induction + grind + Time Monad)

讲者花了一段时间走了一个 insertion sort 的现场 demo(基于其上学期教学的 tutorial),要点是"若有好的公式化与库,证明可以很短很干净":

  1. 定义 insertion sort 为函数:取一个 list,递归地把队首元素插入到已排序的其余部分;可 #eval 得到排序结果。
  2. 证正确性 + 用 grind 自动化:用归纳类型定义"有序(sorted)"(空 list 有序;若 a 是列表最小元、则 a 接在有序尾部仍有序)。用functional induction(函数式归纳)——最自然的按归纳思路——证"insertion sort 输出有序"。演示中先展示"手写要多少行代码",再展示 grind(Lean 里基于 SMT 求解器的自动化 tactic)能把这些消掉:某些目标 grind 直接闭合,一些需要给点提示(如告诉 grind 该调用某函数)后也能闭合。结论:会用 grind/自动化后,可擦掉大量手写行——原来三条引理的证明用一行"全部 grind"搞定。功能归纳 + grind 让验证 quicksort 之类用几十行(约 50 行级)即可、不需要很多行。
  3. 加时间复杂度(Time Monad):用 CSLib.Algorithm.…time m。把普通 insertion sort 的输出改成 time m:把 time 想成一个"盒子",盒里含"计数的数字"和输出;只需在做比较处插入一个 tick(+1),其余代码与之前完全一样,但现在也追踪运行时间(比较次数)。#eval 可看到它同时给出输出与时间。还能证"带时间版程序的输出与不带时间版一致"(用 functional induction)。最后分析时间复杂度:陈述"insertion sort 在 list x 上的时间复杂度是 n²(length × length)",用同样的 functional induction 得到一个初看"有点吓人、含多部分"的目标,但用 CSLib API(time m 会给出可展开的东西)自动展开后目标变得可控,再补几条中间引理即可;simp lemma 替你把正确性那部分处理掉。要点:证时间复杂度时无需操心正确性,可进一步压缩证明。"用大量自动化写短证明"是通向更简洁、更可扩展证明的方向。

现状与征集贡献

demo 结束后小结:想让大家看到 Lean 的能力与 CSLib 已提供的基础功能。CSLib 在多个方向有进行中的活动、也欢迎新贡献:

关键结论 / Takeaways

Q&A / 讨论亮点

名词 / 引用

原文发表:2026-07-11  ·  纪要生成:2026-07-13