A に対して、 f a は型 B の項である。 この記法を利用して関数型の項を定義すること もできる。 FirstTheorem.lean def twice ( n : Nat ) : Nat := n + n def n : Nat := twice 3 def my_first_thm : 1 = 1 := Eq.refl 1 10
から関数の型 A -> B が作れる。また、直 和型 A x B や直積型 A + B を作ることもできる。 型の型 Type がある。 (型全体の型ではない。 )型も項にな る。 0 : Nat であり Nat : Type である。 重要な型に Prop がある。これは命題全体の型で、P : Prop は 「P が命題である」と解釈する。同時に P は型でも あり、 h : P を「h は命題 P の証明である」と解釈する。 13
から関数の型 A -> B が作れる。また、直 和型 A x B や直積型 A + B を作ることもできる。 型の型 Type がある。 (型全体の型ではない。 )型も項にな る。 0 : Nat であり Nat : Type である。 重要な型に Prop がある。これは命題全体の型で、P : Prop は 「P が命題である」と解釈する。同時に P は型でも あり、 h : P を「h は命題 P の証明である」と解釈する。 1=1 : Prop であり、 Eq.refl 1 : 1=1 である。これを 「Eq.refl 1 が 1=1 の証明である」と解釈し、 Eq.refl は等式の 公理に対応する関数と考える。 13
が P の証 明である」と解釈する。 「命題 P を証明する」ことは、プログラム上では P 型の項を 作ることであると解釈する。 「命題 P を仮定する」ことは、 P 型の項が与えられていることであると解釈する。 証明とはおおよそ主張と理由の列と思える。理由となるの は論理規則または公理や定義またはすでに証明した命題。 プログラムとはおおよそ関数の列と思える。 14
に対し、関数 型の項 f : P -> Q は P の証明 h : P を与えると Q の証明 f h : Q を返す関数と解釈する。 プログラムは関数の組み合わせであり、証明はならばの組 み合わせである。 ただし、通常のプログラムにおける関数は実際の値の対応 関係が重要になる一方で、証明は項の対応関係は気にしな いで型だけを気にしている。証明は区別せず、項があるか ないかが重要。 17
: Nat ) ( h0 : a = b ) ( h1 : b = c ) : a = c := Eq.trans h0 h1 関数 Eq.trans : a = b -> b = c -> a = c は a=b 型の項と b=c 型の項を受け取り a=c 型の項を返す関数である。 これは命題 a = b の証明と命題 b = c の証明から命題 a = c の証明を与える、つまり等号の推移律の証明と解釈できる。 19
b = a × b + b が成り立つ。 Proof. 分配法則より (a + 1) × b = a × b + 1 × b である。 掛け算の定義より 1 × b = b である。 関数と等号の定義より a × b + 1 × b = a × b + b である。 等号の推移律より (a + 1) × b = a × b + b である。 20
Nat ) : (a + 1) * (b + 1) = a * b + a + b + 1 := Eq.trans (Eq.trans (B a (b + 1)) (congrArg (fun x => x + (b + 1)) (Eq.trans (Nat.left_distrib a b 1) (congrArg (fun x => a * b + x) (Nat.mul_one a))))) (Eq.symm (Nat.add_assoc (a * b + a) b 1)) 23
を作ることができ る。これに対応して、型 P , Q から直積型 P x Q 、直和型 P + Q を作ることができる。 関数 R → P × Q を作ることは関数 R → P と関数 R → Q を作 ることと同じ。これは R ならば(P かつ Q)の証明は、R なら ば P の証明と R ならば Q の証明の組であることに対応する。 26
を作ることができ る。これに対応して、型 P , Q から直積型 P x Q 、直和型 P + Q を作ることができる。 関数 R → P × Q を作ることは関数 R → P と関数 R → Q を作 ることと同じ。これは R ならば(P かつ Q)の証明は、R なら ば P の証明と R ならば Q の証明の組であることに対応する。 関数 P + Q → R を作ることと関数 P → R と関数 Q → R を作 ることは同じ。これは(P または Q)ならば R の証明は、P ならば R の証明と Q ならば R の証明の組であることに対応 する。 26
h n という P n 型の項を並べたものと思うことができる。 P n 型の項 h n は命題 P(n) の証明であるから、 h はすべて の n に対する命題 P(n) の証明を並べたもの、つまり、 ∀n, P(n) の証明である。 直和型の項は? ある n に対して h n という P n 型の項を選 んだものと思うことができる。 P n 型の項 h n は命題 P(n) の証明であるから、 h はある n に対する命題 P(n) の証明を 選んだもの、つまり、∃n, P(n) の証明である。 28
+ 1) * (b + 1) = a * b + a + b + 1 := calc (a + 1) * (b + 1) = a * (b + 1) + 1 * (b + 1) := by apply Nat.right_distrib _ = a * b + a + b + 1 := by simp [Nat.left_distrib, Nat.add_assoc] 41