AI辅助编程语言形式化验证:从类型标注到Isabelle自动证明

1. 项目概述:当AI遇见形式化验证

最近几年,AI大模型在代码生成、补全和解释上展现的能力,大家有目共睹。从GitHub Copilot到Cursor,再到各种IDE插件,它们已经成了不少开发者日常的“结对编程”伙伴。但如果你以为AI在编程领域的潜力仅限于此,那就有点小看它了。一个更深层次、更具颠覆性的应用正在悄然兴起:利用AI辅助进行编程语言的元理论形式化与自动证明

简单来说,这不再是帮你写个业务函数或者修个bug,而是试图让AI理解编程语言本身的设计原理——比如类型系统如何保证安全、操作语义如何定义执行步骤——并用数学上严格无误的方式(形式化)将其表述出来,最后在定理证明器(如Isabelle)中自动或半自动地完成证明。这听起来很“学术”,离业务开发很远,但它实际上是确保编译器、运行时系统乃至整个语言生态可靠性的基石。过去,这项工作极度依赖顶尖专家手动进行,耗时费力且容易出错。现在,我们看到了用AI降低其门槛、提升效率的可能。

这个项目标题“AI辅助的编程语言元理论形式化:从类型标注到Isabelle自动证明”,精准地勾勒出了一条技术路径。它始于一个相对具体的点(类型标注),最终指向一个宏伟的目标(在Isabelle中自动证明元理论性质)。“类型标注”是切入点,因为它是现代语言(如TypeScript, Rust, Scala)中程序员最直观接触到的、与类型理论相关的部分,也是连接代码实践与形式理论的桥梁。“Isabelle自动证明”是终点和验证手段,Isabelle作为一个高阶逻辑定理证明器,是形式化数学和计算机科学理论的“黄金标准”之一。而**“AI辅助”则是贯穿全程的催化剂**,旨在弥合人类直觉与机器严格性之间的鸿沟。

那么,谁需要关注这个方向?首先是编程语言的设计者和研究者,他们可以借此更高效地探索新的语言特性并确保其正确性。其次是编译器、静态分析工具和验证工具的开发者,形式化的元理论是他们工作的终极依据。甚至,对于那些在金融、航空、医疗等领域从事高可信软件开发工程师,理解其底层语言的形式化基础,也能更好地评估所使用的工具链的可靠性。接下来,我将拆解这个过程中的核心环节、分享可行的技术思路,并探讨其中潜藏的挑战与技巧。

2. 核心思路与方案选型:为什么是这条路径?

将AI引入形式化验证,不是一个凭空而来的想法。它源于当前几个技术趋势的交汇:大语言模型(LLM)在代码和数学文本理解上的进步、交互式定理证明器(ITP)如Isabelle/ HOL对自动化工具的持续集成需求,以及工业界对更高层级软件正确性的追求。我们的方案选型,需要在这三者之间找到平衡点。

2.1 为何从“类型标注”入手?

选择“类型标注”作为起点,是基于务实和渐进的考虑。

  1. 数据丰富且结构化:现代代码库中充斥着类型标注。TypeScript的.ts文件、Rust显式的类型声明、甚至Java的泛型,都提供了海量、高质量、结构化的“类型-表达式”配对数据。这为训练或微调AI模型提供了绝佳的语料。相比之下,完整的操作语义或类型安全证明的语料就稀少得多。
  2. 概念层级适中:类型标注连接了具体的语法(程序文本)和抽象的类型论概念。让AI学习推断(x: number) => x + 1的类型是number -> number,比让它从头开始理解“通过语法归纳法证明类型保持性(Type Preservation)”要容易得多。这是一个理想的“垫脚石”。
  3. 具备直接工具价值:即使不走到最终的形式化证明,一个能深度理解类型标注的AI,已经可以用于增强IDE的类型提示、发现复杂的类型错误、甚至为动态语言添加静态类型建议,这本身就有巨大的实用价值,保证了研究路径的可持续性。

2.2 为何选择Isabelle/HOL作为证明后端?

