annotate automaton-in-agda/src/cfg.agda @ 405:af8f630b7e60

...
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Sun, 24 Sep 2023 18:02:04 +0900
parents 91781b7c65a8
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
405
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 318
diff changeset
1 {-# OPTIONS --cubical-compatible #-}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 318
diff changeset
2
36
9558d870e8ae add cfg and derive
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
3 module cfg where
9558d870e8ae add cfg and derive
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
4
9558d870e8ae add cfg and derive
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
5 open import Level renaming ( suc to succ ; zero to Zero )
43
31e4bd173951 using Fin id
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 42
diff changeset
6 open import Data.Nat hiding ( _≟_ )
39
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
7 open import Data.Fin
36
9558d870e8ae add cfg and derive
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
8 open import Data.Product
39
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
9 open import Data.List
36
9558d870e8ae add cfg and derive
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
10 open import Data.Maybe
40
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 39
diff changeset
11 open import Data.Bool using ( Bool ; true ; false ; _∧_ ; _∨_ )
36
9558d870e8ae add cfg and derive
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
12 open import Relation.Binary.PropositionalEquality hiding ( [_] )
9558d870e8ae add cfg and derive
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
13 open import Relation.Nullary using (¬_; Dec; yes; no)
40
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 39
diff changeset
14 -- open import Data.String
36
9558d870e8ae add cfg and derive
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
15
318
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 277
diff changeset
16 data IsTerm (Token : Set) : Set (succ Zero) where
41
ae69102153a9 cfg done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 40
diff changeset
17 isTerm : Token → IsTerm Token
ae69102153a9 cfg done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 40
diff changeset
18 noTerm : IsTerm Token
ae69102153a9 cfg done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 40
diff changeset
19
43
31e4bd173951 using Fin id
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 42
diff changeset
20 record CFGGrammer (Token Node : Set) : Set (succ Zero) where
39
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
21 field
42
bbb39677d5ab list base CFG
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 41
diff changeset
22 cfg : Node → List ( List ( Node ) )
bbb39677d5ab list base CFG
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 41
diff changeset
23 cfgtop : Node
bbb39677d5ab list base CFG
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 41
diff changeset
24 term? : Node → IsTerm Token
43
31e4bd173951 using Fin id
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 42
diff changeset
25 tokensz : ℕ
31e4bd173951 using Fin id
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 42
diff changeset
26 tokenid : Token → Fin tokensz
41
ae69102153a9 cfg done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 40
diff changeset
27
ae69102153a9 cfg done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 40
diff changeset
28 open CFGGrammer
ae69102153a9 cfg done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 40
diff changeset
29
42
bbb39677d5ab list base CFG
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 41
diff changeset
30 -----------------
bbb39677d5ab list base CFG
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 41
diff changeset
31 --
bbb39677d5ab list base CFG
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 41
diff changeset
32 -- CGF language
bbb39677d5ab list base CFG
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 41
diff changeset
33 --
bbb39677d5ab list base CFG
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 41
diff changeset
34 -----------------
bbb39677d5ab list base CFG
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 41
diff changeset
35
41
ae69102153a9 cfg done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 40
diff changeset
36 split : {Σ : Set} → (List Σ → Bool)
ae69102153a9 cfg done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 40
diff changeset
37 → ( List Σ → Bool) → List Σ → Bool
ae69102153a9 cfg done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 40
diff changeset
38 split x y [] = x [] ∧ y []
ae69102153a9 cfg done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 40
diff changeset
39 split x y (h ∷ t) = (x [] ∧ y (h ∷ t)) ∨
ae69102153a9 cfg done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 40
diff changeset
40 split (λ t1 → x ( h ∷ t1 )) (λ t2 → y t2 ) t
ae69102153a9 cfg done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 40
diff changeset
41
ae69102153a9 cfg done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 40
diff changeset
42
43
31e4bd173951 using Fin id
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 42
diff changeset
43 cfg-language0 : {Node Token : Set} → CFGGrammer Token Node → List (List Node ) → List Token → Bool
40
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 39
diff changeset
44
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 39
diff changeset
45 {-# TERMINATING #-}
43
31e4bd173951 using Fin id
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 42
diff changeset
46 cfg-language2 : {Node Token : Set} → CFGGrammer Token Node → Node → List Token → Bool
41
ae69102153a9 cfg done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 40
diff changeset
47 cfg-language2 cg _ [] = false
ae69102153a9 cfg done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 40
diff changeset
48 cfg-language2 cg x (h1 ∷ [] ) with term? cg x
43
31e4bd173951 using Fin id
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 42
diff changeset
49 cfg-language2 cg x (h1 ∷ []) | isTerm t with tokenid cg h1 ≟ tokenid cg t
31e4bd173951 using Fin id
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 42
diff changeset
50 cfg-language2 cg x (h1 ∷ []) | isTerm t | yes p = true
41
ae69102153a9 cfg done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 40
diff changeset
51 cfg-language2 cg x (h1 ∷ []) | isTerm t | no ¬p = false
42
bbb39677d5ab list base CFG
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 41
diff changeset
52 cfg-language2 cg x (h1 ∷ []) | noTerm = cfg-language0 cg (cfg cg x) ( h1 ∷ [] )
41
ae69102153a9 cfg done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 40
diff changeset
53 cfg-language2 cg x In with term? cg x
ae69102153a9 cfg done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 40
diff changeset
54 cfg-language2 cg x In | isTerm t = false
42
bbb39677d5ab list base CFG
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 41
diff changeset
55 cfg-language2 cg x In | noTerm = cfg-language0 cg (cfg cg x ) In
40
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 39
diff changeset
56
43
31e4bd173951 using Fin id
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 42
diff changeset
57 cfg-language1 : {Node Token : Set} → CFGGrammer Token Node → List Node → List Token → Bool
41
ae69102153a9 cfg done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 40
diff changeset
58 cfg-language1 cg [] [] = true
40
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 39
diff changeset
59 cfg-language1 cg [] _ = false
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 39
diff changeset
60 cfg-language1 cg (node ∷ T) = split ( cfg-language2 cg node ) ( cfg-language1 cg T )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 39
diff changeset
61
41
ae69102153a9 cfg done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 40
diff changeset
62 cfg-language0 cg [] [] = true
40
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 39
diff changeset
63 cfg-language0 cg [] _ = false
42
bbb39677d5ab list base CFG
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 41
diff changeset
64 cfg-language0 cg (node ∷ T) In = cfg-language1 cg node In ∨ cfg-language0 cg T In
41
ae69102153a9 cfg done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 40
diff changeset
65
43
31e4bd173951 using Fin id
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 42
diff changeset
66 cfg-language : {Node Token : Set} → CFGGrammer Token Node → List Token → Bool
42
bbb39677d5ab list base CFG
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 41
diff changeset
67 cfg-language cg = cfg-language0 cg (cfg cg (cfgtop cg))
bbb39677d5ab list base CFG
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 41
diff changeset
68
bbb39677d5ab list base CFG
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 41
diff changeset
69 -----------------
39
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
70
43
31e4bd173951 using Fin id
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 42
diff changeset
71 data IFToken : Set where
31e4bd173951 using Fin id
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 42
diff changeset
72 t:EA : IFToken
31e4bd173951 using Fin id
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 42
diff changeset
73 t:EB : IFToken
31e4bd173951 using Fin id
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 42
diff changeset
74 t:EC : IFToken
31e4bd173951 using Fin id
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 42
diff changeset
75 t:IF : IFToken
31e4bd173951 using Fin id
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 42
diff changeset
76 t:THEN : IFToken
31e4bd173951 using Fin id
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 42
diff changeset
77 t:ELSE : IFToken
31e4bd173951 using Fin id
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 42
diff changeset
78 t:SA : IFToken
31e4bd173951 using Fin id
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 42
diff changeset
79 t:SB : IFToken
31e4bd173951 using Fin id
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 42
diff changeset
80 t:SC : IFToken
31e4bd173951 using Fin id
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 42
diff changeset
81
31e4bd173951 using Fin id
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 42
diff changeset
82 IFtokenid : IFToken → Fin 9
31e4bd173951 using Fin id
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 42
diff changeset
83 IFtokenid t:EA = # 0
31e4bd173951 using Fin id
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 42
diff changeset
84 IFtokenid t:EB = # 1
31e4bd173951 using Fin id
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 42
diff changeset
85 IFtokenid t:EC = # 2
31e4bd173951 using Fin id
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 42
diff changeset
86 IFtokenid t:IF = # 3
31e4bd173951 using Fin id
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 42
diff changeset
87 IFtokenid t:THEN = # 4
31e4bd173951 using Fin id
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 42
diff changeset
88 IFtokenid t:ELSE = # 5
31e4bd173951 using Fin id
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 42
diff changeset
89 IFtokenid t:SA = # 6
31e4bd173951 using Fin id
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 42
diff changeset
90 IFtokenid t:SB = # 7
31e4bd173951 using Fin id
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 42
diff changeset
91 IFtokenid t:SC = # 8
31e4bd173951 using Fin id
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 42
diff changeset
92
31e4bd173951 using Fin id
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 42
diff changeset
93 data IFNode (T : Set) : Set where
31e4bd173951 using Fin id
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 42
diff changeset
94 Token : T → IFNode T
31e4bd173951 using Fin id
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 42
diff changeset
95 expr : IFNode T
31e4bd173951 using Fin id
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 42
diff changeset
96 statement : IFNode T
31e4bd173951 using Fin id
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 42
diff changeset
97
31e4bd173951 using Fin id
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 42
diff changeset
98 IFGrammer : CFGGrammer IFToken (IFNode IFToken)
31e4bd173951 using Fin id
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 42
diff changeset
99 IFGrammer = record {
31e4bd173951 using Fin id
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 42
diff changeset
100 cfg = cfg'
31e4bd173951 using Fin id
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 42
diff changeset
101 ; cfgtop = statement
31e4bd173951 using Fin id
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 42
diff changeset
102 ; term? = term?'
31e4bd173951 using Fin id
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 42
diff changeset
103 ; tokensz = 9
31e4bd173951 using Fin id
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 42
diff changeset
104 ; tokenid = IFtokenid
31e4bd173951 using Fin id
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 42
diff changeset
105 } where
31e4bd173951 using Fin id
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 42
diff changeset
106 term?' : IFNode IFToken → IsTerm IFToken
31e4bd173951 using Fin id
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 42
diff changeset
107 term?' (Token x) = isTerm x
31e4bd173951 using Fin id
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 42
diff changeset
108 term?' _ = noTerm
31e4bd173951 using Fin id
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 42
diff changeset
109 cfg' : IFNode IFToken → List ( List (IFNode IFToken) )
31e4bd173951 using Fin id
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 42
diff changeset
110 cfg' (Token t) = ( (Token t) ∷ [] ) ∷ []
31e4bd173951 using Fin id
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 42
diff changeset
111 cfg' expr = ( Token t:EA ∷ [] ) ∷
31e4bd173951 using Fin id
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 42
diff changeset
112 ( Token t:EB ∷ [] ) ∷
31e4bd173951 using Fin id
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 42
diff changeset
113 ( Token t:EC ∷ [] ) ∷ []
31e4bd173951 using Fin id
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 42
diff changeset
114 cfg' statement = ( Token t:SA ∷ [] ) ∷
31e4bd173951 using Fin id
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 42
diff changeset
115 ( Token t:SB ∷ [] ) ∷
31e4bd173951 using Fin id
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 42
diff changeset
116 ( Token t:SC ∷ [] ) ∷
31e4bd173951 using Fin id
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 42
diff changeset
117 ( Token t:IF ∷ expr ∷ statement ∷ [] ) ∷
31e4bd173951 using Fin id
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 42
diff changeset
118 ( Token t:IF ∷ expr ∷ statement ∷ Token t:ELSE ∷ statement ∷ [] ) ∷ []
31e4bd173951 using Fin id
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 42
diff changeset
119
31e4bd173951 using Fin id
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 42
diff changeset
120
46
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 43
diff changeset
121 cfgtest1 = cfg-language IFGrammer ( t:SA ∷ [] )
39
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 36
diff changeset
122
46
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 43
diff changeset
123 cfgtest2 = cfg-language2 IFGrammer (Token t:SA) ( t:SA ∷ [] )
41
ae69102153a9 cfg done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 40
diff changeset
124
46
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 43
diff changeset
125 cfgtest3 = cfg-language1 IFGrammer (Token t:SA ∷ [] ) ( t:SA ∷ [] )
41
ae69102153a9 cfg done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 40
diff changeset
126
46
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 43
diff changeset
127 cfgtest4 = cfg-language IFGrammer (t:IF ∷ t:EA ∷ t:SA ∷ [] )
41
ae69102153a9 cfg done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 40
diff changeset
128
46
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 43
diff changeset
129 cfgtest5 = cfg-language1 IFGrammer (Token t:IF ∷ expr ∷ statement ∷ []) (t:IF ∷ t:EA ∷ t:EA ∷ [] )
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 43
diff changeset
130 cfgtest6 = cfg-language2 IFGrammer statement (t:IF ∷ t:EA ∷ t:SA ∷ [] )
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 43
diff changeset
131 cfgtest7 = cfg-language1 IFGrammer (Token t:IF ∷ expr ∷ statement ∷ Token t:ELSE ∷ statement ∷ []) (t:IF ∷ t:EA ∷ t:SA ∷ t:ELSE ∷ t:SB ∷ [] )
41
ae69102153a9 cfg done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 40
diff changeset
132
46
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 43
diff changeset
133 cfgtest8 = cfg-language IFGrammer (t:IF ∷ t:EA ∷ t:IF ∷ t:EB ∷ t:SA ∷ t:ELSE ∷ t:SB ∷ [] )
41
ae69102153a9 cfg done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 40
diff changeset
134