← 科研空间 首页
深度精读 · paper2html arXiv v4 · 2026-09-02 · 检索 2026-10-23

FormalEvolve: Neuro-Symbolic Evolutionary Search for Diverse Autoformalization

把 autoformalization 从"译出一个正确答案"变成"在固定预算下搜索一族对证明器各有暴露面的等价表述"——LLM 生成、Lean 4 编译硬门、语义 judge、岛屿档案进化,配 matched no-archive 对照与逐调用预算审计。Haijian Lu, Wei Wang, Jing Liu(西安电子科技大学 / BIGAI)

阅读基础:arXiv 2603.19828v4(2026-09-02,camera-ready,29 页 13 图,含 TeX 源码与官方实现仓库);外部检索(发表状态、引用、相邻工作)执行于 2026-10-23;本次增量补入教学性故事,并再分析跨论文联系。v4 相对本站 2026-08-08 旧页所依据的早期版本(v2,27 页 3 图):以 many-to-many / prover-facing interface 叙事重写,新增 matched no-archive 对照、generator-call 预算审计、stronger-base 与人工审计实验,图从 3 张扩到 13 张。arXiv comments 自述接收 Findings of EMNLP 2026;ACL Anthology 于检索日尚不可查证,本页按此边界表述。本页取代本站 2026-08-08 的旧版页面。

先讲一个故事

教学性场景(非论文记载):研究生林要把一条数学命题交给 Lean 证明器。她第一次只生成一个形式化版本:它通过 Lean 编译,也忠实表达原命题,但手头的自动证明模型仍然证明不了。林起初以为“命题错了”,随后发现障碍可能不在真假,而在表述——不同但等价的 Lean statement 会给证明器不同的搜索入口。

林不能为了让证明器过关就随意改题;她需要同时守住两个条件:候选必须可编译,且语义上仍是原命题。转折是把目标从“找唯一正确译文”改成“在固定生成预算内收集多个经过筛选的等价表述”,让下游 prover 有更多接口可试。FormalEvolve 的论文机制正是以 Lean 编译门、语义 judge 与进化档案来探索这种候选族;故事中的林和具体遭遇只是帮助理解的虚构教学场景,并非论文实验记录。

故事:一题多译的进化论译室

想象一间翻译室。数学编辑把一道中文数学题交给译员,要求译成英文。老译员的规矩是:接单、出一稿、交稿。学生拿到译文去解题,解不动,抱怨"这题没法做"。编辑批注退回:"译文没错,但学生读不懂。"

编辑做了个实验:把同一道题发给 64 个学生,每人配一位不同的译员,每稿只出一种忠实译法。结果戏剧性分化——同一道题,有的译法下大半学生能解,有的译法下全军覆没。译文"对不对"和译文"有没有用",是两件事:题面只要换个说法定理结构就变(比如把"for all x, f(x) > 0"写成"the infimum of f is positive"),证明器看到的可攻击面完全不同。

新译室的规矩变了:不再单稿交卷,而是"养一箱译法"。译员出稿(生成)、编译器当硬门(不通过 Lean 4 编译的稿子进不了箱)、语义评委保忠实(不忠于原题的稿子不能算数)、箱子按岛屿分组互相移民、每次翻稿都参考箱里已有的好译法去变异(整体重写 / 局部改动 / 跨条目杂交)。关键约束是预算:每道题只给译员 100 次开口机会,一分不多——老译室的对照译员也拿同样的 100 次机会,只是没有箱子。

100 次机会用完,交货的不是"一个正确答案",而是一箱"既忠实又各自不同"的译法。学生随便挑顺手的攻击。这就是 FormalEvolve:把 autoformalization(把非形式数学翻成 Lean 4 定理语句)从单点翻译任务,改造成预算约束下对一个等价表述族的进化搜索。

对应:故事 → 论文

故事里 论文里 机制
一稿译文的"对" 候选 statement(header + statement) LLM 生成的完整 Lean 4 文件
编译器当门卫 CompOK 硬可行性门 Lean 4.15.0 + Mathlib 编译通过才能入档
语义评委保忠实 SemOK 语义判定 CriticLean-Qwen3-14B judge
一箱译法 archive(K=2 半隔离岛,全局容量 40) 只存编译可行候选;canonicalization 去重,migration 保护 top-1
变异三招 full / diff / cross 算子(0.5/0.3/0.2) 整体重写 / 局部补丁 / 跨候选杂交
译不动的卡壳 EvolAST 符号回退 重复编辑或编译失败时,AST 级强制变异
100 次开口机会 T=100 generator calls/题 逐调用记账,对照同预算
学生挑顺手译法 prover:Goedel-Prover-V2-32B,B=64 round-robin 跨方法公平评估
忠实度抽查 人工审计 50 题陈述段 + 161 个 thm-complete 产物

先给结论

many-to-many 真正新意。把 autoformalization 的产出从"一个正确表述"重定义为"prover-facing interface 上的等价表述族"(repertoire),并在严格同预算对照下证明档案进化比无档案采样更有效。这是任务定义层面的贡献,不只是又一个 pipeline。
+0.02 ~ +0.05 最可信结论。同模型同 T=100 预算:SH@100 在 ProofNet 0.849 vs 0.828(Δ+0.022,bootstrap CI [0.005, 0.048])、CombiBench 0.580 vs 0.530(Δ+0.050,CI [0.003, 0.130]);Gini 降、尾部题补救(ProofNet 49 胜 5 负);thm-complete@64:CB 13 vs 9、PN 45 vs 40,PN 甚至超过 ground-truth 单参考的 34。
边界 不能越界。语义等价未被认证,依赖 judge(人工审计只在 50 题切片上部分缓解);增益幅度小且数据集不对称;ProofNet 在 seed 模型 SFT 混合内,exploit 类优势有"先验污染"式解释(论文自认);单 prover 单栈 B=64;CB top-10% 集中度降幅 CI 含 0;judge 调用数各方法不等费(CB:Sample 6,953 vs FE 4,970,Hybrid 未单列)。

一句话:这篇论文用进化计算的预算纪律重做了一遍"LLM 生成 + 验证器过滤"这件事,贡献是协议与对照设计——它证明的命题是"档案有用",量级是"几个百分点的稳定放大",前提是"你已经有编译门和修复"。