在众多定理证明器(Coq, Lean, Agda, HOL4等)中,Isabelle/HOL有其独特优势,使其成为AI辅助形式化的理想搭档。

  1. 强大的自动化能力(Sledgehammer):Isabelle内置的Sledgehammer工具,可以自动调用外部的一阶定理证明器(如E, SPASS, Vampire)和SMT求解器(如CVC4, Z3),尝试证明当前子目标。这意味着AI不需要“从头开始”构造证明,而是可以扮演“策略建议者”或“引理提示者”的角色,将人类的高层意图转化为对自动化工具的有效调用。这大大降低了AI直接生成正确、冗长证明项的难度。
  2. 自然演绎风格与可读性:Isabelle/Isar语言允许用户以接近数学论文的风格编写结构化、可读的证明。这对于AI生成和人类审阅都更友好。AI可以先生成证明大纲(Isar脚本的骨架),然后由自动化工具或人工细化。
  3. 成熟的库生态系统:Isabelle拥有庞大且维护良好的标准库,涵盖了从基础数学到复杂编程语言形式化(如HOL/IMP,HOL/Lambda)的众多理论。AI可以学习复用这些库中的定义、引理和证明模式,而不是一切从零开始。
  4. 交互性与容错性:Isabelle是一个交互式环境,允许用户逐步构建证明。AI可以以“建议下一步”的方式介入,在用户卡住时提供提示,或者在证明失败时帮助分析原因、调整策略。这种“人在回路”的模式,比要求AI一次性输出完整正确的证明更现实、更稳健。

2.3 AI在其中扮演的角色:不仅仅是代码生成

在这个项目中,AI不应被简单视为一个“证明生成器”。它的角色是多层次、渐进式的:

  1. 形式化规约的翻译与补全:给定一段用自然语言或非形式化数学描述的元理论(例如,“如果一个表达式具有函数类型,且其参数类型匹配,则应用结果是返回类型”),AI可以帮助将其翻译成Isabelle/HOL的定义和定理陈述。它需要理解数学术语(“蕴含”、“对于所有”、“存在”)并将其映射到逻辑量词==>, !, ?
  2. 证明策略的推荐与合成:在证明过程中,面对一个当前子目标,AI可以分析目标的形式、可用的前提假设以及相关理论库,推荐可能适用的证明策略(auto,simp,blast,metis),或者建议调用Sledgehammer并为其选择合适的过滤条件。
  3. 引理猜想与归纳法建议:对于需要归纳证明的性质(如类型安全性的证明几乎总是基于语法结构的归纳),AI可以识别出归纳变量,并建议归纳法则。它还可以根据失败的证明尝试,“猜想”一个中间引理,这个引理如果成立,就能推动证明前进。
  4. 错误诊断与修复:当Isabelle报告“类型错误”或“证明失败”时,AI可以帮助解读错误信息,定位问题根源(是定义有歧义?还是归纳假设用弱了?),并建议具体的修复方案,比如修改定义、增加前提条件或更换证明策略。

注意:现阶段追求“端到端全自动证明”是不切实际的。更可行的路径是“AI增强的交互式证明”。AI作为超级助手,承担繁重的模式识别、知识检索和策略探索工作,将人类专家从琐碎、重复的推理步骤中解放出来,使其能更专注于高层的创造性构思和关键决策。

3. 技术栈构建与核心组件解析

要实现上述思路,我们需要搭建一个融合了AI与形式化方法的技术栈。这个栈可以分为三层:数据层、AI模型层、集成与交互层

3.1 数据层:喂养AI的“特供食粮”

AI模型需要高质量、有监督的训练数据。对于我们的任务,数据主要来自两方面:

  1. 形式化数学与代码的平行语料

    • 来源:Isabelle标准库(src/HOL)、大型形式化项目(如CompCert的Coq版本、SeL4的Isabelle形式化)的源码。这些源码提供了“定义-定理-证明”的完整链条。
    • 处理:需要解析Isabelle的.thy文件,将其分解为结构化单元。一个理想的数据样本可能包含:
      • 输入:一个用自然语言简要描述的引理(或一个未证明的定理陈述)。
      • 输出:对应的Isabelle定理陈述及其完整的Isar证明脚本。
    • 挑战:直接可用的平行语料很少。大部分工作需要自己构建,包括清洗、对齐和标注。一个技巧是从注释((* ... *))中提取非形式化描述,但注释的质量和完整性参差不齐。
  2. 类型标注与类型推断的语料

    • 来源:大型、类型标注丰富的开源代码库(如TypeScript的DefinitelyTyped、Rust标准库及知名crate)。
    • 处理:使用这些语言的官方解析器(如tsc的编译器API、rustc的语法树)提取每个表达式及其类型标注。可以构建(上下文, 未标注表达式, 类型)(上下文, 标注后表达式)这样的数据对。
    • 用途:这部分数据主要用于预训练或微调一个专门的“类型理解”模型,使其深入掌握类型系统的语法和基本推理规则,为后续映射到形式化理论打下基础。

