目录
6 月 27 日,詹博华老师在SIG-元编程 技术沙龙上分享的议题《定理证明自动化中的元编程问题》,视频已经上传 B 站,欢迎小伙伴们点开观看。同时,感谢詹老师会后梳理提供了文字版,方便大家阅读。
B站链接如下:SIG-元编程技术沙龙回顾|基于元编程的可扩展访问者模式
# 定理证明 #
作为计算机科学的一个分支,定理证明研究如何通过逻辑推导的方式验证计算机程序和系统的正确性。自动定理证明关注能够完全自动证明命题的算法,例如 SAT(可满足性)和 SMT(可满足性模理论)的求解算法。交互式定理证明则是通过人和计算机的交互完成证明。在此过程中,人(用户)可以向计算机提供关于证明步骤和证明方法的更多信息,因此可以验证更复杂的定理和系统性质。一些著名的交互式定理证明的成功应用包括 seL4 操作系统微内核的验证和 C 语言编译器 CompCert 的验证。
交互式定理证明面临的一个主要挑战是对人力的要求巨大。例如,seL4 包含约 8700 行 C 代码,但其正确性证明在 Isabelle 证明辅助工具中需要超过 20 万行的证明代码。证明代码和源代码的比例大于 23:1。提高效率的一个主要途径是改善工具的自动化程度,让计算机自主完成尽可能多的证明。交互式定理证明中的证明自动化已经经过了几十年的发展,包括自动定理证明算法的使用。尽管如此,我们依然面临极大的挑战:在实际应用中,我们经常遇到对人来说相当明显的结论,但已有的证明自动化功能无法处理。
本文的目标是介绍定理证明和证明自动化所涉及的问题。我们将看到由于 “证明” 可以和 “程序” 相对应,证明自动化也可以理解为一种元编程问题。在文章的最后,我将列举一些证明自动化的挑战(从个人的观点)和目前正在进行的工作。
# 什么是证明 #
要想理解定理证明和证明自动化问题,我们首先需要理解什么是 “证明”。在交互式定理证明(以及数理逻辑)中,“证明” 是一个具有严格定义的概念,可以理解为由基本推理规则和公理组成的推导过程。为了具体说明,我们考虑一个相对简单的情景:关于等式关系的推理。等式有以下四条基本推理规则:自反性(reflexivity)、对称性(symmetry)、传递性(transitivity)和全等性(congruence)。使用数理逻辑的语言,我们可以将这些推理规则表达如下:
在这些规则的里,横线之上是规则的前提,横线之下是规则的结论。因此,自反性表示任何表达式 x 等于自身。对称性表示如果 x 等于 y,则 y 等于 x。传递性表示如果 x 等于 y,并且 y 等于 z,则 x 等于 z。全等性表示如果 x 等于 y,并且两个函数 f 和 g 相等,则 f(x)=g(y)。
有趣的是,我们可以将这类规则表达为程序中的函数。例如,使用 Python,这些规则可以大致书写如下:
def refl(x): # 输入x, 输出x = x
return Eq(x,x)
def symm(t