研究动机:语义正确的单参考是浪费的

论文的动机链条有三步。

第一,评分传统把"多对一"当"一对一"。autoformalization 基准(ProofNet、CombiBench 等)以闭集单参考为主:候选与参考字符串比对,或由 judge 对照参考打分。同一道题的多种忠实说法里,只有碰巧撞上参考的那种(或 judge 恰好认可的那种)得满分——语义一致但表面不同的表述被系统性判错。数据集层面,这低估了模型;下游层面,这把丰富的等价类压扁成了一个点。

第二,语义正确 ≠ prover 有用。论文用一张动机图钉死这一点:对同一道题、同样通过编译与语义判定的候选,固定 prover、固定 B=64 采样预算下,有的候选能被证出、有的完全推不动。表述的 binder 结构、import 上下文、定理形状决定了证明器的可攻击面。那么"哪个表述忠实"只有一半价值,"一族忠实表述里 prover 能吃下哪个"才是任务的真问题。

论文 Figure 1:同一道题、同预算下,不同编译可行且语义一致的候选,prover 结果差异大。
页面图 1 · 论文图 fig:intro:同一 informal statement 的多个 CompOK+SemOK 候选,在固定 prover 协议下成功与否差异巨大——"忠实"是必要条件,不是产出条件。

第三,下游真的需要多样数据。prover 的 SFT/RL 训练以可编译的定理语句为食;单参考闭集数据供给的是"一种说法 × N 道题",而训练多样性与鲁棒性需要"一道题 × 多种说法"。把每道题变成一个可搜索的等价类,等于把数据供给从"点"升到"族"——这是 FormalEvolve 的目标函数背后的实际需求。

在研究版图上的位置

论文明确把自己放在三条线的交叉处,且各条线都只差一步:LLM 进化搜索(AlphaEvolve、EvoPrompter 用 LLM 当变异算子进化程序/文本,但没有编译硬门与语义忠实约束);质量-多样性(QD)档案(MAP-Elites 的岛屿+迁移结构是 FormalEvolve 档案的直接来源,但没有 neuro 组件);LLM 数学数据生成(PDA、EvolProerver 等用 LLM 造形式化数据,但产出单候选、无档案概念、无 prover-utility 视角的评估)。空位是:把档案当成 autoformalization 的搜索结构,编译当硬门,prover utility 当下游裁判——三件事在 FormalEvolve 之前没有被接在一起过。

论文 Figure 2:ProofNet 一道题上,候选与 ground truth 的 RR64 prover 结果对比。
页面图 2 · 论文图 fig:figS:数据驱动的动机示例(ProofNet,RR64 协议)。ground truth 单参考并非 prover 视角的最优表述——多候选的必要性有了具体实例。

数学表示及建模

候选、档案与产出

给定非形式陈述 \(x\),一个候选 \(c = (\hat{h}, y)\) 是 header(imports 等)加一个定理语句。两个布尔判定定义可行性:

$$\CompOK(c) = 1 \iff c \text{ 在 Lean 4.15.0 + Mathlib 下编译通过}$$ $$\SemOK(c; x) = 1 \iff \text{judge 认为 } c \text{ 忠实于 } x$$

档案 \(\mathcal{A}\) 是纯可行性门控的:只有 \(\CompOK(c)=1\) 的候选能进档,exact duplicate(whitespace/命名 canonicalization 后)在入档时被拒绝;档案为 K=2 半隔离岛结构,全局容量 40,每 10 代以 0.1 概率迁移并保护各岛 top-1。注意 judge 分数只影响"谁被选为父代",不影响"谁能入库"——入库标准只有编译与去重。

最终产出是 repertoire:

$$\mathcal{G}(x) = \{\, c : \CompOK(c) = 1 \text{ 且在预算 } T \text{ 内被产生} \,\}$$

评估时对 \(\mathcal{G}(x)\) 里每个 semantic_ok 候选跑 prover——一族表述,而不是一个点。

预算即货币

预算 \(T=100\) 按每次 generator call 记账(每题 N×T=100 次提案;两个基准共 CB 10,000、PN 18,600 次)。三个生成算子(full/diff/cross)全部等额计入。修复调用(编译修复 CRep、语义修复 SRep)单独审计。judge 与 prover 调用在预算外,但被完整记录——附录有逐类别调用的预算审计表,因为"搜索 vs 无搜索"的对比只有在调用数相等时才有意义。

父选择:门控分数 + 使用折扣

对岛 \(I\) 内候选 \(c_i\),记 \(n_i\) 为其已被选为父代的次数。采样权重:

$$s_i = \CompOK(c_i)\,(1 + \SemOK(c_i)), \quad \tilde{s}_I = \mathrm{median}_{c_j \in \mathcal{A}_I}(s_j), \quad d_I = \max(\mathrm{MAD}(\{s_j\}), \varepsilon)$$ $$z_i = \frac{s_i - \tilde{s}_I}{d_I}, \qquad u_i = [1 + (1+\beta)\, n_i]^{-1}, \qquad w_i = \sigma(\lambda z_i)\, u_i$$ $$\Pr(p = c_i \mid \mathcal{A}_I) = \frac{w_i}{\sum_{c_j \in \mathcal{A}_I} w_j}$$

入档候选必编译,所以 \(s_i \in \{1, 2\}\):judge 否定为 1、一致为 2。\(u_i\) 是使用折扣:从未被用的父代 \(u_i=1\),被反复采样后衰减(\(\beta = 0.05\));\(\lambda = 10\)、\(\varepsilon = 10^{-6}\) 仅为避免除零。设计意图:judge 分数温和地偏向"编译且忠实"的父代,但任何编译可行候选都保有非零概率——搜索不会被 judge 意见锁死。

评估指标

三层指标从覆盖到效用到集中度:

RR64 协议是公平性关键:不同方法的候选族放进同一个 round-robin 池,prover 每次采样等概率来自所有方法的候选——A 方法自己的候选多,不会因为池子稀释而吃亏,只会因为"贡献了更多能证的表述"而得分。

算法流程 / 方法

论文 Figure 3:FormalEvolve 总览。非形式输入经 LLM 生成候选,编译门过滤,语义 judge 评分,可行候选进入 K 岛档案,父代经 usage-penalized 选择后由 patch 模型变异,EvolAST 在卡壳时强制结构变异。
页面图 3 · 论文图 fig:framework:完整管线。种子库采样入档 → 岛内父选择 → full/diff/cross 变异 → 有界修复 → EvolAST 回退 → 档案更新,全程逐调用记账。