3.2 AI模型层:选型与训练策略

直接使用通用的代码大模型(如Codex、StarCoder)可能不够精准。我们需要针对任务进行定制。

  1. 基础模型选择

    • 编码器-解码器架构:如Google的T5或Facebook的BART。这类模型在“文本到文本”的转换任务上表现优异,非常适合将非形式化描述翻译为形式化定理,或将证明目标转化为策略序列。
    • 自回归解码器架构:如GPT系列或CodeGen。这类模型擅长生成连贯的、结构化的文本,适合生成完整的Isar证明脚本或补全部分证明。考虑到Isabelle证明的强结构性,这类模型可能更有优势。
    • 推荐实践:可以从一个在代码和数学文本上预训练过的模型开始,例如CodeT5+LeanDojo项目(虽然针对Lean,但其思路和部分数据可借鉴)中发布的模型。它们已经具备了一定的形式化语言理解能力。
  2. 训练任务设计

    • 翻译任务:训练模型将非形式化的数学句子映射为Isabelle/HOL的命题。例如,输入“对于所有自然数n,n+0=n”,输出lemma add_0: “∀n::nat. n + 0 = n”
    • 策略预测任务:给定当前的证明状态(goal)和可用的前提(local facts),预测下一个最可能成功的证明策略(tactic)。这可以建模为一个多分类问题。
    • 证明补全任务:给定一个定理陈述和部分证明脚本(可能卡在某个中间状态),生成后续的若干行证明脚本,以完成证明或推进到下一个显著状态。
    • 联合训练:可以采用多任务学习,让一个模型同时胜任翻译、策略建议和补全,共享底层关于形式化逻辑和证明结构的知识表示。
  3. 提示工程: 在零样本或少样本场景下,精心设计的提示(Prompt)至关重要。对于Isabelle,提示中应包含:

    • 相关理论theory ... imports Main ... begin
    • 关键定义:复现当前上下文中重要的数据类型和函数定义。
    • 证明模式示例:提供一两个类似命题的证明样例,展示常用的归纳结构或策略组合。
    • 当前目标:清晰标出需要证明的子目标。 一个结构化的提示能显著提升大模型生成内容的准确性和相关性。

3.3 集成与交互层:打造流畅的“人-AI-证明器”工作流

这是将AI能力转化为生产力的关键。理想的工作流应该无缝嵌入到研究者现有的Isabelle开发环境中。

  1. IDE插件开发

    • 平台:为VS Code或JetBrains IDE开发插件,因为Isabelle已有相关的官方或社区支持(如VSCode的Isabelle插件)。
    • 核心功能
      • 智能补全:在输入lemmaproof后,AI根据上下文建议可能的定理陈述或初始证明步骤。
      • 策略推荐:在证明的每一步,插件侧边栏显示AI推荐的几个最有可能的策略,点击即可应用。
      • 错误解释:当Isabelle返回错误时,插件调用AI模型对错误信息进行解读,并用更通俗的语言解释可能的原因和修复方法。
      • 引理猜想:在用户尝试证明一个复杂目标时,插件可以建议“你是否需要先证明这个中间引理?”,并给出引理的陈述。
  2. 与Isabelle的通信

    • 协议:通过Isabelle的PIDE(Prover IDE)框架进行通信。PIDE定义了证明器与前端界面之间基于异步消息的协议,允许前端查询证明状态、发送命令、接收反馈。
    • 实现:AI插件作为PIDE的一个“智能客户端”,监听当前证明状态的变化。当状态更新时,插件将当前目标、本地假设、理论上下文等信息发送给本地的AI服务(或远程API)。AI服务返回建议,插件再将其呈现给用户或自动执行。
    • 缓存与去重:为了避免对每个微小步骤都调用AI,需要设计缓存机制,对相似的证明状态进行去重,提升响应速度和效率。
  3. 反馈学习循环: 系统应能记录用户的交互行为:哪些AI建议被采纳并成功推进了证明?哪些被忽略或采纳后导致了失败?这些数据是极其宝贵的反馈,可以用于持续微调和改进AI模型,使其越来越贴合用户的实际工作习惯和特定领域的证明风格。

