Built with Alectryon, running Coq+SerAPI v8.18.0+0.18.3. Bubbles () indicate interactive fragments: hover for details, tap to reveal contents. Use Ctrl+↑Ctrl+↓ to navigate, Ctrl+🖱️ to focus. On Mac, use ⌘ instead of Ctrl.
[Loading ML file number_string_notation_plugin.cmxs (using legacy method) ... done]
Require Import Types.Forall Types.Prod.Require Import WildCat.Core WildCat.Prod WildCat.Equiv WildCat.NatTrans WildCat.Square.(** * Bifunctors between WildCats *)(** ** Definition *)(** We choose to store redundant information in the class, so that depending on how an instance is constructed, we will get the expected implementations of [fmap10], [fmap01] and [fmap11]. *)ClassIs0Bifunctor {ABC : Type}
`{IsGraph A, IsGraph B, IsGraph C} (F : A -> B -> C) := {
is0functor_bifunctor_uncurried :: Is0Functor (uncurry F);
is0functor01_bifunctor :: foralla, Is0Functor (F a);
is0functor10_bifunctor :: forallb, Is0Functor (flip F b);
}.(** We provide two alternate constructors, allowing the user to provide just the first field or the last two fields. *)
A, B, C: Type H: IsGraph A H0: Is01Cat A H1: IsGraph B H2: Is01Cat B H3: IsGraph C F: A -> B -> C Is0Functor0: Is0Functor (uncurry F)
Is0Bifunctor F
A, B, C: Type H: IsGraph A H0: Is01Cat A H1: IsGraph B H2: Is01Cat B H3: IsGraph C F: A -> B -> C Is0Functor0: Is0Functor (uncurry F)
Is0Bifunctor F
A, B, C: Type H: IsGraph A H0: Is01Cat A H1: IsGraph B H2: Is01Cat B H3: IsGraph C F: A -> B -> C Is0Functor0: Is0Functor (uncurry F)
Is0Functor (uncurry F)
A, B, C: Type H: IsGraph A H0: Is01Cat A H1: IsGraph B H2: Is01Cat B H3: IsGraph C F: A -> B -> C Is0Functor0: Is0Functor (uncurry F)
foralla : A, Is0Functor (F a)
A, B, C: Type H: IsGraph A H0: Is01Cat A H1: IsGraph B H2: Is01Cat B H3: IsGraph C F: A -> B -> C Is0Functor0: Is0Functor (uncurry F)
forallb : B, Is0Functor (flip F b)
A, B, C: Type H: IsGraph A H0: Is01Cat A H1: IsGraph B H2: Is01Cat B H3: IsGraph C F: A -> B -> C Is0Functor0: Is0Functor (uncurry F)
Is0Functor (uncurry F)
exact _.
A, B, C: Type H: IsGraph A H0: Is01Cat A H1: IsGraph B H2: Is01Cat B H3: IsGraph C F: A -> B -> C Is0Functor0: Is0Functor (uncurry F)
A, B, C: Type H: IsGraph A H0: IsGraph B H1: IsGraph C H2: Is01Cat C F: A -> B -> C H3: foralla : A, Is0Functor (F a) H4: forallb : B, Is0Functor (flip F b)
Is0Bifunctor F
A, B, C: Type H: IsGraph A H0: IsGraph B H1: IsGraph C H2: Is01Cat C F: A -> B -> C H3: foralla : A, Is0Functor (F a) H4: forallb : B, Is0Functor (flip F b)
Is0Bifunctor F
(* The first condition follows from [is0functor_prod_is0functor]. *)rapply Build_Is0Bifunctor.Defined.(** *** 1-functorial action *)(** [fmap] in the first argument. *)Definitionfmap10 {ABC : Type} `{IsGraph A, IsGraph B, IsGraph C}
(F : A -> B -> C) `{!Is0Bifunctor F} {a0 a1 : A} (f : a0 $-> a1) (b : B)
: (F a0 b) $-> (F a1 b)
:= fmap (flip F b) f.(** [fmap] in the second argument. *)Definitionfmap01 {ABC : Type} `{IsGraph A, IsGraph B, IsGraph C}
(F : A -> B -> C) `{!Is0Bifunctor F} (a : A) {b0 b1 : B} (g : b0 $-> b1)
: F a b0 $-> F a b1
:= fmap (F a) g.(** [fmap] in both arguments. *)Definitionfmap11 {ABC : Type} `{IsGraph A, IsGraph B, IsGraph C}
(F : A -> B -> C) `{!Is0Bifunctor F} {a0 a1 : A} (f : a0 $-> a1)
{b0 b1 : B} (g : b0 $-> b1)
: F a0 b0 $-> F a1 b1
:= fmap_pair (uncurry F) f g.(** As with [Is0Bifunctor], we store redundant information. In addition, we store the proofs that they are consistent with each other. *)ClassIs1Bifunctor {ABC : Type}
`{Is1Cat A, Is1Cat B, Is1Cat C} (F : A -> B -> C) `{!Is0Bifunctor F} := {
is1functor_bifunctor_uncurried :: Is1Functor (uncurry F);
is1functor01_bifunctor :: foralla, Is1Functor (F a);
is1functor10_bifunctor :: forallb, Is1Functor (flip F b);
fmap11_is_fmap01_fmap10 {a0 a1} (f : a0 $-> a1) {b0 b1} (g : b0 $-> b1)
: fmap11 F f g $== fmap01 F a1 g $o fmap10 F f b0;
fmap11_is_fmap10_fmap01 {a0 a1} (f : a0 $-> a1) {b0 b1} (g : b0 $-> b1)
: fmap11 F f g $== fmap10 F f b1 $o fmap01 F a0 g;
}.Arguments Is1Bifunctor {A B C _ _ _ _ _ _ _ _ _ _ _ _} F {Is0Bifunctor} : rename.Arguments Build_Is1Bifunctor {A B C _ _ _ _ _ _ _ _ _ _ _ _} F {_} _ _ _ _ _.Arguments fmap11_is_fmap01_fmap10 {A B C _ _ _ _ _ _ _ _ _ _ _ _} F
{Is0Bifunctor Is1Bifunctor} {a0 a1} f {b0 b1} g : rename.Arguments fmap11_is_fmap10_fmap01 {A B C _ _ _ _ _ _ _ _ _ _ _ _} F
{Is0Bifunctor Is1Bifunctor} {a0 a1} f {b0 b1} g : rename.(** We again provide two alternate constructors. *)
A, B, C: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A IsGraph1: IsGraph B Is2Graph1: Is2Graph B Is01Cat1: Is01Cat B H0: Is1Cat B IsGraph2: IsGraph C Is2Graph2: Is2Graph C Is01Cat2: Is01Cat C H1: Is1Cat C F: A -> B -> C Is0Functor0: Is0Functor (uncurry F) Is1Functor0: Is1Functor (uncurry F)
Is1Bifunctor F
A, B, C: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A IsGraph1: IsGraph B Is2Graph1: Is2Graph B Is01Cat1: Is01Cat B H0: Is1Cat B IsGraph2: IsGraph C Is2Graph2: Is2Graph C Is01Cat2: Is01Cat C H1: Is1Cat C F: A -> B -> C Is0Functor0: Is0Functor (uncurry F) Is1Functor0: Is1Functor (uncurry F)
Is1Bifunctor F
A, B, C: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A IsGraph1: IsGraph B Is2Graph1: Is2Graph B Is01Cat1: Is01Cat B H0: Is1Cat B IsGraph2: IsGraph C Is2Graph2: Is2Graph C Is01Cat2: Is01Cat C H1: Is1Cat C F: A -> B -> C Is0Functor0: Is0Functor (uncurry F) Is1Functor0: Is1Functor (uncurry F)
Is1Functor (uncurry F)
A, B, C: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A IsGraph1: IsGraph B Is2Graph1: Is2Graph B Is01Cat1: Is01Cat B H0: Is1Cat B IsGraph2: IsGraph C Is2Graph2: Is2Graph C Is01Cat2: Is01Cat C H1: Is1Cat C F: A -> B -> C Is0Functor0: Is0Functor (uncurry F) Is1Functor0: Is1Functor (uncurry F)
foralla : A, Is1Functor (F a)
A, B, C: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A IsGraph1: IsGraph B Is2Graph1: Is2Graph B Is01Cat1: Is01Cat B H0: Is1Cat B IsGraph2: IsGraph C Is2Graph2: Is2Graph C Is01Cat2: Is01Cat C H1: Is1Cat C F: A -> B -> C Is0Functor0: Is0Functor (uncurry F) Is1Functor0: Is1Functor (uncurry F)
forallb : B, Is1Functor (flip F b)
A, B, C: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A IsGraph1: IsGraph B Is2Graph1: Is2Graph B Is01Cat1: Is01Cat B H0: Is1Cat B IsGraph2: IsGraph C Is2Graph2: Is2Graph C Is01Cat2: Is01Cat C H1: Is1Cat C F: A -> B -> C Is0Functor0: Is0Functor (uncurry F) Is1Functor0: Is1Functor (uncurry F)
forall (a0a1 : A) (f : a0 $-> a1)
(b0b1 : B) (g : b0 $-> b1),
fmap11 F f g $== fmap01 F a1 g $o fmap10 F f b0
A, B, C: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A IsGraph1: IsGraph B Is2Graph1: Is2Graph B Is01Cat1: Is01Cat B H0: Is1Cat B IsGraph2: IsGraph C Is2Graph2: Is2Graph C Is01Cat2: Is01Cat C H1: Is1Cat C F: A -> B -> C Is0Functor0: Is0Functor (uncurry F) Is1Functor0: Is1Functor (uncurry F)
forall (a0a1 : A) (f : a0 $-> a1)
(b0b1 : B) (g : b0 $-> b1),
fmap11 F f g $== fmap10 F f b1 $o fmap01 F a0 g
A, B, C: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A IsGraph1: IsGraph B Is2Graph1: Is2Graph B Is01Cat1: Is01Cat B H0: Is1Cat B IsGraph2: IsGraph C Is2Graph2: Is2Graph C Is01Cat2: Is01Cat C H1: Is1Cat C F: A -> B -> C Is0Functor0: Is0Functor (uncurry F) Is1Functor0: Is1Functor (uncurry F)
Is1Functor (uncurry F)
exact _.
A, B, C: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A IsGraph1: IsGraph B Is2Graph1: Is2Graph B Is01Cat1: Is01Cat B H0: Is1Cat B IsGraph2: IsGraph C Is2Graph2: Is2Graph C Is01Cat2: Is01Cat C H1: Is1Cat C F: A -> B -> C Is0Functor0: Is0Functor (uncurry F) Is1Functor0: Is1Functor (uncurry F)
A, B, C: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A IsGraph1: IsGraph B Is2Graph1: Is2Graph B Is01Cat1: Is01Cat B H0: Is1Cat B IsGraph2: IsGraph C Is2Graph2: Is2Graph C Is01Cat2: Is01Cat C H1: Is1Cat C F: A -> B -> C Is0Functor0: Is0Functor (uncurry F) Is1Functor0: Is1Functor (uncurry F)
A, B, C: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A IsGraph1: IsGraph B Is2Graph1: Is2Graph B Is01Cat1: Is01Cat B H0: Is1Cat B IsGraph2: IsGraph C Is2Graph2: Is2Graph C Is01Cat2: Is01Cat C H1: Is1Cat C F: A -> B -> C Is0Functor0: Is0Functor (uncurry F) Is1Functor0: Is1Functor (uncurry F)
forall (a0a1 : A) (f : a0 $-> a1)
(b0b1 : B) (g : b0 $-> b1),
fmap11 F f g $== fmap01 F a1 g $o fmap10 F f b0
A, B, C: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A IsGraph1: IsGraph B Is2Graph1: Is2Graph B Is01Cat1: Is01Cat B H0: Is1Cat B IsGraph2: IsGraph C Is2Graph2: Is2Graph C Is01Cat2: Is01Cat C H1: Is1Cat C F: A -> B -> C Is0Functor0: Is0Functor (uncurry F) Is1Functor0: Is1Functor (uncurry F) a0, a1: A f: a0 $-> a1 b0, b1: B g: b0 $-> b1
fmap11 F f g $== fmap01 F a1 g $o fmap10 F f b0
A, B, C: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A IsGraph1: IsGraph B Is2Graph1: Is2Graph B Is01Cat1: Is01Cat B H0: Is1Cat B IsGraph2: IsGraph C Is2Graph2: Is2Graph C Is01Cat2: Is01Cat C H1: Is1Cat C F: A -> B -> C Is0Functor0: Is0Functor (uncurry F) Is1Functor0: Is1Functor (uncurry F) a0, a1: A f: a0 $-> a1 b0, b1: B g: b0 $-> b1
fmap_pair (uncurry F) (Id a1 $o f) (g $o Id b0) $->
fmap11 F f g
A, B, C: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A IsGraph1: IsGraph B Is2Graph1: Is2Graph B Is01Cat1: Is01Cat B H0: Is1Cat B IsGraph2: IsGraph C Is2Graph2: Is2Graph C Is01Cat2: Is01Cat C H1: Is1Cat C F: A -> B -> C Is0Functor0: Is0Functor (uncurry F) Is1Functor0: Is1Functor (uncurry F)
forall (a0a1 : A) (f : a0 $-> a1)
(b0b1 : B) (g : b0 $-> b1),
fmap11 F f g $== fmap10 F f b1 $o fmap01 F a0 g
A, B, C: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A IsGraph1: IsGraph B Is2Graph1: Is2Graph B Is01Cat1: Is01Cat B H0: Is1Cat B IsGraph2: IsGraph C Is2Graph2: Is2Graph C Is01Cat2: Is01Cat C H1: Is1Cat C F: A -> B -> C Is0Functor0: Is0Functor (uncurry F) Is1Functor0: Is1Functor (uncurry F) a0, a1: A f: a0 $-> a1 b0, b1: B g: b0 $-> b1
fmap11 F f g $== fmap10 F f b1 $o fmap01 F a0 g
A, B, C: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A IsGraph1: IsGraph B Is2Graph1: Is2Graph B Is01Cat1: Is01Cat B H0: Is1Cat B IsGraph2: IsGraph C Is2Graph2: Is2Graph C Is01Cat2: Is01Cat C H1: Is1Cat C F: A -> B -> C Is0Functor0: Is0Functor (uncurry F) Is1Functor0: Is1Functor (uncurry F) a0, a1: A f: a0 $-> a1 b0, b1: B g: b0 $-> b1
fmap_pair (uncurry F) (f $o Id a0) (Id b1 $o g) $->
fmap11 F f g
A, B, C: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A IsGraph1: IsGraph B Is2Graph1: Is2Graph B Is01Cat1: Is01Cat B H0: Is1Cat B IsGraph2: IsGraph C Is2Graph2: Is2Graph C Is01Cat2: Is01Cat C H1: Is1Cat C F: A -> B -> C H2: foralla : A, Is0Functor (F a) H3: forallb : B, Is0Functor (flip F b) Is0Bifunctor_F:= Build_Is0Bifunctor'' F: Is0Bifunctor F H4: foralla : A, Is1Functor (F a) H5: forallb : B, Is1Functor (flip F b) bifunctor_coh: forall (a0a1 : A) (f : a0 $-> a1)
(b0b1 : B) (g : b0 $-> b1),
fmap01 F a1 g $o fmap10 F f b0 $==
fmap10 F f b1 $o fmap01 F a0 g
Is1Bifunctor F
A, B, C: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A IsGraph1: IsGraph B Is2Graph1: Is2Graph B Is01Cat1: Is01Cat B H0: Is1Cat B IsGraph2: IsGraph C Is2Graph2: Is2Graph C Is01Cat2: Is01Cat C H1: Is1Cat C F: A -> B -> C H2: foralla : A, Is0Functor (F a) H3: forallb : B, Is0Functor (flip F b) Is0Bifunctor_F:= Build_Is0Bifunctor'' F: Is0Bifunctor F H4: foralla : A, Is1Functor (F a) H5: forallb : B, Is1Functor (flip F b) bifunctor_coh: forall (a0a1 : A) (f : a0 $-> a1)
(b0b1 : B) (g : b0 $-> b1),
fmap01 F a1 g $o fmap10 F f b0 $==
fmap10 F f b1 $o fmap01 F a0 g
Is1Bifunctor F
A, B, C: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A IsGraph1: IsGraph B Is2Graph1: Is2Graph B Is01Cat1: Is01Cat B H0: Is1Cat B IsGraph2: IsGraph C Is2Graph2: Is2Graph C Is01Cat2: Is01Cat C H1: Is1Cat C F: A -> B -> C H2: foralla : A, Is0Functor (F a) H3: forallb : B, Is0Functor (flip F b) Is0Bifunctor_F:= Build_Is0Bifunctor'' F: Is0Bifunctor F H4: foralla : A, Is1Functor (F a) H5: forallb : B, Is1Functor (flip F b) bifunctor_coh: forall (a0a1 : A) (f : a0 $-> a1)
(b0b1 : B) (g : b0 $-> b1),
fmap01 F a1 g $o fmap10 F f b0 $==
fmap10 F f b1 $o fmap01 F a0 g
Is1Functor (uncurry F)
A, B, C: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A IsGraph1: IsGraph B Is2Graph1: Is2Graph B Is01Cat1: Is01Cat B H0: Is1Cat B IsGraph2: IsGraph C Is2Graph2: Is2Graph C Is01Cat2: Is01Cat C H1: Is1Cat C F: A -> B -> C H2: foralla : A, Is0Functor (F a) H3: forallb : B, Is0Functor (flip F b) Is0Bifunctor_F:= Build_Is0Bifunctor'' F: Is0Bifunctor F H4: foralla : A, Is1Functor (F a) H5: forallb : B, Is1Functor (flip F b) bifunctor_coh: forall (a0a1 : A) (f : a0 $-> a1)
(b0b1 : B) (g : b0 $-> b1),
fmap01 F a1 g $o fmap10 F f b0 $==
fmap10 F f b1 $o fmap01 F a0 g
foralla : A, Is1Functor (F a)
A, B, C: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A IsGraph1: IsGraph B Is2Graph1: Is2Graph B Is01Cat1: Is01Cat B H0: Is1Cat B IsGraph2: IsGraph C Is2Graph2: Is2Graph C Is01Cat2: Is01Cat C H1: Is1Cat C F: A -> B -> C H2: foralla : A, Is0Functor (F a) H3: forallb : B, Is0Functor (flip F b) Is0Bifunctor_F:= Build_Is0Bifunctor'' F: Is0Bifunctor F H4: foralla : A, Is1Functor (F a) H5: forallb : B, Is1Functor (flip F b) bifunctor_coh: forall (a0a1 : A) (f : a0 $-> a1)
(b0b1 : B) (g : b0 $-> b1),
fmap01 F a1 g $o fmap10 F f b0 $==
fmap10 F f b1 $o fmap01 F a0 g
forallb : B, Is1Functor (flip F b)
A, B, C: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A IsGraph1: IsGraph B Is2Graph1: Is2Graph B Is01Cat1: Is01Cat B H0: Is1Cat B IsGraph2: IsGraph C Is2Graph2: Is2Graph C Is01Cat2: Is01Cat C H1: Is1Cat C F: A -> B -> C H2: foralla : A, Is0Functor (F a) H3: forallb : B, Is0Functor (flip F b) Is0Bifunctor_F:= Build_Is0Bifunctor'' F: Is0Bifunctor F H4: foralla : A, Is1Functor (F a) H5: forallb : B, Is1Functor (flip F b) bifunctor_coh: forall (a0a1 : A) (f : a0 $-> a1)
(b0b1 : B) (g : b0 $-> b1),
fmap01 F a1 g $o fmap10 F f b0 $==
fmap10 F f b1 $o fmap01 F a0 g
forall (a0a1 : A) (f : a0 $-> a1)
(b0b1 : B) (g : b0 $-> b1),
fmap11 F f g $== fmap01 F a1 g $o fmap10 F f b0
A, B, C: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A IsGraph1: IsGraph B Is2Graph1: Is2Graph B Is01Cat1: Is01Cat B H0: Is1Cat B IsGraph2: IsGraph C Is2Graph2: Is2Graph C Is01Cat2: Is01Cat C H1: Is1Cat C F: A -> B -> C H2: foralla : A, Is0Functor (F a) H3: forallb : B, Is0Functor (flip F b) Is0Bifunctor_F:= Build_Is0Bifunctor'' F: Is0Bifunctor F H4: foralla : A, Is1Functor (F a) H5: forallb : B, Is1Functor (flip F b) bifunctor_coh: forall (a0a1 : A) (f : a0 $-> a1)
(b0b1 : B) (g : b0 $-> b1),
fmap01 F a1 g $o fmap10 F f b0 $==
fmap10 F f b1 $o fmap01 F a0 g
forall (a0a1 : A) (f : a0 $-> a1)
(b0b1 : B) (g : b0 $-> b1),
fmap11 F f g $== fmap10 F f b1 $o fmap01 F a0 g
A, B, C: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A IsGraph1: IsGraph B Is2Graph1: Is2Graph B Is01Cat1: Is01Cat B H0: Is1Cat B IsGraph2: IsGraph C Is2Graph2: Is2Graph C Is01Cat2: Is01Cat C H1: Is1Cat C F: A -> B -> C H2: foralla : A, Is0Functor (F a) H3: forallb : B, Is0Functor (flip F b) Is0Bifunctor_F:= Build_Is0Bifunctor'' F: Is0Bifunctor F H4: foralla : A, Is1Functor (F a) H5: forallb : B, Is1Functor (flip F b) bifunctor_coh: forall (a0a1 : A) (f : a0 $-> a1)
(b0b1 : B) (g : b0 $-> b1),
fmap01 F a1 g $o fmap10 F f b0 $==
fmap10 F f b1 $o fmap01 F a0 g
Is1Functor (uncurry F)
exact _. (* [is1functor_prod_is1functor]. *)
A, B, C: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A IsGraph1: IsGraph B Is2Graph1: Is2Graph B Is01Cat1: Is01Cat B H0: Is1Cat B IsGraph2: IsGraph C Is2Graph2: Is2Graph C Is01Cat2: Is01Cat C H1: Is1Cat C F: A -> B -> C H2: foralla : A, Is0Functor (F a) H3: forallb : B, Is0Functor (flip F b) Is0Bifunctor_F:= Build_Is0Bifunctor'' F: Is0Bifunctor F H4: foralla : A, Is1Functor (F a) H5: forallb : B, Is1Functor (flip F b) bifunctor_coh: forall (a0a1 : A) (f : a0 $-> a1)
(b0b1 : B) (g : b0 $-> b1),
fmap01 F a1 g $o fmap10 F f b0 $==
fmap10 F f b1 $o fmap01 F a0 g
foralla : A, Is1Functor (F a)
exact _.
A, B, C: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A IsGraph1: IsGraph B Is2Graph1: Is2Graph B Is01Cat1: Is01Cat B H0: Is1Cat B IsGraph2: IsGraph C Is2Graph2: Is2Graph C Is01Cat2: Is01Cat C H1: Is1Cat C F: A -> B -> C H2: foralla : A, Is0Functor (F a) H3: forallb : B, Is0Functor (flip F b) Is0Bifunctor_F:= Build_Is0Bifunctor'' F: Is0Bifunctor F H4: foralla : A, Is1Functor (F a) H5: forallb : B, Is1Functor (flip F b) bifunctor_coh: forall (a0a1 : A) (f : a0 $-> a1)
(b0b1 : B) (g : b0 $-> b1),
fmap01 F a1 g $o fmap10 F f b0 $==
fmap10 F f b1 $o fmap01 F a0 g
forallb : B, Is1Functor (flip F b)
exact _.
A, B, C: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A IsGraph1: IsGraph B Is2Graph1: Is2Graph B Is01Cat1: Is01Cat B H0: Is1Cat B IsGraph2: IsGraph C Is2Graph2: Is2Graph C Is01Cat2: Is01Cat C H1: Is1Cat C F: A -> B -> C H2: foralla : A, Is0Functor (F a) H3: forallb : B, Is0Functor (flip F b) Is0Bifunctor_F:= Build_Is0Bifunctor'' F: Is0Bifunctor F H4: foralla : A, Is1Functor (F a) H5: forallb : B, Is1Functor (flip F b) bifunctor_coh: forall (a0a1 : A) (f : a0 $-> a1)
(b0b1 : B) (g : b0 $-> b1),
fmap01 F a1 g $o fmap10 F f b0 $==
fmap10 F f b1 $o fmap01 F a0 g
forall (a0a1 : A) (f : a0 $-> a1)
(b0b1 : B) (g : b0 $-> b1),
fmap11 F f g $== fmap01 F a1 g $o fmap10 F f b0
A, B, C: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A IsGraph1: IsGraph B Is2Graph1: Is2Graph B Is01Cat1: Is01Cat B H0: Is1Cat B IsGraph2: IsGraph C Is2Graph2: Is2Graph C Is01Cat2: Is01Cat C H1: Is1Cat C F: A -> B -> C H2: foralla : A, Is0Functor (F a) H3: forallb : B, Is0Functor (flip F b) Is0Bifunctor_F:= Build_Is0Bifunctor'' F: Is0Bifunctor F H4: foralla : A, Is1Functor (F a) H5: forallb : B, Is1Functor (flip F b) bifunctor_coh: forall (a0a1 : A) (f : a0 $-> a1)
(b0b1 : B) (g : b0 $-> b1),
fmap01 F a1 g $o fmap10 F f b0 $==
fmap10 F f b1 $o fmap01 F a0 g a0, a1: A f: a0 $-> a1 b0, b1: B g: b0 $-> b1
fmap11 F f g $== fmap01 F a1 g $o fmap10 F f b0
exact (bifunctor_coh a0 a1 f b0 b1 g)^$.
A, B, C: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A IsGraph1: IsGraph B Is2Graph1: Is2Graph B Is01Cat1: Is01Cat B H0: Is1Cat B IsGraph2: IsGraph C Is2Graph2: Is2Graph C Is01Cat2: Is01Cat C H1: Is1Cat C F: A -> B -> C H2: foralla : A, Is0Functor (F a) H3: forallb : B, Is0Functor (flip F b) Is0Bifunctor_F:= Build_Is0Bifunctor'' F: Is0Bifunctor F H4: foralla : A, Is1Functor (F a) H5: forallb : B, Is1Functor (flip F b) bifunctor_coh: forall (a0a1 : A) (f : a0 $-> a1)
(b0b1 : B) (g : b0 $-> b1),
fmap01 F a1 g $o fmap10 F f b0 $==
fmap10 F f b1 $o fmap01 F a0 g
forall (a0a1 : A) (f : a0 $-> a1)
(b0b1 : B) (g : b0 $-> b1),
fmap11 F f g $== fmap10 F f b1 $o fmap01 F a0 g
reflexivity.Defined.(** ** Bifunctor lemmas *)(** *** Coherence *)Definitionbifunctor_coh {ABC : Type}
(F : A -> B -> C) `{Is1Bifunctor A B C F}
{a0 a1 : A} (f : a0 $-> a1) {b0 b1 : B} (g : b0 $-> b1)
: fmap01 F a1 g $o fmap10 F f b0 $== fmap10 F f b1 $o fmap01 F a0 g
:= (fmap11_is_fmap01_fmap10 _ _ _)^$ $@ fmap11_is_fmap10_fmap01 _ _ _.(** 2-functorial action *)Definitionfmap02 {ABC : Type} `{Is1Cat A, Is1Cat B, Is1Cat C}
(F : A -> B -> C) `{!Is0Bifunctor F, !Is1Bifunctor F}
(a : A) {b0 b1 : B} {g g' : b0 $-> b1} (q : g $== g')
: fmap01 F a g $== fmap01 F a g'
:= fmap2 (F a) q.Definitionfmap12 {ABC : Type} `{Is1Cat A, Is1Cat B, Is1Cat C}
(F : A -> B -> C) `{!Is0Bifunctor F, !Is1Bifunctor F}
{a0 a1 : A} (f : a0 $-> a1) {b0 b1 : B} {g g' : b0 $-> b1} (q : g $== g')
: fmap11 F f g $== fmap11 F f g'
:= fmap2_pair (uncurry F) (Id _) q.Definitionfmap20 {ABC : Type} `{Is1Cat A, Is1Cat B, Is1Cat C}
(F : A -> B -> C) `{!Is0Bifunctor F, !Is1Bifunctor F}
{a0 a1 : A} {f f' : a0 $-> a1} (p : f $== f') (b : B)
: fmap10 F f b $== fmap10 F f' b
:= fmap2 (flip F b) p.Definitionfmap21 {ABC : Type} `{Is1Cat A, Is1Cat B, Is1Cat C}
(F : A -> B -> C) `{!Is0Bifunctor F, !Is1Bifunctor F}
{a0 a1 : A} {f f' : a0 $-> a1} (p : f $== f') {b0 b1 : B} (g : b0 $-> b1)
: fmap11 F f g $== fmap11 F f' g
:= fmap2_pair (uncurry F) p (Id _).Definitionfmap22 {ABC : Type} `{Is1Cat A, Is1Cat B, Is1Cat C}
(F : A -> B -> C) `{!Is0Bifunctor F, !Is1Bifunctor F}
{a0 a1 : A} {f f' : a0 $-> a1} (p : f $== f')
{b0 b1 : B} {g g' : b0 $-> b1} (q : g $== g')
: fmap11 F f g $== fmap11 F f' g'
:= fmap2_pair (uncurry F) p q.(** *** Identity preservation *)Definitionfmap01_id {ABC : Type} `{Is1Cat A, Is1Cat B, Is1Cat C}
(F : A -> B -> C) `{!Is0Bifunctor F, !Is1Bifunctor F} (a : A) (b : B)
: fmap01 F a (Id b) $== Id (F a b)
:= fmap_id (F a) b.Definitionfmap10_id {ABC : Type} `{Is1Cat A, Is1Cat B, Is1Cat C}
(F : A -> B -> C) `{!Is0Bifunctor F, !Is1Bifunctor F} (a : A) (b : B)
: fmap10 F (Id a) b $== Id (F a b)
:= fmap_id (flip F b) a.Definitionfmap11_id {ABC : Type} `{Is1Cat A, Is1Cat B, Is1Cat C}
(F : A -> B -> C) `{!Is0Bifunctor F, !Is1Bifunctor F} (a : A) (b : B)
: fmap11 F (Id a) (Id b) $== Id (F a b)
:= fmap_id (uncurry F) (a, b).(** [fmap11] with left map the identity gives [fmap01]. *)Definitionfmap01_is_fmap11 {ABC : Type} `{Is1Cat A, Is1Cat B, Is1Cat C}
(F : A -> B -> C) `{!Is0Bifunctor F, !Is1Bifunctor F}
(a : A) {b0 b1 : B} (g : b0 $-> b1)
: fmap11 F (Id a) g $== fmap01 F a g
:= fmap11_is_fmap01_fmap10 _ _ _ $@ (_ $@L fmap10_id _ _ _) $@ cat_idr _.(** [fmap11] with right map the identity gives [fmap10]. *)Definitionfmap10_is_fmap11 {ABC : Type} `{Is1Cat A, Is1Cat B, Is1Cat C}
(F : A -> B -> C) `{!Is0Bifunctor F, !Is1Bifunctor F}
{a0 a1 : A} (f : a0 $-> a1) (b : B)
: fmap11 F f (Id b) $== fmap10 F f b
:= fmap11_is_fmap01_fmap10 _ _ _ $@ (fmap01_id _ _ _ $@R _) $@ cat_idl _.(** *** Composition preservation *)Definitionfmap01_comp {ABC : Type} `{Is1Cat A, Is1Cat B, Is1Cat C}
(F : A -> B -> C) `{!Is0Bifunctor F, !Is1Bifunctor F}
(a : A) {b0 b1 b2 : B} (g : b1 $-> b2) (f : b0 $-> b1)
: fmap01 F a (g $o f) $== fmap01 F a g $o fmap01 F a f
:= fmap_comp (F a) f g.Definitionfmap10_comp {ABC : Type} `{Is1Cat A, Is1Cat B, Is1Cat C}
(F : A -> B -> C) `{!Is0Bifunctor F, !Is1Bifunctor F}
{a0 a1 a2 : A} (g : a1 $-> a2) (f : a0 $-> a1) (b : B)
: fmap10 F (g $o f) b $== fmap10 F g b $o fmap10 F f b
:= fmap_comp (flip F b) f g.Definitionfmap11_comp {ABC : Type} `{Is1Cat A, Is1Cat B, Is1Cat C}
(F : A -> B -> C) `{!Is0Bifunctor F, !Is1Bifunctor F}
{a0 a1 a2 : A} (g : a1 $-> a2) (f : a0 $-> a1)
{b0 b1 b2 : B} (k : b1 $-> b2) (h : b0 $-> b1)
: fmap11 F (g $o f) (k $o h) $== fmap11 F g k $o fmap11 F f h
:= fmap_pair_comp (uncurry F) _ _ _ _.(** *** Equivalence preservation *)Global Instanceiemap10 {ABC : Type} `{HasEquivs A, Is1Cat B, HasEquivs C}
(F : A -> B -> C) `{!Is0Bifunctor F, !Is1Bifunctor F}
{a0 a1 : A} (f : a0 $<~> a1) (b : B)
: CatIsEquiv (fmap10 F f b)
:= iemap (flip F b) f.Global Instanceiemap01 {ABC : Type} `{Is1Cat A, HasEquivs B, HasEquivs C}
(F : A -> B -> C) `{!Is0Bifunctor F, !Is1Bifunctor F}
(a : A) {b0 b1 : B} (g : b0 $<~> b1)
: CatIsEquiv (fmap01 F a g)
:= iemap (F a) g.Global Instanceiemap11 {ABC : Type} `{HasEquivs A, HasEquivs B, HasEquivs C}
(F : A -> B -> C) `{!Is0Bifunctor F, !Is1Bifunctor F}
{a0 a1 : A} (f : a0 $<~> a1) {b0 b1 : B} (g : b0 $<~> b1)
: CatIsEquiv (fmap11 F f g)
:= iemap (uncurry F) (a := (a0, b0)) (b := (_, _)) (f, g).Definitionemap10 {ABC : Type} `{HasEquivs A, Is1Cat B, HasEquivs C}
(F : A -> B -> C) `{!Is0Bifunctor F, !Is1Bifunctor F}
{a0 a1 : A} (f : a0 $<~> a1) (b : B)
: F a0 b $<~> F a1 b
:= Build_CatEquiv (fmap10 F f b).Definitionemap01 {ABC : Type} `{Is1Cat A, HasEquivs B, HasEquivs C}
(F : A -> B -> C) `{!Is0Bifunctor F, !Is1Bifunctor F}
(a : A) {b0 b1 : B} (g : b0 $<~> b1)
: F a b0 $<~> F a b1
:= Build_CatEquiv (fmap01 F a g).Definitionemap11 {ABC : Type} `{HasEquivs A, HasEquivs B, HasEquivs C}
(F : A -> B -> C) `{!Is0Bifunctor F, !Is1Bifunctor F}
{a0 a1 : A} (f : a0 $<~> a1) {b0 b1 : B} (g : b0 $<~> b1)
: F a0 b0 $<~> F a1 b1
:= Build_CatEquiv (fmap11 F f g).(** ** Flipping bifunctors *)
A, B, C: Type F: A -> B -> C H: IsGraph A H0: Is01Cat A H1: IsGraph B H2: Is01Cat B H3: IsGraph C H4: Is01Cat C Is0Bifunctor0: Is0Bifunctor F
Is0Bifunctor (flip F)
A, B, C: Type F: A -> B -> C H: IsGraph A H0: Is01Cat A H1: IsGraph B H2: Is01Cat B H3: IsGraph C H4: Is01Cat C Is0Bifunctor0: Is0Bifunctor F
Is0Bifunctor (flip F)
A, B, C: Type F: A -> B -> C H: IsGraph A H0: Is01Cat A H1: IsGraph B H2: Is01Cat B H3: IsGraph C H4: Is01Cat C Is0Bifunctor0: Is0Bifunctor F
Is0Functor (uncurry (flip F))
A, B, C: Type F: A -> B -> C H: IsGraph A H0: Is01Cat A H1: IsGraph B H2: Is01Cat B H3: IsGraph C H4: Is01Cat C Is0Bifunctor0: Is0Bifunctor F
foralla : B, Is0Functor (flip F a)
A, B, C: Type F: A -> B -> C H: IsGraph A H0: Is01Cat A H1: IsGraph B H2: Is01Cat B H3: IsGraph C H4: Is01Cat C Is0Bifunctor0: Is0Bifunctor F
forallb : A, Is0Functor (flip (flip F) b)
A, B, C: Type F: A -> B -> C H: IsGraph A H0: Is01Cat A H1: IsGraph B H2: Is01Cat B H3: IsGraph C H4: Is01Cat C Is0Bifunctor0: Is0Bifunctor F
Is0Functor (uncurry (flip F))
A, B, C: Type F: A -> B -> C H: IsGraph A H0: Is01Cat A H1: IsGraph B H2: Is01Cat B H3: IsGraph C H4: Is01Cat C Is0Bifunctor0: Is0Bifunctor F
Is0Functor (uncurry F o equiv_prod_symm B A)
exact _.
A, B, C: Type F: A -> B -> C H: IsGraph A H0: Is01Cat A H1: IsGraph B H2: Is01Cat B H3: IsGraph C H4: Is01Cat C Is0Bifunctor0: Is0Bifunctor F
foralla : B, Is0Functor (flip F a)
exact _.
A, B, C: Type F: A -> B -> C H: IsGraph A H0: Is01Cat A H1: IsGraph B H2: Is01Cat B H3: IsGraph C H4: Is01Cat C Is0Bifunctor0: Is0Bifunctor F
A, B, C: Type F: A -> B -> C IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H0: Is1Cat A IsGraph1: IsGraph B Is2Graph1: Is2Graph B Is01Cat1: Is01Cat B H1: Is1Cat B IsGraph2: IsGraph C Is2Graph2: Is2Graph C Is01Cat2: Is01Cat C H2: Is1Cat C Is0Bifunctor0: Is0Bifunctor F H: Is1Bifunctor F
Is1Bifunctor (flip F)
A, B, C: Type F: A -> B -> C IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H0: Is1Cat A IsGraph1: IsGraph B Is2Graph1: Is2Graph B Is01Cat1: Is01Cat B H1: Is1Cat B IsGraph2: IsGraph C Is2Graph2: Is2Graph C Is01Cat2: Is01Cat C H2: Is1Cat C Is0Bifunctor0: Is0Bifunctor F H: Is1Bifunctor F
Is1Bifunctor (flip F)
A, B, C: Type F: A -> B -> C IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H0: Is1Cat A IsGraph1: IsGraph B Is2Graph1: Is2Graph B Is01Cat1: Is01Cat B H1: Is1Cat B IsGraph2: IsGraph C Is2Graph2: Is2Graph C Is01Cat2: Is01Cat C H2: Is1Cat C Is0Bifunctor0: Is0Bifunctor F H: Is1Bifunctor F
Is1Functor (uncurry (flip F))
A, B, C: Type F: A -> B -> C IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H0: Is1Cat A IsGraph1: IsGraph B Is2Graph1: Is2Graph B Is01Cat1: Is01Cat B H1: Is1Cat B IsGraph2: IsGraph C Is2Graph2: Is2Graph C Is01Cat2: Is01Cat C H2: Is1Cat C Is0Bifunctor0: Is0Bifunctor F H: Is1Bifunctor F
foralla : B, Is1Functor (flip F a)
A, B, C: Type F: A -> B -> C IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H0: Is1Cat A IsGraph1: IsGraph B Is2Graph1: Is2Graph B Is01Cat1: Is01Cat B H1: Is1Cat B IsGraph2: IsGraph C Is2Graph2: Is2Graph C Is01Cat2: Is01Cat C H2: Is1Cat C Is0Bifunctor0: Is0Bifunctor F H: Is1Bifunctor F
forallb : A, Is1Functor (flip (flip F) b)
A, B, C: Type F: A -> B -> C IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H0: Is1Cat A IsGraph1: IsGraph B Is2Graph1: Is2Graph B Is01Cat1: Is01Cat B H1: Is1Cat B IsGraph2: IsGraph C Is2Graph2: Is2Graph C Is01Cat2: Is01Cat C H2: Is1Cat C Is0Bifunctor0: Is0Bifunctor F H: Is1Bifunctor F
forall (a0a1 : B) (f : a0 $-> a1)
(b0b1 : A) (g : b0 $-> b1),
fmap11 (flip F) f g $==
fmap01 (flip F) a1 g $o fmap10 (flip F) f b0
A, B, C: Type F: A -> B -> C IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H0: Is1Cat A IsGraph1: IsGraph B Is2Graph1: Is2Graph B Is01Cat1: Is01Cat B H1: Is1Cat B IsGraph2: IsGraph C Is2Graph2: Is2Graph C Is01Cat2: Is01Cat C H2: Is1Cat C Is0Bifunctor0: Is0Bifunctor F H: Is1Bifunctor F
forall (a0a1 : B) (f : a0 $-> a1)
(b0b1 : A) (g : b0 $-> b1),
fmap11 (flip F) f g $==
fmap10 (flip F) f b1 $o fmap01 (flip F) a0 g
A, B, C: Type F: A -> B -> C IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H0: Is1Cat A IsGraph1: IsGraph B Is2Graph1: Is2Graph B Is01Cat1: Is01Cat B H1: Is1Cat B IsGraph2: IsGraph C Is2Graph2: Is2Graph C Is01Cat2: Is01Cat C H2: Is1Cat C Is0Bifunctor0: Is0Bifunctor F H: Is1Bifunctor F
Is1Functor (uncurry (flip F))
A, B, C: Type F: A -> B -> C IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H0: Is1Cat A IsGraph1: IsGraph B Is2Graph1: Is2Graph B Is01Cat1: Is01Cat B H1: Is1Cat B IsGraph2: IsGraph C Is2Graph2: Is2Graph C Is01Cat2: Is01Cat C H2: Is1Cat C Is0Bifunctor0: Is0Bifunctor F H: Is1Bifunctor F
Is1Functor (uncurry F o equiv_prod_symm B A)
exact _.
A, B, C: Type F: A -> B -> C IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H0: Is1Cat A IsGraph1: IsGraph B Is2Graph1: Is2Graph B Is01Cat1: Is01Cat B H1: Is1Cat B IsGraph2: IsGraph C Is2Graph2: Is2Graph C Is01Cat2: Is01Cat C H2: Is1Cat C Is0Bifunctor0: Is0Bifunctor F H: Is1Bifunctor F
foralla : B, Is1Functor (flip F a)
exact _.
A, B, C: Type F: A -> B -> C IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H0: Is1Cat A IsGraph1: IsGraph B Is2Graph1: Is2Graph B Is01Cat1: Is01Cat B H1: Is1Cat B IsGraph2: IsGraph C Is2Graph2: Is2Graph C Is01Cat2: Is01Cat C H2: Is1Cat C Is0Bifunctor0: Is0Bifunctor F H: Is1Bifunctor F
forallb : A, Is1Functor (flip (flip F) b)
exact _.
A, B, C: Type F: A -> B -> C IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H0: Is1Cat A IsGraph1: IsGraph B Is2Graph1: Is2Graph B Is01Cat1: Is01Cat B H1: Is1Cat B IsGraph2: IsGraph C Is2Graph2: Is2Graph C Is01Cat2: Is01Cat C H2: Is1Cat C Is0Bifunctor0: Is0Bifunctor F H: Is1Bifunctor F
forall (a0a1 : B) (f : a0 $-> a1)
(b0b1 : A) (g : b0 $-> b1),
fmap11 (flip F) f g $==
fmap01 (flip F) a1 g $o fmap10 (flip F) f b0
A, B, C: Type F: A -> B -> C IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H0: Is1Cat A IsGraph1: IsGraph B Is2Graph1: Is2Graph B Is01Cat1: Is01Cat B H1: Is1Cat B IsGraph2: IsGraph C Is2Graph2: Is2Graph C Is01Cat2: Is01Cat C H2: Is1Cat C Is0Bifunctor0: Is0Bifunctor F H: Is1Bifunctor F b0, b1: B g: b0 $-> b1 a0, a1: A f: a0 $-> a1
fmap11 (flip F) g f $==
fmap01 (flip F) b1 f $o fmap10 (flip F) g a0
exact (fmap11_is_fmap10_fmap01 F f g).
A, B, C: Type F: A -> B -> C IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H0: Is1Cat A IsGraph1: IsGraph B Is2Graph1: Is2Graph B Is01Cat1: Is01Cat B H1: Is1Cat B IsGraph2: IsGraph C Is2Graph2: Is2Graph C Is01Cat2: Is01Cat C H2: Is1Cat C Is0Bifunctor0: Is0Bifunctor F H: Is1Bifunctor F
forall (a0a1 : B) (f : a0 $-> a1)
(b0b1 : A) (g : b0 $-> b1),
fmap11 (flip F) f g $==
fmap10 (flip F) f b1 $o fmap01 (flip F) a0 g
A, B, C: Type F: A -> B -> C IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H0: Is1Cat A IsGraph1: IsGraph B Is2Graph1: Is2Graph B Is01Cat1: Is01Cat B H1: Is1Cat B IsGraph2: IsGraph C Is2Graph2: Is2Graph C Is01Cat2: Is01Cat C H2: Is1Cat C Is0Bifunctor0: Is0Bifunctor F H: Is1Bifunctor F b0, b1: B g: b0 $-> b1 a0, a1: A f: a0 $-> a1
fmap11 (flip F) g f $==
fmap10 (flip F) g a1 $o fmap01 (flip F) b0 f
exact (fmap11_is_fmap01_fmap10 F f g).Defined.Hint Immediate is1bifunctor_flip : typeclass_instances.(** ** Composition of bifunctors *)(** There are 4 different ways to compose a functor with a bifunctor. *)(** Restricting a functor along a bifunctor yields a bifunctor. *)Global Instanceis0bifunctor_postcompose {ABCD : Type}
`{IsGraph A, IsGraph B, IsGraph C, IsGraph D}
(F : A -> B -> C) {bf : Is0Bifunctor F}
(G : C -> D) `{!Is0Functor G}
: Is0Bifunctor (funab => G (F a b))
:= {}.
A, B, C, D: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A IsGraph1: IsGraph B Is2Graph1: Is2Graph B Is01Cat1: Is01Cat B H0: Is1Cat B IsGraph2: IsGraph C Is2Graph2: Is2Graph C Is01Cat2: Is01Cat C H1: Is1Cat C IsGraph3: IsGraph D Is2Graph3: Is2Graph D Is01Cat3: Is01Cat D H2: Is1Cat D F: A -> B -> C G: C -> D Is0Functor0: Is0Functor G Is1Functor0: Is1Functor G Is0Bifunctor0: Is0Bifunctor F bf: Is1Bifunctor F
Is1Bifunctor (fun (a : A) (b : B) => G (F a b))
A, B, C, D: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A IsGraph1: IsGraph B Is2Graph1: Is2Graph B Is01Cat1: Is01Cat B H0: Is1Cat B IsGraph2: IsGraph C Is2Graph2: Is2Graph C Is01Cat2: Is01Cat C H1: Is1Cat C IsGraph3: IsGraph D Is2Graph3: Is2Graph D Is01Cat3: Is01Cat D H2: Is1Cat D F: A -> B -> C G: C -> D Is0Functor0: Is0Functor G Is1Functor0: Is1Functor G Is0Bifunctor0: Is0Bifunctor F bf: Is1Bifunctor F
Is1Bifunctor (fun (a : A) (b : B) => G (F a b))
A, B, C, D: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A IsGraph1: IsGraph B Is2Graph1: Is2Graph B Is01Cat1: Is01Cat B H0: Is1Cat B IsGraph2: IsGraph C Is2Graph2: Is2Graph C Is01Cat2: Is01Cat C H1: Is1Cat C IsGraph3: IsGraph D Is2Graph3: Is2Graph D Is01Cat3: Is01Cat D H2: Is1Cat D F: A -> B -> C G: C -> D Is0Functor0: Is0Functor G Is1Functor0: Is1Functor G Is0Bifunctor0: Is0Bifunctor F bf: Is1Bifunctor F
Is1Functor
(uncurry (fun (a : A) (b : B) => G (F a b)))
A, B, C, D: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A IsGraph1: IsGraph B Is2Graph1: Is2Graph B Is01Cat1: Is01Cat B H0: Is1Cat B IsGraph2: IsGraph C Is2Graph2: Is2Graph C Is01Cat2: Is01Cat C H1: Is1Cat C IsGraph3: IsGraph D Is2Graph3: Is2Graph D Is01Cat3: Is01Cat D H2: Is1Cat D F: A -> B -> C G: C -> D Is0Functor0: Is0Functor G Is1Functor0: Is1Functor G Is0Bifunctor0: Is0Bifunctor F bf: Is1Bifunctor F
foralla : A,
Is1Functor ((fun (a0 : A) (b : B) => G (F a0 b)) a)
A, B, C, D: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A IsGraph1: IsGraph B Is2Graph1: Is2Graph B Is01Cat1: Is01Cat B H0: Is1Cat B IsGraph2: IsGraph C Is2Graph2: Is2Graph C Is01Cat2: Is01Cat C H1: Is1Cat C IsGraph3: IsGraph D Is2Graph3: Is2Graph D Is01Cat3: Is01Cat D H2: Is1Cat D F: A -> B -> C G: C -> D Is0Functor0: Is0Functor G Is1Functor0: Is1Functor G Is0Bifunctor0: Is0Bifunctor F bf: Is1Bifunctor F
forallb : B,
Is1Functor
(flip (fun (a : A) (b0 : B) => G (F a b0)) b)
A, B, C, D: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A IsGraph1: IsGraph B Is2Graph1: Is2Graph B Is01Cat1: Is01Cat B H0: Is1Cat B IsGraph2: IsGraph C Is2Graph2: Is2Graph C Is01Cat2: Is01Cat C H1: Is1Cat C IsGraph3: IsGraph D Is2Graph3: Is2Graph D Is01Cat3: Is01Cat D H2: Is1Cat D F: A -> B -> C G: C -> D Is0Functor0: Is0Functor G Is1Functor0: Is1Functor G Is0Bifunctor0: Is0Bifunctor F bf: Is1Bifunctor F
forall (a0a1 : A) (f : a0 $-> a1)
(b0b1 : B) (g : b0 $-> b1),
fmap11 (fun (a : A) (b : B) => G (F a b)) f g $==
fmap01 (fun (a : A) (b : B) => G (F a b)) a1 g $o
fmap10 (fun (a : A) (b : B) => G (F a b)) f b0
A, B, C, D: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A IsGraph1: IsGraph B Is2Graph1: Is2Graph B Is01Cat1: Is01Cat B H0: Is1Cat B IsGraph2: IsGraph C Is2Graph2: Is2Graph C Is01Cat2: Is01Cat C H1: Is1Cat C IsGraph3: IsGraph D Is2Graph3: Is2Graph D Is01Cat3: Is01Cat D H2: Is1Cat D F: A -> B -> C G: C -> D Is0Functor0: Is0Functor G Is1Functor0: Is1Functor G Is0Bifunctor0: Is0Bifunctor F bf: Is1Bifunctor F
forall (a0a1 : A) (f : a0 $-> a1)
(b0b1 : B) (g : b0 $-> b1),
fmap11 (fun (a : A) (b : B) => G (F a b)) f g $==
fmap10 (fun (a : A) (b : B) => G (F a b)) f b1 $o
fmap01 (fun (a : A) (b : B) => G (F a b)) a0 g
A, B, C, D: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A IsGraph1: IsGraph B Is2Graph1: Is2Graph B Is01Cat1: Is01Cat B H0: Is1Cat B IsGraph2: IsGraph C Is2Graph2: Is2Graph C Is01Cat2: Is01Cat C H1: Is1Cat C IsGraph3: IsGraph D Is2Graph3: Is2Graph D Is01Cat3: Is01Cat D H2: Is1Cat D F: A -> B -> C G: C -> D Is0Functor0: Is0Functor G Is1Functor0: Is1Functor G Is0Bifunctor0: Is0Bifunctor F bf: Is1Bifunctor F
forall (a0a1 : A) (f : a0 $-> a1)
(b0b1 : B) (g : b0 $-> b1),
fmap11 (fun (a : A) (b : B) => G (F a b)) f g $==
fmap01 (fun (a : A) (b : B) => G (F a b)) a1 g $o
fmap10 (fun (a : A) (b : B) => G (F a b)) f b0
A, B, C, D: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A IsGraph1: IsGraph B Is2Graph1: Is2Graph B Is01Cat1: Is01Cat B H0: Is1Cat B IsGraph2: IsGraph C Is2Graph2: Is2Graph C Is01Cat2: Is01Cat C H1: Is1Cat C IsGraph3: IsGraph D Is2Graph3: Is2Graph D Is01Cat3: Is01Cat D H2: Is1Cat D F: A -> B -> C G: C -> D Is0Functor0: Is0Functor G Is1Functor0: Is1Functor G Is0Bifunctor0: Is0Bifunctor F bf: Is1Bifunctor F
forall (a0a1 : A) (f : a0 $-> a1)
(b0b1 : B) (g : b0 $-> b1),
fmap11 (fun (a : A) (b : B) => G (F a b)) f g $==
fmap10 (fun (a : A) (b : B) => G (F a b)) f b1 $o
fmap01 (fun (a : A) (b : B) => G (F a b)) a0 g
A, B, C, D: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A IsGraph1: IsGraph B Is2Graph1: Is2Graph B Is01Cat1: Is01Cat B H0: Is1Cat B IsGraph2: IsGraph C Is2Graph2: Is2Graph C Is01Cat2: Is01Cat C H1: Is1Cat C IsGraph3: IsGraph D Is2Graph3: Is2Graph D Is01Cat3: Is01Cat D H2: Is1Cat D F: A -> B -> C G: C -> D Is0Functor0: Is0Functor G Is1Functor0: Is1Functor G Is0Bifunctor0: Is0Bifunctor F bf: Is1Bifunctor F
forall (a0a1 : A) (f : a0 $-> a1)
(b0b1 : B) (g : b0 $-> b1),
fmap11 (fun (a : A) (b : B) => G (F a b)) f g $==
fmap01 (fun (a : A) (b : B) => G (F a b)) a1 g $o
fmap10 (fun (a : A) (b : B) => G (F a b)) f b0
A, B, C, D: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A IsGraph1: IsGraph B Is2Graph1: Is2Graph B Is01Cat1: Is01Cat B H0: Is1Cat B IsGraph2: IsGraph C Is2Graph2: Is2Graph C Is01Cat2: Is01Cat C H1: Is1Cat C IsGraph3: IsGraph D Is2Graph3: Is2Graph D Is01Cat3: Is01Cat D H2: Is1Cat D F: A -> B -> C G: C -> D Is0Functor0: Is0Functor G Is1Functor0: Is1Functor G Is0Bifunctor0: Is0Bifunctor F bf: Is1Bifunctor F a0, a1: A f: a0 $-> a1 b0, b1: B g: b0 $-> b1
fmap11 (fun (a : A) (b : B) => G (F a b)) f g $==
fmap01 (fun (a : A) (b : B) => G (F a b)) a1 g $o
fmap10 (fun (a : A) (b : B) => G (F a b)) f b0
exact (fmap2 G (fmap11_is_fmap01_fmap10 F f g) $@ fmap_comp G _ _).
A, B, C, D: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A IsGraph1: IsGraph B Is2Graph1: Is2Graph B Is01Cat1: Is01Cat B H0: Is1Cat B IsGraph2: IsGraph C Is2Graph2: Is2Graph C Is01Cat2: Is01Cat C H1: Is1Cat C IsGraph3: IsGraph D Is2Graph3: Is2Graph D Is01Cat3: Is01Cat D H2: Is1Cat D F: A -> B -> C G: C -> D Is0Functor0: Is0Functor G Is1Functor0: Is1Functor G Is0Bifunctor0: Is0Bifunctor F bf: Is1Bifunctor F
forall (a0a1 : A) (f : a0 $-> a1)
(b0b1 : B) (g : b0 $-> b1),
fmap11 (fun (a : A) (b : B) => G (F a b)) f g $==
fmap10 (fun (a : A) (b : B) => G (F a b)) f b1 $o
fmap01 (fun (a : A) (b : B) => G (F a b)) a0 g
A, B, C, D: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A IsGraph1: IsGraph B Is2Graph1: Is2Graph B Is01Cat1: Is01Cat B H0: Is1Cat B IsGraph2: IsGraph C Is2Graph2: Is2Graph C Is01Cat2: Is01Cat C H1: Is1Cat C IsGraph3: IsGraph D Is2Graph3: Is2Graph D Is01Cat3: Is01Cat D H2: Is1Cat D F: A -> B -> C G: C -> D Is0Functor0: Is0Functor G Is1Functor0: Is1Functor G Is0Bifunctor0: Is0Bifunctor F bf: Is1Bifunctor F a0, a1: A f: a0 $-> a1 b0, b1: B g: b0 $-> b1
fmap11 (fun (a : A) (b : B) => G (F a b)) f g $==
fmap10 (fun (a : A) (b : B) => G (F a b)) f b1 $o
fmap01 (fun (a : A) (b : B) => G (F a b)) a0 g
exact (fmap2 G (fmap11_is_fmap10_fmap01 F f g) $@ fmap_comp G _ _).Defined.
A, B, C, D, E: Type H: IsGraph A H0: IsGraph B H1: IsGraph C H2: IsGraph D H3: IsGraph E G: A -> B K: E -> C F: B -> C -> D Is0Functor0: Is0Functor G Is0Bifunctor0: Is0Bifunctor F Is0Functor1: Is0Functor K
Is0Bifunctor (fun (a : A) (b : E) => F (G a) (K b))
A, B, C, D, E: Type H: IsGraph A H0: IsGraph B H1: IsGraph C H2: IsGraph D H3: IsGraph E G: A -> B K: E -> C F: B -> C -> D Is0Functor0: Is0Functor G Is0Bifunctor0: Is0Bifunctor F Is0Functor1: Is0Functor K
Is0Bifunctor (fun (a : A) (b : E) => F (G a) (K b))
A, B, C, D, E: Type H: IsGraph A H0: IsGraph B H1: IsGraph C H2: IsGraph D H3: IsGraph E G: A -> B K: E -> C F: B -> C -> D Is0Functor0: Is0Functor G Is0Bifunctor0: Is0Bifunctor F Is0Functor1: Is0Functor K
Is0Functor
(uncurry (fun (a : A) (b : E) => F (G a) (K b)))
A, B, C, D, E: Type H: IsGraph A H0: IsGraph B H1: IsGraph C H2: IsGraph D H3: IsGraph E G: A -> B K: E -> C F: B -> C -> D Is0Functor0: Is0Functor G Is0Bifunctor0: Is0Bifunctor F Is0Functor1: Is0Functor K
foralla : A,
Is0Functor
((fun (a0 : A) (b : E) => F (G a0) (K b)) a)
A, B, C, D, E: Type H: IsGraph A H0: IsGraph B H1: IsGraph C H2: IsGraph D H3: IsGraph E G: A -> B K: E -> C F: B -> C -> D Is0Functor0: Is0Functor G Is0Bifunctor0: Is0Bifunctor F Is0Functor1: Is0Functor K
forallb : E,
Is0Functor
(flip (fun (a : A) (b0 : E) => F (G a) (K b0)) b)
A, B, C, D, E: Type H: IsGraph A H0: IsGraph B H1: IsGraph C H2: IsGraph D H3: IsGraph E G: A -> B K: E -> C F: B -> C -> D Is0Functor0: Is0Functor G Is0Bifunctor0: Is0Bifunctor F Is0Functor1: Is0Functor K
Is0Functor
(uncurry (fun (a : A) (b : E) => F (G a) (K b)))
A, B, C, D, E: Type H: IsGraph A H0: IsGraph B H1: IsGraph C H2: IsGraph D H3: IsGraph E G: A -> B K: E -> C F: B -> C -> D Is0Functor0: Is0Functor G Is0Bifunctor0: Is0Bifunctor F Is0Functor1: Is0Functor K
Is0Functor (uncurry F o functor_prod G K)
exact _.
A, B, C, D, E: Type H: IsGraph A H0: IsGraph B H1: IsGraph C H2: IsGraph D H3: IsGraph E G: A -> B K: E -> C F: B -> C -> D Is0Functor0: Is0Functor G Is0Bifunctor0: Is0Bifunctor F Is0Functor1: Is0Functor K
foralla : A,
Is0Functor
((fun (a0 : A) (b : E) => F (G a0) (K b)) a)
exact _.
A, B, C, D, E: Type H: IsGraph A H0: IsGraph B H1: IsGraph C H2: IsGraph D H3: IsGraph E G: A -> B K: E -> C F: B -> C -> D Is0Functor0: Is0Functor G Is0Bifunctor0: Is0Bifunctor F Is0Functor1: Is0Functor K
forallb : E,
Is0Functor
(flip (fun (a : A) (b0 : E) => F (G a) (K b0)) b)
A, B, C, D, E: Type H: IsGraph A H0: IsGraph B H1: IsGraph C H2: IsGraph D H3: IsGraph E G: A -> B K: E -> C F: B -> C -> D Is0Functor0: Is0Functor G Is0Bifunctor0: Is0Bifunctor F Is0Functor1: Is0Functor K e: E
Is0Functor
(flip (fun (a : A) (b : E) => F (G a) (K b)) e)
A, B, C, D, E: Type H: IsGraph A H0: IsGraph B H1: IsGraph C H2: IsGraph D H3: IsGraph E G: A -> B K: E -> C F: B -> C -> D Is0Functor0: Is0Functor G Is0Bifunctor0: Is0Bifunctor F Is0Functor1: Is0Functor K e: E
Is0Functor (flip F (K e) o G)
exact _.Defined.
A, B, C, D, E: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A IsGraph1: IsGraph B Is2Graph1: Is2Graph B Is01Cat1: Is01Cat B H0: Is1Cat B IsGraph2: IsGraph C Is2Graph2: Is2Graph C Is01Cat2: Is01Cat C H1: Is1Cat C IsGraph3: IsGraph D Is2Graph3: Is2Graph D Is01Cat3: Is01Cat D H2: Is1Cat D IsGraph4: IsGraph E Is2Graph4: Is2Graph E Is01Cat4: Is01Cat E H3: Is1Cat E G: A -> B K: E -> C F: B -> C -> D Is0Functor0: Is0Functor G Is1Functor0: Is1Functor G Is0Bifunctor0: Is0Bifunctor F Is1Bifunctor0: Is1Bifunctor F Is0Functor1: Is0Functor K Is1Functor1: Is1Functor K
Is1Bifunctor (fun (a : A) (b : E) => F (G a) (K b))
A, B, C, D, E: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A IsGraph1: IsGraph B Is2Graph1: Is2Graph B Is01Cat1: Is01Cat B H0: Is1Cat B IsGraph2: IsGraph C Is2Graph2: Is2Graph C Is01Cat2: Is01Cat C H1: Is1Cat C IsGraph3: IsGraph D Is2Graph3: Is2Graph D Is01Cat3: Is01Cat D H2: Is1Cat D IsGraph4: IsGraph E Is2Graph4: Is2Graph E Is01Cat4: Is01Cat E H3: Is1Cat E G: A -> B K: E -> C F: B -> C -> D Is0Functor0: Is0Functor G Is1Functor0: Is1Functor G Is0Bifunctor0: Is0Bifunctor F Is1Bifunctor0: Is1Bifunctor F Is0Functor1: Is0Functor K Is1Functor1: Is1Functor K
Is1Bifunctor (fun (a : A) (b : E) => F (G a) (K b))
A, B, C, D, E: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A IsGraph1: IsGraph B Is2Graph1: Is2Graph B Is01Cat1: Is01Cat B H0: Is1Cat B IsGraph2: IsGraph C Is2Graph2: Is2Graph C Is01Cat2: Is01Cat C H1: Is1Cat C IsGraph3: IsGraph D Is2Graph3: Is2Graph D Is01Cat3: Is01Cat D H2: Is1Cat D IsGraph4: IsGraph E Is2Graph4: Is2Graph E Is01Cat4: Is01Cat E H3: Is1Cat E G: A -> B K: E -> C F: B -> C -> D Is0Functor0: Is0Functor G Is1Functor0: Is1Functor G Is0Bifunctor0: Is0Bifunctor F Is1Bifunctor0: Is1Bifunctor F Is0Functor1: Is0Functor K Is1Functor1: Is1Functor K
Is1Functor
(uncurry (fun (a : A) (b : E) => F (G a) (K b)))
A, B, C, D, E: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A IsGraph1: IsGraph B Is2Graph1: Is2Graph B Is01Cat1: Is01Cat B H0: Is1Cat B IsGraph2: IsGraph C Is2Graph2: Is2Graph C Is01Cat2: Is01Cat C H1: Is1Cat C IsGraph3: IsGraph D Is2Graph3: Is2Graph D Is01Cat3: Is01Cat D H2: Is1Cat D IsGraph4: IsGraph E Is2Graph4: Is2Graph E Is01Cat4: Is01Cat E H3: Is1Cat E G: A -> B K: E -> C F: B -> C -> D Is0Functor0: Is0Functor G Is1Functor0: Is1Functor G Is0Bifunctor0: Is0Bifunctor F Is1Bifunctor0: Is1Bifunctor F Is0Functor1: Is0Functor K Is1Functor1: Is1Functor K
foralla : A,
Is1Functor
((fun (a0 : A) (b : E) => F (G a0) (K b)) a)
A, B, C, D, E: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A IsGraph1: IsGraph B Is2Graph1: Is2Graph B Is01Cat1: Is01Cat B H0: Is1Cat B IsGraph2: IsGraph C Is2Graph2: Is2Graph C Is01Cat2: Is01Cat C H1: Is1Cat C IsGraph3: IsGraph D Is2Graph3: Is2Graph D Is01Cat3: Is01Cat D H2: Is1Cat D IsGraph4: IsGraph E Is2Graph4: Is2Graph E Is01Cat4: Is01Cat E H3: Is1Cat E G: A -> B K: E -> C F: B -> C -> D Is0Functor0: Is0Functor G Is1Functor0: Is1Functor G Is0Bifunctor0: Is0Bifunctor F Is1Bifunctor0: Is1Bifunctor F Is0Functor1: Is0Functor K Is1Functor1: Is1Functor K
forallb : E,
Is1Functor
(flip (fun (a : A) (b0 : E) => F (G a) (K b0)) b)
A, B, C, D, E: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A IsGraph1: IsGraph B Is2Graph1: Is2Graph B Is01Cat1: Is01Cat B H0: Is1Cat B IsGraph2: IsGraph C Is2Graph2: Is2Graph C Is01Cat2: Is01Cat C H1: Is1Cat C IsGraph3: IsGraph D Is2Graph3: Is2Graph D Is01Cat3: Is01Cat D H2: Is1Cat D IsGraph4: IsGraph E Is2Graph4: Is2Graph E Is01Cat4: Is01Cat E H3: Is1Cat E G: A -> B K: E -> C F: B -> C -> D Is0Functor0: Is0Functor G Is1Functor0: Is1Functor G Is0Bifunctor0: Is0Bifunctor F Is1Bifunctor0: Is1Bifunctor F Is0Functor1: Is0Functor K Is1Functor1: Is1Functor K
forall (a0a1 : A) (f : a0 $-> a1)
(b0b1 : E) (g : b0 $-> b1),
fmap11 (fun (a : A) (b : E) => F (G a) (K b)) f g $==
fmap01 (fun (a : A) (b : E) => F (G a) (K b)) a1 g $o
fmap10 (fun (a : A) (b : E) => F (G a) (K b)) f b0
A, B, C, D, E: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A IsGraph1: IsGraph B Is2Graph1: Is2Graph B Is01Cat1: Is01Cat B H0: Is1Cat B IsGraph2: IsGraph C Is2Graph2: Is2Graph C Is01Cat2: Is01Cat C H1: Is1Cat C IsGraph3: IsGraph D Is2Graph3: Is2Graph D Is01Cat3: Is01Cat D H2: Is1Cat D IsGraph4: IsGraph E Is2Graph4: Is2Graph E Is01Cat4: Is01Cat E H3: Is1Cat E G: A -> B K: E -> C F: B -> C -> D Is0Functor0: Is0Functor G Is1Functor0: Is1Functor G Is0Bifunctor0: Is0Bifunctor F Is1Bifunctor0: Is1Bifunctor F Is0Functor1: Is0Functor K Is1Functor1: Is1Functor K
forall (a0a1 : A) (f : a0 $-> a1)
(b0b1 : E) (g : b0 $-> b1),
fmap11 (fun (a : A) (b : E) => F (G a) (K b)) f g $==
fmap10 (fun (a : A) (b : E) => F (G a) (K b)) f b1 $o
fmap01 (fun (a : A) (b : E) => F (G a) (K b)) a0 g
A, B, C, D, E: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A IsGraph1: IsGraph B Is2Graph1: Is2Graph B Is01Cat1: Is01Cat B H0: Is1Cat B IsGraph2: IsGraph C Is2Graph2: Is2Graph C Is01Cat2: Is01Cat C H1: Is1Cat C IsGraph3: IsGraph D Is2Graph3: Is2Graph D Is01Cat3: Is01Cat D H2: Is1Cat D IsGraph4: IsGraph E Is2Graph4: Is2Graph E Is01Cat4: Is01Cat E H3: Is1Cat E G: A -> B K: E -> C F: B -> C -> D Is0Functor0: Is0Functor G Is1Functor0: Is1Functor G Is0Bifunctor0: Is0Bifunctor F Is1Bifunctor0: Is1Bifunctor F Is0Functor1: Is0Functor K Is1Functor1: Is1Functor K
Is1Functor
(uncurry (fun (a : A) (b : E) => F (G a) (K b)))
A, B, C, D, E: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A IsGraph1: IsGraph B Is2Graph1: Is2Graph B Is01Cat1: Is01Cat B H0: Is1Cat B IsGraph2: IsGraph C Is2Graph2: Is2Graph C Is01Cat2: Is01Cat C H1: Is1Cat C IsGraph3: IsGraph D Is2Graph3: Is2Graph D Is01Cat3: Is01Cat D H2: Is1Cat D IsGraph4: IsGraph E Is2Graph4: Is2Graph E Is01Cat4: Is01Cat E H3: Is1Cat E G: A -> B K: E -> C F: B -> C -> D Is0Functor0: Is0Functor G Is1Functor0: Is1Functor G Is0Bifunctor0: Is0Bifunctor F Is1Bifunctor0: Is1Bifunctor F Is0Functor1: Is0Functor K Is1Functor1: Is1Functor K
Is1Functor (uncurry F o functor_prod G K)
exact _.
A, B, C, D, E: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A IsGraph1: IsGraph B Is2Graph1: Is2Graph B Is01Cat1: Is01Cat B H0: Is1Cat B IsGraph2: IsGraph C Is2Graph2: Is2Graph C Is01Cat2: Is01Cat C H1: Is1Cat C IsGraph3: IsGraph D Is2Graph3: Is2Graph D Is01Cat3: Is01Cat D H2: Is1Cat D IsGraph4: IsGraph E Is2Graph4: Is2Graph E Is01Cat4: Is01Cat E H3: Is1Cat E G: A -> B K: E -> C F: B -> C -> D Is0Functor0: Is0Functor G Is1Functor0: Is1Functor G Is0Bifunctor0: Is0Bifunctor F Is1Bifunctor0: Is1Bifunctor F Is0Functor1: Is0Functor K Is1Functor1: Is1Functor K
foralla : A,
Is1Functor
((fun (a0 : A) (b : E) => F (G a0) (K b)) a)
exact _.
A, B, C, D, E: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A IsGraph1: IsGraph B Is2Graph1: Is2Graph B Is01Cat1: Is01Cat B H0: Is1Cat B IsGraph2: IsGraph C Is2Graph2: Is2Graph C Is01Cat2: Is01Cat C H1: Is1Cat C IsGraph3: IsGraph D Is2Graph3: Is2Graph D Is01Cat3: Is01Cat D H2: Is1Cat D IsGraph4: IsGraph E Is2Graph4: Is2Graph E Is01Cat4: Is01Cat E H3: Is1Cat E G: A -> B K: E -> C F: B -> C -> D Is0Functor0: Is0Functor G Is1Functor0: Is1Functor G Is0Bifunctor0: Is0Bifunctor F Is1Bifunctor0: Is1Bifunctor F Is0Functor1: Is0Functor K Is1Functor1: Is1Functor K
forallb : E,
Is1Functor
(flip (fun (a : A) (b0 : E) => F (G a) (K b0)) b)
A, B, C, D, E: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A IsGraph1: IsGraph B Is2Graph1: Is2Graph B Is01Cat1: Is01Cat B H0: Is1Cat B IsGraph2: IsGraph C Is2Graph2: Is2Graph C Is01Cat2: Is01Cat C H1: Is1Cat C IsGraph3: IsGraph D Is2Graph3: Is2Graph D Is01Cat3: Is01Cat D H2: Is1Cat D IsGraph4: IsGraph E Is2Graph4: Is2Graph E Is01Cat4: Is01Cat E H3: Is1Cat E G: A -> B K: E -> C F: B -> C -> D Is0Functor0: Is0Functor G Is1Functor0: Is1Functor G Is0Bifunctor0: Is0Bifunctor F Is1Bifunctor0: Is1Bifunctor F Is0Functor1: Is0Functor K Is1Functor1: Is1Functor K e: E
Is1Functor
(flip (fun (a : A) (b : E) => F (G a) (K b)) e)
A, B, C, D, E: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A IsGraph1: IsGraph B Is2Graph1: Is2Graph B Is01Cat1: Is01Cat B H0: Is1Cat B IsGraph2: IsGraph C Is2Graph2: Is2Graph C Is01Cat2: Is01Cat C H1: Is1Cat C IsGraph3: IsGraph D Is2Graph3: Is2Graph D Is01Cat3: Is01Cat D H2: Is1Cat D IsGraph4: IsGraph E Is2Graph4: Is2Graph E Is01Cat4: Is01Cat E H3: Is1Cat E G: A -> B K: E -> C F: B -> C -> D Is0Functor0: Is0Functor G Is1Functor0: Is1Functor G Is0Bifunctor0: Is0Bifunctor F Is1Bifunctor0: Is1Bifunctor F Is0Functor1: Is0Functor K Is1Functor1: Is1Functor K e: E
Is1Functor (flip F (K e) o G)
exact _.
A, B, C, D, E: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A IsGraph1: IsGraph B Is2Graph1: Is2Graph B Is01Cat1: Is01Cat B H0: Is1Cat B IsGraph2: IsGraph C Is2Graph2: Is2Graph C Is01Cat2: Is01Cat C H1: Is1Cat C IsGraph3: IsGraph D Is2Graph3: Is2Graph D Is01Cat3: Is01Cat D H2: Is1Cat D IsGraph4: IsGraph E Is2Graph4: Is2Graph E Is01Cat4: Is01Cat E H3: Is1Cat E G: A -> B K: E -> C F: B -> C -> D Is0Functor0: Is0Functor G Is1Functor0: Is1Functor G Is0Bifunctor0: Is0Bifunctor F Is1Bifunctor0: Is1Bifunctor F Is0Functor1: Is0Functor K Is1Functor1: Is1Functor K
forall (a0a1 : A) (f : a0 $-> a1)
(b0b1 : E) (g : b0 $-> b1),
fmap11 (fun (a : A) (b : E) => F (G a) (K b)) f g $==
fmap01 (fun (a : A) (b : E) => F (G a) (K b)) a1 g $o
fmap10 (fun (a : A) (b : E) => F (G a) (K b)) f b0
A, B, C, D, E: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A IsGraph1: IsGraph B Is2Graph1: Is2Graph B Is01Cat1: Is01Cat B H0: Is1Cat B IsGraph2: IsGraph C Is2Graph2: Is2Graph C Is01Cat2: Is01Cat C H1: Is1Cat C IsGraph3: IsGraph D Is2Graph3: Is2Graph D Is01Cat3: Is01Cat D H2: Is1Cat D IsGraph4: IsGraph E Is2Graph4: Is2Graph E Is01Cat4: Is01Cat E H3: Is1Cat E G: A -> B K: E -> C F: B -> C -> D Is0Functor0: Is0Functor G Is1Functor0: Is1Functor G Is0Bifunctor0: Is0Bifunctor F Is1Bifunctor0: Is1Bifunctor F Is0Functor1: Is0Functor K Is1Functor1: Is1Functor K a0, a1: A f: a0 $-> a1 b0, b1: E g: b0 $-> b1
fmap11 (fun (a : A) (b : E) => F (G a) (K b)) f g $==
fmap01 (fun (a : A) (b : E) => F (G a) (K b)) a1 g $o
fmap10 (fun (a : A) (b : E) => F (G a) (K b)) f b0
exact (fmap11_is_fmap01_fmap10 F (fmap G f) (fmap K g)).
A, B, C, D, E: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A IsGraph1: IsGraph B Is2Graph1: Is2Graph B Is01Cat1: Is01Cat B H0: Is1Cat B IsGraph2: IsGraph C Is2Graph2: Is2Graph C Is01Cat2: Is01Cat C H1: Is1Cat C IsGraph3: IsGraph D Is2Graph3: Is2Graph D Is01Cat3: Is01Cat D H2: Is1Cat D IsGraph4: IsGraph E Is2Graph4: Is2Graph E Is01Cat4: Is01Cat E H3: Is1Cat E G: A -> B K: E -> C F: B -> C -> D Is0Functor0: Is0Functor G Is1Functor0: Is1Functor G Is0Bifunctor0: Is0Bifunctor F Is1Bifunctor0: Is1Bifunctor F Is0Functor1: Is0Functor K Is1Functor1: Is1Functor K
forall (a0a1 : A) (f : a0 $-> a1)
(b0b1 : E) (g : b0 $-> b1),
fmap11 (fun (a : A) (b : E) => F (G a) (K b)) f g $==
fmap10 (fun (a : A) (b : E) => F (G a) (K b)) f b1 $o
fmap01 (fun (a : A) (b : E) => F (G a) (K b)) a0 g
A, B, C, D, E: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A IsGraph1: IsGraph B Is2Graph1: Is2Graph B Is01Cat1: Is01Cat B H0: Is1Cat B IsGraph2: IsGraph C Is2Graph2: Is2Graph C Is01Cat2: Is01Cat C H1: Is1Cat C IsGraph3: IsGraph D Is2Graph3: Is2Graph D Is01Cat3: Is01Cat D H2: Is1Cat D IsGraph4: IsGraph E Is2Graph4: Is2Graph E Is01Cat4: Is01Cat E H3: Is1Cat E G: A -> B K: E -> C F: B -> C -> D Is0Functor0: Is0Functor G Is1Functor0: Is1Functor G Is0Bifunctor0: Is0Bifunctor F Is1Bifunctor0: Is1Bifunctor F Is0Functor1: Is0Functor K Is1Functor1: Is1Functor K a0, a1: A f: a0 $-> a1 b0, b1: E g: b0 $-> b1
fmap11 (fun (a : A) (b : E) => F (G a) (K b)) f g $==
fmap10 (fun (a : A) (b : E) => F (G a) (K b)) f b1 $o
fmap01 (fun (a : A) (b : E) => F (G a) (K b)) a0 g
exact (fmap11_is_fmap10_fmap01 F (fmap G f) (fmap K g)).Defined.
A, B, C, D, E: Type F: A -> B -> C G: C -> D -> E H: IsGraph A H0: IsGraph B H1: IsGraph C H2: IsGraph D H3: IsGraph E Is0Bifunctor0: Is0Bifunctor F Is0Bifunctor1: Is0Bifunctor G
Is0Functor
(uncurry
(uncurry
(fun (x : A) (y : B) (z : D) => G (F x y) z)))
A, B, C, D, E: Type F: A -> B -> C G: C -> D -> E H: IsGraph A H0: IsGraph B H1: IsGraph C H2: IsGraph D H3: IsGraph E Is0Bifunctor0: Is0Bifunctor F Is0Bifunctor1: Is0Bifunctor G
Is0Functor
(uncurry
(uncurry
(fun (x : A) (y : B) (z : D) => G (F x y) z)))
exact _.Defined.
A, B, C, D, E: Type F: A -> B -> D G: C -> D -> E H: IsGraph A H0: IsGraph B H1: IsGraph C H2: IsGraph D H3: IsGraph E Is0Bifunctor0: Is0Bifunctor F Is0Bifunctor1: Is0Bifunctor G
Is0Functor
(uncurry
(uncurry
(fun (x : C) (y : A) (z : B) => G x (F y z))))
A, B, C, D, E: Type F: A -> B -> D G: C -> D -> E H: IsGraph A H0: IsGraph B H1: IsGraph C H2: IsGraph D H3: IsGraph E Is0Bifunctor0: Is0Bifunctor F Is0Bifunctor1: Is0Bifunctor G
Is0Functor
(uncurry
(uncurry
(fun (x : C) (y : A) (z : B) => G x (F y z))))
A, B, C, D, E: Type F: A -> B -> D G: C -> D -> E H: IsGraph A H0: IsGraph B H1: IsGraph C H2: IsGraph D H3: IsGraph E Is0Bifunctor0: Is0Bifunctor F Is0Bifunctor1: Is0Bifunctor G
forallab : C * A * B,
(a $-> b) ->
uncurry
(uncurry
(fun (x : C) (y : A) (z : B) => G x (F y z))) a $->
uncurry
(uncurry
(fun (x : C) (y : A) (z : B) => G x (F y z))) b
A, B, C, D, E: Type F: A -> B -> D G: C -> D -> E H: IsGraph A H0: IsGraph B H1: IsGraph C H2: IsGraph D H3: IsGraph E Is0Bifunctor0: Is0Bifunctor F Is0Bifunctor1: Is0Bifunctor G cab, cab': C * A * B h: fst (fst cab) $-> fst (fst cab') f: snd (fst cab) $-> snd (fst cab') g: snd cab $-> snd cab'
uncurry
(uncurry
(fun (x : C) (y : A) (z : B) => G x (F y z))) cab $->
uncurry
(uncurry
(fun (x : C) (y : A) (z : B) => G x (F y z)))
cab'
exact (fmap11 G h (fmap11 F f g)).Defined.Definitionfmap11_square {ABC : Type} `{Is1Cat A, Is1Cat B, Is1Cat C}
(F : A -> B -> C) `{!Is0Bifunctor F, !Is1Bifunctor F}
{a00 a20 a02 a22 : A} {f10 : a00 $-> a20} {f12 : a02 $-> a22}
{f01 : a00 $-> a02} {f21 : a20 $-> a22}
{b00 b20 b02 b22 : B} {g10 : b00 $-> b20} {g12 : b02 $-> b22}
{g01 : b00 $-> b02} {g21 : b20 $-> b22}
(p : Square f01 f21 f10 f12) (q : Square g01 g21 g10 g12)
: Square (fmap11 F f01 g01) (fmap11 F f21 g21) (fmap11 F f10 g10) (fmap11 F f12 g12)
:= (fmap11_comp F _ _ _ _)^$ $@ fmap22 F p q $@ fmap11_comp F _ _ _ _.(** ** Natural transformations between bifunctors *)(** We can show that an uncurried natural transformation between uncurried bifunctors by composing the naturality square in each variable. *)
A, B, C: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A IsGraph1: IsGraph B Is2Graph1: Is2Graph B Is01Cat1: Is01Cat B H0: Is1Cat B IsGraph2: IsGraph C Is2Graph2: Is2Graph C Is01Cat2: Is01Cat C H1: Is1Cat C F: A -> B -> C Is0Bifunctor0: Is0Bifunctor F Is1Bifunctor0: Is1Bifunctor F G: A -> B -> C Is0Bifunctor1: Is0Bifunctor G Is1Bifunctor1: Is1Bifunctor G alpha: uncurry F $=> uncurry G nat_l: forallb : B,
Is1Natural (flip F b) (flip G b)
(funx : A => alpha (x, b)) nat_r: foralla : A,
Is1Natural (F a) (G a)
(funy : B => alpha (a, y))
Is1Natural (uncurry F) (uncurry G) alpha
A, B, C: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A IsGraph1: IsGraph B Is2Graph1: Is2Graph B Is01Cat1: Is01Cat B H0: Is1Cat B IsGraph2: IsGraph C Is2Graph2: Is2Graph C Is01Cat2: Is01Cat C H1: Is1Cat C F: A -> B -> C Is0Bifunctor0: Is0Bifunctor F Is1Bifunctor0: Is1Bifunctor F G: A -> B -> C Is0Bifunctor1: Is0Bifunctor G Is1Bifunctor1: Is1Bifunctor G alpha: uncurry F $=> uncurry G nat_l: forallb : B,
Is1Natural (flip F b) (flip G b)
(funx : A => alpha (x, b)) nat_r: foralla : A,
Is1Natural (F a) (G a)
(funy : B => alpha (a, y))
Is1Natural (uncurry F) (uncurry G) alpha
A, B, C: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A IsGraph1: IsGraph B Is2Graph1: Is2Graph B Is01Cat1: Is01Cat B H0: Is1Cat B IsGraph2: IsGraph C Is2Graph2: Is2Graph C Is01Cat2: Is01Cat C H1: Is1Cat C F: A -> B -> C Is0Bifunctor0: Is0Bifunctor F Is1Bifunctor0: Is1Bifunctor F G: A -> B -> C Is0Bifunctor1: Is0Bifunctor G Is1Bifunctor1: Is1Bifunctor G alpha: uncurry F $=> uncurry G nat_l: forallb : B,
Is1Natural (flip F b) (flip G b)
(funx : A => alpha (x, b)) nat_r: foralla : A,
Is1Natural (F a) (G a)
(funy : B => alpha (a, y)) a: A b: B a': A b': B f: a $-> a' f': b $-> b'
A, B, C: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A IsGraph1: IsGraph B Is2Graph1: Is2Graph B Is01Cat1: Is01Cat B H0: Is1Cat B IsGraph2: IsGraph C Is2Graph2: Is2Graph C Is01Cat2: Is01Cat C H1: Is1Cat C F: A -> B -> C Is0Bifunctor0: Is0Bifunctor F Is1Bifunctor0: Is1Bifunctor F G: A -> B -> C Is0Bifunctor1: Is0Bifunctor G Is1Bifunctor1: Is1Bifunctor G alpha: uncurry F $=> uncurry G nat_l: forallb : B,
Is1Natural (flip F b) (flip G b)
(funx : A => alpha (x, b)) nat_r: foralla : A,
Is1Natural (F a) (G a)
(funy : B => alpha (a, y)) a: A b: B a': A b': B f: a $-> a' f': b $-> b'
A, B, C: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A IsGraph1: IsGraph B Is2Graph1: Is2Graph B Is01Cat1: Is01Cat B H0: Is1Cat B IsGraph2: IsGraph C Is2Graph2: Is2Graph C Is01Cat2: Is01Cat C H1: Is1Cat C F: A -> B -> C Is0Bifunctor0: Is0Bifunctor F Is1Bifunctor0: Is1Bifunctor F G: A -> B -> C Is0Bifunctor1: Is0Bifunctor G Is1Bifunctor1: Is1Bifunctor G alpha: uncurry F $=> uncurry G nat_l: forallb : B,
Is1Natural (flip F b) (flip G b)
(funx : A => alpha (x, b)) nat_r: foralla : A,
Is1Natural (F a) (G a)
(funy : B => alpha (a, y)) a: A b: B a': A b': B f: a $-> a' f': b $-> b'
fmap (uncurry F) (f, f') $== ?Goal
A, B, C: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A IsGraph1: IsGraph B Is2Graph1: Is2Graph B Is01Cat1: Is01Cat B H0: Is1Cat B IsGraph2: IsGraph C Is2Graph2: Is2Graph C Is01Cat2: Is01Cat C H1: Is1Cat C F: A -> B -> C Is0Bifunctor0: Is0Bifunctor F Is1Bifunctor0: Is1Bifunctor F G: A -> B -> C Is0Bifunctor1: Is0Bifunctor G Is1Bifunctor1: Is1Bifunctor G alpha: uncurry F $=> uncurry G nat_l: forallb : B,
Is1Natural (flip F b) (flip G b)
(funx : A => alpha (x, b)) nat_r: foralla : A,
Is1Natural (F a) (G a)
(funy : B => alpha (a, y)) a: A b: B a': A b': B f: a $-> a' f': b $-> b'
A, B, C: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A IsGraph1: IsGraph B Is2Graph1: Is2Graph B Is01Cat1: Is01Cat B H0: Is1Cat B IsGraph2: IsGraph C Is2Graph2: Is2Graph C Is01Cat2: Is01Cat C H1: Is1Cat C F: A -> B -> C Is0Bifunctor0: Is0Bifunctor F Is1Bifunctor0: Is1Bifunctor F G: A -> B -> C Is0Bifunctor1: Is0Bifunctor G Is1Bifunctor1: Is1Bifunctor G alpha: uncurry F $=> uncurry G nat_l: forallb : B,
Is1Natural (flip F b) (flip G b)
(funx : A => alpha (x, b)) nat_r: foralla : A,
Is1Natural (F a) (G a)
(funy : B => alpha (a, y)) a: A b: B a': A b': B f: a $-> a' f': b $-> b'
Square (alpha (a, b)) (alpha (a', b'))
(fmap01 F (fst (a', b')) f' $o
fmap10 F f (snd (a, b)))
(fmap (uncurry G) (f, f'))
A, B, C: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A IsGraph1: IsGraph B Is2Graph1: Is2Graph B Is01Cat1: Is01Cat B H0: Is1Cat B IsGraph2: IsGraph C Is2Graph2: Is2Graph C Is01Cat2: Is01Cat C H1: Is1Cat C F: A -> B -> C Is0Bifunctor0: Is0Bifunctor F Is1Bifunctor0: Is1Bifunctor F G: A -> B -> C Is0Bifunctor1: Is0Bifunctor G Is1Bifunctor1: Is1Bifunctor G alpha: uncurry F $=> uncurry G nat_l: forallb : B,
Is1Natural (flip F b) (flip G b)
(funx : A => alpha (x, b)) nat_r: foralla : A,
Is1Natural (F a) (G a)
(funy : B => alpha (a, y)) a: A b: B a': A b': B f: a $-> a' f': b $-> b'
Square (alpha (a, b)) (alpha (a', b'))
(fmap01 F (fst (a', b')) f' $o
fmap10 F f (snd (a, b)))
?Goal
A, B, C: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A IsGraph1: IsGraph B Is2Graph1: Is2Graph B Is01Cat1: Is01Cat B H0: Is1Cat B IsGraph2: IsGraph C Is2Graph2: Is2Graph C Is01Cat2: Is01Cat C H1: Is1Cat C F: A -> B -> C Is0Bifunctor0: Is0Bifunctor F Is1Bifunctor0: Is1Bifunctor F G: A -> B -> C Is0Bifunctor1: Is0Bifunctor G Is1Bifunctor1: Is1Bifunctor G alpha: uncurry F $=> uncurry G nat_l: forallb : B,
Is1Natural (flip F b) (flip G b)
(funx : A => alpha (x, b)) nat_r: foralla : A,
Is1Natural (F a) (G a)
(funy : B => alpha (a, y)) a: A b: B a': A b': B f: a $-> a' f': b $-> b'
fmap (uncurry G) (f, f') $== ?Goal
A, B, C: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A IsGraph1: IsGraph B Is2Graph1: Is2Graph B Is01Cat1: Is01Cat B H0: Is1Cat B IsGraph2: IsGraph C Is2Graph2: Is2Graph C Is01Cat2: Is01Cat C H1: Is1Cat C F: A -> B -> C Is0Bifunctor0: Is0Bifunctor F Is1Bifunctor0: Is1Bifunctor F G: A -> B -> C Is0Bifunctor1: Is0Bifunctor G Is1Bifunctor1: Is1Bifunctor G alpha: uncurry F $=> uncurry G nat_l: forallb : B,
Is1Natural (flip F b) (flip G b)
(funx : A => alpha (x, b)) nat_r: foralla : A,
Is1Natural (F a) (G a)
(funy : B => alpha (a, y)) a: A b: B a': A b': B f: a $-> a' f': b $-> b'
Square (alpha (a, b)) (alpha (a', b'))
(fmap01 F (fst (a', b')) f' $o
fmap10 F f (snd (a, b)))
(fmap01 G (fst (a', b')) f' $o
fmap10 G f (snd (a, b)))