为什么在 LEAN 中的二项式定理证明中结合律的“重写”失败?
Why does `rewrite` of associativity fail in binomial theorem proof in LEAN?
帝国理工学院开发的 Natural Number Game 是一个伟大的想法,它极大地帮助了 LEAN 中校对写作的基础知识。在经历了其中的大部分之后,有一个 "extra" 问题我还不能弄清楚。下面是这个问题的精简版,它可以放在一个空文件中,并且可以 运行 在 LEAN 中独立存在。
open nat
lemma two_eq_succ_one : 2 = succ(1) := rfl
lemma one_eq_succ_zero : 1 = succ(0) := rfl
theorem add_squared (a b : ℕ) :
(a + b) ^ (2 : ℕ) = a ^ (2 : ℕ) + b ^ (2 : ℕ) + (2 : ℕ) * a * b :=
begin
rw two_eq_succ_one,
rw pow_succ (a+b) 1,
rw pow_one (a+b),
rw mul_add (a+b) a b,
rw add_mul a b a,
rw add_mul a b b,
rw ← mul_comm a b,
-- uncomment the rw below to see it fails
--rw ← add_assoc (a*b) (a*b) (b*b),
end
rw
策略在这里无法识别应该替换的模式,尽管它的打印与目标中出现的完全一样。在线提供的解决方案没有解释为什么会发生这种情况,而是使用 ring
策略来绕过它。然而,游戏的作者说有一个解决方案只使用 rw
。你能帮我理解这里的问题是什么吗?此外,任何额外的代码或提示都会很棒!我从来没有学过抽象代数 class,虽然我很喜欢这个游戏并且学到了很多东西,但这里可能有些东西我没有意识到。
a * a + a * b + (a * b + b * b)
实际上是(a * a + a * b) + (a * b + b * b)
。如果你先 rw add_assoc (a * a)
,那么 rw ← add_assoc (a*b) (a*b) (b*b)
就可以了。
当然,当您不玩自然数游戏时,ring
策略也可以解决此类问题。
帝国理工学院开发的 Natural Number Game 是一个伟大的想法,它极大地帮助了 LEAN 中校对写作的基础知识。在经历了其中的大部分之后,有一个 "extra" 问题我还不能弄清楚。下面是这个问题的精简版,它可以放在一个空文件中,并且可以 运行 在 LEAN 中独立存在。
open nat
lemma two_eq_succ_one : 2 = succ(1) := rfl
lemma one_eq_succ_zero : 1 = succ(0) := rfl
theorem add_squared (a b : ℕ) :
(a + b) ^ (2 : ℕ) = a ^ (2 : ℕ) + b ^ (2 : ℕ) + (2 : ℕ) * a * b :=
begin
rw two_eq_succ_one,
rw pow_succ (a+b) 1,
rw pow_one (a+b),
rw mul_add (a+b) a b,
rw add_mul a b a,
rw add_mul a b b,
rw ← mul_comm a b,
-- uncomment the rw below to see it fails
--rw ← add_assoc (a*b) (a*b) (b*b),
end
rw
策略在这里无法识别应该替换的模式,尽管它的打印与目标中出现的完全一样。在线提供的解决方案没有解释为什么会发生这种情况,而是使用 ring
策略来绕过它。然而,游戏的作者说有一个解决方案只使用 rw
。你能帮我理解这里的问题是什么吗?此外,任何额外的代码或提示都会很棒!我从来没有学过抽象代数 class,虽然我很喜欢这个游戏并且学到了很多东西,但这里可能有些东西我没有意识到。
a * a + a * b + (a * b + b * b)
实际上是(a * a + a * b) + (a * b + b * b)
。如果你先 rw add_assoc (a * a)
,那么 rw ← add_assoc (a*b) (a*b) (b*b)
就可以了。
当然,当您不玩自然数游戏时,ring
策略也可以解决此类问题。