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

时间:2017-01-30 22:11:50

标签: dependent-type formal-verification 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

4 个答案:

答案 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