From 853e812682f32431fd1a087d58be1cc2baa622b2 Mon Sep 17 00:00:00 2001 From: Seasawher Date: Thu, 7 Nov 2024 02:25:02 +0900 Subject: [PATCH] =?UTF-8?q?induction=20...=20generalizing=20=E6=A7=8B?= =?UTF-8?q?=E6=96=87=E3=81=A8=E3=81=9D=E3=81=AE=E5=88=B6=E7=B4=84=E3=82=92?= =?UTF-8?q?=E7=B4=B9=E4=BB=8B=E3=81=99=E3=82=8B=20Fixes=20#971?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- LeanByExample/Reference/Tactic/Induction.lean | 45 +++++++++++++++++++ 1 file changed, 45 insertions(+) diff --git a/LeanByExample/Reference/Tactic/Induction.lean b/LeanByExample/Reference/Tactic/Induction.lean index a123a7a..972484a 100644 --- a/LeanByExample/Reference/Tactic/Induction.lean +++ b/LeanByExample/Reference/Tactic/Induction.lean @@ -42,6 +42,51 @@ example (n : Nat) : sum n = n * (n + 1) / 2 := by -- 後は可換環の性質から示せる ring +/- ## generalizing 構文 +帰納法の仮定が弱すぎることがあります。このとき `generalizing` 構文で帰納法の仮定の中の特定の変数を一般化することができます。 +-/ +namespace Hidden --# + +/-- 偶数であることを意味する帰納的命題 -/ +inductive Even : Nat → Prop where + | zero : Even 0 + | succ : {n : Nat} → Even n → Even (n + 2) + +#guard_msgs (drop warning) in --# +example (n m : Nat) (h : Even (n + m)) (hm : Even m) : Even n := by + generalize hx : n + m = x at h + induction x + + case zero => simp_all + + case succ n' ih => + -- 帰納法の仮定の中の `n, m` は固定されている + guard_hyp ih : n + m = n' → Even n' → Even n + sorry + +#guard_msgs (drop warning) in --# +example (n m : Nat) (h : Even (n + m)) (hm : Even m) : Even n := by + generalize hx : n + m = x at h + -- `generalizing` で帰納法の仮定の中の変数を一般化する + induction x generalizing n m + + case zero => simp_all + case succ x ih => + -- 帰納法の仮定の中の `n, m` が一般化されている + guard_hyp ih : ∀ (n m : ℕ), Even m → n + m = x → Even x → Even n + sorry + +/- `induction ... generalizing` 構文を実行するとき、帰納法を行う変数が一般化される変数に依存していてはいけないというルールがあります。-/ + +/-- +error: variable cannot be generalized because target depends on it + m +-/ +#guard_msgs in + example (n m : Nat) (h : Even (n + m)) (hm : Even m) : Even n := by + induction hm generalizing m + +end Hidden --# /- ## 再帰的定理 Lean では、実は帰納法を使用するのに必ずしも `induction` は必要ありません。場合分けの中で示されたケースを帰納法の仮定として使うことができます。これは recursive theorem(再帰的定理) と呼ばれることがあります。[^recursive] -/