Mercurial > hg > Members > kono > Proof > category
comparison applicative.agda @ 768:9bcdbfbaaa39
clean up
author | Shinji KONO <kono@ie.u-ryukyu.ac.jp> |
---|---|
date | Tue, 12 Dec 2017 10:25:59 +0900 |
parents | monoidal.agda@c30ca91f3a76 |
children | 43138aead09b |
comparison
equal
deleted
inserted
replaced
767:0f8e3b962c13 | 768:9bcdbfbaaa39 |
---|---|
1 open import Level | |
2 open import Category | |
3 module applicative where | |
4 | |
5 open import Data.Product renaming (_×_ to _*_) | |
6 open import Category.Constructions.Product | |
7 open import HomReasoning | |
8 open import cat-utility | |
9 open import Relation.Binary.Core | |
10 open import Relation.Binary | |
11 open import monoidal | |
12 open import Category.Sets | |
13 import Relation.Binary.PropositionalEquality | |
14 | |
15 open Functor | |
16 | |
17 | |
18 _・_ : {c₁ : Level} { a b c : Obj (Sets {c₁} ) } → (b → c) → (a → b) → a → c | |
19 _・_ f g = λ x → f ( g x ) | |
20 | |
21 record IsApplicative {c₁ : Level} ( F : Functor (Sets {c₁}) (Sets {c₁}) ) | |
22 ( pure : {a : Obj Sets} → Hom Sets a ( FObj F a ) ) | |
23 ( _<*>_ : {a b : Obj Sets} → FObj F ( a → b ) → FObj F a → FObj F b ) | |
24 : Set (suc (suc c₁)) where | |
25 field | |
26 identity : { a : Obj Sets } { u : FObj F a } → pure ( id1 Sets a ) <*> u ≡ u | |
27 composition : { a b c : Obj Sets } { u : FObj F ( b → c ) } { v : FObj F (a → b ) } { w : FObj F a } | |
28 → (( pure _・_ <*> u ) <*> v ) <*> w ≡ u <*> (v <*> w) | |
29 homomorphism : { a b : Obj Sets } { f : Hom Sets a b } { x : a } → pure f <*> pure x ≡ pure (f x) | |
30 interchange : { a b : Obj Sets } { u : FObj F ( a → b ) } { x : a } → u <*> pure x ≡ pure (λ f → f x) <*> u | |
31 -- from http://www.staff.city.ac.uk/~ross/papers/Applicative.pdf | |
32 | |
33 record Applicative {c₁ : Level} ( F : Functor (Sets {c₁}) (Sets {c₁}) ) | |
34 : Set (suc (suc c₁)) where | |
35 field | |
36 pure : {a : Obj Sets} → Hom Sets a ( FObj F a ) | |
37 <*> : {a b : Obj Sets} → FObj F ( a → b ) → FObj F a → FObj F b | |
38 isApplicative : IsApplicative F pure <*> | |
39 | |
40 ------ | |
41 -- | |
42 -- Appllicative Functor is a Monoidal Functor | |
43 -- | |
44 | |
45 Applicative→Monoidal : {c : Level} ( F : Functor (Sets {c}) (Sets {c}) ) → (mf : Applicative F ) | |
46 → IsApplicative F ( Applicative.pure mf ) ( Applicative.<*> mf ) | |
47 → MonoidalFunctor {_} {c} {_} {Sets} {Sets} MonoidalSets MonoidalSets | |
48 Applicative→Monoidal {l} F mf ismf = record { | |
49 MF = F | |
50 ; ψ = λ x → unit | |
51 ; isMonodailFunctor = record { | |
52 φab = record { TMap = λ x → φ ; isNTrans = record { commute = comm0 } } | |
53 ; associativity = λ {a b c} → comm1 {a} {b} {c} | |
54 ; unitarity-idr = λ {a b} → comm2 {a} {b} | |
55 ; unitarity-idl = λ {a b} → comm3 {a} {b} | |
56 } | |
57 } where | |
58 open Monoidal | |
59 open IsMonoidal hiding ( _■_ ; _□_ ) | |
60 M = MonoidalSets | |
61 isM = Monoidal.isMonoidal MonoidalSets | |
62 unit = Applicative.pure mf OneObj | |
63 _⊗_ : (x y : Obj Sets ) → Obj Sets | |
64 _⊗_ x y = (IsMonoidal._□_ (Monoidal.isMonoidal M) ) x y | |
65 _□_ : {a b c d : Obj Sets } ( f : Hom Sets a c ) ( g : Hom Sets b d ) → Hom Sets ( a ⊗ b ) ( c ⊗ d ) | |
66 _□_ f g = FMap (m-bi M) ( f , g ) | |
67 φ : {x : Obj (Sets × Sets) } → Hom Sets (FObj (Functor● Sets Sets MonoidalSets F) x) (FObj (Functor⊗ Sets Sets MonoidalSets F) x) | |
68 φ x = Applicative.<*> mf (FMap F (λ j k → (j , k)) (proj₁ x )) (proj₂ x) | |
69 _<*>_ : {a b : Obj Sets} → FObj F ( a → b ) → FObj F a → FObj F b | |
70 _<*>_ = Applicative.<*> mf | |
71 left : {a b : Obj Sets} → {x y : FObj F ( a → b )} → {h : FObj F a } → ( x ≡ y ) → x <*> h ≡ y <*> h | |
72 left {_} {_} {_} {_} {h} eq = ≡-cong ( λ k → k <*> h ) eq | |
73 right : {a b : Obj Sets} → {h : FObj F ( a → b )} → {x y : FObj F a } → ( x ≡ y ) → h <*> x ≡ h <*> y | |
74 right {_} {_} {h} {_} {_} eq = ≡-cong ( λ k → h <*> k ) eq | |
75 id : { a : Obj Sets } → a → a | |
76 id x = x | |
77 pure : {a : Obj Sets } → Hom Sets a ( FObj F a ) | |
78 pure a = Applicative.pure mf a | |
79 -- special case | |
80 F→pureid : {a b : Obj Sets } → (x : FObj F a ) → FMap F id x ≡ pure id <*> x | |
81 F→pureid {a} {b} x = sym ( begin | |
82 pure id <*> x | |
83 ≡⟨ IsApplicative.identity ismf ⟩ | |
84 x | |
85 ≡⟨ ≡-cong ( λ k → k x ) (sym ( IsFunctor.identity (isFunctor F ) )) ⟩ FMap F id x | |
86 ∎ ) | |
87 where | |
88 open Relation.Binary.PropositionalEquality | |
89 open Relation.Binary.PropositionalEquality.≡-Reasoning | |
90 F→pure : {a b : Obj Sets } → { f : a → b } → {x : FObj F a } → FMap F f x ≡ pure f <*> x | |
91 F→pure {a} {b} {f} {x} = sym ( begin | |
92 pure f <*> x | |
93 ≡⟨ ≡-cong ( λ k → k x ) (UniquenessOfFunctor Sets Sets F ( λ f x → pure f <*> x ) ( extensionality Sets ( λ x → IsApplicative.identity ismf ))) ⟩ | |
94 FMap F f x | |
95 ∎ ) | |
96 where | |
97 open Relation.Binary.PropositionalEquality | |
98 open Relation.Binary.PropositionalEquality.≡-Reasoning | |
99 p*p : { a b : Obj Sets } { f : Hom Sets a b } { x : a } → pure f <*> pure x ≡ pure (f x) | |
100 p*p = IsApplicative.homomorphism ismf | |
101 comp = IsApplicative.composition ismf | |
102 inter = IsApplicative.interchange ismf | |
103 pureAssoc : {a b c : Obj Sets } ( f : b → c ) ( g : a → b ) ( h : FObj F a ) → pure f <*> ( pure g <*> h ) ≡ pure ( f ・ g ) <*> h | |
104 pureAssoc f g h = trans ( trans (sym comp) (left (left p*p) )) ( left p*p ) | |
105 where | |
106 open Relation.Binary.PropositionalEquality | |
107 comm00 : {a b : Obj (Sets × Sets)} { f : Hom (Sets × Sets) a b} (x : ( FObj F (proj₁ a) * FObj F (proj₂ a)) ) → | |
108 (Sets [ FMap (Functor⊗ Sets Sets MonoidalSets F) f o φ ]) x ≡ (Sets [ φ o FMap (Functor● Sets Sets MonoidalSets F) f ]) x | |
109 comm00 {a} {b} {(f , g)} (x , y) = begin | |
110 ( FMap (Functor⊗ Sets Sets MonoidalSets F) (f , g) ) ( φ (x , y) ) | |
111 ≡⟨⟩ | |
112 FMap F (λ xy → f (proj₁ xy) , g (proj₂ xy)) ((FMap F (λ j k → j , k) x) <*> y) | |
113 ≡⟨⟩ | |
114 FMap F (map f g) ((FMap F (λ j k → j , k) x) <*> y) | |
115 ≡⟨ F→pure ⟩ | |
116 (pure (map f g) <*> (FMap F (λ j k → j , k) x <*> y)) | |
117 ≡⟨ right ( left F→pure ) ⟩ | |
118 (pure (map f g)) <*> ((pure (λ j k → j , k) <*> x) <*> y) | |
119 ≡⟨ sym ( IsApplicative.composition ismf ) ⟩ | |
120 (( pure _・_ <*> (pure (map f g))) <*> (pure (λ j k → j , k) <*> x)) <*> y | |
121 ≡⟨ left ( sym ( IsApplicative.composition ismf )) ⟩ | |
122 ((( pure _・_ <*> (( pure _・_ <*> (pure (map f g))))) <*> pure (λ j k → j , k)) <*> x) <*> y | |
123 ≡⟨ trans ( trans (left ( left (left (right p*p )))) ( left ( left ( left p*p)))) (left (left p*p)) ⟩ | |
124 (pure (( _・_ (( _・_ ((map f g))))) (λ j k → j , k)) <*> x) <*> y | |
125 ≡⟨⟩ | |
126 (pure (λ j k → f j , g k) <*> x) <*> y | |
127 ≡⟨⟩ | |
128 ( pure ((_・_ (( _・_ ( ( λ h → h g ))) ( _・_ ))) ((λ j k → f j , k))) <*> x ) <*> y | |
129 ≡⟨ sym ( trans (left (left (left p*p))) (left ( left p*p)) ) ⟩ | |
130 ((((pure _・_ <*> pure ((λ h → h g) ・ _・_)) <*> pure (λ j k → f j , k)) <*> x) <*> y) | |
131 ≡⟨ sym (trans ( left ( left ( left (right (left p*p) )))) (left ( left (left (right p*p ))))) ⟩ | |
132 (((pure _・_ <*> (( pure _・_ <*> ( pure ( λ h → h g ))) <*> ( pure _・_ ))) <*> (pure (λ j k → f j , k))) <*> x ) <*> y | |
133 ≡⟨ left ( ( IsApplicative.composition ismf )) ⟩ | |
134 ((( pure _・_ <*> ( pure ( λ h → h g ))) <*> ( pure _・_ )) <*> (pure (λ j k → f j , k) <*> x )) <*> y | |
135 ≡⟨ left (IsApplicative.composition ismf ) ⟩ | |
136 ( pure ( λ h → h g ) <*> ( pure _・_ <*> (pure (λ j k → f j , k) <*> x )) ) <*> y | |
137 ≡⟨ left (sym (IsApplicative.interchange ismf )) ⟩ | |
138 (( pure _・_ <*> (pure (λ j k → f j , k) <*> x )) <*> pure g) <*> y | |
139 ≡⟨ IsApplicative.composition ismf ⟩ | |
140 (pure (λ j k → f j , k) <*> x) <*> (pure g <*> y) | |
141 ≡⟨ sym ( trans (left F→pure ) ( right F→pure ) ) ⟩ | |
142 (FMap F (λ j k → f j , k) x) <*> (FMap F g y) | |
143 ≡⟨ ≡-cong ( λ k → k x <*> (FMap F g y)) ( IsFunctor.distr (isFunctor F )) ⟩ | |
144 (FMap F (λ j k → j , k) (FMap F f x)) <*> (FMap F g y) | |
145 ≡⟨⟩ | |
146 φ ( ( FMap (Functor● Sets Sets MonoidalSets F) (f , g) ) ( x , y ) ) | |
147 ∎ | |
148 where | |
149 open Relation.Binary.PropositionalEquality | |
150 open Relation.Binary.PropositionalEquality.≡-Reasoning | |
151 comm0 : {a b : Obj (Sets × Sets)} { f : Hom (Sets × Sets) a b} → Sets [ Sets [ FMap (Functor⊗ Sets Sets MonoidalSets F) f o φ ] | |
152 ≈ Sets [ φ o FMap (Functor● Sets Sets MonoidalSets F) f ] ] | |
153 comm0 {a} {b} {f} = extensionality Sets ( λ (x : ( FObj F (proj₁ a) * FObj F (proj₂ a)) ) → comm00 x ) | |
154 comm10 : {a b c : Obj Sets} → (x : ((FObj F a ⊗ FObj F b) ⊗ FObj F c) ) → (Sets [ φ o Sets [ id1 Sets (FObj F a) □ φ o Iso.≅→ (mα-iso isM) ] ]) x ≡ | |
155 (Sets [ FMap F (Iso.≅→ (mα-iso isM)) o Sets [ φ o φ □ id1 Sets (FObj F c) ] ]) x | |
156 comm10 {x} {y} {f} ((a , b) , c ) = begin | |
157 φ (( id □ φ ) ( ( Iso.≅→ (mα-iso isM) ) ((a , b) , c))) | |
158 ≡⟨⟩ | |
159 (FMap F (λ j k → j , k) a) <*> ( (FMap F (λ j k → j , k) b) <*> c) | |
160 ≡⟨ trans (left F→pure) (right (left F→pure) ) ⟩ | |
161 (pure (λ j k → j , k) <*> a) <*> ( (pure (λ j k → j , k) <*> b) <*> c) | |
162 ≡⟨ sym comp ⟩ | |
163 ( ( pure _・_ <*> (pure (λ j k → j , k) <*> a)) <*> (pure (λ j k → j , k) <*> b)) <*> c | |
164 ≡⟨ sym ( left comp ) ⟩ | |
165 (( ( pure _・_ <*> ( pure _・_ <*> (pure (λ j k → j , k) <*> a))) <*> (pure (λ j k → j , k))) <*> b) <*> c | |
166 ≡⟨ sym ( left ( left ( left (right comp )))) ⟩ | |
167 (( ( pure _・_ <*> (( (pure _・_ <*> pure _・_ ) <*> (pure (λ j k → j , k))) <*> a)) <*> (pure (λ j k → j , k))) <*> b) <*> c | |
168 ≡⟨ trans (left ( left (left ( right (left ( left p*p )))))) (left ( left ( left (right (left p*p))))) ⟩ | |
169 (( ( pure _・_ <*> ((pure ((_・_ ( _・_ )) ((λ j k → j , k)))) <*> a)) <*> (pure (λ j k → j , k))) <*> b) <*> c | |
170 ≡⟨ sym (left ( left ( left comp ) )) ⟩ | |
171 (((( ( pure _・_ <*> (pure _・_ )) <*> (pure ((_・_ ( _・_ )) ((λ j k → j , k))))) <*> a) <*> (pure (λ j k → j , k))) <*> b) <*> c | |
172 ≡⟨ trans (left ( left ( left (left (left p*p))))) (left ( left ( left (left p*p )))) ⟩ | |
173 ((((pure ( ( _・_ (_・_ )) (((_・_ ( _・_ )) ((λ j k → j , k)))))) <*> a) <*> (pure (λ j k → j , k))) <*> b) <*> c | |
174 ≡⟨⟩ | |
175 ((((pure (λ f g x y → f , g x y)) <*> a) <*> (pure (λ j k → j , k))) <*> b) <*> c | |
176 ≡⟨ left ( left inter ) ⟩ | |
177 (((pure (λ f → f (λ j k → j , k))) <*> ((pure (λ f g x y → f , g x y)) <*> a) ) <*> b) <*> c | |
178 ≡⟨ sym ( left ( left comp )) ⟩ | |
179 (((( pure _・_ <*> (pure (λ f → f (λ j k → j , k)))) <*> (pure (λ f g x y → f , g x y))) <*> a ) <*> b) <*> c | |
180 ≡⟨ trans (left ( left (left (left p*p) ))) (left (left (left p*p ) )) ⟩ | |
181 ((pure (( _・_ (λ f → f (λ j k → j , k))) (λ f g x y → f , g x y)) <*> a ) <*> b) <*> c | |
182 ≡⟨⟩ | |
183 (((pure (λ f g h → f , g , h)) <*> a) <*> b) <*> c | |
184 ≡⟨⟩ | |
185 ((pure ((_・_ ((_・_ ((_・_ ( (λ abc → proj₁ (proj₁ abc) , proj₂ (proj₁ abc) , proj₂ abc))))))) | |
186 (( _・_ ( _・_ ((λ j k → j , k)))) (λ j k → j , k))) <*> a) <*> b) <*> c | |
187 ≡⟨ sym (trans ( left ( left ( left (left (right (right p*p))) ) )) (trans (left (left( left (left (right p*p))))) | |
188 (trans (left (left (left (left p*p)))) (trans ( left (left (left (right (left (right p*p )))))) | |
189 (trans (left (left (left (right (left p*p))))) (trans (left (left (left (right p*p)))) (left (left (left p*p)))) ) ) ) | |
190 ) ) ⟩ | |
191 ((((pure _・_ <*> ((pure _・_ <*> ((pure _・_ <*> ( pure (λ abc → proj₁ (proj₁ abc) , proj₂ (proj₁ abc) , proj₂ abc))))))) <*> | |
192 (( pure _・_ <*> ( pure _・_ <*> (pure (λ j k → j , k)))) <*> pure (λ j k → j , k))) <*> a) <*> b) <*> c | |
193 ≡⟨ left (left comp ) ⟩ | |
194 (((pure _・_ <*> ((pure _・_ <*> ( pure (λ abc → proj₁ (proj₁ abc) , proj₂ (proj₁ abc) , proj₂ abc))))) <*> | |
195 ((( pure _・_ <*> ( pure _・_ <*> (pure (λ j k → j , k)))) <*> pure (λ j k → j , k)) <*> a)) <*> b) <*> c | |
196 ≡⟨ left comp ⟩ | |
197 ((pure _・_ <*> ( pure (λ abc → proj₁ (proj₁ abc) , proj₂ (proj₁ abc) , proj₂ abc))) <*> | |
198 (((( pure _・_ <*> ( pure _・_ <*> (pure (λ j k → j , k)))) <*> pure (λ j k → j , k)) <*> a) <*> b)) <*> c | |
199 ≡⟨ left ( right (left comp )) ⟩ | |
200 ((pure _・_ <*> ( pure (λ abc → proj₁ (proj₁ abc) , proj₂ (proj₁ abc) , proj₂ abc))) <*> | |
201 ((( pure _・_ <*> (pure (λ j k → j , k))) <*> (pure (λ j k → j , k) <*> a)) <*> b)) <*> c | |
202 ≡⟨ left ( right comp ) ⟩ | |
203 ((pure _・_ <*> ( pure (λ abc → proj₁ (proj₁ abc) , proj₂ (proj₁ abc) , proj₂ abc))) <*> | |
204 (pure (λ j k → j , k) <*> ( (pure (λ j k → j , k) <*> a) <*> b))) <*> c | |
205 ≡⟨ comp ⟩ | |
206 pure (λ abc → proj₁ (proj₁ abc) , proj₂ (proj₁ abc) , proj₂ abc) <*> ( (pure (λ j k → j , k) <*> ( (pure (λ j k → j , k) <*> a) <*> b)) <*> c) | |
207 ≡⟨ sym ( trans ( trans F→pure (right (left F→pure ))) ( right ( left (right (left F→pure ))))) ⟩ | |
208 FMap F (λ abc → proj₁ (proj₁ abc) , proj₂ (proj₁ abc) , proj₂ abc) ( (FMap F (λ j k → j , k) ( (FMap F (λ j k → j , k) a) <*> b)) <*> c) | |
209 ≡⟨⟩ | |
210 ( FMap F (Iso.≅→ (mα-iso isM))) (φ (( φ □ id1 Sets (FObj F f) ) ((a , b) , c))) | |
211 ∎ | |
212 where | |
213 open Relation.Binary.PropositionalEquality | |
214 open Relation.Binary.PropositionalEquality.≡-Reasoning | |
215 comm1 : {a b c : Obj Sets} → Sets [ Sets [ φ | |
216 o Sets [ (id1 Sets (FObj F a) □ φ ) o Iso.≅→ (mα-iso isM) ] ] | |
217 ≈ Sets [ FMap F (Iso.≅→ (mα-iso isM)) o Sets [ φ o (φ □ id1 Sets (FObj F c)) ] ] ] | |
218 comm1 {a} {b} {c} = extensionality Sets ( λ x → comm10 x ) | |
219 comm20 : {a b : Obj Sets} ( x : FObj F a * One ) → ( Sets [ | |
220 FMap F (Iso.≅→ (mρ-iso isM)) o Sets [ φ o | |
221 FMap (m-bi MonoidalSets) (id1 Sets (FObj F a) , (λ _ → unit )) ] ] ) x ≡ Iso.≅→ (mρ-iso isM) x | |
222 comm20 {a} {b} (x , OneObj ) = begin | |
223 (FMap F (Iso.≅→ (mρ-iso isM))) ( φ (( FMap (m-bi MonoidalSets) (id1 Sets (FObj F a) , (λ _ → unit))) (x , OneObj) )) | |
224 ≡⟨⟩ | |
225 FMap F proj₁ ((FMap F (λ j k → j , k) x) <*> (pure OneObj)) | |
226 ≡⟨ ≡-cong ( λ k → FMap F proj₁ k) ( IsApplicative.interchange ismf ) ⟩ | |
227 FMap F proj₁ ((pure (λ f → f OneObj)) <*> (FMap F (λ j k → j , k) x)) | |
228 ≡⟨ ( trans F→pure (right ( right F→pure )) ) ⟩ | |
229 pure proj₁ <*> ((pure (λ f → f OneObj)) <*> (pure (λ j k → j , k) <*> x)) | |
230 ≡⟨ sym ( right comp ) ⟩ | |
231 pure proj₁ <*> (((pure _・_ <*> (pure (λ f → f OneObj))) <*> pure (λ j k → j , k)) <*> x) | |
232 ≡⟨ sym comp ⟩ | |
233 ( ( pure _・_ <*> (pure proj₁ ) ) <*> ((pure _・_ <*> (pure (λ f → f OneObj))) <*> pure (λ j k → j , k))) <*> x | |
234 ≡⟨ trans ( trans ( trans ( left ( left p*p)) ( left ( right (left p*p) ))) (left (right p*p) ) ) (left p*p) ⟩ | |
235 pure ( ( _・_ (proj₁ {l} {l})) ((_・_ ((λ f → f OneObj))) (λ j k → j , k))) <*> x | |
236 ≡⟨⟩ | |
237 pure id <*> x | |
238 ≡⟨ IsApplicative.identity ismf ⟩ | |
239 x | |
240 ≡⟨⟩ | |
241 Iso.≅→ (mρ-iso isM) (x , OneObj) | |
242 ∎ | |
243 where | |
244 open Relation.Binary.PropositionalEquality | |
245 open Relation.Binary.PropositionalEquality.≡-Reasoning | |
246 comm2 : {a b : Obj Sets} → Sets [ Sets [ | |
247 FMap F (Iso.≅→ (mρ-iso isM)) o Sets [ φ o | |
248 FMap (m-bi MonoidalSets) (id1 Sets (FObj F a) , (λ _ → unit )) ] ] ≈ Iso.≅→ (mρ-iso isM) ] | |
249 comm2 {a} {b} = extensionality Sets ( λ x → comm20 {a} {b} x ) | |
250 comm30 : {a b : Obj Sets} ( x : One * FObj F b ) → ( Sets [ | |
251 FMap F (Iso.≅→ (mλ-iso isM)) o Sets [ φ o | |
252 FMap (m-bi MonoidalSets) ((λ _ → unit ) , id1 Sets (FObj F b) ) ] ] ) x ≡ Iso.≅→ (mλ-iso isM) x | |
253 comm30 {a} {b} ( OneObj , x) = begin | |
254 (FMap F (Iso.≅→ (mλ-iso isM))) ( φ ( unit , x ) ) | |
255 ≡⟨⟩ | |
256 FMap F proj₂ ((FMap F (λ j k → j , k) (pure OneObj)) <*> x) | |
257 ≡⟨ ( trans F→pure (right ( left F→pure )) ) ⟩ | |
258 pure proj₂ <*> ((pure (λ j k → j , k) <*> (pure OneObj)) <*> x) | |
259 ≡⟨ sym comp ⟩ | |
260 ((pure _・_ <*> (pure proj₂)) <*> (pure (λ j k → j , k) <*> (pure OneObj))) <*> x | |
261 ≡⟨ trans (trans (left (left p*p )) (left ( right p*p)) ) (left p*p) ⟩ | |
262 pure ((_・_ (proj₂ {l}) )((λ (j : One {l}) (k : b ) → j , k) OneObj)) <*> x | |
263 ≡⟨⟩ | |
264 pure id <*> x | |
265 ≡⟨ IsApplicative.identity ismf ⟩ | |
266 x | |
267 ≡⟨⟩ | |
268 Iso.≅→ (mλ-iso isM) ( OneObj , x ) | |
269 ∎ | |
270 where | |
271 open Relation.Binary.PropositionalEquality | |
272 open Relation.Binary.PropositionalEquality.≡-Reasoning | |
273 comm3 : {a b : Obj Sets} → Sets [ Sets [ FMap F (Iso.≅→ (mλ-iso isM)) o | |
274 Sets [ φ o FMap (m-bi MonoidalSets) ((λ _ → unit ) , id1 Sets (FObj F b)) ] ] ≈ Iso.≅→ (mλ-iso isM) ] | |
275 comm3 {a} {b} = extensionality Sets ( λ x → comm30 {a} {b} x ) | |
276 | |
277 ---- | |
278 -- | |
279 -- Monoidal laws imples Applicative laws | |
280 -- | |
281 | |
282 HaskellMonoidal→Applicative : {c₁ : Level} ( F : Functor (Sets {c₁}) (Sets {c₁}) ) | |
283 ( Mono : HaskellMonoidalFunctor F ) | |
284 → Applicative F | |
285 HaskellMonoidal→Applicative {c₁} F Mono = record { | |
286 pure = pure ; | |
287 <*> = _<*>_ ; | |
288 isApplicative = record { | |
289 identity = identity | |
290 ; composition = composition | |
291 ; homomorphism = homomorphism | |
292 ; interchange = interchange | |
293 } | |
294 } | |
295 where | |
296 unit : FObj F One | |
297 unit = HaskellMonoidalFunctor.unit Mono | |
298 φ : {a b : Obj Sets} → Hom Sets ((FObj F a) * (FObj F b )) ( FObj F ( a * b ) ) | |
299 φ = HaskellMonoidalFunctor.φ Mono | |
300 mono : IsHaskellMonoidalFunctor F unit φ | |
301 mono = HaskellMonoidalFunctor.isHaskellMonoidalFunctor Mono | |
302 id : { a : Obj Sets } → a → a | |
303 id x = x | |
304 isM : IsMonoidal (Sets {c₁}) One SetsTensorProduct | |
305 isM = Monoidal.isMonoidal MonoidalSets | |
306 pure : {a : Obj Sets} → Hom Sets a ( FObj F a ) | |
307 pure {a} x = FMap F ( λ y → x ) (unit ) | |
308 _<*>_ : {a b : Obj Sets} → FObj F ( a → b ) → FObj F a → FObj F b | |
309 _<*>_ {a} {b} x y = FMap F ( λ r → ( proj₁ r ) ( proj₂ r ) ) (φ ( x , y )) | |
310 -- right does not work right it makes yellows. why? | |
311 -- right : {n : Level} { a b : Set n} → { x y : a } { h : a → b } → ( x ≡ y ) → h x ≡ h y | |
312 -- right {_} {_} {_} {_} {_} {h} eq = ≡-cong ( λ k → h k ) eq | |
313 left : {n : Level} { a b : Set n} → { x y : a → b } { h : a } → ( x ≡ y ) → x h ≡ y h | |
314 left {_} {_} {_} {_} {_} {h} eq = ≡-cong ( λ k → k h ) eq | |
315 open Relation.Binary.PropositionalEquality | |
316 FφF→F : { a b c d e : Obj Sets } { g : Hom Sets a c } { h : Hom Sets b d } | |
317 { f : Hom Sets (c * d) e } | |
318 { x : FObj F a } { y : FObj F b } | |
319 → FMap F f ( φ ( FMap F g x , FMap F h y ) ) ≡ FMap F ( f o map g h ) ( φ ( x , y ) ) | |
320 FφF→F {a} {b} {c} {d} {e} {g} {h} {f} {x} {y} = sym ( begin | |
321 FMap F ( f o map g h ) ( φ ( x , y ) ) | |
322 ≡⟨ ≡-cong ( λ k → k ( φ ( x , y ))) ( IsFunctor.distr (isFunctor F) ) ⟩ | |
323 FMap F f (( FMap F ( map g h ) ) ( φ ( x , y ))) | |
324 ≡⟨ ≡-cong ( λ k → FMap F f k ) ( IsHaskellMonoidalFunctor.natφ mono ) ⟩ | |
325 FMap F f ( φ ( FMap F g x , FMap F h y ) ) | |
326 ∎ ) | |
327 where | |
328 open Relation.Binary.PropositionalEquality.≡-Reasoning | |
329 u→F : {a : Obj Sets } {u : FObj F a} → u ≡ FMap F id u | |
330 u→F {a} {u} = sym ( ≡-cong ( λ k → k u ) ( IsFunctor.identity ( isFunctor F ) ) ) | |
331 φunitr : {a : Obj Sets } {u : FObj F a} → φ ( unit , u) ≡ FMap F (Iso.≅← (IsMonoidal.mλ-iso isM)) u | |
332 φunitr {a} {u} = sym ( begin | |
333 FMap F (Iso.≅← (IsMonoidal.mλ-iso isM)) u | |
334 ≡⟨ ≡-cong ( λ k → FMap F (Iso.≅← (IsMonoidal.mλ-iso isM)) k ) (sym (IsHaskellMonoidalFunctor.idlφ mono)) ⟩ | |
335 FMap F (Iso.≅← (IsMonoidal.mλ-iso isM)) ( FMap F (Iso.≅→ (IsMonoidal.mλ-iso isM)) ( φ ( unit , u) ) ) | |
336 ≡⟨ left ( sym ( IsFunctor.distr ( isFunctor F ) )) ⟩ | |
337 (FMap F ( (Iso.≅← (IsMonoidal.mλ-iso isM)) o (Iso.≅→ (IsMonoidal.mλ-iso isM)))) ( φ ( unit , u) ) | |
338 ≡⟨ ≡-cong ( λ k → FMap F k ( φ ( unit , u) )) (Iso.iso→ ( (IsMonoidal.mλ-iso isM) )) ⟩ | |
339 FMap F id ( φ ( unit , u) ) | |
340 ≡⟨ left ( IsFunctor.identity ( isFunctor F ) ) ⟩ | |
341 id ( φ ( unit , u) ) | |
342 ≡⟨⟩ | |
343 φ ( unit , u) | |
344 ∎ ) | |
345 where | |
346 open Relation.Binary.PropositionalEquality.≡-Reasoning | |
347 φunitl : {a : Obj Sets } {u : FObj F a} → φ ( u , unit ) ≡ FMap F (Iso.≅← (IsMonoidal.mρ-iso isM)) u | |
348 φunitl {a} {u} = sym ( begin | |
349 FMap F (Iso.≅← (IsMonoidal.mρ-iso isM)) u | |
350 ≡⟨ ≡-cong ( λ k → FMap F (Iso.≅← (IsMonoidal.mρ-iso isM)) k ) (sym (IsHaskellMonoidalFunctor.idrφ mono)) ⟩ | |
351 FMap F (Iso.≅← (IsMonoidal.mρ-iso isM)) ( FMap F (Iso.≅→ (IsMonoidal.mρ-iso isM)) ( φ ( u , unit ) ) ) | |
352 ≡⟨ left ( sym ( IsFunctor.distr ( isFunctor F ) )) ⟩ | |
353 (FMap F ( (Iso.≅← (IsMonoidal.mρ-iso isM)) o (Iso.≅→ (IsMonoidal.mρ-iso isM)))) ( φ ( u , unit ) ) | |
354 ≡⟨ ≡-cong ( λ k → FMap F k ( φ ( u , unit ) )) (Iso.iso→ ( (IsMonoidal.mρ-iso isM) )) ⟩ | |
355 FMap F id ( φ ( u , unit ) ) | |
356 ≡⟨ left ( IsFunctor.identity ( isFunctor F ) ) ⟩ | |
357 id ( φ ( u , unit ) ) | |
358 ≡⟨⟩ | |
359 φ ( u , unit ) | |
360 ∎ ) | |
361 where | |
362 open Relation.Binary.PropositionalEquality.≡-Reasoning | |
363 open IsMonoidal | |
364 identity : { a : Obj Sets } { u : FObj F a } → pure ( id1 Sets a ) <*> u ≡ u | |
365 identity {a} {u} = begin | |
366 pure id <*> u | |
367 ≡⟨⟩ | |
368 ( FMap F ( λ r → ( proj₁ r ) ( proj₂ r )) ) ( φ ( FMap F ( λ y → id ) unit , u ) ) | |
369 ≡⟨ ≡-cong ( λ k → ( FMap F ( λ r → ( proj₁ r ) ( proj₂ r )) ) ( φ ( FMap F ( λ y → id ) unit , k ))) u→F ⟩ | |
370 ( FMap F ( λ r → ( proj₁ r ) ( proj₂ r )) ) ( φ ( FMap F ( λ y → id ) unit , FMap F id u ) ) | |
371 ≡⟨ FφF→F ⟩ | |
372 FMap F (λ x → proj₂ x ) (φ (unit , u ) ) | |
373 ≡⟨⟩ | |
374 FMap F (Iso.≅→ (mλ-iso isM)) (φ (unit , u )) | |
375 ≡⟨ IsHaskellMonoidalFunctor.idlφ mono ⟩ | |
376 u | |
377 ∎ | |
378 where | |
379 open Relation.Binary.PropositionalEquality.≡-Reasoning | |
380 composition : { a b c : Obj Sets } { u : FObj F ( b → c ) } { v : FObj F (a → b ) } { w : FObj F a } | |
381 → (( pure _・_ <*> u ) <*> v ) <*> w ≡ u <*> (v <*> w) | |
382 composition {a} {b} {c} {u} {v} {w} = begin | |
383 FMap F (λ r → proj₁ r (proj₂ r)) (φ (FMap F (λ r → proj₁ r (proj₂ r)) (φ | |
384 (FMap F (λ r → proj₁ r (proj₂ r)) (φ (FMap F (λ y f g x → f (g x)) unit , u)) , v)) , w)) | |
385 ≡⟨ ≡-cong ( λ k → FMap F (λ r → proj₁ r (proj₂ r)) (φ (FMap F (λ r → proj₁ r (proj₂ r)) (φ (FMap F (λ r → proj₁ r (proj₂ r)) (φ (FMap F (λ y f g x → f (g x)) unit , k)) , v)) , w)) ) u→F ⟩ | |
386 FMap F (λ r → proj₁ r (proj₂ r)) (φ (FMap F (λ r → proj₁ r (proj₂ r)) (φ | |
387 (FMap F (λ r → proj₁ r (proj₂ r)) (φ (FMap F (λ y f g x → f (g x)) unit , FMap F id u )) , v)) , w)) | |
388 ≡⟨ ≡-cong ( λ k → FMap F (λ r → proj₁ r (proj₂ r)) (φ (FMap F (λ r → proj₁ r (proj₂ r)) (φ ( k , v)) , w)) ) FφF→F ⟩ | |
389 FMap F (λ r → proj₁ r (proj₂ r)) (φ (FMap F (λ r → proj₁ r (proj₂ r)) (φ | |
390 (FMap F ( λ x → (λ r → proj₁ r (proj₂ r)) ((map (λ y f g x → f (g x)) id ) x)) (φ ( unit , u)) , v)) , w)) | |
391 ≡⟨ ≡-cong ( λ k → ( FMap F (λ r → proj₁ r (proj₂ r)) (φ (FMap F (λ r → proj₁ r (proj₂ r)) (φ | |
392 (FMap F ( λ x → (λ r → proj₁ r (proj₂ r)) ((map (λ y f g x → f (g x)) id ) x)) k , v)) , w)) ) ) φunitr ⟩ | |
393 FMap F (λ r → proj₁ r (proj₂ r)) (φ (FMap F (λ r → proj₁ r (proj₂ r)) (φ | |
394 ( (FMap F ( λ x → (λ r → proj₁ r (proj₂ r)) ((map (λ y f g x → f (g x)) id ) x)) (FMap F (Iso.≅← (mλ-iso isM)) u) ) , v)) , w)) | |
395 ≡⟨ ≡-cong ( λ k → FMap F (λ r → proj₁ r (proj₂ r)) (φ (FMap F (λ r → proj₁ r (proj₂ r)) (φ | |
396 (k u , v)) , w)) ) (sym ( IsFunctor.distr (isFunctor F ))) ⟩ | |
397 FMap F (λ r → proj₁ r (proj₂ r)) (φ (FMap F (λ r → proj₁ r (proj₂ r)) (φ | |
398 ( FMap F (λ x → ((λ y f g x₁ → f (g x₁)) unit x) ) u , v)) , w)) | |
399 ≡⟨⟩ | |
400 FMap F (λ r → proj₁ r (proj₂ r)) (φ (FMap F (λ r → proj₁ r (proj₂ r)) (φ | |
401 ( FMap F (λ x g h → x (g h) ) u , v)) , w)) | |
402 ≡⟨ ≡-cong ( λ k → FMap F (λ r → proj₁ r (proj₂ r)) (φ (FMap F (λ r → proj₁ r (proj₂ r)) (φ ( FMap F (λ x g h → x (g h) ) u , k)) , w)) ) u→F ⟩ | |
403 FMap F (λ r → proj₁ r (proj₂ r)) (φ (FMap F (λ r → proj₁ r (proj₂ r)) (φ (FMap F (λ x g h → x (g h)) u , FMap F id v)) , w)) | |
404 ≡⟨ ≡-cong ( λ k → FMap F (λ r → proj₁ r (proj₂ r)) (φ (k , w)) ) FφF→F ⟩ | |
405 FMap F (λ r → proj₁ r (proj₂ r)) (φ (FMap F ((λ r → proj₁ r (proj₂ r)) o map (λ x g h → x (g h)) id) (φ (u , v)) , w)) | |
406 ≡⟨⟩ | |
407 FMap F (λ r → proj₁ r (proj₂ r)) (φ (FMap F (λ x h → proj₁ x (proj₂ x h)) (φ (u , v)) , w)) | |
408 ≡⟨ ≡-cong ( λ k → FMap F (λ r → proj₁ r (proj₂ r)) (φ (FMap F (λ x h → proj₁ x (proj₂ x h)) (φ (u , v)) , k)) ) u→F ⟩ | |
409 FMap F (λ r → proj₁ r (proj₂ r)) (φ (FMap F (λ x h → proj₁ x (proj₂ x h)) (φ (u , v)) , FMap F id w)) | |
410 ≡⟨ FφF→F ⟩ | |
411 FMap F ((λ r → proj₁ r (proj₂ r)) o map (λ x h → proj₁ x (proj₂ x h)) id) (φ (φ (u , v) , w)) | |
412 ≡⟨⟩ | |
413 FMap F (λ x → proj₁ (proj₁ x) (proj₂ (proj₁ x) (proj₂ x))) (φ (φ (u , v) , w)) | |
414 ≡⟨ ≡-cong ( λ k → FMap F (λ x → proj₁ (proj₁ x) (proj₂ (proj₁ x) (proj₂ x))) (k (φ (φ (u , v) , w)) )) (sym (IsFunctor.identity (isFunctor F ))) ⟩ | |
415 FMap F (λ x → proj₁ (proj₁ x) (proj₂ (proj₁ x) (proj₂ x))) (FMap F id (φ (φ (u , v) , w)) ) | |
416 ≡⟨ ≡-cong ( λ k → FMap F (λ x → proj₁ (proj₁ x) (proj₂ (proj₁ x) (proj₂ x))) (FMap F k (φ (φ (u , v) , w)) ) ) (sym (Iso.iso→ (mα-iso isM))) ⟩ | |
417 FMap F (λ x → proj₁ (proj₁ x) (proj₂ (proj₁ x) (proj₂ x))) (FMap F ( (Iso.≅← (mα-iso isM)) o (Iso.≅→ (mα-iso isM))) (φ (φ (u , v) , w)) ) | |
418 ≡⟨ ≡-cong ( λ k → FMap F (λ x → proj₁ (proj₁ x) (proj₂ (proj₁ x) (proj₂ x))) (k (φ (φ (u , v) , w)))) ( IsFunctor.distr (isFunctor F )) ⟩ | |
419 FMap F (λ x → proj₁ (proj₁ x) (proj₂ (proj₁ x) (proj₂ x))) (FMap F (Iso.≅← (mα-iso isM)) ( FMap F (Iso.≅→ (mα-iso isM)) (φ (φ (u , v) , w)) )) | |
420 ≡⟨ ≡-cong ( λ k → FMap F (λ x → proj₁ (proj₁ x) (proj₂ (proj₁ x) (proj₂ x))) (FMap F (Iso.≅← (mα-iso isM)) k) ) (sym ( IsHaskellMonoidalFunctor.assocφ mono ) ) ⟩ | |
421 FMap F (λ x → proj₁ (proj₁ x) (proj₂ (proj₁ x) (proj₂ x))) (FMap F (Iso.≅← (mα-iso isM)) (φ (u , φ (v , w)))) | |
422 ≡⟨⟩ | |
423 FMap F (λ x → proj₁ (proj₁ x) (proj₂ (proj₁ x) (proj₂ x))) (FMap F (λ r → (proj₁ r , proj₁ (proj₂ r)) , proj₂ (proj₂ r)) (φ (u , φ (v , w)))) | |
424 ≡⟨ left (sym ( IsFunctor.distr (isFunctor F ))) ⟩ | |
425 FMap F (λ y → (λ x → proj₁ (proj₁ x) (proj₂ (proj₁ x) (proj₂ x))) ((λ r → (proj₁ r , proj₁ (proj₂ r)) , proj₂ (proj₂ r)) y )) (φ (u , φ (v , w))) | |
426 ≡⟨⟩ | |
427 FMap F (λ y → proj₁ y (proj₁ (proj₂ y) (proj₂ (proj₂ y)))) (φ (u , φ (v , w))) | |
428 ≡⟨⟩ | |
429 FMap F ( λ x → (proj₁ x) ((λ r → proj₁ r (proj₂ r)) ( proj₂ x))) ( φ ( u , (φ (v , w)))) | |
430 ≡⟨ sym FφF→F ⟩ | |
431 FMap F (λ r → proj₁ r (proj₂ r)) (φ (FMap F id u , FMap F (λ r → proj₁ r (proj₂ r)) (φ (v , w)))) | |
432 ≡⟨ ≡-cong ( λ k → FMap F (λ r → proj₁ r (proj₂ r)) (φ (k , FMap F (λ r → proj₁ r (proj₂ r)) (φ (v , w)))) ) (sym u→F ) ⟩ | |
433 FMap F (λ r → proj₁ r (proj₂ r)) (φ (u , FMap F (λ r → proj₁ r (proj₂ r)) (φ (v , w)))) | |
434 ∎ | |
435 where | |
436 open Relation.Binary.PropositionalEquality.≡-Reasoning | |
437 homomorphism : { a b : Obj Sets } { f : Hom Sets a b } { x : a } → pure f <*> pure x ≡ pure (f x) | |
438 homomorphism {a} {b} {f} {x} = begin | |
439 pure f <*> pure x | |
440 ≡⟨⟩ | |
441 FMap F (λ r → proj₁ r (proj₂ r)) (φ (FMap F (λ y → f) unit , FMap F (λ y → x) unit)) | |
442 ≡⟨ FφF→F ⟩ | |
443 FMap F ((λ r → proj₁ r (proj₂ r)) o map (λ y → f) (λ y → x)) (φ (unit , unit)) | |
444 ≡⟨⟩ | |
445 FMap F (λ y → f x) (φ (unit , unit)) | |
446 ≡⟨ ≡-cong ( λ k → FMap F (λ y → f x) k ) φunitl ⟩ | |
447 FMap F (λ y → f x) (FMap F (Iso.≅← (mρ-iso isM)) unit) | |
448 ≡⟨⟩ | |
449 FMap F (λ y → f x) (FMap F (λ y → (y , OneObj)) unit) | |
450 ≡⟨ left ( sym ( IsFunctor.distr (isFunctor F ))) ⟩ | |
451 FMap F (λ y → f x) unit | |
452 ≡⟨⟩ | |
453 pure (f x) | |
454 ∎ | |
455 where | |
456 open Relation.Binary.PropositionalEquality.≡-Reasoning | |
457 interchange : { a b : Obj Sets } { u : FObj F ( a → b ) } { x : a } → u <*> pure x ≡ pure (λ f → f x) <*> u | |
458 interchange {a} {b} {u} {x} = begin | |
459 u <*> pure x | |
460 ≡⟨⟩ | |
461 FMap F (λ r → proj₁ r (proj₂ r)) (φ (u , FMap F (λ y → x) unit)) | |
462 ≡⟨ ≡-cong ( λ k → FMap F (λ r → proj₁ r (proj₂ r)) (φ (k , FMap F (λ y → x) unit)) ) u→F ⟩ | |
463 FMap F (λ r → proj₁ r (proj₂ r)) (φ (FMap F id u , FMap F (λ y → x) unit)) | |
464 ≡⟨ FφF→F ⟩ | |
465 FMap F ((λ r → proj₁ r (proj₂ r)) o map id (λ y → x)) (φ (u , unit)) | |
466 ≡⟨⟩ | |
467 FMap F (λ r → proj₁ r x) (φ (u , unit)) | |
468 ≡⟨ ≡-cong ( λ k → FMap F (λ r → proj₁ r x) k ) φunitl ⟩ | |
469 FMap F (λ r → proj₁ r x) (( FMap F (Iso.≅← (mρ-iso isM))) u ) | |
470 ≡⟨ left ( sym ( IsFunctor.distr (isFunctor F )) ) ⟩ | |
471 FMap F (( λ r → proj₁ r x) o ((Iso.≅← (mρ-iso isM) ))) u | |
472 ≡⟨⟩ | |
473 FMap F (( λ r → proj₂ r x) o ((Iso.≅← (mλ-iso isM) ))) u | |
474 ≡⟨ left ( IsFunctor.distr (isFunctor F )) ⟩ | |
475 FMap F (λ r → proj₂ r x) (FMap F (Iso.≅← (IsMonoidal.mλ-iso isM)) u) | |
476 ≡⟨ ≡-cong ( λ k → FMap F (λ r → proj₂ r x) k ) (sym φunitr ) ⟩ | |
477 FMap F (λ r → proj₂ r x) (φ (unit , u)) | |
478 ≡⟨⟩ | |
479 FMap F ((λ r → proj₁ r (proj₂ r)) o map (λ y f → f x) id) (φ (unit , u)) | |
480 ≡⟨ sym FφF→F ⟩ | |
481 FMap F (λ r → proj₁ r (proj₂ r)) (φ (FMap F (λ y f → f x) unit , FMap F id u)) | |
482 ≡⟨ ≡-cong ( λ k → FMap F (λ r → proj₁ r (proj₂ r)) (φ (FMap F (λ y f → f x) unit , k)) ) (sym u→F) ⟩ | |
483 FMap F (λ r → proj₁ r (proj₂ r)) (φ (FMap F (λ y f → f x) unit , u)) | |
484 ≡⟨⟩ | |
485 pure (λ f → f x) <*> u | |
486 ∎ | |
487 where | |
488 open Relation.Binary.PropositionalEquality.≡-Reasoning | |
489 | |
490 ---- | |
491 -- | |
492 -- Applicative laws imples Monoidal laws | |
493 -- | |
494 | |
495 Applicative→HaskellMonoidal : {c₁ : Level} ( F : Functor (Sets {c₁}) (Sets {c₁}) ) | |
496 ( App : Applicative F ) | |
497 → HaskellMonoidalFunctor F | |
498 Applicative→HaskellMonoidal {l} F App = record { | |
499 unit = unit ; | |
500 φ = φ ; | |
501 isHaskellMonoidalFunctor = record { | |
502 natφ = natφ | |
503 ; assocφ = assocφ | |
504 ; idrφ = idrφ | |
505 ; idlφ = idlφ | |
506 } | |
507 } where | |
508 pure = Applicative.pure App | |
509 <*> = Applicative.<*> App | |
510 app = Applicative.isApplicative App | |
511 unit : FObj F One | |
512 unit = pure OneObj | |
513 φ : {a b : Obj Sets} → Hom Sets ((FObj F a) * (FObj F b )) ( FObj F ( a * b ) ) | |
514 φ = λ x → <*> (FMap F (λ j k → (j , k)) ( proj₁ x)) ( proj₂ x) | |
515 isM : IsMonoidal (Sets {l}) One SetsTensorProduct | |
516 isM = Monoidal.isMonoidal MonoidalSets | |
517 MF : MonoidalFunctor {_} {l} {_} {Sets} {Sets} MonoidalSets MonoidalSets | |
518 MF = Applicative→Monoidal F App app | |
519 isMF = MonoidalFunctor.isMonodailFunctor MF | |
520 natφ : { a b c d : Obj Sets } { x : FObj F a} { y : FObj F b} { f : a → c } { g : b → d } | |
521 → FMap F (map f g) (φ (x , y)) ≡ φ (FMap F f x , FMap F g y) | |
522 natφ {a} {b} {c} {d} {x} {y} {f} {g} = begin | |
523 FMap F (map f g) (φ (x , y)) | |
524 ≡⟨⟩ | |
525 FMap F (λ xy → f (proj₁ xy) , g (proj₂ xy)) (<*> (FMap F (λ j k → j , k) x) y) | |
526 ≡⟨ ≡-cong ( λ h → h (x , y)) ( IsNTrans.commute ( NTrans.isNTrans ( IsMonoidalFunctor.φab isMF ))) ⟩ | |
527 <*> (FMap F (λ j k → j , k) (FMap F f x)) (FMap F g y) | |
528 ≡⟨⟩ | |
529 φ (FMap F f x , FMap F g y) | |
530 ∎ | |
531 where | |
532 open Relation.Binary.PropositionalEquality.≡-Reasoning | |
533 assocφ : { x y z : Obj Sets } { a : FObj F x } { b : FObj F y }{ c : FObj F z } | |
534 → φ (a , φ (b , c)) ≡ FMap F (Iso.≅→ (IsMonoidal.mα-iso isM)) (φ (φ (a , b) , c)) | |
535 assocφ {x} {y} {z} {a} {b} {c} = ≡-cong ( λ h → h ((a , b) , c ) ) ( IsMonoidalFunctor.associativity isMF ) | |
536 idrφ : {a : Obj Sets } { x : FObj F a } → FMap F (Iso.≅→ (IsMonoidal.mρ-iso isM)) (φ (x , unit)) ≡ x | |
537 idrφ {a} {x} = ≡-cong ( λ h → h (x , OneObj ) ) ( IsMonoidalFunctor.unitarity-idr isMF {a} {One} ) | |
538 idlφ : {a : Obj Sets } { x : FObj F a } → FMap F (Iso.≅→ (IsMonoidal.mλ-iso isM)) (φ (unit , x)) ≡ x | |
539 idlφ {a} {x} = ≡-cong ( λ h → h (OneObj , x ) ) ( IsMonoidalFunctor.unitarity-idl isMF {One} {a} ) | |
540 | |
541 |