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

标签 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

最佳答案

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

请注意,Lean 能够推断出我们的函数是 λ n, n + 1 ,所以证明可以简化为congr_arg _ H .

关于dependent-type - 如何在精益中证明 a = b → a + 1 = b + 1?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41946310/

相关文章:

pattern-matching - 什么是公理K?

insert - Dafny 插入方法,后置条件可能不会在此返回路径上成立

lazy-evaluation - 精益 4 是懒惰的还是严格的?

operators - 精益中有前缀符号吗?

formal-verification - 在 Lean 中,如果 x < y → x ≤ y - 2 都是奇数或都是偶数,如何证明?

generics - 根据参数值返回不同类型的通用函数

haskell - 是否可以在运行时分配 KnownNat?

distributed - 如何设计和验证分布式系统?

计算导致满足谓词的输入范围

coq - Coq 中保留表示法的多个Where 子句?