Skip to content

Commit 7ca78ba

Browse files
committed
cases タクティクを一般の帰納的述語に適用する例を追加する
resolve #2202
1 parent 57f3394 commit 7ca78ba

File tree

1 file changed

+27
-2
lines changed

1 file changed

+27
-2
lines changed

LeanByExample/Tactic/Cases.lean

Lines changed: 27 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,8 @@ example (P Q R : Prop) : P ∨ Q → (P → R) → (Q → R) → R := by
5252

5353
/- ## 舞台裏
5454
55+
### 帰納型の分解
56+
5557
`cases` は、実際には論理和に限らず[帰納型](#{root}/Declarative/Inductive.md)をコンストラクタに分解することができるタクティクです。
5658
-/
5759

@@ -86,7 +88,30 @@ Or.inr : ∀ {a b : Prop}, b → a ∨ b
8688
--#--
8789

8890
inductive Or (a b : Prop) : Prop where
89-
| inl (h : a) : Or a b
90-
| inr (h : b) : Or a b
91+
| inl (h : a)
92+
| inr (h : b)
9193

9294
end Hidden --#
95+
/-
96+
### 帰納的述語の分解
97+
98+
特に、帰納的述語も `cases` タクティクで分解することができます。
99+
仮定がどのコンストラクタから来たものなのかに応じて場合分けをすることができます。
100+
101+
たとえば、以下のように偶数であることを表す帰納的述語を定義したとします。
102+
このとき `Even (n + 2)` という仮定があれば `Even n` を結論出来ますが、これは `cases` タクティクで行うことができます。
103+
-/
104+
105+
/-- 偶数であることを表す帰納的述語 -/
106+
inductive Even : Nat → Prop where
107+
| zero : Even 0
108+
| cons {n : Nat} (ih : Even n) : Even (n + 2)
109+
110+
example (n : Nat) (h : Even (n + 2)) : Even n := by
111+
-- h に対して場合分けを行う。
112+
-- `Even (n + 2)` という仮定はどのコンストラクタから来たか?で場合分けできる。
113+
-- `cases` タクティクはある程度賢いので、
114+
-- `zero` のケースはありえないと判断してスキップできる。
115+
cases h with
116+
| cons ih =>
117+
exact ih

0 commit comments

Comments
 (0)