4. 实操演练:从简单类型标注到形式化证明

让我们通过一个具体的、极度简化的例子,来感受一下这个工作流。假设我们要形式化一个微型整数表达式语言,并证明其类型安全。

4.1 步骤一:定义语言语法和类型

首先,我们在Isabelle中定义语言的语法。这里,我们只有整数常量和加法运算。

theory MiniLang imports Main begin (* 定义类型:我们的语言只有整数类型 *) datatype ty = IntTy (* 定义表达式语法 *) datatype exp = Const int (* 整数常量 *) | Add exp exp (* 加法 e1 + e2 *) (* 定义类型判断关系 ⊢ : (环境) ⇒ (表达式) ⇒ (类型) *) inductive has_type :: "exp ⇒ ty ⇒ bool" (infix "⊢" 55) where t_const: "Const n ⊢ IntTy" | t_add: "⟦ e1 ⊢ IntTy; e2 ⊢ IntTy ⟧ ⟹ Add e1 e2 ⊢ IntTy" end

实操要点

  • datatype用于定义递归的数据类型,非常贴合BNF语法定义。
  • inductive定义了类型判断关系has_type的推理规则。规则t_const说任何整数常量都是IntTy类型。规则t_add说如果e1e2都是IntTy类型,那么它们的加法运算结果也是IntTy。这里的⟦ ... ⟧表示前提条件。
  • 此时,一个训练好的AI助手,可以在你输入inductive has_type ::之后,根据常见的类型规则模式,建议你加入t_constt_add规则。

4.2 步骤二:定义操作语义(求值)

接下来,我们定义表达式如何求值。这里采用大步语义(Big-Step Semantics)。

(* 定义值:目前只有整数值 *) type_synonym val = int (* 大步求值关系 ⇓ : (表达式) ⇒ (值) *) inductive eval :: "exp ⇒ val ⇒ bool" (infix "⇓" 55) where e_const: "Const n ⇓ n" | e_add: "⟦ e1 ⇓ v1; e2 ⇓ v2 ⟧ ⟹ Add e1 e2 ⇓ (v1 + v2)"

实操要点

  • type_synonym为现有类型创建别名,提高可读性。
  • 求值规则e_add的含义是:要求值Add e1 e2,必须先分别求出e1e2的值v1v2,然后结果就是v1 + v2
  • AI助手可以识别出,在定义了has_type之后,很可能会需要定义eval。它可以根据has_type的结构,类比地建议eval规则的基本框架。

4.3 步骤三:陈述并证明类型安全性(进展定理)

类型安全性通常包含两个部分:进展(Progress)和保持(Preservation)。我们先证明进展定理:一个良类型的表达式,要么已经是一个值,要么可以继续求值(对于我们的简单语言,它总是可以求值到一个值)。

(* 进展定理:良类型的表达式要么是值,要么可以求一步 *) (* 在我们的语言里,所有表达式最终都能求值为值 *) theorem progress: "e ⊢ IntTy ⟹ ∃v. e ⇓ v" proof (induction e rule: exp.induct) case (Const n) then show ?case by (metis eval.intros(1) has_type.cases) (* AI可能建议使用 `e_const` 和 `t_const` *) next case (Add e1 e2) (* 根据归纳假设,e1和e2都能求值 *) from Add.IH(1) obtain v1 where "e1 ⇓ v1" by blast from Add.IH(2) obtain v2 where "e2 ⇓ v2" by blast then show ?case by (metis eval.intros(2) has_type.cases) (* AI可能建议使用 `e_add` *) qed

