annotate a03/lecture.ind @ 141:b3f05cd08d24

clean up
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Sun, 27 Dec 2020 13:26:44 +0900
parents 293a2075514b
children 26407ce19d66
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
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
3 -- Automaton オートマトンの定義 ( Q, Σ, σ, q0, F )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
4
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
5 1. Q is a finte set calles states
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
6 2. Σ is a finte set calles alphabet
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
7 3. δ : Q x Σ is the transition function
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
8 4. q0 ∈ Q is the start state
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
9 5. F ⊆ Q is the set of accept states
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
10
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
11 これを Agda で表すには record を使う。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
12
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
13 record Automaton ( Q : Set ) ( Σ : Set )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
14 : Set where
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
15 field
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
16 δ : Q → Σ → Q
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
17 aend : Q → Bool
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
18
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
19 <a href="../agda/automaton.agda"> automaton.agda </a>
65
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
20 <br>
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
21 <a href="../agda/logic.agda"> logic.agda </a>
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
22 <br>
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
23 <a href="../agda/finiteSet.agda"> finiteSet.agda </a>
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
24 <br>
37
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
25
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
26 record は名前のついた数学的構造で、二つの集合 Q と Σの関係定義する関数からなる。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
27
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
28 record は直積で複数の集合の組だが、ここでは関係を表す論理式/関数の型の組になっている。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
29
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
30 δ : Q → Σ → Q
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
31
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
32 は関数で、引数を二つ持っている。ここでは論理式ではない。入力となるaplhabet(文字) とstate (状態)から次の状態を指定する関数である。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
33 transition function (状態遷移関数)と呼ばれる。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
34
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
35 aend : Q → Bool
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
36
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
37 これはQの部分集合を指定している。Bool は
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
38
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
39 data Bool : Set where
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
40 true : Bool
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
41 false : Bool
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
42
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
43 で、true false の二つの要素を持つ集合である。(これでどうして部分集合になるのか? F ⊆ Q を Agda ではどう定義するべきか?)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
44
63
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 59
diff changeset
45 start state はrecordで定義しない方が便利だと言うことがこの後わかる。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 59
diff changeset
46
37
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
47 --オートマトンの入力
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
48
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
49 オートマトンの入力は文字列である。文字列を表すには List を用いる。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
50
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
51 data List (A : Set ) : Set where
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
52 [] : List A
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
53 _∷_ : A → List A → List A
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
54
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
55 l2 = a ∷ b ∷ a ∷ c ∷ []
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
56
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
57 だったことを思い出そう。(Agda のbuiltinのListは ∷ を使う)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
58
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
59
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
60 --状態遷移
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
61
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
62 状態遷移関数をListに適用する。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
63
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
64 moves : { Q : Set } { Σ : Set }
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
65 → Automaton Q Σ
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
66 → Q → List Σ → Q
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
67 moves {Q} { Σ} M q L = move q L
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
68 where
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
69 move : (q : Q ) ( L : List Σ ) → Q
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
70 move q [] = q
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
71 move q ( H ∷ T ) = move ( (δ M) q H ) T
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
72
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
73 List に沿って、状態が変わる。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
74
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
75 accept : { Q : Set } { Σ : Set }
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
76 → Automaton Q Σ
63
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 59
diff changeset
77 → (astart : Q)
37
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
78 → List Σ → Bool
63
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 59
diff changeset
79 accept {Q} { Σ} M astart L = move astart L
37
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
80 where
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
81 move : (q : Q ) ( L : List Σ ) → Bool
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
82 move q [] = aend M q
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
83 move q ( H ∷ T ) = move ( (δ M) q H ) T
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
84
63
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 59
diff changeset
85
37
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
86 最後の状態が aend ならば accept される。これらを、record Automaton 内で定義しても良い。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
87
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 reccord Automaton は抽象的なオートマトンで実装がない。(Java/C++ の abstract classと同じ)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
91 実装を与えるには、record のfield の型を持つ関数を与えれば良い。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
92
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
93 まず、状態と文字を定義する。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
94
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
95 data States1 : Set where
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
96 sr : States1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
97 ss : States1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
98 st : States1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
99
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
100 data In2 : Set where
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
101 i0 : In2
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
102 i1 : In2
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
103
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
104 状態遷移関数と accept state を作ろう。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
105
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
106 transition1 : States1 → In2 → States1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
107 transition1 sr i0 = sr
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
108 transition1 sr i1 = ss
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
109 transition1 ss i0 = sr
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
110 transition1 ss i1 = st
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
111 transition1 st i0 = sr
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
112 transition1 st i1 = st
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
113
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
114 fin1 : States1 → Bool
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
115 fin1 st = true
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
116 fin1 _ = false
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
117
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
118 st になればok。record は以下のように作る。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
119
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
120 am1 : Automaton States1 In2
63
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 59
diff changeset
121 am1 = record { δ = transition1 ; aend = fin1 }
37
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
122
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
123 これを動かすには、
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
124
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
125 example1-1 = accept am1 ( i0 ∷ i1 ∷ i0 ∷ [] )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
126 example1-2 = accept am1 ( i1 ∷ i1 ∷ i1 ∷ [] )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
127
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
128 とする。( example1-1 の型は何か?)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
129
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
130 --問題 3.1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
131
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
132 教科書のAutomatonの例のいくつかを Agda で定義してみよ。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
133
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
134 accept される入力と accept されない入力を示し、Agda で true false を確認せよ。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
135
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
136 <a href=""> </a> <!--- Exercise 3.1 --->
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
137
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
138
59
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
139 --Regular Language
37
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
140
59
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
141 Language とは?
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 Regular Language とは?
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 --Regular Languageの演算
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 Concatenation
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
148
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
149 Union
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
150
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
151 Star
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
152
65
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
153 <a href="../agda/regular-language.agda"> Agda での Regular Language </a>
59
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
154
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
155
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
156