循环逐步

  1. 种子库。每题先用 seed 模型(Kimina-Autoformalizer-7B)采样若干候选,编译可行的进档案——这给了进化一个起点,且这些调用计入预算。
  2. 选岛、选父。随机选一个岛;岛内按上节权重 \(w_i\) 采父代。
  3. 变异。patch 模型(Qwen3-30B-A3B)按三种模板之一出新候选:full(整体重写,0.5)、diff(参照父代与编译器/judge 反馈的最小改动,0.3)、cross(额外参照档案里的"灵感"候选做杂交,0.2)。三种模板都返回完整 Lean 4 文件,等额计费。
  4. 有界修复。编译失败触发修复 prompt(看编译器报错提最小补丁),预算 2 次、温度 0.7;语义修复同理(看 judge 意见改表述)。修复是有界的——两次修不好就放弃这个候选。
  5. EvolAST 回退。当提案与已试编辑完全重复(canonicalization 下的 exact duplicate)或编译反复失败时,切换到符号层的 AST 编辑强制结构变异:只改写 binder 类型与 goal 类型(imports/preamble 不变),产出不递归重写、也不再送入 LLM 修复,仍需过编译门与语义 judge。AST 编辑不消耗 generator 预算——它是免费的多样性保底,防止整个岛在一个死胡同里烧完预算。
  6. 更新。新候选编译可行且非重复则入档(全局容量 40,论文附录未详述满载时的具体逐出规则);每 10 代以 0.1 概率跨岛迁移可行候选,各岛 top-1 受保护。

模型分工

角色 模型 说明
seed 生成器 Kimina-Autoformalizer-7B 种子库采样;其 SFT 混合含 ProofNet、PutnamBench、miniF2F、Compfiles
patch / 修复 Qwen3-30B-A3B full/diff/cross 变异与两类修复
语义 judge CriticLean-Qwen3-14B SemOK 判定与语义修复反馈
prover Goedel-Prover-V2-32B B=64 round-robin 评估 PU
工具链 Kimina Lean Server Lean 4.15.0 + Mathlib v4.15.0(9837ca9)

为什么这套设计成立

三个设计决定互相咬合。编译门做可行性:Lean 编译定义了极窄的可行域,档案只收"物理上站得住"的候选,搜索不浪费在语法废稿上;judge 做软引导:语义分数只影响父选择权重,不构成入库门槛,judge 的错误不会永久污染档案结构;AST 编辑做免费保底:LLM 变异最怕的不是"变不出好东西"而是"反复变出同一个东西",符号级强制变异以零预算打破局部收敛。这套组合把进化计算的两个经典难题(可行域窄、多样性塌缩)分别交给了编译器和 AST。

实验设计

两个基准,两种压力

CombiBench(CB,100 题):大学难度的组合恒等式/不等式类问题,7 个数学域、27 种技能,输入是自然语言与公式的混合。对 7B 级 autoformalizer 是强域移位——先验帮不上忙。

ProofNet(PN,test 186 题):MATH 难度上采样的本科数学,纯自然语言陈述。关键披露:seed 模型 Kimina 的 SFT 混合包含 ProofNet、PutnamBench、miniF2F、Compfiles——论文公开这一点,并用它解释消融的不对称。

对照系:matched,不是强弱对照

论文的对照组设计是这篇的方法论骨架。所有对照与 FormalEvolve 用同模型、同 T=100 预算、同修复协议,唯一差别是"有没有档案结构":

预算审计进数据表:附录把 Gen(生成)、CRep(编译修复)、SRep(语义修复)调用分开记账。judge 调用不进 generator 预算但被披露——CB 上 Sample 6,953 次、FE 4,970 次(其中 EvolAST 子集 863 次)、FE 去 EvolAST 3,800 次、FE 去修复 9,025 次(Hybrid 的 judge 开销未单列):FE 用比纯采样更少的 judge 调用拿到更高的 SH,档案复用减少了无效生成,EvolAST 的 863 次是多样性的行价。这是"搜索省 token、采样砸 token"的第一个直接证据。

评估协议

主指标 CH/SH@100(覆盖)、Gini 与 top-10%(集中度)、PU@64(round-robin,B=64,Goedel-Prover-V2-32B)。两个独立验证:① stronger-base——CB 上换 Goedel-Formalizer-V2-8B seed + GPT-5.4 修复,检验装置是否随底座增强仍成立;② 人工审计——50 题的陈述段三分类(faithful/benign/severe)+ 161 个 thm-complete 产物逐条核验,直接测 judge 误差是否被档案放大。

实验结果

主表:T=100 覆盖与集中度

下表按论文 Table 1 重建(ProofNet / CombiBench)。每格:CH@100 / SH@100 / Gini / top-10%。

方法 ProofNet(186 题) CombiBench(100 题)
Sample 0.903 / 0.715 / 0.537 / 0.243 1.000 / 0.440 / 0.816 / 0.637
Compile Repair 0.909 / 0.720 / 0.566 / 0.263 0.990 / 0.400 / 0.825 / 0.641
C+S Repair 0.909 / 0.780 / 0.555 / 0.264 0.990 / 0.460 / 0.813 / 0.609
Qwen3 Sample 0.387 / 0.242 / 0.896 / 0.876 0.300 / 0.200 / 0.939 / 0.952
Qwen3+CRep 0.371 / 0.237 / 0.912 / 0.911 0.900 / 0.260 / 0.740 / 0.385
Qwen3+C+S 0.688 / 0.548 / 0.802 / 0.656 0.940 / 0.390 / 0.827 / 0.655
Hybrid(matched) 0.973 / 0.828 / 0.505 / 0.241 1.000 / 0.530 / 0.790 / 0.588
FormalEvolve 0.973 / 0.849 / 0.443 / 0.229 1.000 / 0.580 / 0.759 / 0.531
FE(K=1) 0.984 / 0.866 / 0.362 / 0.198 1.000 / 0.550 / 0.726 / 0.442
FE w/o EvolAST 0.973 / 0.871 / 0.454 / 0.236 1.000 / 0.500 / 0.776 / 0.577
FE w/o patch repair 0.903 / 0.780 / 0.449 / 0.211 1.000 / 0.470 / 0.772 / 0.494

