Skip to content

Commit 679c2fc

Browse files
committed
帰納型の族の話をよくあるエラーではなく帰納型の例として紹介する
1 parent e68180a commit 679c2fc

File tree

1 file changed

+29
-29
lines changed

1 file changed

+29
-29
lines changed

LeanByExample/Reference/Declarative/Inductive.lean

+29-29
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,35 @@ inductive BinTree (α : Type) : Type where
3434
| empty : BinTree α
3535
| node (value : α) (left : BinTree α) (right : BinTree α) : BinTree α
3636

37+
/- ### 帰納型の族
38+
39+
ある添字集合 `Λ : Type` の各要素 `λ : Λ` に対して、型 `T λ : Sort u` を定義することができます。簡単な例として、偶数を表す帰納型の族があります。
40+
-/
41+
42+
/-- 自然数 `n` が偶数であることを表す命題 -/
43+
inductive Even : Nat → Prop where
44+
| zero : Even 0
45+
| succ (n : Nat) : Even n → Even (n + 2)
46+
47+
/- これで帰納型の族 `{Even 0, Even 2, Even 4, …}` を定義したことになります。
48+
49+
`inductive` コマンドは「パラメータを持つ帰納型」と「帰納型の族」を区別するため、「自然数 `n` が偶数である」ということを表す型を定義しようとして次のように書いたとすると、エラーになることに注意してください。
50+
-/
51+
52+
/--
53+
error: inductive datatype parameter mismatch
54+
0
55+
expected
56+
n
57+
-/
58+
#guard_msgs in
59+
inductive BadEven (n : Nat) : Prop where
60+
| zero : BadEven 0
61+
| succ (m : Nat) : BadEven m → BadEven (m + 2)
62+
63+
/- このようにコードを書くと「すべての `n : Nat` に対して、帰納型 `BadEven n` を構成する」という意味になり、`zero : BadEven 0` だけでなく `zero : BadEven 1` や `zero : BadEven 2` なども存在すると宣言したことになります。したがって、右辺には `BadEven 0` ではなく `BadEven n` が来なければならないというエラーが出ているわけです。
64+
-/
65+
3766
/- ## Peano の公理と帰納型
3867
帰納型を利用すると、「Peano の公理に基づく自然数の定義」のような帰納的な公理による定義を表現することができます。
3968
@@ -75,33 +104,4 @@ info: recursor Inductive.MyNat.rec.{u} : {motive : MyNat → Sort u} →
75104
-/
76105
#guard_msgs in #print MyNat.rec
77106

78-
/- ## よくあるエラー
79-
80-
`inductive` コマンドは「パラメータを持つ帰納型」と「帰納型の族」を区別します。
81-
82-
たとえば、「自然数 `n` が偶数である」ということを表す型を定義しようとして次のように書いたとすると、エラーになってしまいます。
83-
-/
84-
85-
/--
86-
error: inductive datatype parameter mismatch
87-
0
88-
expected
89-
n
90-
-/
91-
#guard_msgs in
92-
inductive BadEven (n : Nat) : Prop where
93-
| zero : BadEven 0
94-
| succ (m : Nat) : BadEven m → BadEven (m + 2)
95-
96-
/- このようにコードを書くと「すべての `n : Nat` に対して、帰納型 `BadEven n` を構成する」という意味になり、`zero : BadEven 0` だけでなく `zero : BadEven 1` や `zero : BadEven 2` なども存在すると宣言したことになります。したがって、右辺には `BadEven 0` ではなく `BadEven n` が来なければならないというエラーが出ているわけです。
97-
98-
次のように修正すると意図通りに動きます。-/
99-
100-
/-- 自然数 `n` が偶数であることを表す命題 -/
101-
inductive Even : Nat → Prop where
102-
| zero : Even 0
103-
| succ (n : Nat) : Even n → Even (n + 2)
104-
105-
/- このコードでは、帰納型の族 `{Even 0, Even 2, Even 4, …}` を定義していることになります。 -/
106-
107107
end Inductive --#

0 commit comments

Comments
 (0)