我正在研究lean tutorial的第4章。
我希望能够证明简单的等式,例如a = b → a + 1 = b + 1
,不用必须使用calc环境。换句话说,我想明确地构建证明术语:
example (a b : nat) (H1 : a = b) : a + 1 = b + 1 := sorry
我最好的猜测是我需要使用eq.subst
和一些关于标准库中自然数相等的相关引理,但我很遗憾。我能找到的最接近的精益例子是:
example (A : Type) (a b : A) (P : A → Prop) (H1 : a = b) (H2 : P a) : P b :=
eq.subst H1 H2
答案 0 :(得分:4)
您可以使用congr_arg
引理
lemma congr_arg {α : Sort u} {β : Sort v} {a₁ a₂ : α} (f : α → β) :
a₁ = a₂ → f a₁ = f a₂
表示如果为函数提供相等的输入,输出值也将相等。
证据是这样的:
example (a b : nat) (H : a = b) : a + 1 = b + 1 :=
congr_arg (λ n, n + 1) H
请注意,精益能够推断我们的函数是λ n, n + 1
,因此证明可以简化为congr_arg _ H
。
答案 1 :(得分:3)
虽然congr_arg
一般来说是一个很好的解决方案,但这个具体的例子确实可以通过eq.subst
+更高阶的统一来解决(congr_arg
在内部使用)。
example (a b : nat) (H1 : a = b) : a + 1 = b + 1 :=
eq.subst H1 rfl
答案 2 :(得分:0)
更笼统:a = b-> a + c = b + c环形
import algebra.ring
open algebra
variable {A : Type}
variables [s : ring A] (a b c : A)
include s
example (a b c : A) (H1 : a = b) : a + c = b + c :=
eq.subst H1 rfl
答案 3 :(得分:0)
由于您拥有等式(a = b
),因此您也可以使用战术模式来重写目标:
example (a b : nat) (H1 : a = b) : a + 1 = b + 1 :=
by rw H1
有关策略的介绍,请参见Chapter 5 of Theorem Proving in Lean。