LEAN 除了是一门通用编程语言(General Purpose Programming Language)外,同时,还是理论证明工具(Theorem Prover)。因此,LEAN 具备很多特性来支持理论证明。其中,策略(Tactic)机制,就常用的手段。
LEAN 的策略机制,属于 LEAN 的元编程(Meta-Programming)。通过,策略机制去修改编译器在处理 LEAN 代码时的内部状态。主要,是为围绕这个作为目的(Goal)的元变量(Metavariable),来操作的。
首先,要理解,使用LEAN做理论证明时,如下图:
有,基于两个假设(Hypotheses),得到结论(Target)。即
(H1 : 1 = 1) (H2 : 2 = 2) ⊢ 2= 2
其中,符号⊢的左边为假设(Hypotheses),右边为结论(Target),整体为目的(Goal)。
也就是,
目的(Goal):= 假设(Hypotheses) ⊢ 结论(Target)。
假设(Hypotheses)也称 本地上下文(Local Context)。
那么,by 关键字是用于触发LEAN的策略机制,也就是说,by 后面的每行代码,在整个 by block 结束前,都是,<策略名> <策略输入参数s>,如 上面的无参策略 custom_assump。
也就是说, by 后面的所有策略的组合(Permutation)是为了满足(satisfy) 目的(Goal)的。此时,LEAN 会给定一个元变量(metavariable),如
?m : (H1 : 1 = 1) (H2 : 2 = 2) ⊢ 2= 2
那么, by 引出的策略组(Tactics)就是要给 ?m 赋值(assignment),使得,其值满足 类型 (H1 : 1 = 1) (H2 : 2 = 2) ⊢ 2= 2 。
这就是LEAN策略机制的核心思想。