如何在精益中证明a = b → a + 1 = b + 1?

How to prove a = b → a + 1 = b + 1 in lean?

我正在学习 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

您可以使用 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

虽然 congr_arg 通常是一个很好的解决方案,但这个具体示例确实可以通过 eq.subst + higher-order 统一(congr_arg 在内部使用)来解决。

example (a b : nat) (H1 : a = b) : a + 1 = b + 1 :=
eq.subst H1 rfl

更一般化:a = b -> a + c = b + c in a Ring

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

既然你有平等(a = b),你也可以使用战术模式重写目标:

example (a b : nat) (H1 : a = b) : a + 1 = b + 1 :=
by rw H1

有关策略的介绍,请参阅 Chapter 5 of Theorem Proving in Lean