annotate final_pre/src/stack-subtype-sample.agda @ 7:28f900230c26

add final_pre
author ryokka
date Mon, 19 Feb 2018 23:32:24 +0900
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
7
28f900230c26 add final_pre
ryokka
parents:
diff changeset
1 module stack-subtype-sample where
28f900230c26 add final_pre
ryokka
parents:
diff changeset
2
28f900230c26 add final_pre
ryokka
parents:
diff changeset
3 open import Level renaming (suc to S ; zero to O)
28f900230c26 add final_pre
ryokka
parents:
diff changeset
4 open import Function
28f900230c26 add final_pre
ryokka
parents:
diff changeset
5 open import Data.Nat
28f900230c26 add final_pre
ryokka
parents:
diff changeset
6 open import Data.Maybe
28f900230c26 add final_pre
ryokka
parents:
diff changeset
7 open import Relation.Binary.PropositionalEquality
28f900230c26 add final_pre
ryokka
parents:
diff changeset
8
28f900230c26 add final_pre
ryokka
parents:
diff changeset
9 open import stack-subtype ℕ
28f900230c26 add final_pre
ryokka
parents:
diff changeset
10 open import subtype Context as N
28f900230c26 add final_pre
ryokka
parents:
diff changeset
11 open import subtype Meta as M
28f900230c26 add final_pre
ryokka
parents:
diff changeset
12
28f900230c26 add final_pre
ryokka
parents:
diff changeset
13
28f900230c26 add final_pre
ryokka
parents:
diff changeset
14 record Num : Set where
28f900230c26 add final_pre
ryokka
parents:
diff changeset
15 field
28f900230c26 add final_pre
ryokka
parents:
diff changeset
16 num : ℕ
28f900230c26 add final_pre
ryokka
parents:
diff changeset
17
28f900230c26 add final_pre
ryokka
parents:
diff changeset
18 instance
28f900230c26 add final_pre
ryokka
parents:
diff changeset
19 NumIsNormalDataSegment : N.DataSegment Num
28f900230c26 add final_pre
ryokka
parents:
diff changeset
20 NumIsNormalDataSegment = record { get = (\c -> record { num = Context.n c})
28f900230c26 add final_pre
ryokka
parents:
diff changeset
21 ; set = (\c n -> record c {n = Num.num n})}
28f900230c26 add final_pre
ryokka
parents:
diff changeset
22 NumIsMetaDataSegment : M.DataSegment Num
28f900230c26 add final_pre
ryokka
parents:
diff changeset
23 NumIsMetaDataSegment = record { get = (\m -> record {num = Context.n (Meta.context m)})
28f900230c26 add final_pre
ryokka
parents:
diff changeset
24 ; set = (\m n -> record m {context = record (Meta.context m) {n = Num.num n}})}
28f900230c26 add final_pre
ryokka
parents:
diff changeset
25
28f900230c26 add final_pre
ryokka
parents:
diff changeset
26
28f900230c26 add final_pre
ryokka
parents:
diff changeset
27 plus3 : Num -> Num
28f900230c26 add final_pre
ryokka
parents:
diff changeset
28 plus3 record { num = n } = record {num = n + 3}
28f900230c26 add final_pre
ryokka
parents:
diff changeset
29
28f900230c26 add final_pre
ryokka
parents:
diff changeset
30 plus3CS : N.CodeSegment Num Num
28f900230c26 add final_pre
ryokka
parents:
diff changeset
31 plus3CS = N.cs plus3
28f900230c26 add final_pre
ryokka
parents:
diff changeset
32
28f900230c26 add final_pre
ryokka
parents:
diff changeset
33
28f900230c26 add final_pre
ryokka
parents:
diff changeset
34
28f900230c26 add final_pre
ryokka
parents:
diff changeset
35 plus5AndPushWithPlus3 : {mc : Meta} {{_ : N.DataSegment Num}}
28f900230c26 add final_pre
ryokka
parents:
diff changeset
36 -> M.CodeSegment Num (Meta)
28f900230c26 add final_pre
ryokka
parents:
diff changeset
37 plus5AndPushWithPlus3 {mc} {{nn}} = M.cs (\n -> record {context = con n ; nextCS = (liftContext {{nn}} {{nn}} plus3CS) ; stack = st} )
28f900230c26 add final_pre
ryokka
parents:
diff changeset
38 where
28f900230c26 add final_pre
ryokka
parents:
diff changeset
39 co = Meta.context mc
28f900230c26 add final_pre
ryokka
parents:
diff changeset
40 con : Num -> Context
28f900230c26 add final_pre
ryokka
parents:
diff changeset
41 con record { num = num } = N.DataSegment.set nn co record {num = num + 5}
28f900230c26 add final_pre
ryokka
parents:
diff changeset
42 st = Meta.stack mc
28f900230c26 add final_pre
ryokka
parents:
diff changeset
43
28f900230c26 add final_pre
ryokka
parents:
diff changeset
44
28f900230c26 add final_pre
ryokka
parents:
diff changeset
45
28f900230c26 add final_pre
ryokka
parents:
diff changeset
46
28f900230c26 add final_pre
ryokka
parents:
diff changeset
47 push-sample : {{_ : N.DataSegment Num}} {{_ : M.DataSegment Num}} -> Meta
28f900230c26 add final_pre
ryokka
parents:
diff changeset
48 push-sample {{nd}} {{md}} = M.exec {{md}} (plus5AndPushWithPlus3 {mc} {{nd}}) mc
28f900230c26 add final_pre
ryokka
parents:
diff changeset
49 where
28f900230c26 add final_pre
ryokka
parents:
diff changeset
50 con = record { n = 4 ; element = just 0}
28f900230c26 add final_pre
ryokka
parents:
diff changeset
51 code = N.cs (\c -> c)
28f900230c26 add final_pre
ryokka
parents:
diff changeset
52 mc = record {context = con ; stack = emptySingleLinkedStack ; nextCS = code}
28f900230c26 add final_pre
ryokka
parents:
diff changeset
53
28f900230c26 add final_pre
ryokka
parents:
diff changeset
54
28f900230c26 add final_pre
ryokka
parents:
diff changeset
55 push-sample-equiv : push-sample ≡ record { nextCS = liftContext plus3CS
28f900230c26 add final_pre
ryokka
parents:
diff changeset
56 ; stack = record { top = nothing}
28f900230c26 add final_pre
ryokka
parents:
diff changeset
57 ; context = record { n = 9} }
28f900230c26 add final_pre
ryokka
parents:
diff changeset
58 push-sample-equiv = refl
28f900230c26 add final_pre
ryokka
parents:
diff changeset
59
28f900230c26 add final_pre
ryokka
parents:
diff changeset
60
28f900230c26 add final_pre
ryokka
parents:
diff changeset
61 pushed-sample : {m : Meta} {{_ : N.DataSegment Num}} {{_ : M.DataSegment Num}} -> Meta
28f900230c26 add final_pre
ryokka
parents:
diff changeset
62 pushed-sample {m} {{nd}} {{md}} = M.exec {{md}} (M.csComp {m} {{md}} pushSingleLinkedStackCS (plus5AndPushWithPlus3 {mc} {{nd}})) mc
28f900230c26 add final_pre
ryokka
parents:
diff changeset
63 where
28f900230c26 add final_pre
ryokka
parents:
diff changeset
64 con = record { n = 4 ; element = just 0}
28f900230c26 add final_pre
ryokka
parents:
diff changeset
65 code = N.cs (\c -> c)
28f900230c26 add final_pre
ryokka
parents:
diff changeset
66 mc = record {context = con ; stack = emptySingleLinkedStack ; nextCS = code}
28f900230c26 add final_pre
ryokka
parents:
diff changeset
67
28f900230c26 add final_pre
ryokka
parents:
diff changeset
68
28f900230c26 add final_pre
ryokka
parents:
diff changeset
69
28f900230c26 add final_pre
ryokka
parents:
diff changeset
70 pushed-sample-equiv : {m : Meta} ->
28f900230c26 add final_pre
ryokka
parents:
diff changeset
71 pushed-sample {m} ≡ record { nextCS = liftContext plus3CS
28f900230c26 add final_pre
ryokka
parents:
diff changeset
72 ; stack = record { top = just (cons 0 nothing) }
28f900230c26 add final_pre
ryokka
parents:
diff changeset
73 ; context = record { n = 12} }
28f900230c26 add final_pre
ryokka
parents:
diff changeset
74 pushed-sample-equiv = refl
28f900230c26 add final_pre
ryokka
parents:
diff changeset
75
28f900230c26 add final_pre
ryokka
parents:
diff changeset
76
28f900230c26 add final_pre
ryokka
parents:
diff changeset
77
28f900230c26 add final_pre
ryokka
parents:
diff changeset
78 pushNum : N.CodeSegment Context Context
28f900230c26 add final_pre
ryokka
parents:
diff changeset
79 pushNum = N.cs pn
28f900230c26 add final_pre
ryokka
parents:
diff changeset
80 where
28f900230c26 add final_pre
ryokka
parents:
diff changeset
81 pn : Context -> Context
28f900230c26 add final_pre
ryokka
parents:
diff changeset
82 pn record { n = n } = record { n = pred n ; element = just n}
28f900230c26 add final_pre
ryokka
parents:
diff changeset
83
28f900230c26 add final_pre
ryokka
parents:
diff changeset
84
28f900230c26 add final_pre
ryokka
parents:
diff changeset
85 pushOnce : Meta -> Meta
28f900230c26 add final_pre
ryokka
parents:
diff changeset
86 pushOnce m = M.exec pushSingleLinkedStackCS m
28f900230c26 add final_pre
ryokka
parents:
diff changeset
87
28f900230c26 add final_pre
ryokka
parents:
diff changeset
88 n-push : {m : Meta} {{_ : M.DataSegment Meta}} (n : ℕ) -> M.CodeSegment Meta Meta
28f900230c26 add final_pre
ryokka
parents:
diff changeset
89 n-push {{mm}} (zero) = M.cs {{mm}} {{mm}} id
28f900230c26 add final_pre
ryokka
parents:
diff changeset
90 n-push {m} {{mm}} (suc n) = M.cs {{mm}} {{mm}} (\m -> M.exec {{mm}} {{mm}} (n-push {m} {{mm}} n) (pushOnce m))
28f900230c26 add final_pre
ryokka
parents:
diff changeset
91
28f900230c26 add final_pre
ryokka
parents:
diff changeset
92 popOnce : Meta -> Meta
28f900230c26 add final_pre
ryokka
parents:
diff changeset
93 popOnce m = M.exec popSingleLinkedStackCS m
28f900230c26 add final_pre
ryokka
parents:
diff changeset
94
28f900230c26 add final_pre
ryokka
parents:
diff changeset
95 n-pop : {m : Meta} {{_ : M.DataSegment Meta}} (n : ℕ) -> M.CodeSegment Meta Meta
28f900230c26 add final_pre
ryokka
parents:
diff changeset
96 n-pop {{mm}} (zero) = M.cs {{mm}} {{mm}} id
28f900230c26 add final_pre
ryokka
parents:
diff changeset
97 n-pop {m} {{mm}} (suc n) = M.cs {{mm}} {{mm}} (\m -> M.exec {{mm}} {{mm}} (n-pop {m} {{mm}} n) (popOnce m))
28f900230c26 add final_pre
ryokka
parents:
diff changeset
98
28f900230c26 add final_pre
ryokka
parents:
diff changeset
99
28f900230c26 add final_pre
ryokka
parents:
diff changeset
100
28f900230c26 add final_pre
ryokka
parents:
diff changeset
101 initMeta : ℕ -> Maybe ℕ -> N.CodeSegment Context Context -> Meta
28f900230c26 add final_pre
ryokka
parents:
diff changeset
102 initMeta n mn code = record { context = record { n = n ; element = mn}
28f900230c26 add final_pre
ryokka
parents:
diff changeset
103 ; stack = emptySingleLinkedStack
28f900230c26 add final_pre
ryokka
parents:
diff changeset
104 ; nextCS = code
28f900230c26 add final_pre
ryokka
parents:
diff changeset
105 }
28f900230c26 add final_pre
ryokka
parents:
diff changeset
106
28f900230c26 add final_pre
ryokka
parents:
diff changeset
107 n-push-cs-exec = M.exec (n-push {meta} 3) meta
28f900230c26 add final_pre
ryokka
parents:
diff changeset
108 where
28f900230c26 add final_pre
ryokka
parents:
diff changeset
109 meta = (initMeta 5 (just 9) pushNum)
28f900230c26 add final_pre
ryokka
parents:
diff changeset
110
28f900230c26 add final_pre
ryokka
parents:
diff changeset
111
28f900230c26 add final_pre
ryokka
parents:
diff changeset
112 n-push-cs-exec-equiv : n-push-cs-exec ≡ record { nextCS = pushNum
28f900230c26 add final_pre
ryokka
parents:
diff changeset
113 ; context = record {n = 2 ; element = just 3}
28f900230c26 add final_pre
ryokka
parents:
diff changeset
114 ; stack = record {top = just (cons 4 (just (cons 5 (just (cons 9 nothing)))))}}
28f900230c26 add final_pre
ryokka
parents:
diff changeset
115 n-push-cs-exec-equiv = refl
28f900230c26 add final_pre
ryokka
parents:
diff changeset
116
28f900230c26 add final_pre
ryokka
parents:
diff changeset
117
28f900230c26 add final_pre
ryokka
parents:
diff changeset
118 n-pop-cs-exec = M.exec (n-pop {meta} 4) meta
28f900230c26 add final_pre
ryokka
parents:
diff changeset
119 where
28f900230c26 add final_pre
ryokka
parents:
diff changeset
120 meta = record { nextCS = N.cs id
28f900230c26 add final_pre
ryokka
parents:
diff changeset
121 ; context = record { n = 0 ; element = nothing}
28f900230c26 add final_pre
ryokka
parents:
diff changeset
122 ; stack = record {top = just (cons 9 (just (cons 8 (just (cons 7 (just (cons 6 (just (cons 5 nothing)))))))))}
28f900230c26 add final_pre
ryokka
parents:
diff changeset
123 }
28f900230c26 add final_pre
ryokka
parents:
diff changeset
124
28f900230c26 add final_pre
ryokka
parents:
diff changeset
125 n-pop-cs-exec-equiv : n-pop-cs-exec ≡ record { nextCS = N.cs id
28f900230c26 add final_pre
ryokka
parents:
diff changeset
126 ; context = record { n = 0 ; element = just 6}
28f900230c26 add final_pre
ryokka
parents:
diff changeset
127 ; stack = record { top = just (cons 5 nothing)}
28f900230c26 add final_pre
ryokka
parents:
diff changeset
128 }
28f900230c26 add final_pre
ryokka
parents:
diff changeset
129
28f900230c26 add final_pre
ryokka
parents:
diff changeset
130 n-pop-cs-exec-equiv = refl
28f900230c26 add final_pre
ryokka
parents:
diff changeset
131
28f900230c26 add final_pre
ryokka
parents:
diff changeset
132
28f900230c26 add final_pre
ryokka
parents:
diff changeset
133 open ≡-Reasoning
28f900230c26 add final_pre
ryokka
parents:
diff changeset
134
28f900230c26 add final_pre
ryokka
parents:
diff changeset
135 id-meta : ℕ -> ℕ -> SingleLinkedStack ℕ -> Meta
28f900230c26 add final_pre
ryokka
parents:
diff changeset
136 id-meta n e s = record { context = record {n = n ; element = just e}
28f900230c26 add final_pre
ryokka
parents:
diff changeset
137 ; nextCS = (N.cs id) ; stack = s}
28f900230c26 add final_pre
ryokka
parents:
diff changeset
138
28f900230c26 add final_pre
ryokka
parents:
diff changeset
139 exec-comp : (f g : M.CodeSegment Meta Meta) (m : Meta) -> M.exec (M.csComp {m} f g) m ≡ M.exec f (M.exec g m)
28f900230c26 add final_pre
ryokka
parents:
diff changeset
140 exec-comp (M.cs x) (M.cs _) m = refl
28f900230c26 add final_pre
ryokka
parents:
diff changeset
141
28f900230c26 add final_pre
ryokka
parents:
diff changeset
142
28f900230c26 add final_pre
ryokka
parents:
diff changeset
143 push-pop-type : ℕ -> ℕ -> ℕ -> Element ℕ -> Set₁
28f900230c26 add final_pre
ryokka
parents:
diff changeset
144 push-pop-type n e x s = M.exec (M.csComp {meta} (M.cs popOnce) (M.cs pushOnce)) meta ≡ meta
28f900230c26 add final_pre
ryokka
parents:
diff changeset
145 where
28f900230c26 add final_pre
ryokka
parents:
diff changeset
146 meta = id-meta n e record {top = just (cons x (just s))}
28f900230c26 add final_pre
ryokka
parents:
diff changeset
147
28f900230c26 add final_pre
ryokka
parents:
diff changeset
148 push-pop : (n e x : ℕ) -> (s : Element ℕ) -> push-pop-type n e x s
28f900230c26 add final_pre
ryokka
parents:
diff changeset
149 push-pop n e x s = refl
28f900230c26 add final_pre
ryokka
parents:
diff changeset
150
28f900230c26 add final_pre
ryokka
parents:
diff changeset
151
28f900230c26 add final_pre
ryokka
parents:
diff changeset
152
28f900230c26 add final_pre
ryokka
parents:
diff changeset
153 pop-n-push-type : ℕ -> ℕ -> ℕ -> SingleLinkedStack ℕ -> Set₁
28f900230c26 add final_pre
ryokka
parents:
diff changeset
154 pop-n-push-type n cn ce s = M.exec (M.csComp {meta} (M.cs popOnce) (n-push {meta} (suc n))) meta
28f900230c26 add final_pre
ryokka
parents:
diff changeset
155 ≡ M.exec (n-push {meta} n) meta
28f900230c26 add final_pre
ryokka
parents:
diff changeset
156 where
28f900230c26 add final_pre
ryokka
parents:
diff changeset
157 meta = id-meta cn ce s
28f900230c26 add final_pre
ryokka
parents:
diff changeset
158
28f900230c26 add final_pre
ryokka
parents:
diff changeset
159 pop-n-push : (n cn ce : ℕ) -> (s : SingleLinkedStack ℕ) -> pop-n-push-type n cn ce s
28f900230c26 add final_pre
ryokka
parents:
diff changeset
160
28f900230c26 add final_pre
ryokka
parents:
diff changeset
161 pop-n-push zero cn ce s = refl
28f900230c26 add final_pre
ryokka
parents:
diff changeset
162 pop-n-push (suc n) cn ce s = begin
28f900230c26 add final_pre
ryokka
parents:
diff changeset
163 M.exec (M.csComp {id-meta cn ce s} (M.cs popOnce) (n-push {id-meta cn ce (record {top = just (cons ce (SingleLinkedStack.top s))})} (suc (suc n)))) (id-meta cn ce s)
28f900230c26 add final_pre
ryokka
parents:
diff changeset
164 ≡⟨ refl ⟩
28f900230c26 add final_pre
ryokka
parents:
diff changeset
165 M.exec (M.csComp {id-meta cn ce s} (M.cs popOnce) (M.csComp {id-meta cn ce s} (n-push {id-meta cn ce (record {top = just (cons ce (SingleLinkedStack.top s))})} (suc n)) (M.cs pushOnce))) (id-meta cn ce s)
28f900230c26 add final_pre
ryokka
parents:
diff changeset
166 ≡⟨ exec-comp (M.cs popOnce) (M.csComp {id-meta cn ce s} (n-push {id-meta cn ce (record {top = just (cons ce (SingleLinkedStack.top s))})} (suc n)) (M.cs pushOnce)) (id-meta cn ce s) ⟩
28f900230c26 add final_pre
ryokka
parents:
diff changeset
167 M.exec (M.cs popOnce) (M.exec (M.csComp {id-meta cn ce s} (n-push {id-meta cn ce (record {top = just (cons ce (SingleLinkedStack.top s))})} (suc n)) (M.cs pushOnce)) (id-meta cn ce s))
28f900230c26 add final_pre
ryokka
parents:
diff changeset
168 ≡⟨ cong (\x -> M.exec (M.cs popOnce) x) (exec-comp (n-push {id-meta cn ce (record {top = just (cons ce (SingleLinkedStack.top s))})} (suc n)) (M.cs pushOnce) (id-meta cn ce s)) ⟩
28f900230c26 add final_pre
ryokka
parents:
diff changeset
169 M.exec (M.cs popOnce) (M.exec (n-push {id-meta cn ce (record {top = just (cons ce (SingleLinkedStack.top s))})} (suc n))(M.exec (M.cs pushOnce) (id-meta cn ce s)))
28f900230c26 add final_pre
ryokka
parents:
diff changeset
170 ≡⟨ refl ⟩
28f900230c26 add final_pre
ryokka
parents:
diff changeset
171 M.exec (M.cs popOnce) (M.exec (n-push {id-meta cn ce (record {top = just (cons ce (SingleLinkedStack.top s))})} (suc n)) (id-meta cn ce (record {top = just (cons ce (SingleLinkedStack.top s))})))
28f900230c26 add final_pre
ryokka
parents:
diff changeset
172 ≡⟨ sym (exec-comp (M.cs popOnce) (n-push {id-meta cn ce (record {top = just (cons ce (SingleLinkedStack.top s))})} (suc n)) (id-meta cn ce (record {top = just (cons ce (SingleLinkedStack.top s))}))) ⟩
28f900230c26 add final_pre
ryokka
parents:
diff changeset
173 M.exec (M.csComp {id-meta cn ce s} (M.cs popOnce) (n-push {id-meta cn ce (record {top = just (cons ce (SingleLinkedStack.top s))})} (suc n))) (id-meta cn ce (record {top = just (cons ce (SingleLinkedStack.top s))}))
28f900230c26 add final_pre
ryokka
parents:
diff changeset
174 ≡⟨ pop-n-push n cn ce (record {top = just (cons ce (SingleLinkedStack.top s))}) ⟩
28f900230c26 add final_pre
ryokka
parents:
diff changeset
175 M.exec (n-push n) (id-meta cn ce (record {top = just (cons ce (SingleLinkedStack.top s))}))
28f900230c26 add final_pre
ryokka
parents:
diff changeset
176 ≡⟨ refl ⟩
28f900230c26 add final_pre
ryokka
parents:
diff changeset
177 M.exec (n-push n) (pushOnce (id-meta cn ce s))
28f900230c26 add final_pre
ryokka
parents:
diff changeset
178 ≡⟨ refl ⟩
28f900230c26 add final_pre
ryokka
parents:
diff changeset
179 M.exec (n-push n) (M.exec (M.cs pushOnce) (id-meta cn ce s))
28f900230c26 add final_pre
ryokka
parents:
diff changeset
180 ≡⟨ refl ⟩
28f900230c26 add final_pre
ryokka
parents:
diff changeset
181 M.exec (n-push {id-meta cn ce s} (suc n)) (id-meta cn ce s)
28f900230c26 add final_pre
ryokka
parents:
diff changeset
182
28f900230c26 add final_pre
ryokka
parents:
diff changeset
183
28f900230c26 add final_pre
ryokka
parents:
diff changeset
184
28f900230c26 add final_pre
ryokka
parents:
diff changeset
185
28f900230c26 add final_pre
ryokka
parents:
diff changeset
186 n-push-pop-type : ℕ -> ℕ -> ℕ -> SingleLinkedStack ℕ -> Set₁
28f900230c26 add final_pre
ryokka
parents:
diff changeset
187 n-push-pop-type n cn ce st = M.exec (M.csComp {meta} (n-pop {meta} n) (n-push {meta} n)) meta ≡ meta
28f900230c26 add final_pre
ryokka
parents:
diff changeset
188 where
28f900230c26 add final_pre
ryokka
parents:
diff changeset
189 meta = id-meta cn ce st
28f900230c26 add final_pre
ryokka
parents:
diff changeset
190
28f900230c26 add final_pre
ryokka
parents:
diff changeset
191 n-push-pop : (n cn ce : ℕ) -> (s : SingleLinkedStack ℕ) -> n-push-pop-type n cn ce s
28f900230c26 add final_pre
ryokka
parents:
diff changeset
192 n-push-pop zero cn ce s = refl
28f900230c26 add final_pre
ryokka
parents:
diff changeset
193 n-push-pop (suc n) cn ce s = begin
28f900230c26 add final_pre
ryokka
parents:
diff changeset
194 M.exec (M.csComp {id-meta cn ce s} (n-pop {id-meta cn ce s} (suc n)) (n-push {id-meta cn ce s} (suc n))) (id-meta cn ce s)
28f900230c26 add final_pre
ryokka
parents:
diff changeset
195 ≡⟨ refl ⟩
28f900230c26 add final_pre
ryokka
parents:
diff changeset
196 M.exec (M.csComp {id-meta cn ce s} (M.cs (\m -> M.exec (n-pop {id-meta cn ce s} n) (popOnce m))) (n-push {id-meta cn ce s} (suc n))) (id-meta cn ce s)
28f900230c26 add final_pre
ryokka
parents:
diff changeset
197 ≡⟨ exec-comp (M.cs (\m -> M.exec (n-pop n) (popOnce m))) (n-push {id-meta cn ce s} (suc n)) (id-meta cn ce s) ⟩
28f900230c26 add final_pre
ryokka
parents:
diff changeset
198 M.exec (M.cs (\m -> M.exec (n-pop {id-meta cn ce s} n) (popOnce m))) (M.exec (n-push {id-meta cn ce s} (suc n)) (id-meta cn ce s))
28f900230c26 add final_pre
ryokka
parents:
diff changeset
199 ≡⟨ refl ⟩
28f900230c26 add final_pre
ryokka
parents:
diff changeset
200 M.exec (n-pop n) (popOnce (M.exec (n-push {id-meta cn ce s} (suc n)) (id-meta cn ce s)))
28f900230c26 add final_pre
ryokka
parents:
diff changeset
201 ≡⟨ refl ⟩
28f900230c26 add final_pre
ryokka
parents:
diff changeset
202 M.exec (n-pop n) (M.exec (M.cs popOnce) (M.exec (n-push {id-meta cn ce s} (suc n)) (id-meta cn ce s)))
28f900230c26 add final_pre
ryokka
parents:
diff changeset
203 ≡⟨ cong (\x -> M.exec (n-pop {id-meta cn ce s} n) x) (sym (exec-comp (M.cs popOnce) (n-push {id-meta cn ce s} (suc n)) (id-meta cn ce s))) ⟩
28f900230c26 add final_pre
ryokka
parents:
diff changeset
204 M.exec (n-pop n) (M.exec (M.csComp {id-meta cn ce s} (M.cs popOnce) (n-push {id-meta cn ce s} (suc n))) (id-meta cn ce s))
28f900230c26 add final_pre
ryokka
parents:
diff changeset
205 ≡⟨ cong (\x -> M.exec (n-pop {id-meta cn ce s} n) x) (pop-n-push n cn ce s) ⟩
28f900230c26 add final_pre
ryokka
parents:
diff changeset
206 M.exec (n-pop n) (M.exec (n-push n) (id-meta cn ce s))
28f900230c26 add final_pre
ryokka
parents:
diff changeset
207 ≡⟨ sym (exec-comp (n-pop n) (n-push n) (id-meta cn ce s)) ⟩
28f900230c26 add final_pre
ryokka
parents:
diff changeset
208 M.exec (M.csComp (n-pop n) (n-push n)) (id-meta cn ce s)
28f900230c26 add final_pre
ryokka
parents:
diff changeset
209 ≡⟨ n-push-pop n cn ce s ⟩
28f900230c26 add final_pre
ryokka
parents:
diff changeset
210 id-meta cn ce s
28f900230c26 add final_pre
ryokka
parents:
diff changeset
211
28f900230c26 add final_pre
ryokka
parents:
diff changeset
212