读法有三层。第一层(覆盖):FE 对 Hybrid 的 SH@100 增益 PN +0.021、CB +0.050,配对 bootstrap CI 分别 [0.005, 0.048] 与 [0.003, 0.130],均不含 0。第二层(集中度):Gini 降幅 PN 0.505→0.443(ΔCI [0.035, 0.090])、CB 0.790→0.759(ΔCI [0.010, 0.055])稳定;top-10% 同向但 CB 的区间更宽。第三层(反事实):Qwen3 组证明弱 seed 下编译修复反而降 CH(0.387→0.371)——修复不是免费午餐,弱模型会把候选修进死胡同。

论文 Figure 4:T=100 下 FormalEvolve 相对 Kimina+语义修复基线的逐题 delta 条带。
页面图 4 · 论文图 fig:figA:逐题 delta 条带(T=100,对照 Kimina 系 C+S Repair)。增益不是均匀抬升,而是集中在部分题目——正好是档案的意义所在。
论文 Figure 5:SH 覆盖率随 debited generator calls 的曲线,虚线标记种子库名义边界 t=16。
页面图 5 · 论文图 fig:main-curves:SH 覆盖 vs 记账调用数。虚线 t=16 是种子库名义边界——曲线在边界后仍持续爬升,说明增益来自进化阶段而非仅仅更多采样。
论文 Figure 6:FE 相对对照的覆盖差随调用数的演化。
页面图 6 · 论文图 fig:figD:覆盖差随预算增长——差距随调用数扩大,档案的红利是累积的。

增益在哪:尾部补救,不是均匀抬升

论文把逐题 semantic_ok 计数按 C+S Repair 的题序排成热图——head/mid/tail 只是基线排序诱出的可视化分区,不是预定义难度档。在这个排序下,FE 的增量集中在 mid 与 tail:tail 段 FE 计数更高的是 CB 18 题对 2 题、PN 49 题对 5 题;head 段仍可偏向 C+S(PN 尤甚)。论文把这一点明确表述为互补的问题级覆盖而非支配——档案不改变强题的结果,它把基线做不出的题救回来一部分,同时也有基线能做它做不出的题。附录逐题命中表给出两端实例:FE 独命中的(CB 0057 第 2 次调用即中、PN 0045 第 12 次)与基线独命中的(PN 的 Blaschke 条件题基线第 3 次命中、FE 百次内未中)并存,反向实例没有被藏起来。

论文 Figure 7:逐题 semantic_ok 计数热图。
页面图 7 · 论文图 fig:uniformity-filtered:逐题 semantic_ok 计数(滤掉全零列)。FE 的列整体更"亮"且更长尾——增益集中在基线排序的 mid/tail 段。
论文 Figure 8:Gini 系数随调用数的曲线。
页面图 8 · 论文图 fig:uniformity-gini:Gini 随预算演化。FE 曲线持续低于 Hybrid——多样性优势在预算全程保持,不是末端假象。

消融:修复是最大直接驱动,数据集决定 explore/exploit

三个消融把机制拆开。去修复:CB SH 0.580→0.470(-0.110)、PN 0.849→0.780(-0.069)——修复是最大单项;没有修复,档案也巧妇难为无米之炊。PN 上 exploit 赢:K=1(0.866)与去 EvolAST(0.871)都高于默认(0.849)——ProofNet 在 Kimina SFT 混合内,先验已经很强,多样性的边际价值低,精修单一方向反而更优。CB 上 explore 赢:默认(0.580)> K=1(0.550)> 去 EvolAST(0.500)——强域移位下,先验失效,必须靠结构变异逃坑。论文对这对矛盾的处理是诚实的:默认 K=2+EvolAST 是"跨域难度的稳健默认",不是每处最优;主对照(档案 vs 无档案)不受影响。

证明效用:round-robin B=64

方法 CB:pass / complete / thm-complete PN:pass / complete / thm-complete
FormalEvolve 44 / 27 / 13 127 / 52 / 45
Hybrid 40 / 22 / 9 110 / 49 / 40
Sample 41 / 23 / 8 106 / 46 / 41
C+S Repair 40 / 23 / 8 119 / 50 / 46
Ground truth(单参考) 96 / 68 / 18 146 / 46 / 34

两读。对 Hybrid:thm-complete CB 13 vs 9、PN 45 vs 40——档案产出的表述族对 prover 更"可证透"。对 ground truth:CB 上 GT 仍碾压(18 vs 13,pass 96 vs 44)——人造参考在大学难度域还是强;但 PN 上 FE 的 45 超过 GT 的 34:多样 repertoire 打败了单一人写参考。这不只是分数,是任务定义层面的宣言——单参考不是金标准,只是等价类里的一个采样点。C+S 在 PN 的 46 略高于 FE 45,说明"档案增益"在 PN 的 PU 维度上接近饱和(与该基准的先验解释一致)。

论文 Figure 9:PU 随 k 的曲线面板,含 Kimina 单参考对照。
页面图 9 · 论文图 fig:figP:PU 随每题候选数 k 的曲线(RR64)。曲线随 k 上升说明"多表述"持续转化为"多可证"。
论文 Figure 10:逐题 thm-complete 计数热图。
页面图 10 · 论文图 fig:figQ:逐题 thm-complete 计数。哪些题被"证透"了、被谁证透——比总分更细的信号。
论文 Figure 11:thm-complete 题数的分解:空 repertoire / 全部修复失败 / 成功。
页面图 11 · 论文图 fig:figR:thm-complete 题数分解——空 repertoire、全部候选证明失败、成功三层。增益来源一目了然:FE 主要赢在"别人空手它有产出"的题上。

成本、stronger-base 与人工审计

成本:整批时长 CB 8.16h(FE)vs 8.18h(Hybrid)、PN 17.29h vs 20.77h——FE 在 PN 反而更快(档案减少了无效生成)。stronger-base(CB,Goedel-Formalizer-V2-8B + GPT-5.4 修复):SH 0.86→0.88、SemOK 总数 1,886→3,238(1.7 倍)、Gini 0.4832→0.4383、top-10% 0.3128→0.2202——底座变强,装置结论不倒,且绝对产出大涨。人工审计:50 题陈述段三分类 FE/Hybrid/Sample = 42/5/3、43/4/3、43/3/4(faithful/benign/severe);161 个 thm-complete 产物里 FE faithful 41、三方 severe 11/10/12——档案没有放大 judge 的语义误差。这三个验证分别回应了"贵不贵""是不是弱模型专属""judge 偏差会不会被搜索放大"三个最自然的质疑。

