annotate a02/lecture.ind @ 287:ce16779e72a5

fix decrement case
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Tue, 28 Dec 2021 03:17:29 +0900
parents e5cf49902db3
children a3fb231feeb9
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
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
25
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 1) 論理式を変数とそれを結ぶ演算子(connectives)で定義する
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
29 これは構文定義、あるいは、論理式の作り方に相当する
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
30
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
31 2) 演算子を導入する推論と、除去する推論を定義する。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
32   これには証明図を使う
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
33
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
34 3) 推論に対応する関数を表す項を考える
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
35 項は関数型言語の要素になる
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
36
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
37   項の導入 ... データ構造のconstructor
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
38   項の除去 ... データ構造のaccesor
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
39
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 4) x = x の導入と除去
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
48
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
49 5) 項が等しいとはとういうことかを学ぶ  
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
50 正規形
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 以上のことを Agda (Haskell に似た構文を持つ証明支援系)で記述する。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
55
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 A は論理式を表す変数。あるいは型Aという集合。論理式は変数と論理演算子で表される木構造。変数や演算子は構文要素。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
59
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
60 A → B
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
61
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
62 これは「AならばB」というのに対応する。関数の視点からは、Aという型からBという型への関数。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
63 AとBは型を表す論理式。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
64
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
65 A
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
66 -----------
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
67 B
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
68
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
69 Aを仮定して、Bが証明されたことを表す図。証明図。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
70
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
71 --関数適用による証明
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
72
266
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 163
diff changeset
73 導入 除去
37
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
74
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
75 A
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
76 :
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
77 B A A → B
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
78 ------------- ------------------
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
79 A → B B
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
80
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 λ x → y
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
85
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
86 x は変数、y は項。y は複雑な項(関数のbody)でも良い。これは構文定義でもある。変数 x と項yから
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
87 λ x → y という項を作れる。 x は構文的にスコープを持っている。つまり、関数の引数と同じ扱いとする。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
88
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 x : A
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
92
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
93 は、x という項が型Aを持つと言うのを表している。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
94
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
95 x : A かつ y : B の時に、
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
96
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
97 λ x → y : A → B
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
98
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 ---Agdaの構文
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
104
53
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
105 <a href="agda-install.html"> Agda のinstallの方法 </a>
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
106 <br>
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
107
37
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
108 型と値
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 indent
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
113
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
114 implicit variable
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
115
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
116 infix operator and operator order
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
117
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
118 <a href="agda.html"> agda の細かい構文の話 </a>
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
119
266
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 163
diff changeset
120 Unicode入力
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 163
diff changeset
121
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 163
diff changeset
122 <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
123
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 163
diff changeset
124 --重要
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 163
diff changeset
125
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 163
diff changeset
126 空白が入らないものは一単語になる (A→A は一単語、A → A とは別)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 163
diff changeset
127
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 163
diff changeset
128 A:Set は間違いで、A : Set
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 A → B → C は、 A → ( B → C ) のこと
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 163
diff changeset
131
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 163
diff changeset
132   f x y は (f x) y のこと
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 163
diff changeset
133
53
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
134
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
135 ---問題2.1 Agdaによる関数と証明
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
136
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
137
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
138 以下の agda の ? の部分を埋めよ。対応する証明図をコメントで書くこと。
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 <a href="agda/lambda.agda"> lambda </a> <!--- Exercise 2.1 --->
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
37
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
143 --record または ∧
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
144
266
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 163
diff changeset
145 導入 除去
37
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
146
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
147 A B A ∧ B A ∧ B
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
148 ------------- ----------- π1 ---------- π2
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
149 A ∧ B A B
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
150
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
151 除去は複数あるので名前を区別する必要がある。つまり、それぞれに項を用意する必要がある。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
152
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
153 A ∧ B は新しく導入した型である。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
154 型Aと型Bから作るデータ構造であり、オブジェクトあるいは構造体だと思って良い。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
155 π1 π2 は構造体から field を抜き出す accesor によって実装できる。
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
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
159 record によって
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
160
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
161 record _∧_ A B : Set
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
162 field
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
163 π1 : A
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
164 π2 : B
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
165
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
166 _∧_ は中置演算子を表す。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
167
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
168 _∧_ A B
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
169
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 A ∧ B
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
173
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
174 とかける。(Haskell では (∧) を使う)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
175
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
176 は、型Aと型Bから作るデ0ータ構造である。オブジェクトあるいは構造体だと思って良い。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
177
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
178 record { π1 = x ; π2 = y }
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
179
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
180
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
181 ---例題
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
182
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
183 A → B ∧ B → C → A → C
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 (( A → B ) ∧ ( B → C )) → ( A → C )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
188
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 -------------------------------------------------
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
193 (( A → B ) ∧ ( B → C )) → ( A → C )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
194
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
195 : はこれから埋めていく部分。まず適用するのは→のintro duction である。 ( A → B ) ∧ ( B → C )を仮定で使えるようになる。
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 → 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 (( A → B ) ∧ ( B → C )) → ( A → 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 さらに→introを使う。Aを仮定で使えるようになる。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
203
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
204 :
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
205 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 A → C
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
208 -------------------------------------------------
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
209 (( A → B ) ∧ ( B → C )) → ( A → C )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
210
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
211 仮定でCを生成できるのは B → C しかない。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
212
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
213 B B → C
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
214 ---------------------
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
215 C
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
216
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
217 これは→elim である。 B → C は仮定( A → B ) ∧ ( B → C )の左側が使える
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
218
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
219 ( A → B ) ∧ ( B → C )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
220 --------------------- π2
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
221 B → C
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
222
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
223 B の方もがんばると、最終的に
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
224
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
225 [ ( A → B ) ∧ ( B → C )]*1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
226 --------------------------------- π1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
227 [A]*2 A → B [ ( A → B ) ∧ ( B → C ) ]*1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
228 ---------------- →elim ------------------------------- π2
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
229 B B → C
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
230 ----------------------------------------------- →elim
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
231 C
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
232 ------------------------------------------------- →intro 2
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
233 A → C
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
234 ------------------------------------------------- →intro 1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
235 (( A → B ) ∧ ( B → C )) → ( A → C )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
236
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
237 となる。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
238
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
239 Agda では、
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
240
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
241 lemma : (( A → B ) ∧ ( B → C )) → ( A → C )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
242 lemma = ?
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
243
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
244 とすると、A B C が未定義だと言われる。
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 C : Set } → (( 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 引数が一つあるので、それに名前を付ける。
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 f∧g = ?
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 a = ?
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
258
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
259 f∧g は直積なので、
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
260
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
261 π1 f∧g : A → B
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
262 π2 f∧g : B → C
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
263
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
264 なことを考えると、
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
265
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
266 lemma : {A B C : Set } → (( A → B ) ∧ ( B → C )) → ( A → C )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
267 lemma f∧g a = π2 f∧g ?
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
268
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
269 ここで、π2 f∧g ? は (π2 f∧g) ? であることを思い出そう。最終的に、
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 (π1 f∧g) a
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 (π1 f∧g)) a と書かなくても良いのは何故か?)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
275
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
276 前の証明図と、Agdaで証明とどこがどう対応しているのかを考えてみよう。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
277
53
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
278 ---問題2.2 Agdaによる関数と証明
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
279
37
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
104
fba1cd54581d use exists in cond, nfa example
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 59
diff changeset
283 最低限5題をまとめてレポートで提出せよ
fba1cd54581d use exists in cond, nfa example
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 59
diff changeset
284
266
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 163
diff changeset
285 <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
286
266
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 163
diff changeset
287 --Sum type
37
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
288
266
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 163
diff changeset
289 <a href="sumtype.html"> Sum type 排他的論理和</a>
37
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
290
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
291