Lean 战术编写
介绍
Lean是一个交互式定理证明器,它允许用户通过编写代码来构造数学证明。在Lean中,**战术(Tactics)**是用于自动化证明过程的工具。它们可以帮助你分解目标、应用定理、简化表达式等。掌握战术编写是Lean元编程的核心技能之一。
本文将逐步介绍如何在Lean中编写战术,并通过实际案例展示其应用场景。
什么是战术?
战术是Lean中用于操作证明状态的小程序。它们可以看作是对当前证明目标的指令,告诉Lean如何将目标分解为更简单的子目标,或者如何应用已知的定理来解决问题。
基本战术
在Lean中,有一些内置的基本战术,例如:
intro
:用于引入假设。apply
:用于应用定理。exact
:用于直接完成目标。simp
:用于简化表达式。
这些战术可以组合使用,以构建复杂的证明。
编写自定义战术
除了使用内置战术外,你还可以编写自定义战术。自定义战术允许你封装常用的证明步骤,以便在多个证明中重复使用。
示例:编写一个简单的战术
假设我们经常需要证明某个特定的逻辑命题,例如 A → A
。我们可以编写一个自定义战术来自动完成这个证明。
meta def my_tactic : tactic unit :=
do tactic.intro `h,
tactic.exact (expr.var 0)
在这个例子中,my_tactic
是一个自定义战术,它首先使用 intro
引入假设 h
,然后使用 exact
完成证明。
使用自定义战术
编写完自定义战术后,你可以在证明中使用它:
example : A → A :=
begin
my_tactic
end
这个例子展示了如何使用自定义战术 my_tactic
来证明 A → A
。
实际案例
案例1:自动化逻辑证明
假设我们需要证明一个逻辑命题 (A → B) → (B → C) → (A → C)
。我们可以编写一个战术来自动完成这个证明。
meta def logic_tactic : tactic unit :=
do tactic.intro `h1,
tactic.intro `h2,
tactic.intro `h3,
tactic.apply (expr.var 1),
tactic.apply (expr.var 2),
tactic.exact (expr.var 0)
然后,我们可以使用这个战术来证明命题:
example : (A → B) → (B → C) → (A → C) :=
begin
logic_tactic
end
案例2:简化表达式
假设我们需要简化一个复杂的表达式,例如 (a + b) + (c + d)
。我们可以编写一个战术来自动完成这个任务。
meta def simplify_tactic : tactic unit :=
do tactic.simp
然后,我们可以使用这个战术来简化表达式:
example : (a + b) + (c + d) = a + b + c + d :=
begin
simplify_tactic
end
总结
通过本文,我们学习了如何在Lean中编写战术。战术是Lean中自动化证明过程的重要工具,掌握战术编写可以帮助你更高效地完成复杂的证明任务。
附加资源
练习
- 编写一个自定义战术,用于证明
A → (B → A)
。 - 编写一个自定义战术,用于简化表达式
(a * b) * (c * d)
。
通过练习,你将更深入地理解战术编写,并能够在实际证明中灵活运用。