Skip to content

Commit 4092577

Browse files
authored
Merge pull request #1067 from lean-ja/Seasawher/issue971
induction ... generalizing 構文とその制約を紹介する
2 parents 3895f98 + 853e812 commit 4092577

File tree

1 file changed

+45
-0
lines changed

1 file changed

+45
-0
lines changed

LeanByExample/Reference/Tactic/Induction.lean

+45
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,51 @@ example (n : Nat) : sum n = n * (n + 1) / 2 := by
4242
-- 後は可換環の性質から示せる
4343
ring
4444

45+
/- ## generalizing 構文
46+
帰納法の仮定が弱すぎることがあります。このとき `generalizing` 構文で帰納法の仮定の中の特定の変数を一般化することができます。
47+
-/
48+
namespace Hidden --#
49+
50+
/-- 偶数であることを意味する帰納的命題 -/
51+
inductive Even : Nat → Prop where
52+
| zero : Even 0
53+
| succ : {n : Nat} → Even n → Even (n + 2)
54+
55+
#guard_msgs (drop warning) in --#
56+
example (n m : Nat) (h : Even (n + m)) (hm : Even m) : Even n := by
57+
generalize hx : n + m = x at h
58+
induction x
59+
60+
case zero => simp_all
61+
62+
case succ n' ih =>
63+
-- 帰納法の仮定の中の `n, m` は固定されている
64+
guard_hyp ih : n + m = n' → Even n' → Even n
65+
sorry
66+
67+
#guard_msgs (drop warning) in --#
68+
example (n m : Nat) (h : Even (n + m)) (hm : Even m) : Even n := by
69+
generalize hx : n + m = x at h
70+
-- `generalizing` で帰納法の仮定の中の変数を一般化する
71+
induction x generalizing n m
72+
73+
case zero => simp_all
74+
case succ x ih =>
75+
-- 帰納法の仮定の中の `n, m` が一般化されている
76+
guard_hyp ih : ∀ (n m : ℕ), Even m → n + m = x → Even x → Even n
77+
sorry
78+
79+
/- `induction ... generalizing` 構文を実行するとき、帰納法を行う変数が一般化される変数に依存していてはいけないというルールがあります。-/
80+
81+
/--
82+
error: variable cannot be generalized because target depends on it
83+
m
84+
-/
85+
#guard_msgs in
86+
example (n m : Nat) (h : Even (n + m)) (hm : Even m) : Even n := by
87+
induction hm generalizing m
88+
89+
end Hidden --#
4590
/- ## 再帰的定理
4691
Lean では、実は帰納法を使用するのに必ずしも `induction` は必要ありません。場合分けの中で示されたケースを帰納法の仮定として使うことができます。これは recursive theorem(再帰的定理) と呼ばれることがあります。[^recursive]
4792
-/

0 commit comments

Comments
 (0)