annotate agda/epautomaton.agda @ 139:3be1afb87f82

add utm
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Sat, 14 Mar 2020 17:34:54 +0900
parents a904b6bc76af
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
9
e7bb980408fb separate epsiron
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1 module epautomaton where
e7bb980408fb separate epsiron
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2
e7bb980408fb separate epsiron
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
3 open import Level renaming ( suc to succ ; zero to Zero )
e7bb980408fb separate epsiron
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
4 open import Data.Nat
13
02b4ecc9972c start exp version of subset construction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
5 open import Data.List
02b4ecc9972c start exp version of subset construction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
6 open import Data.Maybe
9
e7bb980408fb separate epsiron
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
7 open import Data.Bool using ( Bool ; true ; false )
e7bb980408fb separate epsiron
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
8 open import Relation.Binary.PropositionalEquality hiding ( [_] )
e7bb980408fb separate epsiron
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
9 open import Relation.Nullary using (¬_; Dec; yes; no)
e7bb980408fb separate epsiron
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
10
e7bb980408fb separate epsiron
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
11 open import automaton
34
a904b6bc76af add regular language
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 13
diff changeset
12 open import nfa-list
9
e7bb980408fb separate epsiron
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
13
e7bb980408fb separate epsiron
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
14 nth : {S : Set } → ℕ → List S → Maybe S
e7bb980408fb separate epsiron
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
15 nth _ [] = nothing
e7bb980408fb separate epsiron
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
16 nth 0 ( x ∷ _ ) = just x
e7bb980408fb separate epsiron
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
17 nth (suc n) ( _ ∷ t ) = nth n t
e7bb980408fb separate epsiron
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
18
e7bb980408fb separate epsiron
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
19 member : ℕ → List ℕ → Bool
e7bb980408fb separate epsiron
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
20 member _ [] = false
e7bb980408fb separate epsiron
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
21 member n ( x ∷ t ) with n ≟ x
e7bb980408fb separate epsiron
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
22 ... | yes _ = true
e7bb980408fb separate epsiron
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
23 ... | no _ = member n t
e7bb980408fb separate epsiron
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
24
e7bb980408fb separate epsiron
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
25
e7bb980408fb separate epsiron
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
26 data STree (S E : Set ) : Set where
e7bb980408fb separate epsiron
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
27 empty : STree S E
e7bb980408fb separate epsiron
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
28 leaf : S → E → STree S E
e7bb980408fb separate epsiron
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
29 node : S → E → STree S E → STree S E → STree S E
e7bb980408fb separate epsiron
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
30
e7bb980408fb separate epsiron
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
31 Tree : Set → Set
e7bb980408fb separate epsiron
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
32 Tree E = STree ℕ E
e7bb980408fb separate epsiron
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
33
e7bb980408fb separate epsiron
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
34 insertT : {E : Set} → ℕ → E → Tree E → Tree E
e7bb980408fb separate epsiron
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
35 insertT {E} n e empty = leaf n e
13
02b4ecc9972c start exp version of subset construction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
36 insertT {E} n e (leaf n1 e1 ) with n ≟ n1 | n ≤? n1
9
e7bb980408fb separate epsiron
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
37 ... | yes _ | _ = leaf n e
e7bb980408fb separate epsiron
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
38 ... | no _ | yes _ = node n e ( leaf n1 e1 ) empty
e7bb980408fb separate epsiron
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
39 ... | no _ | no _ = node n e empty ( leaf n1 e1 )
e7bb980408fb separate epsiron
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
40 insertT {E} n e (node n1 e1 left right ) with n ≟ n1 | n ≤? n1
e7bb980408fb separate epsiron
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
41 ... | yes _ | _ = node n e left right
e7bb980408fb separate epsiron
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
42 ... | no _ | yes _ = node n1 e1 ( insertT n e left ) right
13
02b4ecc9972c start exp version of subset construction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
43 ... | no _ | no _ = node n1 e1 left ( insertT n e right )
9
e7bb980408fb separate epsiron
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
44
e7bb980408fb separate epsiron
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
45 memberT : {E : Set } → ℕ → Tree E → Maybe E
e7bb980408fb separate epsiron
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
46 memberT _ empty = nothing
e7bb980408fb separate epsiron
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
47 memberT n (leaf n1 e) with n ≟ n1
e7bb980408fb separate epsiron
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
48 ... | yes _ = just e
e7bb980408fb separate epsiron
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
49 ... | no _ = nothing
e7bb980408fb separate epsiron
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
50 memberT n (node n1 e1 left right) with n ≟ n1 | n ≤? n1
e7bb980408fb separate epsiron
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
51 ... | yes _ | _ = just e1
e7bb980408fb separate epsiron
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
52 memberT n (node n1 e1 left right) | no ¬p | (yes p) = memberT n left
e7bb980408fb separate epsiron
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
53 memberT n (node n1 e1 left right) | no ¬p | (no ¬p₁) = memberT n right
e7bb980408fb separate epsiron
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
54
e7bb980408fb separate epsiron
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
55 open import Data.Product
e7bb980408fb separate epsiron
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
56
13
02b4ecc9972c start exp version of subset construction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
57 record εAutomaton ( Q : Set ) ( Σ : Set )
9
e7bb980408fb separate epsiron
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
58 : Set where
e7bb980408fb separate epsiron
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
59 field
e7bb980408fb separate epsiron
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
60 εδ : Q → Maybe Σ → Tree Q
e7bb980408fb separate epsiron
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
61 all-εδ : Q → Tree ( Maybe Σ × Tree Q )
e7bb980408fb separate epsiron
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
62 εid : Q → ℕ
10
32fea87e21b8 merge Σ
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
63 Σid : Σ → ℕ
9
e7bb980408fb separate epsiron
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
64 allState : Tree Q
e7bb980408fb separate epsiron
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
65 εstart : Q
13
02b4ecc9972c start exp version of subset construction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
66 εend : Q → Bool
9
e7bb980408fb separate epsiron
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
67
e7bb980408fb separate epsiron
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
68 open εAutomaton
e7bb980408fb separate epsiron
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
69
e7bb980408fb separate epsiron
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
70 --
e7bb980408fb separate epsiron
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
71 -- find ε connected state by following ε transition
e7bb980408fb separate epsiron
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
72 -- keep track state list in C
e7bb980408fb separate epsiron
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
73 -- if already tracked, skip it
e7bb980408fb separate epsiron
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
74 εclosure : { Q : Set } { Σ : Set }
e7bb980408fb separate epsiron
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
75 → ( allState : Tree Q )
e7bb980408fb separate epsiron
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
76 → ( εδ : Q → Maybe Σ → Tree Q )
e7bb980408fb separate epsiron
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
77 → Tree ( Tree Q )
e7bb980408fb separate epsiron
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
78 εclosure {Q} { Σ} allState εδ = closure ( allState )
e7bb980408fb separate epsiron
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
79 where
13
02b4ecc9972c start exp version of subset construction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
80 closure2 : Tree Q → Tree Q → Tree Q
9
e7bb980408fb separate epsiron
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
81 closure2 empty C = C
e7bb980408fb separate epsiron
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
82 closure2 ( leaf n1 q ) C with memberT n1 C
e7bb980408fb separate epsiron
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
83 ... | just _ = C
13
02b4ecc9972c start exp version of subset construction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
84 ... | nothing = insertT n1 q C
9
e7bb980408fb separate epsiron
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
85 closure2 ( node n1 q left right ) C with memberT n1 C
e7bb980408fb separate epsiron
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
86 ... | just _ = closure2 left ( closure2 right C )
e7bb980408fb separate epsiron
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
87 ... | nothing = insertT n1 q (closure2 left ( closure2 right C ))
13
02b4ecc9972c start exp version of subset construction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
88 closure1 : ℕ → Tree Q
02b4ecc9972c start exp version of subset construction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
89 closure1 n with memberT n (allState )
9
e7bb980408fb separate epsiron
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
90 ... | nothing = empty
e7bb980408fb separate epsiron
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
91 ... | just q = closure2 (εδ q nothing) ( leaf n q )
e7bb980408fb separate epsiron
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
92 closure : Tree Q → Tree ( Tree Q )
e7bb980408fb separate epsiron
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
93 closure empty = empty
e7bb980408fb separate epsiron
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
94 closure (leaf n e) = (leaf n (closure1 n) )
e7bb980408fb separate epsiron
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
95 closure (node n e left right) =
13
02b4ecc9972c start exp version of subset construction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
96 node n (closure1 n) ( closure left ) ( closure right )
9
e7bb980408fb separate epsiron
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
97
10
32fea87e21b8 merge Σ
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
98
9
e7bb980408fb separate epsiron
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
99 εAutomaton2U : { Q : Set } { Σ : Set }
e7bb980408fb separate epsiron
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
100 → εAutomaton Q Σ → NAutomaton Q Σ
e7bb980408fb separate epsiron
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
101 εAutomaton2U {Q} { Σ} M = record {
e7bb980408fb separate epsiron
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
102 nδ = nδ' ;
e7bb980408fb separate epsiron
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
103 sid = εid M ;
e7bb980408fb separate epsiron
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
104 nstart = εstart M ;
e7bb980408fb separate epsiron
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
105 nend = εend M
e7bb980408fb separate epsiron
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
106 } where
e7bb980408fb separate epsiron
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
107 MTree : Tree ( Tree Q )
e7bb980408fb separate epsiron
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
108 MTree = εclosure (allState M ) ( εδ M )
10
32fea87e21b8 merge Σ
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
109 flatten : Tree Q → List Q
32fea87e21b8 merge Σ
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
110 flatten empty = []
32fea87e21b8 merge Σ
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
111 flatten (leaf x q) = [ q ]
32fea87e21b8 merge Σ
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
112 flatten (node x q left right) = flatten left ++ [ q ] ++ flatten right
9
e7bb980408fb separate epsiron
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
113 nδ1 : Tree Q → Σ → List Q
e7bb980408fb separate epsiron
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
114 nδ1 empty i = []
10
32fea87e21b8 merge Σ
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
115 nδ1 (leaf n q) i = flatten (εδ M q (just i))
32fea87e21b8 merge Σ
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
116 nδ1 (node n q left right) i = nδ1 left i ++ ( flatten (εδ M q (just i) )) ++ nδ1 right i
9
e7bb980408fb separate epsiron
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
117 nδ' : Q → Σ → List Q
e7bb980408fb separate epsiron
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
118 nδ' q i with memberT ( εid M q ) MTree
e7bb980408fb separate epsiron
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
119 ... | nothing = []
e7bb980408fb separate epsiron
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
120 ... | just x = nδ1 x i
e7bb980408fb separate epsiron
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
121