实操过程与AI辅助解析

  1. 定理陈述:我们输入theorem progress: “e ⊢ IntTy ⟹ ∃v. e ⇓ v”。AI助手可以基于常见模式,在我们输入theorem progress后,自动补全类似“well_typed e ⟹ ∃v. eval e v”的陈述,我们只需调整变量名和关系符号。
  2. 选择归纳法:我们开始证明proof (induction e rule: exp.induct)。这是对表达式结构进行归纳的标准做法。AI可以识别出exp是一个递归数据类型,并主动推荐使用结构归纳法exp.induct
  3. 处理子情况
    • case (Const n):我们需要证明Const n ⊢ IntTy ⟹ ∃v. Const n ⇓ v。前提告诉我们Const n是良类型的。根据规则t_const,这总是成立。我们需要找到一个v使得Const n ⇓ v成立。根据规则e_constConst n ⇓ n总是成立。所以v就是n
    • 在这里,AI可以分析当前目标∃v. Const n ⇓ v和已知事实Const n ⊢ IntTy,推荐证明策略apply (rule exI[of _ n])来指定vn,然后apply (rule e_const)来完成证明。或者,它可能推荐更自动化的by (metis eval.intros(1) has_type.cases),其中metis是Isabelle的自动化推理器,eval.intros(1)指代e_const规则。
  4. 处理加法情况case (Add e1 e2)更复杂。归纳假设IH给出了e1 ⊢ IntTy ⟹ ∃v. e1 ⇓ ve2 ⊢ IntTy ⟹ ∃v. e2 ⇓ v。当前前提是Add e1 e2 ⊢ IntTy。根据规则t_add,这个前提蕴含了e1 ⊢ IntTye2 ⊢ IntTy。因此,我们可以从归纳假设中分别得到e1 ⇓ v1e2 ⇓ v2。最后,根据规则e_add,我们有Add e1 e2 ⇓ (v1 + v2),所以存在值v1+v2
    • AI可以在此处发挥关键作用。看到我们使用了from Add.IH(1) obtain v1 where “e1 ⇓ v1”,它可能提示“你需要先使用t_add规则来分解前提Add e1 e2 ⊢ IntTy,以得到e1 ⊢ IntTye2 ⊢ IntTy,才能应用归纳假设”。它甚至可以自动生成这段代码:fromAdd e1 e2 ⊢ IntTyhave “e1 ⊢ IntTy” and “e2 ⊢ IntTy” by (auto elim: has_type.cases)

注意事项:这个例子极其简单,实际的编程语言形式化要复杂无数倍,涉及变量、函数、递归、子类型、多态等。但核心的工作流是相似的:定义语法和关系,陈述定理,进行证明。AI的辅助价值在于,它能从庞大的理论库和过往证明中,快速找到适用的模式、规则和策略,减少开发者“记忆负担”和“搜索成本”。

5. 核心挑战与应对策略

将AI应用于形式化验证,道路并非一片坦途。以下是几个主要的挑战及我的思考:

5.1 数据稀缺与质量难题

挑战:高质量、大规模的形式化证明语料极其有限。Isabelle的整个标准库虽然庞大,但相对于训练现代大模型的需求,仍属“小数据”。且证明风格因人而异,存在噪声。

应对策略

  1. 数据增强:对现有的形式化证明进行语法上的等价变换,生成新的训练样本。例如,重命名变量、重新排列证明步骤的顺序(在保持逻辑等价的前提下)、将apply风格的证明改写为结构化的Isar风格。
  2. 合成数据生成:设计一个“元定理生成器”,自动生成简单的、语法正确的Isabelle定理及其证明。可以从已知的公理和推理规则出发,通过随机组合生成新的命题和证明。虽然这些命题可能没有数学意义,但能帮助模型掌握形式化的语法和基本推理模式。
  3. 迁移学习:利用在通用代码和自然语言文本上预训练的大模型(如Codex、GPT-4),通过提示工程和少量精调(Fine-tuning),使其适应形式化语言的任务。通用模型已经学会了大量的逻辑和数学概念,迁移学习的起点很高。
  4. 社区共建:推动形式化验证社区共享更多的、标注良好的证明案例,建立开源的数据集(类似LeanDojo为Lean所做的工作)。

5.2 形式逻辑的严格性与AI的模糊性

挑战:定理证明要求绝对的精确性,一个字符的错误都可能导致证明失败。而当前的大语言模型(LLM)本质上是概率模型,生成的内容存在不确定性(“幻觉”),可能产生语法正确但逻辑错误的内容。

应对策略

  1. 始终以证明器为裁判:AI生成的所有内容(定义、定理、证明步骤)都必须提交给Isabelle内核进行验证。只有被内核接受的内容才是有效的。AI的角色是“建议者”,而非“决策者”。这从根本上保证了系统的正确性。
  2. 小步生成与即时验证:不要让AI一次性生成很长的证明脚本。而是采用交互式、小步推进的方式。AI每次只建议下一步策略或下一行代码,立即由Isabelle验证。如果验证失败,AI根据错误信息进行调整。这种“快速失败、快速修正”的循环,能有效控制幻觉的影响。
  3. 利用Isabelle的强类型系统:Isabelle/HOL的类型系统本身就能过滤掉大量无意义的建议。AI生成的表达式如果类型不匹配,会在提交验证前就被标记出来。这为AI提供了一个强大的、即时的约束反馈。

