annotate a04/lecture.ind @ 67:b9679ebd1156

...
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Thu, 31 Oct 2019 13:53:26 +0900
parents a7f09c9a2c7a
children f124fceba460
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 決定性オートマトンは入力に対して次の状態が一意に決まる。一つの入力に対して可能な状態が複数ある場合を考える。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
4
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 この拡張は容易で、状態遷移関数が状態の代わりに状態のリストを返せば良い。部分集合を使っても良いが、ここではリストを使おう。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
8
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
9 record NAutomaton ( Q : Set ) ( Σ : Set )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
10 : Set where
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
11 field
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
12 nδ : Q → Σ → List Q
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
13 sid : Q → ℕ
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
14 nstart : Q
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
15 nend : Q → Bool
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
16
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
17 これを非決定性オートマトンという。Agda では同じ名前を使いまわしすることはできない(monomorpphism)ので、nを付けた。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
18
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
19 次の状態は状態の集合(List)になる。次の次の状態は、可能な状態の次の状態の集合を合わせた(union)ものになる。
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
20
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
21 少し複雑がだが、insert と merge を定義して、
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
22
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
23 <a href="../agda/nfa-list.agda"> nfa-list.agda </a>
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
24
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
25 insert : { Q : Set } { Σ : Set } → ( NAutomaton Q Σ ) → List Q → Q → List Q
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
26 insert M [] q = q ∷ []
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
27 insert M ( q ∷ T ) q' with (sid M q ) ≟ (sid M q')
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
28 ... | yes _ = insert M T q'
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
29 ... | no _ = q ∷ (insert M T q' )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
30
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
31 merge : { Q : Set } { Σ : Set } → ( NAutomaton Q Σ ) → List Q → List Q → List Q
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
32 merge M L1 [] = L1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
33 merge M L1 ( H ∷ L ) = insert M (merge M L1 L ) H
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
34
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
35 Nmoves : { Q : Set } { Σ : Set }
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
36 → NAutomaton Q Σ
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
37 → List Q → List Σ → List Q
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
38 Nmoves {Q} { Σ} M q L = Nmoves1 q L []
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
39 where
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
40 Nmoves1 : (q : List Q ) ( L : List Σ ) → List Q → List Q
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
41 Nmoves1 q [] _ = q
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
42 Nmoves1 [] (_ ∷ L) LQ = Nmoves1 LQ L []
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
43 Nmoves1 (q ∷ T ) (H ∷ L) LQ = Nmoves1 T (H ∷ L) ( merge M ( nδ M q H ) LQ )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
44
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
45 Naccept : { Q : Set } { Σ : Set }
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
46 → NAutomaton Q Σ
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
47 → List Σ → Bool
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
48 Naccept {Q} { Σ} M L =
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
49 checkAccept ( Nmoves M ((nstart M) ∷ [] ) L )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
50 where
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
51 checkAccept : (q : List Q ) → Bool
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
52 checkAccept [] = false
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
53 checkAccept ( H ∷ L ) with (nend M) H
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
54 ... | true = true
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
55 ... | false = checkAccept L
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 --部分集合を使うと簡単になる
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 href="../agda/nfa-list.agda"> nfa-list.agda </a>
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
62
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
63
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
64 record NAutomaton ( Q : Set ) ( Σ : Set )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
65 : Set where
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
66 field
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
67 Nδ : Q → Σ → Q → Bool
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
68 Nstart : Q → Bool
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
69 Nend : Q → Bool
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 Nmoves : { Q : Set } { Σ : Set }
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
73 → NAutomaton Q Σ
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
74 → {n : ℕ } → FiniteSet Q {n}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
75 → ( Q → Bool ) → Σ → Q → Bool
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
76 Nmoves {Q} { Σ} M fin Qs s q =
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
77 exists fin ( λ qn → (Qs qn ∧ ( Nδ M qn s q ) ))
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
78
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
79
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
80 Naccept : { Q : Set } { Σ : Set }
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
81 → NAutomaton Q Σ
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
82 → {n : ℕ } → FiniteSet Q {n}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
83 → List Σ → Bool
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
84 Naccept {Q} {Σ} M fin input = Naccept1 M ( Nstart M ) input
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
85 where
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
86 Naccept1 : NAutomaton Q Σ → ( Q → Bool ) → List Σ → Bool
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
87 Naccept1 M sb [] = exists fin ( λ q → sb q ∧ Nend M q )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
88 Naccept1 M sb (i ∷ t ) = Naccept1 M ( Nmoves M fin sb i ) t
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 transition3 : States1 → In2 → States1 → Bool
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
93 transition3 sr i0 sr = true
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
94 transition3 sr i1 ss = true
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
95 transition3 sr i1 sr = true
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
96 transition3 ss i0 sr = true
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
97 transition3 ss i1 st = true
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
98 transition3 st i0 sr = true
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
99 transition3 st i1 st = true
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
100 transition3 _ _ _ = false
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
101
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
102 fin1 : States1 → Bool
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
103 fin1 st = true
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
104 fin1 ss = false
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
105 fin1 sr = false
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
106
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
107 start1 : States1 → Bool
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
108 start1 sr = true
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
109 start1 _ = false
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
110
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
111 am2 : NAutomaton States1 In2
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
112 am2 = record { Nδ = transition3 ; Nstart = start1 ; Nend = fin1}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
113
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
114 example2-1 = Naccept am2 finState1 ( i0 ∷ i1 ∷ i0 ∷ [] )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
115 example2-2 = Naccept am2 finState1 ( i1 ∷ i1 ∷ i1 ∷ [] )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
116
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
117