annotate a03/lecture.ind @ 406:a60132983557

...
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Wed, 08 Nov 2023 21:35:54 +0900
parents a3fb231feeb9
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: 決定性オートマトン
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2
163
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 65
diff changeset
3 数学の本に書いてあることを Agda で定義してみる。なるべく、数学の本に近くする。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 65
diff changeset
4
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 65
diff changeset
5 Agda は関数型言語なので、数字の添字を使うものは合わない。そのあたりは修正する。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 65
diff changeset
6
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 65
diff changeset
7 Agda は直観主義論理なので、排他律が成立しない。存在を示すには構成的、つまり関数で構成する必要がある。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 65
diff changeset
8
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 65
diff changeset
9 数学の本でも、構成的な証明かどうかは(選択公理を使っているかどうかなどで)区別されていることが多い。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 65
diff changeset
10
37
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
11 -- Automaton オートマトンの定義 ( Q, Σ, σ, q0, F )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
12
163
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 65
diff changeset
13 教科書では以下のようになっている。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 65
diff changeset
14
37
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
15 1. Q is a finte set calles states
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
16 2. Σ is a finte set calles alphabet
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
17 3. δ : Q x Σ is the transition function
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
18 4. q0 ∈ Q is the start state
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
19 5. F ⊆ Q is the set of accept states
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
20
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
21 これを Agda で表すには record を使う。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
22
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
23 record Automaton ( Q : Set ) ( Σ : Set )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
24 : Set where
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
25 field
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
26 δ : Q → Σ → Q
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
27 aend : Q → Bool
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
28
163
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 65
diff changeset
29 どれがどこにん対応しているかを確認しよう。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 65
diff changeset
30
37
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
31 <a href="../agda/automaton.agda"> automaton.agda </a>
65
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
32 <br>
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
33 <a href="../agda/logic.agda"> logic.agda </a>
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
34 <br>
37
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
35
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
36 record は名前のついた数学的構造で、二つの集合 Q と Σの関係定義する関数からなる。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
37
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
38 record は直積で複数の集合の組だが、ここでは関係を表す論理式/関数の型の組になっている。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
39
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
40 δ : Q → Σ → Q
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
41
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
42 は関数で、引数を二つ持っている。ここでは論理式ではない。入力となるaplhabet(文字) とstate (状態)から次の状態を指定する関数である。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
43 transition function (状態遷移関数)と呼ばれる。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
44
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
45 aend : Q → Bool
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
46
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
47 これはQの部分集合を指定している。Bool は
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
48
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
49 data Bool : Set where
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
50 true : Bool
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
51 false : Bool
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
52
326
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 163
diff changeset
53 で、true false の二つの要素を持つ集合である。(これでどうして部分集合になるのか? F ⊆ Q を Agda ではどう定義するべきか? Set を使わないのはなぜか)
37
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
54
63
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 59
diff changeset
55 start state はrecordで定義しない方が便利だと言うことがこの後わかる。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 59
diff changeset
56
37
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 オートマトンの入力は文字列である。文字列を表すには List を用いる。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
60
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
61 data List (A : Set ) : Set where
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
62 [] : List A
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
63 _∷_ : A → List A → List A
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
64
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
65 l2 = a ∷ b ∷ a ∷ c ∷ []
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
66
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
67 だったことを思い出そう。(Agda のbuiltinのListは ∷ を使う)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
68
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
69
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 状態遷移関数をListに適用する。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
73
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
74 moves : { Q : Set } { Σ : Set }
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
75 → Automaton Q Σ
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
76 → Q → List Σ → Q
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
77 moves {Q} { Σ} M q L = move q L
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
78 where
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
79 move : (q : Q ) ( L : List Σ ) → Q
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
80 move q [] = q
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
81 move q ( H ∷ T ) = move ( (δ M) q H ) T
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
82
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
83 List に沿って、状態が変わる。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
84
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
85 accept : { Q : Set } { Σ : Set }
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
86 → Automaton Q Σ
63
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 59
diff changeset
87 → (astart : Q)
37
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
88 → List Σ → Bool
63
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 59
diff changeset
89 accept {Q} { Σ} M astart L = move astart L
37
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
90 where
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
91 move : (q : Q ) ( L : List Σ ) → Bool
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
92 move q [] = aend M q
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
93 move q ( H ∷ T ) = move ( (δ M) q H ) T
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
94
63
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 59
diff changeset
95
37
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
96 最後の状態が aend ならば accept される。これらを、record Automaton 内で定義しても良い。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
97
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 reccord Automaton は抽象的なオートマトンで実装がない。(Java/C++ の abstract classと同じ)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
101 実装を与えるには、record のfield の型を持つ関数を与えれば良い。
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
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
105 data States1 : Set where
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
106 sr : States1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
107 ss : States1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
108 st : States1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
109
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
110 data In2 : Set where
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
111 i0 : In2
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
112 i1 : In2
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
113
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
114 状態遷移関数と accept state を作ろう。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
115
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
116 transition1 : States1 → In2 → States1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
117 transition1 sr i0 = sr
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
118 transition1 sr i1 = ss
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
119 transition1 ss i0 = sr
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
120 transition1 ss i1 = st
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
121 transition1 st i0 = sr
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
122 transition1 st i1 = st
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
123
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
124 fin1 : States1 → Bool
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
125 fin1 st = true
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
126 fin1 _ = false
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
127
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
128 st になればok。record は以下のように作る。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
129
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
130 am1 : Automaton States1 In2
63
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 59
diff changeset
131 am1 = record { δ = transition1 ; aend = fin1 }
37
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
132
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
133 これを動かすには、
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
134
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
135 example1-1 = accept am1 ( i0 ∷ i1 ∷ i0 ∷ [] )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
136 example1-2 = accept am1 ( i1 ∷ i1 ∷ i1 ∷ [] )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
137
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
138 とする。( example1-1 の型は何か?)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
139
163
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 65
diff changeset
140 <a href="../agda/automaton-ex.agda"> Agda による Automaton の例題 </a>
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 65
diff changeset
141
37
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
142 --問題 3.1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
143
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
144 教科書のAutomatonの例のいくつかを Agda で定義してみよ。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
145
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
146 accept される入力と accept されない入力を示し、Agda で true false を確認せよ。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
147
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
148 <a href=""> </a> <!--- Exercise 3.1 --->
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
149
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
150
59
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
151 --Regular Language
37
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
152
163
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 65
diff changeset
153 Automaton は List Σ に対して true / false を返す。つまり、文字列の部分集合を決定する。
59
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
154
163
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 65
diff changeset
155 文字列の部分集合を (Automaton の専門用語として) Language という。でたらめの発声の部分集合が日本語なので言語といえなくもない。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 65
diff changeset
156
326
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 163
diff changeset
157 language : { Σ : Set } → Set
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 163
diff changeset
158 language {Σ} = List Σ → Bool
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 163
diff changeset
159
163
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 65
diff changeset
160 なんらかのAutomaton が受け付ける文字列の部分集合を Regular Language という。この範囲に収まらない Language も後で調べる。
59
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
161
326
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 163
diff changeset
162
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 163
diff changeset
163 --Agda によるRegular Languageの集合演算
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 163
diff changeset
164
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 163
diff changeset
165 何かのAutomaton で判定される言語は ∃ automaton だが、これを record で書く。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 163
diff changeset
166
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 163
diff changeset
167 record RegularLanguage ( Σ : Set ) : Set (Suc Zero) where
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 163
diff changeset
168 field
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 163
diff changeset
169 states : Set
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 163
diff changeset
170 astart : states
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 163
diff changeset
171 automaton : Automaton states Σ
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 163
diff changeset
172 contain : List Σ → Bool
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 163
diff changeset
173 contain x = accept automaton astart x
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 163
diff changeset
174
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 163
diff changeset
175 contain が language の定義の形になっていることを確認しよう。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 163
diff changeset
176
59
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
177 --Regular Languageの演算
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
178
163
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 65
diff changeset
179 Regular Languageは以下の演算に付いて閉じていることが知られている。閉じているとは以下の集合演算をしても、それはやはり
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 65
diff changeset
180 Regular Language つまり、Automaton で、その集合に入っているかどうかを判定できる。
59
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
181
163
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 65
diff changeset
182 二つの文字列集合から、その結合を集める Concatenation
59
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
183
163
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 65
diff changeset
184 文字列の集合の和集合 Union
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 65
diff changeset
185
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 65
diff changeset
186 結合の繰り返し Star
59
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
187
65
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
188 <a href="../agda/regular-language.agda"> Agda での Regular Language </a>
59
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
189
326
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 163
diff changeset
190 Union は Bool 演算を使って簡単に表される。
163
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 65
diff changeset
191
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 65
diff changeset
192 Union : {Σ : Set} → ( A B : language {Σ} ) → language {Σ}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 65
diff changeset
193 Union {Σ} A B x = (A x ) \/ (B x)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 65
diff changeset
194
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 65
diff changeset
195 Concat はそんなに簡単ではない。ある文字列が、前半はAの要素で、後半がBの要素であれば良いのだが、
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 65
diff changeset
196
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 65
diff changeset
197 Concat : {Σ : Set} → ( A B : language {Σ} ) → language {Σ}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 65
diff changeset
198 Concat {Σ} A B x = ?
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 65
diff changeset
199
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 65
diff changeset
200 前半と後半の分け方には非決定性がある。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 65
diff changeset
201
326
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 163
diff changeset
202 --Split による List の分割
163
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 65
diff changeset
203
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 65
diff changeset
204 i0 ∷ i1 ∷ i0 ∷ [] の分け方は and と or で以下のようになる。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 65
diff changeset
205
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 65
diff changeset
206 ( A [] /\ B ( i0 ∷ i1 ∷ i0 ∷ [] ) ) \/
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 65
diff changeset
207 ( A ( i0 ∷ [] ) /\ B ( i1 ∷ i0 ∷ [] ) ) \/
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 65
diff changeset
208 ( A ( i0 ∷ i1 ∷ [] ) /\ B ( i0 ∷ [] ) ) \/
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 65
diff changeset
209 ( A ( i0 ∷ i1 ∷ i0 ∷ [] ) /\ B [] )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 65
diff changeset
210
326
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 163
diff changeset
211 Agda は高階論理なので、これを任意長の List に対して定義できる。
163
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 65
diff changeset
212
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 65
diff changeset
213 split : {Σ : Set} → (List Σ → Bool)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 65
diff changeset
214 → ( List Σ → Bool) → List Σ → Bool
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 65
diff changeset
215 split x y [] = x [] /\ y []
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 65
diff changeset
216 split x y (h ∷ t) = (x [] /\ y (h ∷ t)) \/
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 65
diff changeset
217 split (λ t1 → x ( h ∷ t1 )) (λ t2 → y t2 ) t
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 65
diff changeset
218
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 65
diff changeset
219 これが、実際に文字列の分解になっていることを確認する。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 65
diff changeset
220
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 65
diff changeset
221 test-AB→split : {Σ : Set} → {A B : List In2 → Bool} → split A B ( i0 ∷ i1 ∷ i0 ∷ [] ) ≡ (
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 65
diff changeset
222 ( A [] /\ B ( i0 ∷ i1 ∷ i0 ∷ [] ) ) \/
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 65
diff changeset
223 ( A ( i0 ∷ [] ) /\ B ( i1 ∷ i0 ∷ [] ) ) \/
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 65
diff changeset
224 ( A ( i0 ∷ i1 ∷ [] ) /\ B ( i0 ∷ [] ) ) \/
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 65
diff changeset
225 ( A ( i0 ∷ i1 ∷ i0 ∷ [] ) /\ B [] )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 65
diff changeset
226 )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 65
diff changeset
227 test-AB→split {_} {A} {B} = refl
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 65
diff changeset
228
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 65
diff changeset
229 これを使って Concat と Star を書ける。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 65
diff changeset
230
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 65
diff changeset
231 Concat : {Σ : Set} → ( A B : language {Σ} ) → language {Σ}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 65
diff changeset
232 Concat {Σ} A B = split A B
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 65
diff changeset
233
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 65
diff changeset
234 {-# TERMINATING #-}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 65
diff changeset
235 Star : {Σ : Set} → ( A : language {Σ} ) → language {Σ}
326
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 163
diff changeset
236 Star {Σ} A [] = true
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 163
diff changeset
237 Star {Σ} A (h ∷ t) = split A ( Star {Σ} A ) (h ∷ t)
163
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 65
diff changeset
238
326
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 163
diff changeset
239 {-# TERMINATING #-}は Agda が停止性を判定できないというエラーを抑止するのだった。
163
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 65
diff changeset
240
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 65
diff changeset
241 --Union が RegularLanguage で閉じていること
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 65
diff changeset
242
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 65
diff changeset
243 RegularLanguage かどうかは以下の命題を作れるかどうかでわかる。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 65
diff changeset
244
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 65
diff changeset
245 isRegular : {Σ : Set} → (A : language {Σ} ) → ( x : List Σ ) → (r : RegularLanguage Σ ) → Set
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 65
diff changeset
246 isRegular A x r = A x ≡ contain r x
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 65
diff changeset
247
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 65
diff changeset
248 たとえば Union に付いて閉じているかどうかは
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 65
diff changeset
249
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 65
diff changeset
250 closed-in-union : {Σ : Set} → (A B : RegularLanguage Σ ) → ( x : List Σ ) → isRegular (Union (contain A) (contain B)) x ( M-Union A B )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 65
diff changeset
251
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 65
diff changeset
252 とかける。この時に
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 65
diff changeset
253
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 65
diff changeset
254 M-Union : {Σ : Set} → (A B : RegularLanguage Σ ) → RegularLanguage Σ
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 65
diff changeset
255
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 65
diff changeset
256 で、これは Automaton を具体的に作る必要がある。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 65
diff changeset
257
326
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 163
diff changeset
258 この証明は M-Union の定義とUnionが同じことなので簡単に証明できる。
163
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 65
diff changeset
259
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 65
diff changeset
260
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 65
diff changeset
261 --Concat が RegularLanguage で閉じていること
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 65
diff changeset
262
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 65
diff changeset
263 これは割と難しい。Automaton の状態が有限であることが必要になる。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 65
diff changeset
264
326
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 163
diff changeset
265 A x ≡ contain r x は両辺が true の場合と false の場合がある。これを示すことになる。
163
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 65
diff changeset
266
326
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 163
diff changeset
267 ≡-Bool-func : {A B : Bool } → ( A ≡ true → B ≡ true ) → ( B ≡ true → A ≡ true ) → A ≡ B
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 163
diff changeset
268
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 163
diff changeset
269 をつかって
163
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 65
diff changeset
270
326
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 163
diff changeset
271 closed-in-concat : {Σ : Set} → (A B : RegularLanguage Σ ) → ( x : List Σ ) → isRegular (Concat (contain A) (contain B)) x ( M-Concat A B )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 163
diff changeset
272 closed-in-concat {Σ} A B x = ≡-Bool-func closed-in-concat→ closed-in-concat← where
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 163
diff changeset
273 closed-in-concat→ : Concat (contain A) (contain B) x ≡ true → contain (M-Concat A B) x ≡ true
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 163
diff changeset
274 closed-in-concat→ = ?
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 163
diff changeset
275 closed-in-concat← : contain (M-Concat A B) x ≡ true → Concat (contain A) (contain B) x ≡ true
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 163
diff changeset
276 closed-in-concat← = ?
163
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 65
diff changeset
277
326
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 163
diff changeset
278 とする。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 163
diff changeset
279
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 163
diff changeset
280 問題は M-Concat A B つまり、Concat を受け付ける automaton をどうやって定義するかになる。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 163
diff changeset
281
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 163
diff changeset
282 これは次の lecture で行う。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 163
diff changeset
283
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 163
diff changeset
284 --Star が RegularLanguage で閉じていること
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 163
diff changeset
285
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 163
diff changeset
286 これも問題は上と同じだが...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 163
diff changeset
287