5.3 长程依赖与上下文理解

挑战:一个复杂的证明可能长达数百行,涉及多个引理和复杂的归纳结构。AI需要理解很长的上下文,才能给出合理的后续建议。这超出了当前Transformer模型的标准上下文窗口。

应对策略

  1. 分层与摘要:不将整个证明文件作为上下文喂给AI。而是进行智能摘要:提取当前证明目标、最近使用的几个引理和定义、当前理论中最重要的假设。只将这些精华信息作为提示的一部分。
  2. 向量检索增强:为整个形式化项目(包括所有导入的库)建立向量数据库。当需要建议时,根据当前目标从数据库中检索最相关的定理、定义和证明片段,将它们作为“参考示例”插入到提示中。这相当于给AI模型配备了一个动态的、精准的“工作记忆”。
  3. 聚焦于局部推理:很多证明步骤是局部的。例如,化简(simp)、自动推理(auto)、代数运算(algebra)等策略,主要依赖于当前子目标和少数几个前提。AI可以专注于这些局部模式,而不必总是理解整个证明的宏大叙事。

5.4 评估指标与“有用性”衡量

挑战:如何评估一个AI辅助证明系统的效果?传统的代码生成指标(如BLEU, CodeBLEU)不适用。证明是否成功最终由证明器判定,但“成功”之外,还有“效率”、“指导性”等维度。

应对策略

  1. 成功率:在保留的测试定理集上,衡量在有限交互次数内,系统(人类+AI)能完成证明的比例。
  2. 步骤节省率:与基线(如纯人工证明,或仅使用标准自动化工具)相比,系统减少的证明步骤数或缩短的证明时间。
  3. 建议采纳率:在真实的用户研究中,记录开发者采纳AI建议的比例。高采纳率意味着建议是相关且有用的。
  4. 学习曲线平缓度:新手用户在使用该系统后,独立完成形式化证明任务的能力提升速度。一个好的系统应该能降低入门门槛。

6. 未来展望与个人实践建议

尽管挑战重重,但AI辅助形式化验证的潜力是巨大的。它可能改变编程语言设计、编译器验证和关键系统构建的方式。

从我个人的实践和观察来看,这条路不会一蹴而就。它更像是一场“登山”,而不是“飞跃”。对于想要进入这个领域或尝试相关工具的同行,我的建议是:

从“用”开始,而非从“造”开始。不必一开始就想着构建完整的AI证明系统。可以先尝试使用现有的、集成了一些AI能力的定理证明环境,比如Lean4社区与AI结合非常紧密,有诸多工具和库。感受一下AI在证明过程中能提供什么样的帮助,痛点在哪里。

深入理解一门形式化工具的基础。无论是Isabelle/HOL, Coq, 还是Lean,花时间扎实地学习其基础逻辑、标准库和证明方法论。只有你自己知道如何手动完成一个证明,你才能有效地评估和引导AI。否则,你无法判断AI的建议是妙手偶得,还是胡说八道。

参与社区,贡献数据。这个领域的发展极度依赖社区协作。如果你在使用中积累了有趣的案例、巧妙的证明,或者将一些经典的论文结果形式化了,不妨以开源项目的形式分享出来。这些数据对于后续研究者训练更好的模型至关重要。

关注“提示工程”在形式化领域的特殊技巧。如何为Isabelle/Coq/Lean设计有效的提示,是一个新兴的实践领域。如何组织上下文、如何提供示例、如何约束输出格式,这些经验非常宝贵,且与传统自然语言或代码生成的提示技巧有所不同。

最后,保持耐心和务实。这项技术目前最成熟的应用可能还不是完全自动化的证明,而是“超级智能的证明助手”——它能理解你的模糊意图,帮你补全繁琐的细节,在你卡住时提供几个高质量的备选思路,并解释复杂的错误信息。这已经能极大地提升形式化验证的效率和愉悦感了。从这个角度看,未来已来,只是分布得还不均匀。我们每个人都可以成为推动它前进的一份子。