annotate a02/lecture.ind @ 406:a60132983557

...
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Wed, 08 Nov 2023 21:35:54 +0900
parents 407684f806e4
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
37
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1 -title: 証明と関数型言語、Agda
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
3 問題は、メールでSubjectを (a01 の 問題2.5ならば)
139
3be1afb87f82 add utm
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 104
diff changeset
4 Subject: Report on Automaton Lecture 2.5
37
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
5 として、問題毎に提出すること。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
6
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
7 kono@ie.u-ryukyu.ac.jp まで送ること。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
8 番号のついてない問題はオプションです。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
9
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
10 学籍番号をメールの中に記述すること。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
11 問題番号は正確に記述すること。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
12 出席しない場合でも、問題解答を送れば出席扱いとします。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
13
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
14 提出期限は ura.ie.classes.automaton で知らせます。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
15
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
16
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
17 --証明と関数型言語の関係
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
18
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
19 証明とは、論理式それを結ぶ推論からなる数学的な構造である。また、関数型言語は集合である型とそれを結ぶ関数からなる数学的構造である。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
20
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
21 型つきλ計算と論理が対応するように、データ構造と論理演算子(∧とか∨)を対応させることにより
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
22
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
23 論理式を型として表し、推論を型つきλ計算の項とすると、この二つは似ていることがわかる。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
24
406
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 330
diff changeset
25 この章の内容は基本的には Girad 先生の Proofs and Typesに書いてある内容です。
37
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
26
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
27 --あらすじ
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
28
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
29 1) 論理式を変数とそれを結ぶ演算子(connectives)で定義する
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
30 これは構文定義、あるいは、論理式の作り方に相当する
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
31
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
32 2) 演算子を導入する推論と、除去する推論を定義する。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
33   これには証明図を使う
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
34
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
35 3) 推論に対応する関数を表す項を考える
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
36 項は関数型言語の要素になる
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
37
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
38   項の導入 ... データ構造のconstructor
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
39   項の除去 ... データ構造のaccesor
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
40
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
41 導入は関数の出力の型に現れる
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
42 除去は関数の入力の型に現れる
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
43
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
44 これを演算子の数の分だけ繰り返す。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
45
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
46 次に等式論理を学ぶ。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
47
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
48 4) x = x の導入と除去
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
49
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
50 5) 項が等しいとはとういうことかを学ぶ  
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
51 正規形
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
52
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
53 正規形を得ることが関数型言語の計算(項の操作)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
54
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
55 以上のことを Agda (Haskell に似た構文を持つ証明支援系)で記述する。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
56
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
57 --証明の基本
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
58
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
59 A は論理式を表す変数。あるいは型Aという集合。論理式は変数と論理演算子で表される木構造。変数や演算子は構文要素。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
60
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
61 A → B
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
62
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
63 これは「AならばB」というのに対応する。関数の視点からは、Aという型からBという型への関数。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
64 AとBは型を表す論理式。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
65
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
66 A
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
67 -----------
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
68 B
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
69
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
70 Aを仮定して、Bが証明されたことを表す図。証明図。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
71
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
72 --関数適用による証明
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
73
266
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 163
diff changeset
74 導入 除去
37
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
75
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
76 A
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
77 :
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
78 B A A → B
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
79 ------------- ------------------
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
80 A → B B
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
81
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
82 対応する項。項とは、関数型プログラムを構成する構文要素。木構造で表される。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
83
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
84
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
85 λ x → y
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
86
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
87 x は変数、y は項。y は複雑な項(関数のbody)でも良い。これは構文定義でもある。変数 x と項yから
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
88 λ x → y という項を作れる。 x は構文的にスコープを持っている。つまり、関数の引数と同じ扱いとする。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
89
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
90 項には型が対応する。これは、再帰的に定義される
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
91
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
92 x : A
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
93
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
94 は、x という項が型Aを持つと言うのを表している。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
95
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
96 x : A かつ y : B の時に、
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
97
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
98 λ x → y : A → B
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
99
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
100 と定義する。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
101
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
102
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
103
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
104 ---Agdaの構文
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
105
53
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
106 <a href="agda-install.html"> Agda のinstallの方法 </a>
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
107 <br>
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
108
37
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
109 型と値
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
110
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
111 名前の作り方
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
112
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
113 indent
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
114
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
115 implicit variable
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
116
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
117 infix operator and operator order
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
118
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
119 <a href="agda.html"> agda の細かい構文の話 </a>
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
120
266
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 163
diff changeset
121 Unicode入力
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 163
diff changeset
122
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 163
diff changeset
123 <a href="https://agda.readthedocs.io/en/v2.6.0.1/tools/emacs-mode.html"> Unicode入力 </a>
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 163
diff changeset
124
330
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 326
diff changeset
125 --Agda introduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 326
diff changeset
126
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 326
diff changeset
127 <a href="https://gitlab.ie.u-ryukyu.ac.jp/teacher/kono/agda-introduction"> Agda introduction </a>
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 326
diff changeset
128
266
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 163
diff changeset
129 --重要
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 163
diff changeset
130
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 163
diff changeset
131 空白が入らないものは一単語になる (A→A は一単語、A → A とは別)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 163
diff changeset
132
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 163
diff changeset
133 A:Set は間違いで、A : Set
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 163
diff changeset
134
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 163
diff changeset
135 A → B → C は、 A → ( B → C ) のこと
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 163
diff changeset
136
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 163
diff changeset
137   f x y は (f x) y のこと
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 163
diff changeset
138
53
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
139
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
140 ---問題2.1 Agdaによる関数と証明
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
141
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
142
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
143 以下の agda の ? の部分を埋めよ。対応する証明図をコメントで書くこと。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
144
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
145 <a href="agda/lambda.agda"> lambda </a> <!--- Exercise 2.1 --->
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
146
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
147
37
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
148 --record または ∧
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
149
266
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 163
diff changeset
150 導入 除去
37
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
151
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
152 A B A ∧ B A ∧ B
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
153 ------------- ----------- π1 ---------- π2
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
154 A ∧ B A B
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
155
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
156 除去は複数あるので名前を区別する必要がある。つまり、それぞれに項を用意する必要がある。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
157
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
158 A ∧ B は新しく導入した型である。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
159 型Aと型Bから作るデータ構造であり、オブジェクトあるいは構造体だと思って良い。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
160 π1 π2 は構造体から field を抜き出す accesor によって実装できる。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
161
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
162
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
163
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
164 record によって
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
165
406
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 330
diff changeset
166 record _∧_ A B : Set where
37
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
167 field
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
168 π1 : A
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
169 π2 : B
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
170
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
171 _∧_ は中置演算子を表す。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
172
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
173 _∧_ A B
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
174
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
175
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
176
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
177 A ∧ B
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
178
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
179 とかける。(Haskell では (∧) を使う)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
180
406
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 330
diff changeset
181 は、型Aと型Bから作るデータ構造である。オブジェクトあるいは構造体だと思って良い。
37
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
182
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
183 record { π1 = x ; π2 = y }
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
184
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
185
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
186 ---例題
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
187
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
188 A → B ∧ B → C → A → C
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
189
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
190 まず、正しくかっこを付ける。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
191
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
192 (( A → B ) ∧ ( B → C )) → ( A → C )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
193
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
194 線を上に引く。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
195
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
196 :
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
197 -------------------------------------------------
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
198 (( A → B ) ∧ ( B → C )) → ( A → C )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
199
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
200 : はこれから埋めていく部分。まず適用するのは→のintro duction である。 ( A → B ) ∧ ( B → C )を仮定で使えるようになる。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
201
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
202 :
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
203 A → C
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
204 -------------------------------------------------
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
205 (( A → B ) ∧ ( B → C )) → ( A → C )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
206
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
207 さらに→introを使う。Aを仮定で使えるようになる。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
208
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
209 :
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
210 C
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
211 -------------------------------------------------
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
212 A → C
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
213 -------------------------------------------------
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
214 (( A → B ) ∧ ( B → C )) → ( A → C )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
215
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
216 仮定でCを生成できるのは B → C しかない。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
217
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
218 B B → C
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
219 ---------------------
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
220 C
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
221
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
222 これは→elim である。 B → C は仮定( A → B ) ∧ ( B → C )の左側が使える
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
223
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
224 ( A → B ) ∧ ( B → C )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
225 --------------------- π2
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
226 B → C
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
227
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
228 B の方もがんばると、最終的に
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
229
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
230 [ ( A → B ) ∧ ( B → C )]*1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
231 --------------------------------- π1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
232 [A]*2 A → B [ ( A → B ) ∧ ( B → C ) ]*1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
233 ---------------- →elim ------------------------------- π2
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
234 B B → C
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
235 ----------------------------------------------- →elim
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
236 C
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
237 ------------------------------------------------- →intro 2
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
238 A → C
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
239 ------------------------------------------------- →intro 1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
240 (( A → B ) ∧ ( B → C )) → ( A → C )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
241
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
242 となる。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
243
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
244 Agda では、
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
245
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
246 lemma : (( A → B ) ∧ ( B → C )) → ( A → C )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
247 lemma = ?
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
248
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
249 とすると、A B C が未定義だと言われる。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
250
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
251 lemma : {A B C : Set } → (( A → B ) ∧ ( B → C )) → ( A → C )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
252 lemma = ?
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
253
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
254 引数が一つあるので、それに名前を付ける。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
255
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
256 lemma : {A B C : Set } → (( A → B ) ∧ ( B → C )) → ( A → C )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
257 lemma f∧g = ?
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
258
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
259 いや引数は二つだった。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
260
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
261 lemma : {A B C : Set } → (( A → B ) ∧ ( B → C )) → ( A → C )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
262 lemma f∧g a = ?
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
263
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
264 f∧g は直積なので、
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
265
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
266 π1 f∧g : A → B
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
267 π2 f∧g : B → C
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
268
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
269 なことを考えると、
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
270
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
271 lemma : {A B C : Set } → (( A → B ) ∧ ( B → C )) → ( A → C )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
272 lemma f∧g a = π2 f∧g ?
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
273
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
274 ここで、π2 f∧g ? は (π2 f∧g) ? であることを思い出そう。最終的に、
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
275
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
276 lemma : {A B C : Set } → (( A → B ) ∧ ( B → C )) → ( A → C )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
277 lemma f∧g a = π2 f∧g (π1 f∧g) a
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
278
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
279 (ここで、(π2 f∧g (π1 f∧g)) a と書かなくても良いのは何故か?)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
280
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
281 前の証明図と、Agdaで証明とどこがどう対応しているのかを考えてみよう。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
282
53
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
283 ---問題2.2 Agdaによる関数と証明
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
284
37
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
285
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
286 以下の agda の ? の部分を埋めよ。対応する証明図をコメントで書くこと。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
287
104
fba1cd54581d use exists in cond, nfa example
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 59
diff changeset
288 最低限5題をまとめてレポートで提出せよ
fba1cd54581d use exists in cond, nfa example
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 59
diff changeset
289
266
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 163
diff changeset
290 <a href="agda/record1.agda"> record1</a> <!--- Exercise 2.2 --->
55
ba5ee7eb2866 fix graph
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 53
diff changeset
291
326
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 266
diff changeset
292 --data -- Sum type
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 266
diff changeset
293
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 266
diff changeset
294 record は ∧ に対応するが、∨はどうすれば良いのか。残念ながら∧と対称につくることはできない。(なぜか?)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 266
diff changeset
295
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 266
diff changeset
296 Agda では data という場合分けをする型を導入する。Curry Howard対応が成立する様に、論理記号に対応する
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 266
diff changeset
297 型を導入する。型には導入と削除がある。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 266
diff changeset
298
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 266
diff changeset
299 導入のない data を定義すると、それを矛盾として使うことができる。それを使って否定を定義する。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 266
diff changeset
300
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 266
diff changeset
301 さらに
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 266
diff changeset
302
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 266
diff changeset
303 有限な要素を持つ集合(型)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 266
diff changeset
304 自然数
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 266
diff changeset
305 λ項の等しさとしての等式
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 266
diff changeset
306 不等号
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 266
diff changeset
307
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 266
diff changeset
308 も data を使って定義できる。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 266
diff changeset
309
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 266
diff changeset
310 data は invariant あるいは、制約付きのデータ構造を表すこともできる。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 266
diff changeset
311
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 266
diff changeset
312 さらに、
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 266
diff changeset
313
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 266
diff changeset
314  規則にしたがって生成される集合
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 266
diff changeset
315
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 266
diff changeset
316 も表すことができる。一つ一つ、ゆっくり片付けていこう。
37
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
317
266
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 163
diff changeset
318 <a href="sumtype.html"> Sum type 排他的論理和</a>
37
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
319
326
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 266
diff changeset
320 以下は必要に応じて説明していく。
37
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
321
326
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 266
diff changeset
322 --λ計算の進み方
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 266
diff changeset
323
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 266
diff changeset
324 Agda の値と型は項で定義されていて、それを簡約化することにより計算が進む。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 266
diff changeset
325
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 266
diff changeset
326 Agda (そして Haskell )は、項を簡約化していくことにより計算が進むプログラミング言語である。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 266
diff changeset
327
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 266
diff changeset
328 簡約化の順序には自由度があり、それは実装にって変わる。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 266
diff changeset
329
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 266
diff changeset
330  関数適用にる置き換え
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 266
diff changeset
331  場合分けによる変数の確定
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 266
diff changeset
332 確定した変数での置き換え
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 266
diff changeset
333
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 266
diff changeset
334 自由度に関係なく、項は決まった形に簡約化されるようにλ計算は作られている。(合流性 -- 要証明だが、割と難しい)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 266
diff changeset
335
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 266
diff changeset
336 (Agda で Agda を実装できるのか?)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 266
diff changeset
337
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 266
diff changeset
338 合流性があるので、data で定義された等号が正しく動作する。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 266
diff changeset
339
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 266
diff changeset
340 変数が含まれている場合の等号は単一化と呼ばれる。変数の置き換えが置きるのは data の場合分けと、関数呼び出しの二種類になる。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 266
diff changeset
341
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 266
diff changeset
342 --停止性の問題
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 266
diff changeset
343
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 266
diff changeset
344 入力を data の場合分けで分解していくことは、入力が決まった大きさの項なので、必ず有限回しかできない。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 266
diff changeset
345
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 266
diff changeset
346 つまり、そういう計算が止まることは Agda にはわかる。例えば List や Nat の分解である。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 266
diff changeset
347
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 266
diff changeset
348 分解は再帰的なので、再帰呼び出しがとまるかどうかは、再帰呼び出しの引数が、dataの分解になっているかどうかで判断される。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 266
diff changeset
349
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 266
diff changeset
350 これは一般的なプログラムでは自明にはならない。その時には型チェックエラーになる。 {-# TERMINATING #-} を指定することにより
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 266
diff changeset
351 それを抑制できる。その場合は、そういう止まるとすればという仮定を持つ計算あるいは証明になる。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 266
diff changeset
352
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 266
diff changeset
353 -- induction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 266
diff changeset
354
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 266
diff changeset
355 自明な停止条件でない推論もいくつかある。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 266
diff changeset
356
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 266
diff changeset
357 引数が直接 data を分解しないが、引数が減少する自然数に対応する場合
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 266
diff changeset
358 生成される引数パターンが有限だと分かっている場合
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 266
diff changeset
359
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 266
diff changeset
360 の二つの場合は Agda で induction を定義できる。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 266
diff changeset
361
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 266
diff changeset
362 --古典論理、一階述語論理との差
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 266
diff changeset
363
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 266
diff changeset
364 Agda の → ∧ ∨ は、項の型として定義されている。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 266
diff changeset
365
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 266
diff changeset
366 _∧_ : Set → Set → Set
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 266
diff changeset
367
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 266
diff changeset
368 古典論理では真と偽の二つしかない。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 266
diff changeset
369
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 266
diff changeset
370 data Bool : Set where
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 266
diff changeset
371 true : Bool
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 266
diff changeset
372 false : Bool
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 266
diff changeset
373
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 266
diff changeset
374 この差は、二重否定の扱いに現れる。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 266
diff changeset
375
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 266
diff changeset
376 _/\_ : Bool → Bool → Bool
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 266
diff changeset
377 true /\ true = true
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 266
diff changeset
378 _ /\ _ = false
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 266
diff changeset
379
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 266
diff changeset
380 _\/_ : Bool → Bool → Bool
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 266
diff changeset
381 false \/ false = false
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 266
diff changeset
382 _ \/ _ = true
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 266
diff changeset
383
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 266
diff changeset
384 not_ : Bool → Bool
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 266
diff changeset
385 not true = false
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 266
diff changeset
386 not false = true
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 266
diff changeset
387
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 266
diff changeset
388
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 266
diff changeset
389 とする。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 266
diff changeset
390
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 266
diff changeset
391 以下は Bool では証明できるが、Set では示せない。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 266
diff changeset
392
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 266
diff changeset
393 lem-in-bool : (b : Bool) → not p \/ p
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 266
diff changeset
394 lem-in-bool = ?
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 266
diff changeset
395
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 266
diff changeset
396 double-negation-bool : {B : Bool} → not (not B) → B
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 266
diff changeset
397 double-negation-bool = ?
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 266
diff changeset
398
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 266
diff changeset
399 Set の方では対偶は一方向しか成立しない。また、二重否定や排中律も成立しない。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 266
diff changeset
400
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 266
diff changeset
401 contra-position : {n m : Level } {A : Set n} {B : Set m} → (A → B) → ¬ B → ¬ A
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 266
diff changeset
402 contra-position {n} {m} {A} {B} f ¬b a ?
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 266
diff changeset
403
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 266
diff changeset
404 これは、Agdaの Set が具体的なλ項を要求するためである。つまり、
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 266
diff changeset
405
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 266
diff changeset
406   実際に構成できる証明しか Set は受け付けない
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 266
diff changeset
407
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 266
diff changeset
408 Bool の場合は最初から true / false がわかっている。Set の場合は、そこに入る項がある、入らないことを証明する項がある。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 266
diff changeset
409 そして、どちらかわからない場合がある。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 266
diff changeset
410
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 266
diff changeset
411 実際にわからない場合があることが証明されている(不完全性定理)。一方で、
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 266
diff changeset
412
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 266
diff changeset
413   証明するべき式が恒真(すべての可能な入力について真)なら、証明がある(完全性)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 266
diff changeset
414
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 266
diff changeset
415 であることも証明されている。恒真かどうかはわからないので、この二つは矛盾しない。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 266
diff changeset
416
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 266
diff changeset
417
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 266
diff changeset
418 --一階述語論理の定義
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 266
diff changeset
419
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 266
diff changeset
420 Agda を使って一階述語論理を定義することもできる。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 266
diff changeset
421
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 266
diff changeset
422
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 266
diff changeset
423
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 266
diff changeset
424
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 266
diff changeset
425
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 266
diff changeset
426
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 266
diff changeset
427
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 266
diff changeset
428
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 266
diff changeset
429
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 266
diff changeset
430
330
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 326
diff changeset
431 ---問題2.3 sum type の問題
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 326
diff changeset
432
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 326
diff changeset
433 問題2.9 まで
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 326
diff changeset
434
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 326
diff changeset
435 <a href=""> </a> <!--- Exercise 2.3 --->
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 326
diff changeset
436 <a href=""> </a> <!--- Exercise 2.4 --->
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 326
diff changeset
437 <a href=""> </a> <!--- Exercise 2.5 --->
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 326
diff changeset
438 <a href=""> </a> <!--- Exercise 2.6 --->
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 326
diff changeset
439 <a href=""> </a> <!--- Exercise 2.7 --->
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 326
diff changeset
440 <a href=""> </a> <!--- Exercise 2.8 --->
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 326
diff changeset
441 <a href=""> </a> <!--- Exercise 2.9 --->
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 326
diff changeset
442 <a href=""> </a> <!--- Exercise 2.8 --->
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 326
diff changeset
443 <a href=""> </a> <!--- Exercise 2.9 --->
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 326
diff changeset
444
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 326
diff changeset
445