论文 Figure 12:SH vs 批时长的成本-性能散点。
页面图 12 · 论文图 fig:figT:SH@100 vs 批时长。FE 不在成本曲线上付出溢价。

一个演化 trace

论文给了一道 PN 题(0000_exercise_2_3_2,群共轭陈述)的完整演化轨迹,它演示了"编译可行"与"语义达标"为什么要分开判定:初始候选 exists g, a*b = g*b*a ∧ b*a = g*a*b 编译通过(Comp=1)但被判语义不一致(Sem=0)——它表达了目标命题的一个更强、非标准的变体;有界语义修复去掉多余合取项、改写成标准共轭形式 exists g, a*b = g*(b*a)*g^(-1)(Comp=1, Sem=1),并保持编译可行。也就是说,修复在这个例子里做的不是"把坏代码修好",而是"把一个编译得过但说错了的话改写成一个说得对的标准说法"——编译门和语义门各拦各的,缺一个都会放进错误数据。

论文 Figure 13:一道 ProofNet 题的候选演化轨迹。
页面图 13 · 论文图 fig:fig_pn0000:演化 trace——从种子候选到可证候选的变异链,每步标注算子与门控结果。

我的评论

协议级贡献,配得上它自述的接收档次。它证明的命题比它的分数更重要——但在两个方向上,论文离自己的核心假说还差一步没走完。

1. matched no-archive 对照是这篇论文的本体,不是附注。"LLM 搜索有用"类论文最常见的混杂是:搜索方法比基线多花调用、多花 token、多用一个模型。这篇把 generator calls 当货币,同模型同预算同修复协议,只留"档案"一个变量;judge/prover 调用单独审计并披露(CB:FE 4,970 vs Sample 6,953——FE 更省)。这套纪律值得成为 LLM 搜索类工作的引用模板。相对地,它也让增益显得朴素:+2~5 个百分点的 SH,不是量级突破。

2. 档案是修复收益的放大器,不是替代。去修复消融(CB 0.580→0.470)比档案增益(+0.050)大一倍:没有有界修复,档案没有素材可积累。诚实的解读是:FE 的增益 = 修复给出的"可行候选流" × 档案的"不丢失+多样化"。工程上这意味着先有编译门和修复,再谈档案——顺序反了就是白烧算力。

3. 数据集不对称是发现,不是尴尬。PN(先验强)上 exploit 消融更高、CB(域移位)上 explore 默认更高——这组合指向一个可检验的判据:test-time 搜索的价值随 seed 先验与目标域的错位度上升。这比"FE 平均更好"有用得多:它告诉你在哪个场景付搜索的钱。论文自己把 Kimina-SFT-包含-ProofNet 这件事写在明处,用消融解释而非掩盖,这是干净的做派。

4. 最大未闭合环:单 prover。标题级假说是"表述是 prover-facing interface"——interface 的定义依赖于对端。但实验只有一个对端(Goedel-Prover-V2-32B,B=64)。假说的直接检验是跨 prover 迁移:FE 档案在 prover A 上建、给 prover B/C 用,看 utility 是否随 prover 变化。没做。在此实验落地前,"prover-facing" 更接近一个解释框架而非已验证机制。

5. judge 进入数据管线,是这类方法的结构性风险。SemOK 是 CriticLean 判的,不是认证的。审计显示 FE 不放大 judge 偏差(severe 11/10/12 三方几乎持平)——但这只在 50 题切片上测过。一旦这套装置产品化为 prover 训练数据的供给线,judge 的系统性盲区就会以训练数据的形式固化进证明器。任何下游使用都需要把"语义忠实"当带噪声的代理指标对待,而不是当已认证事实。

6. PN thm-complete 45 > GT 34 是全文最有信息量的一个数字。它说明"人写的那个参考"在 prover 视角下只是等价类的一个采样点,甚至常常不是好的采样点。对 autoformalization 基准的直接含义:以单参考字符串为评分锚的基准,测的不是模型能力,是模型与参考写法的巧合度。(CB 上 GT 18 vs FE 13 仍保持差距——大学难度域人写参考还是强,两个方向都真实。)

对本站研究主线的意义。FormalEvolve 把"验证器引导的搜索"做成了 per-problem test-time 的最小干净实例:编译器当验证器、档案当状态、预算当约束。但它的问题结构决定了档案不跨题共享——每道题从零建档、用完即弃。这与我们关注的 historical full learning-state 复用(state 跨任务、跨时间累积)正好构成分界线:FE 证明了"状态在题内有用",留下的问题是"状态何时值得跨题携带"。

跨论文再分析:搜索状态与质量边界

One More Thing:把基准从"评分"改成"等价类供给"

这篇论文最激进的暗示藏在 PN 45 > GT 34 里:autoformalization 基准评错了对象。现行基准给你一道题、一个人写参考、一个匹配函数;这套装置下,模型再好也只能"猜中写法"。而 FormalEvolve 的档案第一次把"等价类"做成了可操作的对象——一族编译可行、语义忠实、各自不同的候选,可以按下游需求取用。

顺着走一步:接口基准(equivalence-class benchmark)。评分单位从"候选-参考匹配"改成"类供给":① 每题报告类级 utility 曲线(best-1/best-k under prover budget,FE 的 RR64 协议已经是现成读数);② 数据集汇总报告"类覆盖率"而非"题覆盖率";③ 附带 budget-constrained representative selection——给定 prover 预算,从档案选 k 个代表,测的是"这套数据管线能喂出多强的下游"。基准从考卷变成数据供给合同,评测与训练在同一个对象上闭环。

注意边界:这是本页在论文证据上外推的研究提议,不是论文已验证的内容。FE 没有做 prover 训练实验(PU 是评估,不是训练收益);"类级评分更公平"目前只有 PN 单点证据(45 vs 34)与 CB 反向证据(GT 18 vs 13)并存。

