Lean 语言参考

16. grind策略🔗

grind策略使用受现代 SMT 求解器启发的技术来自动构建证明。 它通过增量收集事实集、使用一组合作技术从现有事实中推导出新事实来生成证据。 在幕后,所有的证明都是通过反证法,所以预期的结论和前提之间不存在操作上的区别; grind 总是试图推导出矛盾。

想象一个虚拟白板。 每当 grind 发现新的等式、不等式或布尔文字时,它都会将该事实写入黑板上,将等效项合并到存储桶中,并邀请每个引擎从共享白板中读取并添加回共享白板。 特别是,由于所有真命题都等于 True,所有假命题都等于 False,因此 grind 跟踪一组已知事实作为跟踪等价类的一部分。

合作的引擎有:

与其他策略一样,grind 为其添加的每个事实生成普通的 Lean 证明条款。 Lean 的标准库已经用 @[grind] 属性进行了注释,因此会自动发现常见的引理。

grind 不是为搜索空间组合爆炸的目标而设计 - 想想大型 n 鸽子实例、图形着色减少、高阶 N 皇后板或编码为布尔约束的 200 变量数独。 此类编码需要数千(或数百万)次大小写分割,这会压垮 grind 的分支搜索。 对于位级或纯布尔组合问题,请使用 bv_decidebv_decide策略调用最先进的 SAT 求解器(例如 CaDiCaL 或 Kissat),然后返回紧凑的机器可检查证书。 所有大量搜索都发生在 Lean 之外;证书在 Lean 内重放和验证,因此保留了信任(验证时间随证书大小而变化)。

Congruence Closure

使用 同余闭包,该证明立即成功,它发现了相等项的集合。

example (a b c : Nat) (h₁ : a = b) (h₂ : b = c) : a = c := a:Natb:Natc:Nath₁:a = bh₂:b = ca = c All goals completed! 🐙
Algebraic Reasoning

该证明使用 grind 的交换环求解器。

example [CommRing α] [NoNatZeroDivisors α] (a b c : α) : a + b + c = 3 a ^ 2 + b ^ 2 + c ^ 2 = 5 a ^ 3 + b ^ 3 + c ^ 3 = 7 a ^ 4 + b ^ 4 = 9 - c ^ 4 := α:Type u_1inst✝¹:CommRing αinst✝:NoNatZeroDivisors αa:αb:αc:αa + b + c = 3 a ^ 2 + b ^ 2 + c ^ 2 = 5 a ^ 3 + b ^ 3 + c ^ 3 = 7 a ^ 4 + b ^ 4 = 9 - c ^ 4 All goals completed! 🐙
Finite-Field Reasoning

Fin 上的算术运算溢出,当结果超出界限时返回到 0grind 可以使用这个事实来证明如下定理:

example (x y : Fin 11) : x ^ 2 * y = 1 x * y ^ 2 = y y * x = 1 := x:Fin 11y:Fin 11x ^ 2 * y = 1 x * y ^ 2 = y y * x = 1 All goals completed! 🐙
Linear Integer Arithmetic with Case Analysis
example (x y : Int) : 27 11 * x + 13 * y 11 * x + 13 * y 45 -10 7 * x - 9 * y 7 * x - 9 * y 4 False := x:Inty:Int27 11 * x + 13 * y 11 * x + 13 * y 45 -10 7 * x - 9 * y 7 * x - 9 * y 4 False All goals completed! 🐙
  1. 16.1. 错误信息
  2. 16.2. 最小化 grind 调用
  3. 16.3. 同余闭包
  4. 16.4. 约束传播
  5. 16.5. 案例分析
  6. 16.6. 电子匹配
  7. 16.7. 线性整数算术
  8. 16.8. 代数工作室(交换环、域)
  9. 16.9. 线性算术工作站
  10. 16.10.grind 注释库
  11. 16.11. 还原性
  12. 16.12. 更大的例子