annotate agda/sbconst.agda @ 99:aca3f1349913

...
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Mon, 11 Nov 2019 21:30:04 +0900
parents 02b4ecc9972c
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
8
cdf75ae6f0c1 add subset construction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1 module sbconst where
cdf75ae6f0c1 add subset construction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2
cdf75ae6f0c1 add subset construction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
3 open import Level renaming ( suc to succ ; zero to Zero )
cdf75ae6f0c1 add subset construction
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: 12
diff changeset
5 open import Data.List
02b4ecc9972c start exp version of subset construction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 12
diff changeset
6 open import Data.Maybe
02b4ecc9972c start exp version of subset construction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 12
diff changeset
7 open import Data.Product
8
cdf75ae6f0c1 add subset construction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
8 open import Data.Bool using ( Bool ; true ; false ; _∨_ )
cdf75ae6f0c1 add subset construction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
9 open import Relation.Binary.PropositionalEquality hiding ( [_] )
cdf75ae6f0c1 add subset construction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
10 open import Relation.Nullary using (¬_; Dec; yes; no)
cdf75ae6f0c1 add subset construction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
11
cdf75ae6f0c1 add subset construction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
12 open import automaton
9
e7bb980408fb separate epsiron
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
13 open import epautomaton
8
cdf75ae6f0c1 add subset construction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
14
10
32fea87e21b8 merge Σ
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
15
32fea87e21b8 merge Σ
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
16 -- all primitive state has id
32fea87e21b8 merge Σ
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
17 -- Tree Q is sorted by id and is contents are unique
32fea87e21b8 merge Σ
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
18
13
02b4ecc9972c start exp version of subset construction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 12
diff changeset
19 flatten : { Q : Set} → Tree Q → List ℕ
8
cdf75ae6f0c1 add subset construction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
20 flatten empty = []
cdf75ae6f0c1 add subset construction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
21 flatten (leaf x x₁) = [ x ]
cdf75ae6f0c1 add subset construction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
22 flatten (node x x₁ x₂ x₃) = flatten x₂ ++ [ x ] ++ flatten x₃
cdf75ae6f0c1 add subset construction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
23
cdf75ae6f0c1 add subset construction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
24 listEq : List ℕ → List ℕ → Bool
cdf75ae6f0c1 add subset construction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
25 listEq [] [] = true
cdf75ae6f0c1 add subset construction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
26 listEq [] ( _ ∷ _ ) = false
cdf75ae6f0c1 add subset construction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
27 listEq ( _ ∷ _ ) [] = false
cdf75ae6f0c1 add subset construction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
28 listEq ( h1 ∷ t1 ) ( h2 ∷ t2 ) with h1 ≟ h2
cdf75ae6f0c1 add subset construction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
29 ... | yes _ = listEq t1 t2
cdf75ae6f0c1 add subset construction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
30 ... | no _ = false
cdf75ae6f0c1 add subset construction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
31
cdf75ae6f0c1 add subset construction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
32 infixr 7 _==_
cdf75ae6f0c1 add subset construction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
33 _==_ : { Q : Set} → Tree Q → Tree Q → Bool
cdf75ae6f0c1 add subset construction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
34 x == y = listEq ( flatten x ) ( flatten y )
cdf75ae6f0c1 add subset construction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
35
10
32fea87e21b8 merge Σ
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
36 memberTT : { Q : Set} → Tree Q → Tree ( Tree Q ) → Bool
8
cdf75ae6f0c1 add subset construction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
37 memberTT t empty = false
cdf75ae6f0c1 add subset construction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
38 memberTT t (leaf x x₁) = t == x₁
cdf75ae6f0c1 add subset construction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
39 memberTT t (node x x₁ x₂ x₃) with t == x₁
cdf75ae6f0c1 add subset construction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
40 ... | true = true
cdf75ae6f0c1 add subset construction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
41 ... | false = memberTT t x₂ ∨ memberTT t x₃
cdf75ae6f0c1 add subset construction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
42
cdf75ae6f0c1 add subset construction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
43 lengthT : { Q : Set} → Tree Q → ℕ
cdf75ae6f0c1 add subset construction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
44 lengthT t = length ( flatten t )
cdf75ae6f0c1 add subset construction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
45
9
e7bb980408fb separate epsiron
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
46 findT : { Q : Set} → Tree Q → Tree ( Tree Q ) → Maybe ( Tree Q )
e7bb980408fb separate epsiron
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
47 findT t empty = nothing
e7bb980408fb separate epsiron
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
48 findT t (leaf x x₁) = just x₁
e7bb980408fb separate epsiron
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
49 findT t (node x x₁ x₂ x₃) with t == x₁
e7bb980408fb separate epsiron
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
50 ... | true = just x₁
e7bb980408fb separate epsiron
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
51 ... | false with findT t x₂
e7bb980408fb separate epsiron
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
52 ... | (just y) = just y
e7bb980408fb separate epsiron
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
53 ... | nothing = findT t x₃
e7bb980408fb separate epsiron
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
54
13
02b4ecc9972c start exp version of subset construction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 12
diff changeset
55 mergeT : { Q : Set} → Tree Q → Tree Q → Tree Q
10
32fea87e21b8 merge Σ
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
56 mergeT empty t = t
32fea87e21b8 merge Σ
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
57 mergeT (leaf x t0) t = insertT x t0 t
32fea87e21b8 merge Σ
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
58 mergeT (node x t0 left right ) t =
32fea87e21b8 merge Σ
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
59 mergeT left ( insertT x t0 (mergeT right t ))
32fea87e21b8 merge Σ
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
60
8
cdf75ae6f0c1 add subset construction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
61 open εAutomaton
cdf75ae6f0c1 add subset construction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
62
10
32fea87e21b8 merge Σ
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
63 -- all inputs are exclusive each other ( only one input can happen )
9
e7bb980408fb separate epsiron
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
64
13
02b4ecc9972c start exp version of subset construction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 12
diff changeset
65 -- merge Tree ( Maybe Σ × Tree Q )
02b4ecc9972c start exp version of subset construction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 12
diff changeset
66 merge-itεδ : { Σ Q : Set } → εAutomaton Q Σ → Σ → Tree Q → Tree ( Maybe Σ × Tree Q ) → Tree ( Maybe Σ × Tree Q )
02b4ecc9972c start exp version of subset construction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 12
diff changeset
67 merge-itεδ NFA i t empty = leaf (Σid NFA i) ( just i , t )
10
32fea87e21b8 merge Σ
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
68 merge-itεδ NFA i t (leaf x (i' , t1 )) with (Σid NFA i) ≟ x
32fea87e21b8 merge Σ
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
69 ... | no _ = leaf x (i' , t1)
32fea87e21b8 merge Σ
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
70 ... | yes _ = leaf x (just i , mergeT t t1 )
32fea87e21b8 merge Σ
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
71 merge-itεδ NFA i t (node x (i' , t1) left right ) with (Σid NFA i) ≟ x
32fea87e21b8 merge Σ
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
72 ... | no _ = node x (i' , t1) ( merge-itεδ NFA i t left ) ( merge-itεδ NFA i t right )
32fea87e21b8 merge Σ
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
73 ... | yes _ = node x (just i , mergeT t t1 )
32fea87e21b8 merge Σ
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
74 ( merge-itεδ NFA i t left ) ( merge-itεδ NFA i t right )
32fea87e21b8 merge Σ
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
75
13
02b4ecc9972c start exp version of subset construction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 12
diff changeset
76 merge-iεδ : { Σ Q : Set } → εAutomaton Q Σ → Maybe Σ → Tree Q → Tree ( Maybe Σ × Tree Q ) → Tree ( Maybe Σ × Tree Q )
10
32fea87e21b8 merge Σ
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
77 merge-iεδ NFA nothing _ t = t
32fea87e21b8 merge Σ
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
78 merge-iεδ NFA (just i) q t = merge-itεδ NFA i q t
32fea87e21b8 merge Σ
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
79
13
02b4ecc9972c start exp version of subset construction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 12
diff changeset
80 merge-εδ : { Σ Q : Set } → εAutomaton Q Σ → Tree ( Maybe Σ × Tree Q ) → Tree ( Maybe Σ × Tree Q ) → Tree ( Maybe Σ × Tree Q )
10
32fea87e21b8 merge Σ
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
81 merge-εδ NFA empty t = t
32fea87e21b8 merge Σ
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
82 merge-εδ NFA (leaf x (i , t1) ) t = merge-iεδ NFA i t1 t
32fea87e21b8 merge Σ
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
83 merge-εδ NFA (node x (i , t1) left right) t =
32fea87e21b8 merge Σ
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
84 merge-εδ NFA left ( merge-iεδ NFA i t1 ( merge-εδ NFA right t ) )
13
02b4ecc9972c start exp version of subset construction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 12
diff changeset
85
02b4ecc9972c start exp version of subset construction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 12
diff changeset
86 -- merge and find new state from newly created Tree ( Maybe Σ × Tree Q )
02b4ecc9972c start exp version of subset construction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 12
diff changeset
87 sbconst13 : { Σ Q : Set } → εAutomaton Q Σ → Tree ( Maybe Σ × Tree Q ) → Tree ( Tree Q ) → Tree ( Tree Q ) → ℕ → ( Tree ( Tree Q ) × Tree ( Tree Q ) × ℕ )
11
8e66865fd9af fix sbconst
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
88 sbconst13 NFA empty nt t n = (nt , t , n)
8e66865fd9af fix sbconst
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
89 sbconst13 NFA (leaf x (p , q)) nt t n with memberTT q t
8e66865fd9af fix sbconst
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
90 ... | true = ( nt , t , n)
12
5998479bb4ee sbconst done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
91 ... | false = ( insertT n q nt , insertT n q t , n + 1 )
11
8e66865fd9af fix sbconst
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
92 sbconst13 NFA (node x (_ , q) left right) nt t n with memberTT q t
12
5998479bb4ee sbconst done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
93 sbconst13 NFA (node x (_ , q) left right) nt t n | true = ( nt , t , n )
11
8e66865fd9af fix sbconst
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
94 sbconst13 NFA (node x (_ , q) left right) nt t n | false = p2
9
e7bb980408fb separate epsiron
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
95 where
11
8e66865fd9af fix sbconst
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
96 p1 = sbconst13 NFA left nt t n
12
5998479bb4ee sbconst done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
97 n1 = proj₂ ( proj₂ p1 )
5998479bb4ee sbconst done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
98 p2 = sbconst13 NFA right (insertT n1 q ( proj₁ p1 )) (insertT n1 q ( proj₁ (proj₂ p1))) (n1 + 1 )
11
8e66865fd9af fix sbconst
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
99 -- expand state to Tree ( Maybe Σ × Tree Q )
8e66865fd9af fix sbconst
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
100 sbconst12 : { Σ Q : Set } → εAutomaton Q Σ → Tree Q → Tree ( Maybe Σ × Tree Q ) → Tree ( Maybe Σ × Tree Q )
8e66865fd9af fix sbconst
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
101 sbconst12 NFA empty s = s
8e66865fd9af fix sbconst
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
102 sbconst12 NFA (leaf x q) s = merge-εδ NFA s (all-εδ NFA q)
8e66865fd9af fix sbconst
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
103 sbconst12 NFA (node x q left right) s = sbconst12 NFA right (merge-εδ NFA (all-εδ NFA q) (sbconst12 NFA left s))
8e66865fd9af fix sbconst
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
104 -- loop on state tree
12
5998479bb4ee sbconst done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
105 sbconst11 : { Σ Q : Set } → εAutomaton Q Σ → Tree ( Tree Q ) → Tree ( Tree Q ) → Tree ( Tree Q ) → ℕ → ( Tree ( Tree Q ) × Tree ( Tree Q ) × ℕ )
5998479bb4ee sbconst done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
106 sbconst11 NFA empty nt t n = (nt , t , n )
5998479bb4ee sbconst done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
107 sbconst11 NFA (leaf x q) nt t n = sbconst13 NFA (sbconst12 NFA q empty ) nt t n
5998479bb4ee sbconst done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
108 sbconst11 NFA (node x q left right ) nt t n = p3
9
e7bb980408fb separate epsiron
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
109 where
12
5998479bb4ee sbconst done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
110 p1 = sbconst11 NFA left nt t n
5998479bb4ee sbconst done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
111 p2 = sbconst13 NFA (sbconst12 NFA q empty ) ( proj₁ p1 ) ( proj₁ ( proj₂ p1 ) ) ( proj₂ ( proj₂ p1 ) )
13
02b4ecc9972c start exp version of subset construction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 12
diff changeset
112 p3 = sbconst11 NFA right ( proj₁ p2 ) ( proj₁ ( proj₂ p2 )) ( proj₂ ( proj₂ p2 ))
02b4ecc9972c start exp version of subset construction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 12
diff changeset
113
9
e7bb980408fb separate epsiron
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
114 {-# TERMINATING #-}
11
8e66865fd9af fix sbconst
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
115 sbconst0 : { Σ Q : Set } → εAutomaton Q Σ → Tree ( Tree Q ) → Tree ( Tree Q ) → ℕ → ( Tree ( Tree Q ) × ℕ )
12
5998479bb4ee sbconst done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
116 sbconst0 NFA t t1 n0 with sbconst11 NFA t t1 empty n0
11
8e66865fd9af fix sbconst
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
117 ... | t2 , empty , n = (t2 , n )
12
5998479bb4ee sbconst done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
118 ... | t2 , leaf x y , n = sbconst0 NFA ( proj₁ ( proj₂ p1 )) (leaf x y) ( proj₂ ( proj₂ p1 ) )
9
e7bb980408fb separate epsiron
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
119 where
12
5998479bb4ee sbconst done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
120 p1 = sbconst11 NFA (leaf x y) t1 empty n
5998479bb4ee sbconst done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
121 ... | t2 , node x y left right , n = p4
9
e7bb980408fb separate epsiron
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
122 where
e7bb980408fb separate epsiron
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
123 p1 = sbconst0 NFA left t2 n
13
02b4ecc9972c start exp version of subset construction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 12
diff changeset
124 p2 = sbconst11 NFA (leaf x y) ( proj₁ p1 ) empty ( proj₂ p1 )
12
5998479bb4ee sbconst done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
125 p3 = sbconst0 NFA right ( proj₁ p2 ) ( proj₂ ( proj₂ p2 ))
5998479bb4ee sbconst done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
126 p4 = sbconst0 NFA ( proj₁ ( proj₂ p2 )) ( proj₁ p3) ( proj₂ p3 )
9
e7bb980408fb separate epsiron
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
127
e7bb980408fb separate epsiron
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
128 nfa2dfa : { Σ Q : Set } → εAutomaton Q Σ → Automaton (Tree Q) Σ
8
cdf75ae6f0c1 add subset construction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
129 nfa2dfa {Σ} {Q} NFA = record {
13
02b4ecc9972c start exp version of subset construction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 12
diff changeset
130 δ = δ'
02b4ecc9972c start exp version of subset construction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 12
diff changeset
131 ; astart = astart'
8
cdf75ae6f0c1 add subset construction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
132 ; aend = aend'
cdf75ae6f0c1 add subset construction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
133 }
cdf75ae6f0c1 add subset construction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
134 where
9
e7bb980408fb separate epsiron
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
135 MTree : { Σ Q : Set } → (x : εAutomaton Q Σ) → Tree ( Tree Q )
e7bb980408fb separate epsiron
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
136 MTree {Σ} {Q} NFA = εclosure (allState NFA ) ( εδ NFA )
e7bb980408fb separate epsiron
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
137 sbconst : { Σ Q : Set } → εAutomaton Q Σ → Tree ( Tree Q )
11
8e66865fd9af fix sbconst
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
138 sbconst NFA = proj₁ (sbconst0 NFA ( MTree NFA ) (MTree NFA) zero)
12
5998479bb4ee sbconst done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
139 δ0 : Σ → Tree ( Maybe Σ × Tree Q ) → Tree Q
5998479bb4ee sbconst done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
140 δ0 x empty = empty
5998479bb4ee sbconst done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
141 δ0 x (leaf x₁ q) with Σid NFA x ≟ x₁
5998479bb4ee sbconst done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
142 ... | no ¬p = empty
5998479bb4ee sbconst done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
143 ... | yes p with proj₁ q
5998479bb4ee sbconst done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
144 ... | nothing = empty
5998479bb4ee sbconst done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
145 ... | just _ = proj₂ q
13
02b4ecc9972c start exp version of subset construction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 12
diff changeset
146 δ0 x (node x₁ q left right) with Σid NFA x ≟ x₁
12
5998479bb4ee sbconst done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
147 ... | no ¬p with δ0 x left
5998479bb4ee sbconst done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
148 ... | empty = δ0 x right
5998479bb4ee sbconst done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
149 ... | q1 = q1
5998479bb4ee sbconst done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
150 δ0 x (node x₁ q left right) | yes p with proj₁ q
5998479bb4ee sbconst done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
151 ... | nothing = empty
5998479bb4ee sbconst done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
152 ... | just _ = proj₂ q
9
e7bb980408fb separate epsiron
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
153 δ' : Tree Q → Σ → Tree Q
e7bb980408fb separate epsiron
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
154 δ' t x with findT t ( MTree NFA )
e7bb980408fb separate epsiron
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
155 ... | nothing = leaf zero ( εstart NFA ) -- can't happen
12
5998479bb4ee sbconst done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
156 ... | just q = δ0 x (sbconst12 NFA q empty)
9
e7bb980408fb separate epsiron
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
157 astart' : Tree Q
e7bb980408fb separate epsiron
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
158 astart' = leaf zero ( εstart NFA )
e7bb980408fb separate epsiron
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
159 aend' : Tree Q → Bool
e7bb980408fb separate epsiron
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
160 aend' empty = false
e7bb980408fb separate epsiron
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
161 aend' (leaf _ x) = εend NFA x
e7bb980408fb separate epsiron
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
162 aend' (node _ x left right ) =
13
02b4ecc9972c start exp version of subset construction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 12
diff changeset
163 aend' left ∨ εend NFA x ∨ aend' right
8
cdf75ae6f0c1 add subset construction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
164