comparison agda/delta/monad.agda @ 107:caaf364f45ac

Prove monad-laws for length fixed infinite Delta
author Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
date Wed, 28 Jan 2015 22:21:27 +0900
parents e6499a50ccbd
children d47aea3f9246
comparison
equal deleted inserted replaced
106:2779a09e1526 107:caaf364f45ac
8 open import Level 8 open import Level
9 open import Relation.Binary.PropositionalEquality 9 open import Relation.Binary.PropositionalEquality
10 open ≡-Reasoning 10 open ≡-Reasoning
11 11
12 module delta.monad where 12 module delta.monad where
13
14 tailDelta-is-nt : {l : Level} {A B : Set l} {n : Nat}
15 (f : A -> B) -> (d : Delta A (S (S n))) ->
16 (tailDelta {n = n} ∙ (delta-fmap f)) d ≡ ((delta-fmap f) ∙ tailDelta {n = n}) d
17 tailDelta-is-nt f (delta x d) = refl
18
19 tailDelta-to-tail-nt : {l : Level} {A B : Set l} (n m : Nat)
20 (f : A -> B) (d : Delta (Delta A (S (S m))) (S n)) ->
21 delta-fmap tailDelta (delta-fmap (delta-fmap f) d) ≡ delta-fmap (delta-fmap f) (delta-fmap tailDelta d)
22 tailDelta-to-tail-nt O O f (mono (delta x d)) = refl
23 tailDelta-to-tail-nt O (S m) f (mono (delta x d)) = refl
24 tailDelta-to-tail-nt (S n) O f (delta (delta x (mono xx)) d) = begin
25 delta (mono (f xx))
26 (delta-fmap tailDelta (delta-fmap (delta-fmap f) d))
27 ≡⟨ cong (\de -> delta (mono (f xx)) de) (tailDelta-to-tail-nt n O f d) ⟩
28 delta (mono (f xx))
29 (delta-fmap (delta-fmap f) (delta-fmap tailDelta d))
30
31 tailDelta-to-tail-nt (S n) (S m) f (delta (delta x (delta xx d)) ds) = begin
32 delta (delta (f xx) (delta-fmap f d))
33 (delta-fmap tailDelta (delta-fmap (delta-fmap f) ds))
34 ≡⟨ cong (\de -> delta (delta (f xx) (delta-fmap f d)) de) (tailDelta-to-tail-nt n (S m) f ds) ⟩
35 delta (delta (f xx) (delta-fmap f d))
36 (delta-fmap (delta-fmap f) (delta-fmap tailDelta ds))
37
38
39
13 40
14 delta-eta-is-nt : {l : Level} {A B : Set l} -> {n : Nat} 41 delta-eta-is-nt : {l : Level} {A B : Set l} -> {n : Nat}
15 (f : A -> B) -> (x : A) -> (delta-eta {n = n} ∙ f) x ≡ delta-fmap f (delta-eta x) 42 (f : A -> B) -> (x : A) -> (delta-eta {n = n} ∙ f) x ≡ delta-fmap f (delta-eta x)
16 delta-eta-is-nt {n = O} f x = refl 43 delta-eta-is-nt {n = O} f x = refl
17 delta-eta-is-nt {n = S O} f x = refl 44 delta-eta-is-nt {n = S O} f x = refl
21 delta (f x) (delta-eta (f x)) ≡⟨ cong (\de -> delta (f x) de) (delta-eta-is-nt f x) ⟩ 48 delta (f x) (delta-eta (f x)) ≡⟨ cong (\de -> delta (f x) de) (delta-eta-is-nt f x) ⟩
22 delta (f x) (delta-fmap f (delta-eta x)) ≡⟨ refl ⟩ 49 delta (f x) (delta-fmap f (delta-eta x)) ≡⟨ refl ⟩
23 delta-fmap f (delta x (delta-eta x)) ≡⟨ refl ⟩ 50 delta-fmap f (delta x (delta-eta x)) ≡⟨ refl ⟩
24 delta-fmap f (delta-eta x) ∎ 51 delta-fmap f (delta-eta x) ∎
25 52
53
26 delta-mu-is-nt : {l : Level} {A B : Set l} {n : Nat} -> (f : A -> B) -> (d : Delta (Delta A (S n)) (S n)) 54 delta-mu-is-nt : {l : Level} {A B : Set l} {n : Nat} -> (f : A -> B) -> (d : Delta (Delta A (S n)) (S n))
27 -> delta-mu (delta-fmap (delta-fmap f) d) ≡ delta-fmap f (delta-mu d) 55 -> delta-mu (delta-fmap (delta-fmap f) d) ≡ delta-fmap f (delta-mu d)
28 delta-mu-is-nt f d = {!!} 56 delta-mu-is-nt {n = O} f (mono d) = refl
29 57 delta-mu-is-nt {n = S n} f (delta (delta x d) ds) = begin
30 hoge : {l : Level} {A : Set l} {n : Nat} -> (ds : Delta (Delta A (S (S n))) (S (S n))) -> 58 delta (f x) (delta-mu (delta-fmap tailDelta (delta-fmap (delta-fmap f) ds)))
31 (tailDelta {n = n} ∙ delta-mu {n = (S n)}) ds 59 ≡⟨ cong (\de -> delta (f x) (delta-mu de)) (tailDelta-to-tail-nt n n f ds ) ⟩
60 delta (f x) (delta-mu (delta-fmap (delta-fmap f) (delta-fmap tailDelta ds)))
61 ≡⟨ cong (\de -> delta (f x) de) (delta-mu-is-nt f (delta-fmap tailDelta ds)) ⟩
62 delta (f x) (delta-fmap f (delta-mu (delta-fmap tailDelta ds)))
63
64
65
66 delta-fmap-mu-to-tail : {l : Level} {A : Set l} (n m : Nat) (d : Delta (Delta (Delta A (S (S m))) (S (S m))) (S n)) ->
67 delta-fmap tailDelta (delta-fmap delta-mu d)
32 68
33 (((delta-mu {n = n}) ∙ (delta-fmap tailDelta)) ∙ tailDelta) ds 69 (delta-fmap delta-mu (delta-fmap (delta-fmap tailDelta) (delta-fmap tailDelta d)))
34 hoge (delta ds ds₁) = refl 70 delta-fmap-mu-to-tail O O (mono (delta d ds)) = refl
35 71 delta-fmap-mu-to-tail O (S n) (mono (delta (delta x (delta xx d)) (delta (delta dx (delta dxx dd)) ds))) = refl
72 delta-fmap-mu-to-tail (S n) O (delta (delta (delta x (mono xx)) (mono (delta dx (mono dxx)))) ds) = begin
73 delta (mono dxx) (delta-fmap tailDelta (delta-fmap delta-mu ds))
74 ≡⟨ cong (\de -> delta (mono dxx) de) (delta-fmap-mu-to-tail n O ds) ⟩
75 delta (mono dxx)
76 (delta-fmap delta-mu
77 (delta-fmap (delta-fmap tailDelta) (delta-fmap tailDelta ds)))
78
79 delta-fmap-mu-to-tail (S n) (S n₁) (delta (delta (delta x (delta xx d)) (delta (delta dx (delta dxx dd)) ds)) dds) = begin
80 delta (delta dxx (delta-mu (delta-fmap tailDelta (delta-fmap tailDelta ds))))
81 (delta-fmap tailDelta (delta-fmap delta-mu dds))
82 ≡⟨ cong (\de -> delta (delta dxx (delta-mu (delta-fmap tailDelta (delta-fmap tailDelta ds)))) de) (delta-fmap-mu-to-tail n (S n₁) dds) ⟩
83 delta (delta dxx (delta-mu (delta-fmap tailDelta (delta-fmap tailDelta ds))))
84 (delta-fmap delta-mu (delta-fmap (delta-fmap tailDelta) (delta-fmap tailDelta dds)))
85
36 86
37 87
38 88
39 -- Monad-laws (Category) 89 -- Monad-laws (Category)
40 -- monad-law-1 : join . delta-fmap join = join . join 90 -- monad-law-1 : join . delta-fmap join = join . join
41 monad-law-1 : {l : Level} {A : Set l} {n : Nat} (d : Delta (Delta (Delta A (S n)) (S n)) (S n)) -> 91 monad-law-1 : {l : Level} {A : Set l} {n : Nat} (d : Delta (Delta (Delta A (S n)) (S n)) (S n)) ->
42 ((delta-mu ∙ (delta-fmap delta-mu)) d) ≡ ((delta-mu ∙ delta-mu) d) 92 ((delta-mu ∙ (delta-fmap delta-mu)) d) ≡ ((delta-mu ∙ delta-mu) d)
43 monad-law-1 {n = O} (mono d) = refl 93 monad-law-1 {n = O} (mono d) = refl
94 monad-law-1 {n = S n} (delta (delta (delta x d) dd) ds) = begin
95 delta x (delta-mu (delta-fmap tailDelta (delta-fmap delta-mu ds)))
96 ≡⟨ cong (\de -> delta x (delta-mu de)) (delta-fmap-mu-to-tail n n ds) ⟩
97 delta x (delta-mu (delta-fmap delta-mu (delta-fmap (delta-fmap tailDelta) (delta-fmap tailDelta ds))))
98 ≡⟨ cong (\de -> delta x de) (monad-law-1 (delta-fmap (delta-fmap tailDelta) (delta-fmap tailDelta ds))) ⟩
99 delta x (delta-mu (delta-mu (delta-fmap (delta-fmap tailDelta) (delta-fmap tailDelta ds))))
100 ≡⟨ cong (\de -> delta x (delta-mu de)) (delta-mu-is-nt tailDelta (delta-fmap tailDelta ds) ) ⟩
101 delta x (delta-mu (delta-fmap tailDelta (delta-mu (delta-fmap tailDelta ds))))
102
103
104
105 {-
106 begin
107 delta x (delta-mu (delta-fmap tailDelta (delta-fmap delta-mu ds))) ≡⟨ {!!} ⟩
108 delta x (delta-mu (delta-fmap tailDelta (delta-mu (delta-fmap tailDelta ds))))
109
110 -}
111 {-
44 monad-law-1 {n = S O} (delta (delta (delta _ _) _) (mono (delta (delta _ (mono _)) (mono (delta _ (mono _)))))) = refl 112 monad-law-1 {n = S O} (delta (delta (delta _ _) _) (mono (delta (delta _ (mono _)) (mono (delta _ (mono _)))))) = refl
45 monad-law-1 {n = S n} (delta (delta (delta x d) dd) ds) = begin 113 monad-law-1 {n = S n} (delta (delta (delta x d) dd) ds) = begin
46 (delta-mu ∙ delta-fmap delta-mu) (delta (delta (delta x d) dd) ds) ≡⟨ refl ⟩ 114 (delta-mu ∙ delta-fmap delta-mu) (delta (delta (delta x d) dd) ds) ≡⟨ refl ⟩
47 delta-mu (delta-fmap delta-mu (delta (delta (delta x d) dd) ds)) ≡⟨ refl ⟩ 115 delta-mu (delta-fmap delta-mu (delta (delta (delta x d) dd) ds)) ≡⟨ refl ⟩
48 delta-mu (delta (delta-mu (delta (delta x d) dd)) (delta-fmap delta-mu ds)) ≡⟨ refl ⟩ 116 delta-mu (delta (delta-mu (delta (delta x d) dd)) (delta-fmap delta-mu ds)) ≡⟨ refl ⟩
67 delta-mu (delta (delta x d) (delta-mu (delta-fmap tailDelta ds))) ≡⟨ refl ⟩ 135 delta-mu (delta (delta x d) (delta-mu (delta-fmap tailDelta ds))) ≡⟨ refl ⟩
68 delta-mu (delta (headDelta (delta (delta x d) dd)) (delta-mu (delta-fmap tailDelta ds))) ≡⟨ refl ⟩ 136 delta-mu (delta (headDelta (delta (delta x d) dd)) (delta-mu (delta-fmap tailDelta ds))) ≡⟨ refl ⟩
69 delta-mu (delta-mu (delta (delta (delta x d) dd) ds)) ≡⟨ refl ⟩ 137 delta-mu (delta-mu (delta (delta (delta x d) dd) ds)) ≡⟨ refl ⟩
70 (delta-mu ∙ delta-mu) (delta (delta (delta x d) dd) ds) 138 (delta-mu ∙ delta-mu) (delta (delta (delta x d) dd) ds)
71 139
140 -}
72 {- 141 {-
73 begin 142 begin
74 (delta-mu ∙ delta-fmap delta-mu) (delta d ds) ≡⟨ refl ⟩ 143 (delta-mu ∙ delta-fmap delta-mu) (delta d ds) ≡⟨ refl ⟩
75 delta-mu (delta-fmap delta-mu (delta d ds)) ≡⟨ refl ⟩ 144 delta-mu (delta-fmap delta-mu (delta d ds)) ≡⟨ refl ⟩
76 delta-mu (delta (delta-mu d) (delta-fmap delta-mu ds)) ≡⟨ refl ⟩ 145 delta-mu (delta (delta-mu d) (delta-fmap delta-mu ds)) ≡⟨ refl ⟩
123 id (delta x d) ∎ 192 id (delta x d) ∎
124 193
125 194
126 195
127 delta-is-monad : {l : Level} {n : Nat} -> Monad {l} (\A -> Delta A (S n)) delta-is-functor 196 delta-is-monad : {l : Level} {n : Nat} -> Monad {l} (\A -> Delta A (S n)) delta-is-functor
128
129
130 delta-is-monad = record { eta = delta-eta; 197 delta-is-monad = record { eta = delta-eta;
131 mu = delta-mu; 198 mu = delta-mu;
132 return = delta-eta; 199 return = delta-eta;
133 bind = delta-bind; 200 bind = delta-bind;
134 eta-is-nt = delta-eta-is-nt; 201 eta-is-nt = delta-eta-is-nt;