Other Discussion Roles / 其他讨论角色

以下七个角色使用 MIT MAS.S60 课程原始 prompt,从不同责任位置审视同一篇论文。

Scientific Peer Reviewer

The paper has not been published yet and is currently submitted to a top conference where you’ve been assigned as a peer reviewer. Complete a full review of the paper answering all prompts of the official review form of the top venue in this research area (e.g., NeurIPS). This includes recommending whether to accept or reject the paper.

Summary. 作者把 autoformalization 的产出从单 statement 改写为预算内的等价表述族(repertoire):LLM patch 算子(full/diff/cross)+ 有界修复 + EvolAST 符号回退,在 2 岛编译门档案上进化;同模型同 T=100 generator-call 预算的 no-archive 对照(Hybrid)在 ProofNet/CombiBench 上对比 SH@100、Gini、PU@64,附 stronger-base 与人工忠实度审计。

Strengths. (1) matched 对照 + 逐调用预算审计是这类论文少见的纪律,把"档案的净效应"干净地隔离出来;(2) 负结果与不对称照实报告:Qwen3 弱底座下编译修复反降 CH、PN 上 exploit 消融反超默认、Blaschke 反向实例直接列进附录表;(3) seed 模型 SFT 含 ProofNet 的先验污染主动披露并用消融解释;(4) judge 依赖有人工审计兜底(50 题 + 161 产物);(5) 去修复消融把"档案增益 = 修复候选流 × 档案复用"的分解定量给出。

Weaknesses. (1) 全部 PU 结论建立在单一 prover(Goedel-Prover-V2-32B,B=64)上,"prover-facing interface" 核心假说的直接检验(跨 prover 迁移)缺失;(2) judge 审计只在 50 题切片,系统性盲区未量化;(3) 增益幅度温和(SH +0.021/+0.050),CB top-10% 集中度 CI 含 0;(4) ProofNet 在 Kimina SFT 混合内,作为独立测试台的地位弱(论文已认);(5) 没有下游 prover 训练实验——PU 是评估代理,不是训练收益;(6) 岛数/容量/迁移率的超参敏感性只覆盖部分点。

Questions. ① 同一批档案在 2-3 个 prover(Goedel-V2 / Kimina-Prover / LeanDojo 系)下的 utility 相关矩阵是什么?假说预测它不接近单位阵。② B=64 附近 PU 是否饱和(B=256 改变排名吗)?③ judge 对"档案里的老候选"与"新候选"的判定一致性有无漂移?④ SH 增益在 T=300 时保持、收敛还是反转?⑤ 容量 40 与 K=4 的交叉敏感性?

Rating: 6/10(accept,Findings/资源区)——协议贡献真实、实验诚实,但单 prover 与温和增益撑不起主赛道长文。Confidence: 4/5。

Archaeologist

This paper was found buried under ground in the desert. You’re an archeologist who must determine where this paper sits in the context of previous and subsequent work. Find and report on one older paper cited within the current paper that substantially influenced the current paper and one newer paper that cites this current paper.

更早的(论文引用):Illuminating Search Spaces by Mapping Elites(Mouret & Clune, 2015,MAP-Elites)。FE 档案的骨架就是 MAP-Elites 的:多岛 + 优质个体保护 + 周期迁移 + 容量受限的档案。FE 做的是三次替换:变异算子换成 LLM patch(把"随机变异"变成"看反馈的定向变异")、可行性门换成 Lean 编译(把"仿真通过"变成"类型检查通过")、在质量之外加第二维门(语义 judge)。换句话说,它验证的命题可以读作"MAP-Elites 的档案结构在 LLM+编译器时代依然有效"——这条谱系比"又一个 LLM pipeline"的读法更准确,也解释了为什么消融里 explore/exploit 的权衡如此经典。

更新的(引用本篇):截至检索日(2026-10-19),OpenAlex 记录本篇被引 0 次(Semantic Scholar 因限流不可核验)——论文太新,没有找到引用它的后续工作。作为替代,给出三篇同期相邻工作(非引用关系,仅示坐标):arXiv:2606.14867 审计 autoformalizer 对改述的敏感性——正面支持本篇 many-to-many 前提;LeanScribe 做 formalize-once-edit-rest——恰好站在本篇"单表述"假想的反面;LeanMarathon 做长程 autoformalization。把引用关系留白是诚实的:这篇论文的学术后代尚未出生。

Academic Researcher

You’re a researcher who is working on a new project in this area. Propose an imaginary follow-up project not just based on the current but only possible due to the existence and success of the current paper.

项目:Prover-Transfer Atlas(证明器迁移图谱)——把"prover-facing interface"从口号变成测量。只有 FE 成功之后这个项目才可能:它需要 FE 已经造出的两样东西——跨题多样候选档案的生产能力,和 matched 预算协议的评估纪律。做法:固定候选侧(同一批 FE 档案),在 3 个异构 prover(Goedel-Prover-V2、Kimina-Prover、LeanDojo/ReProver 系)下跑同一 B 预算,产出接口敏感度矩阵——同一候选在不同 prover 下的 utility 相关性。两个可证伪预测:① 若"prover-facing"为真,矩阵显著偏离单位阵(候选对 prover 有"口味"匹配);② 若 FE 增益只是数据多样性,矩阵接近单位阵(哪个 prover 都一样受益)——假说被干净地杀死。再加一步跨 prover 迁移(档案在 A 上建、喂给 B)与一个 explore/exploit 策略学习器(用 seed-先验错位度预测该用 K=1 还是 K=2+EvolAST,直接把论文的消融不对称升级成方法)。这个项目同时补上本页评论第 4 条指出的最大未闭合环。

Industry Practitioner

You work at a company or organization developing an application or product of your choice (that has not already been suggested in a prior session). Bring a convincing pitch for why you should be paid to implement the method in the paper, and discuss at least one positive and negative impact of this application.

