Mercurial > hg > Members > kono > Proof > automaton
annotate agda/pushdown.agda @ 143:f896c112f01f
...
author | Shinji KONO <kono@ie.u-ryukyu.ac.jp> |
---|---|
date | Tue, 29 Dec 2020 15:32:57 +0900 |
parents | b3f05cd08d24 |
children | 26407ce19d66 |
rev | line source |
---|---|
17 | 1 module pushdown where |
2 | |
3 open import Level renaming ( suc to succ ; zero to Zero ) | |
4 open import Data.Nat | |
5 open import Data.List | |
6 open import Data.Maybe | |
7 open import Data.Bool using ( Bool ; true ; false ) | |
8 open import Relation.Binary.PropositionalEquality hiding ( [_] ) | |
9 open import Relation.Nullary using (¬_; Dec; yes; no) | |
10 open import Level renaming ( suc to succ ; zero to Zero ) | |
11 open import Data.Product | |
12 | |
13 | |
14 data PushDown ( Γ : Set ) : Set where | |
15 pop : PushDown Γ | |
16 push : Γ → PushDown Γ | |
17 | |
18 | |
19 record PushDownAutomaton ( Q : Set ) ( Σ : Set ) ( Γ : Set ) | |
20 : Set where | |
21 field | |
22 pδ : Q → Σ → Γ → Q × ( PushDown Γ ) | |
38
ab265470c2d0
push down automaton example
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
17
diff
changeset
|
23 pok : Q → Bool |
ab265470c2d0
push down automaton example
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
17
diff
changeset
|
24 pempty : Γ |
ab265470c2d0
push down automaton example
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
17
diff
changeset
|
25 pmoves : Q → List Γ → Σ → ( Q × List Γ ) |
ab265470c2d0
push down automaton example
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
17
diff
changeset
|
26 pmoves q [] i with pδ q i pempty |
ab265470c2d0
push down automaton example
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
17
diff
changeset
|
27 pmoves q [] i | qn , pop = ( qn , [] ) |
ab265470c2d0
push down automaton example
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
17
diff
changeset
|
28 pmoves q [] i | qn , push x = ( qn , ( x ∷ [] ) ) |
ab265470c2d0
push down automaton example
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
17
diff
changeset
|
29 pmoves q ( H ∷ T ) i with pδ q i H |
ab265470c2d0
push down automaton example
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
17
diff
changeset
|
30 pmoves q (H ∷ T) i | qn , pop = ( qn , T ) |
ab265470c2d0
push down automaton example
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
17
diff
changeset
|
31 pmoves q (H ∷ T) i | qn , push x = ( qn , ( x ∷ H ∷ T) ) |
ab265470c2d0
push down automaton example
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
17
diff
changeset
|
32 |
138 | 33 paccept : (q : Q ) ( In : List Σ ) ( sp : List Γ ) → Bool |
34 paccept q [] [] = pok q | |
35 paccept q ( H ∷ T) [] with pδ q H pempty | |
36 paccept q (H ∷ T) [] | qn , pop = paccept qn T [] | |
37 paccept q (H ∷ T) [] | qn , push x = paccept qn T (x ∷ [] ) | |
38 paccept q [] (_ ∷ _ ) = false | |
39 paccept q ( H ∷ T ) ( SH ∷ ST ) with pδ q H SH | |
40 ... | (nq , pop ) = paccept nq T ST | |
41 ... | (nq , push ns ) = paccept nq T ( ns ∷ SH ∷ ST ) | |
17 | 42 |
43 | |
38
ab265470c2d0
push down automaton example
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
17
diff
changeset
|
44 -- 0011 |
ab265470c2d0
push down automaton example
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
17
diff
changeset
|
45 -- 00000111111 |
138 | 46 inputnn : ( n : ℕ ) → { Σ : Set } → ( x y : Σ ) → List Σ → List Σ |
47 inputnn zero {_} _ _ s = s | |
48 inputnn (suc n) x y s = x ∷ ( inputnn n x y ( y ∷ s ) ) | |
49 | |
17 | 50 |
38
ab265470c2d0
push down automaton example
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
17
diff
changeset
|
51 data States0 : Set where |
ab265470c2d0
push down automaton example
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
17
diff
changeset
|
52 sr : States0 |
17 | 53 |
38
ab265470c2d0
push down automaton example
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
17
diff
changeset
|
54 data In2 : Set where |
ab265470c2d0
push down automaton example
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
17
diff
changeset
|
55 i0 : In2 |
ab265470c2d0
push down automaton example
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
17
diff
changeset
|
56 i1 : In2 |
138 | 57 |
58 test0 = inputnn 5 i0 i1 [] | |
38
ab265470c2d0
push down automaton example
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
17
diff
changeset
|
59 |
ab265470c2d0
push down automaton example
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
17
diff
changeset
|
60 pnn : PushDownAutomaton States0 In2 States0 |
ab265470c2d0
push down automaton example
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
17
diff
changeset
|
61 pnn = record { |
ab265470c2d0
push down automaton example
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
17
diff
changeset
|
62 pδ = pδ |
ab265470c2d0
push down automaton example
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
17
diff
changeset
|
63 ; pempty = sr |
ab265470c2d0
push down automaton example
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
17
diff
changeset
|
64 ; pok = λ q → true |
ab265470c2d0
push down automaton example
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
17
diff
changeset
|
65 } where |
ab265470c2d0
push down automaton example
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
17
diff
changeset
|
66 pδ : States0 → In2 → States0 → States0 × PushDown States0 |
ab265470c2d0
push down automaton example
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
17
diff
changeset
|
67 pδ sr i0 _ = (sr , push sr) |
ab265470c2d0
push down automaton example
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
17
diff
changeset
|
68 pδ sr i1 _ = (sr , pop ) |
ab265470c2d0
push down automaton example
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
17
diff
changeset
|
69 |
138 | 70 data States1 : Set where |
71 ss : States1 | |
72 st : States1 | |
73 | |
74 pn1 : PushDownAutomaton States1 In2 States1 | |
75 pn1 = record { | |
76 pδ = pδ | |
77 ; pempty = ss | |
78 ; pok = pok1 | |
79 } where | |
80 pok1 : States1 → Bool | |
81 pok1 ss = false | |
82 pok1 st = true | |
83 pδ : States1 → In2 → States1 → States1 × PushDown States1 | |
84 pδ ss i0 _ = (ss , push ss) | |
85 pδ ss i1 _ = (st , pop) | |
86 pδ st i0 _ = (st , push ss) | |
87 pδ st i1 _ = (st , pop ) | |
88 | |
89 test1 = PushDownAutomaton.paccept pnn sr ( i0 ∷ i0 ∷ i1 ∷ i1 ∷ [] ) [] | |
90 test2 = PushDownAutomaton.paccept pnn sr ( i0 ∷ i0 ∷ i1 ∷ i0 ∷ [] ) [] | |
38
ab265470c2d0
push down automaton example
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
17
diff
changeset
|
91 test3 = PushDownAutomaton.pmoves pnn sr [] i0 |
138 | 92 test4 = PushDownAutomaton.paccept pnn sr ( i0 ∷ i0 ∷ i1 ∷ i1 ∷ i0 ∷ i1 ∷ [] ) [] |
38
ab265470c2d0
push down automaton example
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
17
diff
changeset
|
93 |
138 | 94 test5 = PushDownAutomaton.paccept pn1 ss ( i0 ∷ i0 ∷ i1 ∷ i1 ∷ [] ) [] |
95 test6 = PushDownAutomaton.paccept pn1 ss ( i0 ∷ i0 ∷ i1 ∷ i1 ∷ i0 ∷ i1 ∷ [] ) [] | |
141 | 96 |
97 test7 : (n : ℕ ) → PushDownAutomaton.paccept pnn sr (inputnn n i0 i1 []) [] ≡ true | |
98 test7 zero = refl | |
99 test7 (suc n) with test7 n | |
100 ... | t = test7lem [] t where | |
101 test7lem : (x : List States0) → PushDownAutomaton.paccept pnn sr (inputnn n i0 i1 []) x ≡ true | |
102 → PushDownAutomaton.paccept pnn sr (inputnn n i0 i1 (i1 ∷ [])) (sr ∷ x) ≡ true | |
103 test7lem x with PushDownAutomaton.paccept pnn sr (inputnn (suc n) i0 i1 []) (sr ∷ x) | |
104 ... | t2 = {!!} |