File tree 1 file changed +45
-0
lines changed
LeanByExample/Reference/Tactic
1 file changed +45
-0
lines changed Original file line number Diff line number Diff line change @@ -42,6 +42,51 @@ example (n : Nat) : sum n = n * (n + 1) / 2 := by
42
42
-- 後は可換環の性質から示せる
43
43
ring
44
44
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 --#
45
90
/- ## 再帰的定理
46
91
Lean では、実は帰納法を使用するのに必ずしも `induction` は必要ありません。場合分けの中で示されたケースを帰納法の仮定として使うことができます。これは recursive theorem(再帰的定理) と呼ばれることがあります。[ ^recursive ]
47
92
-/
You can’t perform that action at this time.
0 commit comments