产品:Formal Data Foundry——面向 prover 厂商与评测机构的形式化数据供给线。卖点:现在的 prover 团队(尤其是做 SFT/RL 的)为可编译定理语句的多样性发愁——人写参考一条题一个说法,扩展贵且慢。Foundry 按 FE 架构跑批:每道种子题产出"编译可行 + judge 过 + 去重"的表述族,带逐调用预算与 lineage 审计。买家按"每千条 SemOK 候选"付费,比雇佣人类形式化便宜一个量级(论文整批 PN 17.3 小时 vs Hybrid 20.8 小时,还不付溢价)。正面影响:小实验室获得预算内可审计的形式化数据多样性;论文里 matched-control + 预算审计的纪律可以做成产品标配,抬高数据供给的透明度标准。负面影响:judge 盲区随规模进入下游训练数据(审计只覆盖 50 题切片),近重复表述族一旦回流基准会系统性抬高 pass 率——"多样性"反过来变成污染源;需要把污染追踪(来源指纹、去重哈希)做成产品义务而不是可选项。

Hacker

You’re a hacker who needs a demo of this paper ASAP. Implement a small part or simplified version of the paper on a small dataset or toy problem. Prepare to share the core code of the algorithm to the class and demo your implementation. Do not simply download and run an existing implementation – though you are welcome to use (and give credit to) an existing implementation for “backbone” code.

mini-FE:137 行跑通"档案进化 vs 无档案采样"的同预算对照。玩具域替换掉 Lean 与 LLM,机制保真:候选是 Python 布尔表达式字符串,"编译门" = eval 过语法且可执行,"语义 judge" = 在 30 个样例上与隐藏真值一致,exact duplicate 触发符号级强制变异(EvolAST 替身),canonicalization 去重,K=2 岛 + 全局容量 40 + 迁移保护。真机跑 python mini_fe.py(10 种子取均值)的输出是:FormalEvolve: mean unique sem-OK 0.3 / repertoire 40,Sample: mean unique sem-OK 0.7 / repertoire 39——玩具域里档案没赢,这个结果本身值得讲(见下方备注)。

import random, warnings

K, CAP, T, BETA, LAM = 2, 40, 100, 0.05, 10
PREDS = ["x%2==0", "x%3==0", "x%2==1", "x<10", "x>=10", "x>5", "x<=5"]
TRUTH = lambda x: x % 2 == 0 and x >= 10   # 隐藏真值("judge oracle")
SAMPLES = list(range(30))

def comp_ok(c):                    # “Lean 编译门”→ 语法+可执行门
    try:
        with warnings.catch_warnings():    # 变异垃圾会触发 SyntaxWarning,属预期
            warnings.simplefilter("ignore")
            f = eval("lambda x: " + c)
        [f(x) for x in SAMPLES]
        return f
    except Exception:
        return None

def sem_ok(f):                     # “语义 judge”→ 机器 oracle(toy 专属简化)
    return all(f(x) == TRUTH(x) for x in SAMPLES)

def canon(c):                      # canonicalization 去重(whitespace/命名归一)
    return " ".join(c.replace("(", " ( ").replace(")", " ) ").split())

def fresh(rng):                    # full 算子:从模板重新生成
    toks = [rng.choice(PREDS)]
    while len(toks) < 7 and rng.random() < 0.35:
        toks += [rng.choice(["and", "or"]), rng.choice(PREDS)]
    return " ".join(toks)

def diff_edit(parent, rng):        # diff 算子:token 级最小改动
    toks = parent.split()
    i = rng.randrange(len(toks))
    if rng.random() < 0.5:
        toks[i] = rng.choice(PREDS + ["and", "or"])     # 换一个 token
    else:
        j = rng.randrange(1, len(toks) + 1)              # 只在 token 边界后插入
        toks[j:j] = [rng.choice(["and", "or"]), rng.choice(PREDS)]  # 增一个合取项
    return " ".join(toks)

def cross(parent, inspir, rng):    # cross 算子:把灵感里的谓词嫁接进父代
    a, b = parent.split(), inspir.split()
    j = rng.randrange(1, len(a) + 1)                     # 只在 token 边界后嫁接
    a[j:j] = [rng.choice(["and", "or"]), b[rng.randrange(len(b))]]
    return " ".join(a)

def evolast(c, rng):               # EvolAST 回退:结构性强制变异
    toks = c.split()
    j = rng.randrange(len(toks))
    if toks[j] in ("and", "or"):
        toks[j] = "or" if toks[j] == "and" else "and"
    else:
        toks[j] = "not (%s)" % toks[j]
    return " ".join(toks)

def repair(c, rng):                # 有界修复:最多 2 次
    for _ in range(2):
        f = comp_ok(c)
        if f is not None:
            return c, f
        toks = c.split()
        if len(toks) > 1:          # 删一个 token 常能修好语法
            del toks[rng.randrange(len(toks))]
        c = " ".join(toks)
    return c, comp_ok(c)

def parent_select(island, rng):    # 使用惩罚的加权父选择
    recs = [r for r in island]
    if not recs:
        return None
    w = []
    for r in recs:
        s = 1 + r["sem"]                       # s = CompOK*(1+SemOK),入档必编译
        u = 1.0 / (1 + (1 + BETA) * r["n"])    # 使用折扣
        w.append(u * (1.0 + LAM * (s - 1)))    # 软加权(sigmoid 的线性替身)
    return rng.choices(recs, weights=w)[0]

def run(evolve=True, seed=0):
    rng = random.Random(seed)
    isl = [[] for _ in range(K)]                # K 个半隔离岛,全局容量 CAP
    seen, hits = set(), set()
    for t in range(T):                          # T=100 generator calls,逐调用记账
        parent = None
        if evolve and any(len(I) for I in isl):
            k = rng.randrange(K)                # 采样一个岛,父代/灵感限于岛内
            home = isl[k] or [r for I in isl for r in I]
            parent = parent_select(home, rng)
            insp = rng.choice(home)
            r = rng.random()
            if r < 0.3:                         # diff:参照父代的最小改动
                cand = diff_edit(parent["e"], rng)
            elif r < 0.5:                       # cross:与岛内灵感杂交
                cand = cross(parent["e"], insp["e"], rng)
            else:                               # full:整体重写
                cand = fresh(rng)
        else:                                   # Sample 对照:同预算,无档案复用
            cand = fresh(rng)
        cand, f = repair(cand, rng)             # 有界修复(comp 失败触发,≤2 次)
        if f is None:
            continue                            # 编译门:进不了档案
        key = canon(cand)
        if key in seen:                         # exact duplicate → EvolAST 强制变异
            cand = evolast(cand, rng)
            f = comp_ok(cand)
            if f is None:
                continue
            key = canon(cand)
        sem = sem_ok(f)
        if sem:
            hits.add(key)
        if key not in seen and sum(len(I) for I in isl) < CAP:
            born = rng.randrange(K) if parent is None else next(
                i for i in range(K) if any(parent is r for r in isl[i]))
            isl[born].append({"e": cand, "sem": sem, "n": 0})
            seen.add(key)
        if parent is not None:
            parent["n"] += 1                    # 使用计数(惩罚反复选同一父代)
        if t % 10 == 9:                         # 每 10 代迁移,保护各岛 top-1
            for i in range(K):
                if len(isl[i]) > 1 and rng.random() < 0.1:
                    j = (i + 1) % K
                    elite = max(isl[i], key=lambda r: 1 + r["sem"])
                    movable = [r for r in isl[i] if r is not elite]
                    mover = movable[rng.randrange(len(movable))]
                    isl[i].remove(mover)                 # 真迁出,不是复制
                    isl[j].append(mover)
    return len(hits), sum(len(I) for I in isl)

