形式化验证
数学证明程序正确,超越测试
CS336 · 第 18 课
形式化验证、程序合成与 LLM:当语言模型遇到绝对正确性。Daniel Selsam 分享形式化方法如何为 AI 系统提供数学级别的保证。
来源状态:Spring 2026 官方日程确认本讲嘉宾为 Daniel Selsam,但当前官方仓库未提供可核对的 handout 或 trace。
以下内容仅作为主题背景导读,不视为官方客座讲义的逐段重建。
本讲问题:LLM 可以生成程序、证明和数学步骤,但语言流畅不等于正确;本讲关注怎样把 verifier 放进生成循环,让错误能够被机械检查并反馈。
形式化规格 → verifier → 候选生成 → verification-guided search / synthesis → 数学与程序应用 → verifier 覆盖范围决定可靠性边界。
Spring 2026 官方日程只确认 guest lecture 与讲者,本页没有可核对的本地 handout;以下内容是围绕讲者研究方向建立的学习框架,不应冒充逐页讲义。命题是待证明 statement,proof term 是可由 trusted kernel 检查的对象;测试只覆盖样例,形式化证明覆盖 specification 描述的全部情况。
informal intent → formal specification
↓
generator → candidate proof/program → verifier
↑ pass / diagnostic
└──────── search / repair ────────┘
verifier soundness + specification coverage
→ define what “verified” actually guarantees程序声称对所有整数 \(x\) 返回 \(x^2≥0\)。测试 \(x=-1,0,2\) 只能说明三个点;证明需要由整数平方性质推出任意 \(x\) 都成立。反例:若 specification 错写成“对测试集合中的 x”,proof 可完全正确却没有覆盖原意。
Lean kernel 能检查 proof 是否符合已声明 axioms/types,不负责判断 informal theorem 是否正确翻译、库中的假设是否符合现实。Verification-guided generation 降低非法输出率,但 generator 仍可能卡在搜索、利用过弱规格或只对可形式化部分成功。
Daniel Selsam 是形式化验证和程序合成领域的研究者。他参与创建了 Lean 定理证明器,并致力于将形式化方法应用于 AI 系统。他的工作横跨:
核心问题:LLM 可以生成看起来正确的代码和推理,但我们如何确信它是正确的?形式化验证提供了传统测试无法实现的数学级别的保证。
传统测试:运行程序,检查输出是否正确。只能证明存在 bug,不能证明没有 bug。
形式化验证:用数学方法证明程序满足规范。可以证明不存在特定类型的 bug。
# 例: 排序函数的规范
# 传统测试:
def test_sort():
assert sort([3, 1, 2]) == [1, 2, 3]
assert sort([]) == []
assert sort([1]) == [1]
# 测试通过 ≠ 所有输入都正确
# 形式化验证 (Lean 风格):
def sort (list : List Nat) : List Nat := ...
theorem sort_is_sorted (list : List Nat) :
sorted (sort list) := by
-- 证明: sort 的输出总是有序的
...
theorem sort_is_permutation (list : List Nat) :
Permutation list (sort list) := by
-- 证明: sort 的输出是输入的排列(没有丢元素)
...
Lean 是一个开源的编程语言和证明助手:
| 维度 | 测试 | 形式化验证 |
|---|---|---|
| 保证 | 部分覆盖 | 数学证明 |
| 适用范围 | 所有程序 | 需要可形式化的规范 |
| 成本 | 低 | 高(需要专业知识) |
| 发现 bug | 可以 | 可以(在证明过程中) |
| 证明无 bug | 不能 | 能(对特定属性) |
从高层规范自动生成程序。LLM 是程序合成的一种实现方式。
传统程序合成:
输入: 规范(如类型签名 + 示例)
输出: 满足规范的程序
例: 合成一个 reverse 函数
规范:
- 类型: List A → List A
- 示例: reverse [1, 2, 3] = [3, 2, 1]
- 属性: reverse (reverse xs) = xs
LLM 程序合成:
输入: "写一个函数反转列表" (自然语言规范)
输出: 代码
关键区别:
传统: 规范是形式化的,可以验证
LLM: 规范是自然语言的,无法严格验证
现代 LLM(如 Codex、DeepSeek-Coder)可以进行程序合成:
LLM 程序合成的根本问题:LLM 生成的代码看起来正确,但无法保证正确。测试通过 ≠ 正确。形式化验证可以提供这种保证,但 LLM 目前还不能可靠地生成形式化证明。
将 LLM 的生成能力与形式化验证的保证能力结合:
# Verification-Guided Generation:
#
# 1. LLM 生成候选程序
# 2. 形式化验证器检查正确性
# 3. 如果不通过,反馈给 LLM 重新生成
# 4. 重复直到通过或超时
# 伪代码:
def verify_guided_generate(spec, max_attempts=10):
for attempt in range(max_attempts):
# LLM 生成
code = llm.generate(spec)
# 验证器检查
result = verifier.verify(code, spec)
if result.is_valid:
return code # 通过!
# 不通过,反馈错误信息
feedback = result.error_message
llm.add_feedback(feedback)
return None # 所有尝试都失败
AI 系统在数学竞赛中取得突破:
# Lean 在 AI for Math 中的角色:
# 1. 形式化问题陈述
-- 例: 费马大定理
theorem flt (n : Nat) (hn : n ≥ 3)
(a b c : Nat) (ha : a > 0) (hb : b > 0) :
a^n + b^n ≠ c^n := by
-- ...
sorry -- 这里放证明
# 2. LLM 生成证明步骤
# 3. Lean 检查每一步是否正确
# 4. 如果所有步骤都通过,定理被证明
LLM 在许多场景中被使用,其中错误代价很高:
| 方法 | 适用场景 | 保证程度 |
|---|---|---|
| 形式化验证 | 代码、协议、算法 | 数学证明 |
| 符号执行 | 有限状态系统 | 路径覆盖 |
| 类型检查 | 类型化语言 | 类型安全 |
| 运行时监控 | 任何系统 | 运行时的部分保证 |
# 例: 验证 LLM 生成的排序算法
# Step 1: LLM 生成代码
code = llm.generate("写一个快速排序")
def quicksort(arr):
if len(arr) <= 1:
return arr
pivot = arr[0]
left = [x for x in arr[1:] if x <= pivot]
right = [x for x in arr[1:] if x > pivot]
return quicksort(left) + [pivot] + quicksort(right)
# Step 2: 形式化规范
# 规范 1: 输出是有序的
# 规范 2: 输出是输入的排列
# 规范 3: 时间复杂度 O(n log n) 平均
# Step 3: 验证
# 用 Lean/Coq/Isabelle 证明代码满足规范
# 如果验证通过 → 数学保证正确
让 LLM 直接生成形式化证明,由证明助手验证:
结合神经网络(LLM)和符号推理(证明助手):
构建可以数学证明其行为正确的 AI 系统:
用形式化方法描述和验证 LLM 本身的行为:
关键洞察:LLM 和形式化验证是互补的技术。LLL 擅长生成(但不可靠),形式化验证擅长验证(但需要规范)。将两者结合,可以构建既强大又可靠的 AI 系统。
问题 1:形式化验证相比传统测试的主要优势是什么?
问题 2:Lean 是什么?
问题 3:Verification-guided generation 的核心思想是什么?
问题 4:LLM 和形式化验证的关系是什么?
Proof kernel 接受了证明,但 specification 漏掉负数输入。能否声称原始程序需求已验证?
答案:不能;只验证了 formal statement,informal intent 到 specification 的翻译仍有缺口。
若答“能,因为 kernel sound”,你把 proof checking soundness 扩张成了 specification completeness。
Verifier 给“结果是否满足规格”的反馈;最后一课回到系统测量,展示 profiler 与 hardware cost model 怎样给“实现为什么慢”的反馈。
数学证明程序正确,超越测试
开源定理证明器,Mathlib 形式化数学库
LLM 生成 + 验证器检查的循环
LLM 生成能力 + 形式化验证的保证