comparison agda/deltaM/monad.agda @ 127:d56596e4e784

Prove left-unity-law for DeltaM
author Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
date Tue, 03 Feb 2015 12:13:40 +0900
parents 5902b2a24abf
children d9a30f696933
comparison
equal deleted inserted replaced
126:5902b2a24abf 127:d56596e4e784
37 (f : A -> B) -> (d : (DeltaM M A (S (S n)))) -> 37 (f : A -> B) -> (d : (DeltaM M A (S (S n)))) ->
38 (tailDeltaM ∙ (deltaM-fmap f)) d ≡ ((deltaM-fmap f) ∙ tailDeltaM) d 38 (tailDeltaM ∙ (deltaM-fmap f)) d ≡ ((deltaM-fmap f) ∙ tailDeltaM) d
39 tailDeltaM-with-f {n = O} f (deltaM (delta x d)) = refl 39 tailDeltaM-with-f {n = O} f (deltaM (delta x d)) = refl
40 tailDeltaM-with-f {n = S n} f (deltaM (delta x d)) = refl 40 tailDeltaM-with-f {n = S n} f (deltaM (delta x d)) = refl
41 41
42 42 headDeltaM-with-deltaM-eta : {l : Level} {A : Set l} {n : Nat}
43 fmap-headDeltaM-with-deltaM-eta : {l : Level} {A : Set l} {n : Nat} 43 {T : Set l -> Set l} {F : Functor T} {M : Monad T F} ->
44 {T : Set l -> Set l} {F : Functor T} {M : Monad T F} -> 44 (x : DeltaM M A (S n)) ->
45 (x : T A) -> (fmap F ((headDeltaM {n = n} {M = M}) ∙ deltaM-eta) x) ≡ fmap F (eta M) x 45 ((headDeltaM {n = n} {M = M}) ∙ deltaM-eta) x ≡ eta M x
46 fmap-headDeltaM-with-deltaM-eta {n = O} x = refl 46 headDeltaM-with-deltaM-eta {n = O} (deltaM (mono x)) = refl
47 fmap-headDeltaM-with-deltaM-eta {n = S n} x = refl 47 headDeltaM-with-deltaM-eta {n = S n} (deltaM (delta x d)) = refl
48
49 48
50 49
51 fmap-tailDeltaM-with-deltaM-eta : {l : Level} {A : Set l} {n : Nat} 50 fmap-tailDeltaM-with-deltaM-eta : {l : Level} {A : Set l} {n : Nat}
52 {T : Set l -> Set l} {F : Functor T} {M : Monad T F} -> 51 {T : Set l -> Set l} {F : Functor T} {M : Monad T F} ->
53 (d : DeltaM M A (S n)) -> 52 (d : DeltaM M A (S n)) ->
72 fmap-tailDeltaM-with-deltaM-mu {n = O} (deltaM (mono x)) = refl 71 fmap-tailDeltaM-with-deltaM-mu {n = O} (deltaM (mono x)) = refl
73 fmap-tailDeltaM-with-deltaM-mu {n = S n} (deltaM d) = refl 72 fmap-tailDeltaM-with-deltaM-mu {n = S n} (deltaM d) = refl
74 73
75 74
76 75
77 76 {-
78 77
79 -- main proofs 78 -- main proofs
80 79
81 deltaM-eta-is-nt : {l : Level} {A B : Set l} {n : Nat} 80 deltaM-eta-is-nt : {l : Level} {A B : Set l} {n : Nat}
82 {T : Set l -> Set l} {F : Functor T} {M : Monad T F} -> 81 {T : Set l -> Set l} {F : Functor T} {M : Monad T F} ->
106 105
107 deltaM-mu-is-nt : {l : Level} {A B : Set l} {n : Nat} 106 deltaM-mu-is-nt : {l : Level} {A B : Set l} {n : Nat}
108 {T : Set l -> Set l} {F : Functor T} {M : Monad T F} 107 {T : Set l -> Set l} {F : Functor T} {M : Monad T F}
109 (f : A -> B) -> (d : DeltaM M (DeltaM M A (S n)) (S n)) -> 108 (f : A -> B) -> (d : DeltaM M (DeltaM M A (S n)) (S n)) ->
110 deltaM-fmap f (deltaM-mu d) ≡ deltaM-mu (deltaM-fmap (deltaM-fmap f) d) 109 deltaM-fmap f (deltaM-mu d) ≡ deltaM-mu (deltaM-fmap (deltaM-fmap f) d)
111 deltaM-mu-is-nt {l} {A} {B} {O} {T} {F} {M} f (deltaM (mono x)) = 110 deltaM-mu-is-nt {l} {A} {B} {O} {T} {F} {M} f (deltaM (mono x)) = begin
112 {-
113 deltaM-mu-is-nt {l} {A} {B} {O} {T} {F} {M} f (deltaM (mono x)) = begin
114 deltaM-fmap f (deltaM-mu (deltaM (mono x))) ≡⟨ refl ⟩
115 deltaM-fmap f (deltaM (mono (mu M (fmap F (headDeltaM {M = M}) (headDeltaM {M = M} (deltaM (mono x))))))) ≡⟨ refl ⟩
116 deltaM-fmap f (deltaM (mono (mu M (fmap F (headDeltaM {M = M}) x)))) ≡⟨ refl ⟩
117 deltaM (mono (fmap F f (mu M (fmap F (headDeltaM {M = M}) x)))) ≡⟨ {!!} ⟩
118 deltaM (mono (mu M (fmap F (headDeltaM {M = M}) (fmap F (deltaM-fmap f) x)))) ≡⟨ refl ⟩
119 deltaM (mono (mu M (fmap F (headDeltaM {M = M}) (headDeltaM {M = M} (deltaM (mono (fmap F (deltaM-fmap f) x))))))) ≡⟨ refl ⟩
120 deltaM-mu (deltaM (mono (fmap F (deltaM-fmap f) x))) ≡⟨ refl ⟩
121 deltaM-mu (deltaM (mono (fmap F (deltaM-fmap f) x))) ≡⟨ refl ⟩
122 deltaM-mu (deltaM-fmap (deltaM-fmap f) (deltaM (mono x)))
123
124 -}
125
126 begin
127 deltaM-fmap f (deltaM-mu (deltaM (mono x))) 111 deltaM-fmap f (deltaM-mu (deltaM (mono x)))
128 ≡⟨ refl ⟩ 112 ≡⟨ refl ⟩
129 deltaM-fmap f (deltaM (mono (mu M (fmap F headDeltaM x)))) 113 deltaM-fmap f (deltaM (mono (mu M (fmap F headDeltaM x))))
130 ≡⟨ refl ⟩ 114 ≡⟨ refl ⟩
131 deltaM (mono (fmap F f (mu M (fmap F headDeltaM x)))) 115 deltaM (mono (fmap F f (mu M (fmap F headDeltaM x))))
142 ≡⟨ refl ⟩ 126 ≡⟨ refl ⟩
143 deltaM-mu (deltaM (mono (fmap F (deltaM-fmap f) x))) 127 deltaM-mu (deltaM (mono (fmap F (deltaM-fmap f) x)))
144 ≡⟨ refl ⟩ 128 ≡⟨ refl ⟩
145 deltaM-mu (deltaM-fmap (deltaM-fmap f) (deltaM (mono x))) 129 deltaM-mu (deltaM-fmap (deltaM-fmap f) (deltaM (mono x)))
146 130
147
148 deltaM-mu-is-nt {l} {A} {B} {S n} {T} {F} {M} f (deltaM (delta x d)) = begin 131 deltaM-mu-is-nt {l} {A} {B} {S n} {T} {F} {M} f (deltaM (delta x d)) = begin
149 deltaM-fmap f (deltaM-mu (deltaM (delta x d))) ≡⟨ refl ⟩ 132 deltaM-fmap f (deltaM-mu (deltaM (delta x d))) ≡⟨ refl ⟩
150 deltaM-fmap f (deltaM (delta (mu M (fmap F (headDeltaM {M = M}) (headDeltaM {M = M} (deltaM (delta x d))))) 133 deltaM-fmap f (deltaM (delta (mu M (fmap F (headDeltaM {M = M}) (headDeltaM {M = M} (deltaM (delta x d)))))
151 (unDeltaM {M = M} (deltaM-mu (deltaM-fmap tailDeltaM (tailDeltaM (deltaM (delta x d)))))))) 134 (unDeltaM {M = M} (deltaM-mu (deltaM-fmap tailDeltaM (tailDeltaM (deltaM (delta x d))))))))
152 ≡⟨ refl ⟩ 135 ≡⟨ refl ⟩
205 188
206 189
207 190
208 191
209 192
210 {- 193
211 deltaM-right-unity-law : {l : Level} {A : Set l} {n : Nat} 194 deltaM-right-unity-law : {l : Level} {A : Set l} {n : Nat}
212 {T : Set l -> Set l} {F : Functor T} {M : Monad T F} -> 195 {T : Set l -> Set l} {F : Functor T} {M : Monad T F} ->
213 (d : DeltaM M A (S n)) -> (deltaM-mu ∙ deltaM-eta) d ≡ id d 196 (d : DeltaM M A (S n)) -> (deltaM-mu ∙ deltaM-eta) d ≡ id d
214 deltaM-right-unity-law {l} {A} {O} {M} {fm} {mm} (deltaM (mono x)) = begin 197 deltaM-right-unity-law {l} {A} {O} {M} {fm} {mm} (deltaM (mono x)) = begin
215 deltaM-mu (deltaM-eta (deltaM (mono x))) ≡⟨ refl ⟩ 198 deltaM-mu (deltaM-eta (deltaM (mono x))) ≡⟨ refl ⟩
258 ≡⟨ refl ⟩ 241 ≡⟨ refl ⟩
259 deltaM (delta x d) 242 deltaM (delta x d)
260 243
261 244
262 245
263 246 -}
264 247
265 248
266 249
267 postulate deltaM-left-unity-law : {l : Level} {A : Set l} 250 deltaM-left-unity-law : {l : Level} {A : Set l} {n : Nat}
268 {M : Set l -> Set l} {functorM : Functor M} {monadM : Monad M functorM} 251 {T : Set l -> Set l} {F : Functor T} {M : Monad T F}
269 {n : Nat} 252 (d : DeltaM M A (S n)) -> (deltaM-mu ∙ (deltaM-fmap deltaM-eta)) d ≡ id d
270 (d : DeltaM M {functorM} {monadM} A (S n)) -> 253 deltaM-left-unity-law {l} {A} {O} {T} {F} {M} (deltaM (mono x)) = begin
271 (deltaM-mu ∙ (deltaM-fmap deltaM-eta)) d ≡ id d 254 deltaM-mu (deltaM-fmap deltaM-eta (deltaM (mono x))) ≡⟨ refl ⟩
255 deltaM-mu (deltaM (mono (fmap F deltaM-eta x))) ≡⟨ refl ⟩
256 deltaM (mono (mu M (fmap F (headDeltaM {M = M}) (headDeltaM {M = M} (deltaM (mono (fmap F deltaM-eta x))))))) ≡⟨ refl ⟩
257 deltaM (mono (mu M (fmap F (headDeltaM {M = M}) (fmap F deltaM-eta x))))
258 ≡⟨ cong (\de -> deltaM (mono (mu M de))) (sym (covariant F deltaM-eta headDeltaM x)) ⟩
259 deltaM (mono (mu M (fmap F ((headDeltaM {n = O} {M = M}) ∙ deltaM-eta) x)))
260 ≡⟨ refl ⟩
261 deltaM (mono (mu M (fmap F (eta M) x)))
262 ≡⟨ cong (\de -> deltaM (mono de)) (left-unity-law M x) ⟩
263 deltaM (mono x)
264
265 deltaM-left-unity-law {l} {A} {S n} {T} {F} {M} (deltaM (delta x d)) = begin
266 deltaM-mu (deltaM-fmap deltaM-eta (deltaM (delta x d)))
267 ≡⟨ refl ⟩
268 deltaM-mu (deltaM (delta (fmap F deltaM-eta x) (delta-fmap (fmap F deltaM-eta) d)))
269 ≡⟨ refl ⟩
270 deltaM (delta (mu M (fmap F (headDeltaM {n = S n} {M = M}) (headDeltaM {n = S n} {M = M} (deltaM (delta (fmap F deltaM-eta x) (delta-fmap (fmap F deltaM-eta) d))))))
271 (unDeltaM {M = M} (deltaM-mu (deltaM-fmap tailDeltaM (tailDeltaM (deltaM (delta (fmap F deltaM-eta x) (delta-fmap (fmap F deltaM-eta) d))))))))
272 ≡⟨ refl ⟩
273 deltaM (delta (mu M (fmap F (headDeltaM {n = S n} {M = M}) (fmap F deltaM-eta x)))
274 (unDeltaM {M = M} (deltaM-mu (deltaM-fmap tailDeltaM (deltaM (delta-fmap (fmap F deltaM-eta) d))))))
275 ≡⟨ cong (\de -> deltaM (delta (mu M de) (unDeltaM {M = M} (deltaM-mu (deltaM-fmap tailDeltaM (deltaM (delta-fmap (fmap F deltaM-eta) d)))))))
276 (sym (covariant F deltaM-eta headDeltaM x)) ⟩
277 deltaM (delta (mu M (fmap F ((headDeltaM {n = S n} {M = M}) ∙ deltaM-eta) x))
278 (unDeltaM {M = M} (deltaM-mu (deltaM-fmap tailDeltaM (deltaM (delta-fmap (fmap F deltaM-eta) d))))))
279 ≡⟨ refl ⟩
280 deltaM (delta (mu M (fmap F (eta M) x))
281 (unDeltaM {M = M} (deltaM-mu (deltaM-fmap tailDeltaM (deltaM (delta-fmap (fmap F deltaM-eta) d))))))
282 ≡⟨ cong (\de -> deltaM (delta de (unDeltaM {M = M} (deltaM-mu (deltaM-fmap tailDeltaM (deltaM (delta-fmap (fmap F deltaM-eta) d)))))))
283 (left-unity-law M x) ⟩
284 deltaM (delta x (unDeltaM {M = M} (deltaM-mu (deltaM-fmap tailDeltaM (deltaM (delta-fmap (fmap F deltaM-eta) d))))))
285 ≡⟨ refl ⟩
286 deltaM (delta x (unDeltaM {M = M} (deltaM-mu (deltaM-fmap (tailDeltaM {n = n})(deltaM-fmap (deltaM-eta {n = S n})(deltaM d))))))
287 ≡⟨ cong (\de -> deltaM (delta x (unDeltaM {M = M} (deltaM-mu de)))) (sym (deltaM-covariant tailDeltaM deltaM-eta (deltaM d))) ⟩
288 deltaM (delta x (unDeltaM {M = M} (deltaM-mu (deltaM-fmap ((tailDeltaM {n = n}) ∙ (deltaM-eta {n = S n})) (deltaM d)))))
289 ≡⟨ refl ⟩
290 deltaM (delta x (unDeltaM {M = M} (deltaM-mu (deltaM-fmap deltaM-eta (deltaM d)))))
291 ≡⟨ cong (\de -> deltaM (delta x (unDeltaM {M = M} de))) (deltaM-left-unity-law (deltaM d)) ⟩
292 deltaM (delta x (unDeltaM {M = M} (deltaM d)))
293 ≡⟨ refl ⟩
294 deltaM (delta x d)
295
296
297
272 {- 298 {-
273 deltaM-left-unity-law {l} {A} {M} {fm} {mm} {O} (deltaM (mono x)) = begin 299
274 deltaM-mu (deltaM-fmap deltaM-eta (deltaM (mono x)))
275 ≡⟨ refl ⟩
276 deltaM-mu (deltaM (delta-fmap (fmap fm deltaM-eta) (mono x)))
277 ≡⟨ refl ⟩
278 deltaM-mu (deltaM (mono (fmap fm deltaM-eta x)))
279 ≡⟨ refl ⟩
280 deltaM (mono (mu mm (fmap fm (headDeltaM {l} {A} {O} {M}) (fmap fm deltaM-eta x))))
281 ≡⟨ cong (\de -> deltaM (mono (mu mm de))) (sym (covariant fm deltaM-eta headDeltaM x)) ⟩
282 deltaM (mono (mu mm (fmap fm ((headDeltaM {l} {A} {O} {M} {fm} {mm}) ∙ deltaM-eta) x)))
283 ≡⟨ cong (\de -> deltaM (mono (mu mm de))) (fmap-headDeltaM-with-deltaM-eta {l} {A} {O} {M} {fm} {mm} x) ⟩
284 deltaM (mono (mu mm (fmap fm (eta mm) x)))
285 ≡⟨ cong (\de -> deltaM (mono de)) (left-unity-law mm x) ⟩
286 deltaM (mono x)
287
288 deltaM-left-unity-law {l} {A} {M} {fm} {mm} {S n} (deltaM (delta x d)) = begin
289 deltaM-mu (deltaM-fmap deltaM-eta (deltaM (delta x d)))
290 ≡⟨ refl ⟩
291 deltaM-mu (deltaM (delta-fmap (fmap fm deltaM-eta) (delta x d)))
292 ≡⟨ refl ⟩
293 deltaM-mu (deltaM (delta (fmap fm deltaM-eta x) (delta-fmap (fmap fm deltaM-eta) d)))
294 ≡⟨ refl ⟩
295 appendDeltaM (deltaM (mono (mu mm (fmap fm (headDeltaM {l} {A} {S n} {M} {fm} {mm}) (fmap fm deltaM-eta x)))))
296 (deltaM-mu (deltaM-fmap tailDeltaM (deltaM (delta-fmap (fmap fm deltaM-eta) d))))
297 ≡⟨ cong (\de -> appendDeltaM (deltaM (mono (mu mm de)))
298 (deltaM-mu (deltaM-fmap tailDeltaM (deltaM (delta-fmap (fmap fm deltaM-eta) d)))))
299 (sym (covariant fm deltaM-eta headDeltaM x)) ⟩
300 appendDeltaM (deltaM (mono (mu mm (fmap fm ((headDeltaM {l} {A} {S n} {M} {fm} {mm}) ∙ deltaM-eta) x))))
301 (deltaM-mu (deltaM-fmap tailDeltaM (deltaM (delta-fmap (fmap fm deltaM-eta) d))))
302 ≡⟨ cong (\de -> appendDeltaM (deltaM (mono (mu mm de)))
303 (deltaM-mu (deltaM-fmap tailDeltaM (deltaM (delta-fmap (fmap fm deltaM-eta) d)))))
304 (fmap-headDeltaM-with-deltaM-eta {l} {A} {S n} {M} {fm} {mm} x) ⟩
305 appendDeltaM (deltaM (mono (mu mm (fmap fm (eta mm) x))))
306 (deltaM-mu (deltaM-fmap tailDeltaM (deltaM (delta-fmap (fmap fm deltaM-eta) d))))
307
308 ≡⟨ cong (\de -> (appendDeltaM (deltaM (mono de)) (deltaM-mu (deltaM-fmap tailDeltaM (deltaM (delta-fmap (fmap fm deltaM-eta) d))))))
309 (left-unity-law mm x) ⟩
310 appendDeltaM (deltaM (mono x)) (deltaM-mu (deltaM-fmap tailDeltaM (deltaM (delta-fmap (fmap fm deltaM-eta) d))))
311 ≡⟨ refl ⟩
312 appendDeltaM (deltaM (mono x)) (deltaM-mu (deltaM-fmap (tailDeltaM {n = n})(deltaM-fmap deltaM-eta (deltaM d))))
313 ≡⟨ cong (\de -> appendDeltaM (deltaM (mono x)) (deltaM-mu de)) (sym (covariant deltaM-is-functor deltaM-eta tailDeltaM (deltaM d))) ⟩
314 appendDeltaM (deltaM (mono x)) (deltaM-mu (deltaM-fmap ((tailDeltaM {n = n}) ∙ deltaM-eta) (deltaM d)))
315 ≡⟨ cong (\de -> appendDeltaM (deltaM (mono x)) (deltaM-mu de)) (fmap-tailDeltaM-with-deltaM-eta (deltaM d)) ⟩
316 appendDeltaM (deltaM (mono x)) (deltaM-mu (deltaM-fmap deltaM-eta (deltaM d)))
317 ≡⟨ cong (\de -> appendDeltaM (deltaM (mono x)) de) (deltaM-left-unity-law (deltaM d)) ⟩
318 appendDeltaM (deltaM (mono x)) (deltaM d)
319 ≡⟨ refl ⟩
320 deltaM (delta x d)
321
322
323 -}
324 postulate nya : {l : Level} {A : Set l} 300 postulate nya : {l : Level} {A : Set l}
325 (M : Set l -> Set l) (fm : Functor M) (mm : Monad M fm) 301 (M : Set l -> Set l) (fm : Functor M) (mm : Monad M fm)
326 (d : DeltaM M {fm} {mm} (DeltaM M {fm} {mm} (DeltaM M {fm} {mm} A (S O)) (S O)) (S O)) -> 302 (d : DeltaM M {fm} {mm} (DeltaM M {fm} {mm} (DeltaM M {fm} {mm} A (S O)) (S O)) (S O)) ->
327 deltaM-mu (deltaM-fmap deltaM-mu d) ≡ deltaM-mu (deltaM-mu d) 303 deltaM-mu (deltaM-fmap deltaM-mu d) ≡ deltaM-mu (deltaM-mu d)
328 304