if __name__ == "__main__":
    # 10 个种子取均值:玩具域里两种方法都只有 0~1 个命中——这本身就是结果(见页内说明)
    import statistics as st
    fe = [run(True, s) for s in range(10)]
    smp = [run(False, s) for s in range(10)]
    # Sample 的“档案”只是台账(记录 repertoire,从不复用为父代)
    print("FormalEvolve : mean unique sem-OK %.1f / repertoire %.0f" % (
        st.mean(h for h, _ in fe), st.mean(a for _, a in fe)))
    print("Sample       : mean unique sem-OK %.1f / repertoire %.0f" % (
        st.mean(h for h, _ in smp), st.mean(a for _, a in smp)))

与论文的差异及玩具域的诚实结论:真 FE 的变异是看编译器报错与 judge 意见的 LLM patch(定向),编译门是 Lean 4 + Mathlib 的窄可行域,语义门是 CriticLean;本 demo 的算子是无向的字符/token 变异,oracle 只给二值信号。所以 demo 复现的是循环结构(编译门档案、使用惩罚、三算子、有界修复、duplicate 回退、同预算对照),不复现论文的增益——事实上玩具域里 Sample 还略胜(0.7 vs 0.3):无档案的重新采样在宽可行域里每发命中概率不低,而围着垃圾父代变异反而浪费调用。这恰好从反面说明论文的增益从哪来:窄可行域 + 定向变异,档案只有在"父代有信息可给"时才值钱。给 demo 换上反馈定向的修复(如按 oracle 不一致输入翻转变元方向),增益方向就会回来——这留作课堂练习。

Private Investigator

You are a detective who needs to run a background check on one of the paper’s authors. Where have they worked? What did they study? What previous projects might have led to working on this one? What motivated them to work on this project? Feel free to contact the authors, but remember to be courteous, polite, and on-topic.

背景调查(仅公开记录,未联系作者)。先交代一个利益声明:本站维护者与论文作者团队重合——官方实现仓库 cnfjlhj/formalevolve 就托管在本站维护者的 GitHub 账号下,因此这个角色在本页退化为"用公开记录自我陈述",侦探不需要出门。公开履历(论文 front matter):第一作者 Haijian Lu,西安电子科技大学人工智能学院,并列 BIGAI(北京通用人工智能研究院)身份;通讯作者 Wei Wang(BIGAI / 模式识别国家重点实验室,NLPR),负责邮箱 wangwei@nlpr.ia.ac.cn;Jing Liu(西电)。通往这篇论文的可见路径:工具栈本身是履历——全文构建在 Kimina Lean Server(Lean 4.15 + Mathlib)之上、seed 用 Kimina-Autoformalizer、judge 用 CriticLean,说明作者团队在 Lean 自动形式化基础设施上持续投入过工程时间;GitHub 仓库创建于 2026-01-28,早于 v1(2026-03-20)六周,与"代码先行、论文随行"的开发节奏一致。动机的合理推断:把 autoformalization 从"翻译任务"改造成"搜索任务",对同时做过进化计算与 Lean 工具链的人来说是最自然的交叉点——动机图(同预算下候选 prover 结果剧变)大概率是真实实验里先撞见的现象。未核验边界:EMNLP Findings 接收仅见于 arXiv comments 与仓库 README 自述,ACL Anthology 于 2026-10-19 检索 404;作者更早的个人经历公开信息不足,侦探拒绝编。

Social Impact Assessor

Identify how this paper self-assesses its (likely positive) impact on the world. Have any additional positive social impacts left out? What are possible negative social impacts that were overlooked or omitted?

论文自评。正文没有专门的 broader impact 声明,自评散落在动机与局限里:为 prover 训练提供多样、可编译、语义可信的定理语句(数据供给侧);Limitations 主动列出语义等价未被认证(judge 依赖)、单 prover 配置、B=64 单点等边界。

漏掉的正面。① 评测纪律的示范价值:matched 对照 + 逐调用预算审计 + 负结果照报,这套协议若被 LLM 搜索类工作普遍采用,直接抬高全领域的可比较性——这可能是比数据本身更大的公共品;② 小实验室的可及性:整批十几小时的量级意味着非工业界实验室也付得起多样形式化数据的边际成本,形式化数据的供给不再绑定大厂;③ SFT 污染式先验的主动披露,为"基准先验审计"立了一个好先例。

被忽视的负面。① judge 误差的规模化固化:一旦这类管线成为证明器训练数据的主供给,CriticLean 的系统性盲区将以训练语料的形式进入安全攸关的证明工具——50 题切片的审计挡不住这个;② 基准污染回流:近重复表述族扩散到公开基准的语料环境里,pass 率虚高的机制从"背题"升级成"生成近亲题";③ 激励迁移:定理"可证变体"的量产能力可能把形式化社区的注意力从"理解数学"移向"吞吐量竞赛";④ 计算集中:即便"便宜",也仍是以 GPU 时长计的准入门槛,资源弱势组被排除在数据供给生态之外。

Reference / 参考

论文与官方材料

论文内引用的方法与工具(arXiv 号取自论文 references.bib)

站内跨论文参照(仅作分析坐标,不暗示引用关系)

同期相邻工作(未建立引用关系,仅坐标参照)

取回与核验方式