From 679c2fcc9223de6ccfd2130bf84086bd35c7d891 Mon Sep 17 00:00:00 2001 From: Seasawher Date: Thu, 10 Oct 2024 03:44:33 +0900 Subject: [PATCH] =?UTF-8?q?=E5=B8=B0=E7=B4=8D=E5=9E=8B=E3=81=AE=E6=97=8F?= =?UTF-8?q?=E3=81=AE=E8=A9=B1=E3=82=92=E3=82=88=E3=81=8F=E3=81=82=E3=82=8B?= =?UTF-8?q?=E3=82=A8=E3=83=A9=E3=83=BC=E3=81=A7=E3=81=AF=E3=81=AA=E3=81=8F?= =?UTF-8?q?=E5=B8=B0=E7=B4=8D=E5=9E=8B=E3=81=AE=E4=BE=8B=E3=81=A8=E3=81=97?= =?UTF-8?q?=E3=81=A6=E7=B4=B9=E4=BB=8B=E3=81=99=E3=82=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Reference/Declarative/Inductive.lean | 58 +++++++++---------- 1 file changed, 29 insertions(+), 29 deletions(-) diff --git a/LeanByExample/Reference/Declarative/Inductive.lean b/LeanByExample/Reference/Declarative/Inductive.lean index 7cd21382..dca22746 100644 --- a/LeanByExample/Reference/Declarative/Inductive.lean +++ b/LeanByExample/Reference/Declarative/Inductive.lean @@ -34,6 +34,35 @@ inductive BinTree (α : Type) : Type where | empty : BinTree α | node (value : α) (left : BinTree α) (right : BinTree α) : BinTree α +/- ### 帰納型の族 + +ある添字集合 `Λ : Type` の各要素 `λ : Λ` に対して、型 `T λ : Sort u` を定義することができます。簡単な例として、偶数を表す帰納型の族があります。 +-/ + +/-- 自然数 `n` が偶数であることを表す命題 -/ +inductive Even : Nat → Prop where + | zero : Even 0 + | succ (n : Nat) : Even n → Even (n + 2) + +/- これで帰納型の族 `{Even 0, Even 2, Even 4, …}` を定義したことになります。 + +`inductive` コマンドは「パラメータを持つ帰納型」と「帰納型の族」を区別するため、「自然数 `n` が偶数である」ということを表す型を定義しようとして次のように書いたとすると、エラーになることに注意してください。 +-/ + +/-- +error: inductive datatype parameter mismatch + 0 +expected + n +-/ +#guard_msgs in + inductive BadEven (n : Nat) : Prop where + | zero : BadEven 0 + | succ (m : Nat) : BadEven m → BadEven (m + 2) + +/- このようにコードを書くと「すべての `n : Nat` に対して、帰納型 `BadEven n` を構成する」という意味になり、`zero : BadEven 0` だけでなく `zero : BadEven 1` や `zero : BadEven 2` なども存在すると宣言したことになります。したがって、右辺には `BadEven 0` ではなく `BadEven n` が来なければならないというエラーが出ているわけです。 +-/ + /- ## Peano の公理と帰納型 帰納型を利用すると、「Peano の公理に基づく自然数の定義」のような帰納的な公理による定義を表現することができます。 @@ -75,33 +104,4 @@ info: recursor Inductive.MyNat.rec.{u} : {motive : MyNat → Sort u} → -/ #guard_msgs in #print MyNat.rec -/- ## よくあるエラー - -`inductive` コマンドは「パラメータを持つ帰納型」と「帰納型の族」を区別します。 - -たとえば、「自然数 `n` が偶数である」ということを表す型を定義しようとして次のように書いたとすると、エラーになってしまいます。 --/ - -/-- -error: inductive datatype parameter mismatch - 0 -expected - n --/ -#guard_msgs in - inductive BadEven (n : Nat) : Prop where - | zero : BadEven 0 - | succ (m : Nat) : BadEven m → BadEven (m + 2) - -/- このようにコードを書くと「すべての `n : Nat` に対して、帰納型 `BadEven n` を構成する」という意味になり、`zero : BadEven 0` だけでなく `zero : BadEven 1` や `zero : BadEven 2` なども存在すると宣言したことになります。したがって、右辺には `BadEven 0` ではなく `BadEven n` が来なければならないというエラーが出ているわけです。 - -次のように修正すると意図通りに動きます。-/ - -/-- 自然数 `n` が偶数であることを表す命題 -/ -inductive Even : Nat → Prop where - | zero : Even 0 - | succ (n : Nat) : Even n → Even (n + 2) - -/- このコードでは、帰納型の族 `{Even 0, Even 2, Even 4, …}` を定義していることになります。 -/ - end Inductive --#