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.
(* -*- mode: coq; mode: visual-line -*- *)
[Loading ML file number_string_notation_plugin.cmxs (using legacy method) ... done]
Require Import WildCat.Core.Require Import WildCat.Equiv.Require Import Types.Prod.(** * Product categories *)(** Products preserve (0,1)-categories. *)Global Instanceisgraph_prodAB `{IsGraph A} `{IsGraph B}
: IsGraph (A * B)
:= Build_IsGraph (A * B) (funxy => (fst x $-> fst y) * (snd x $-> snd y)).
A, B: Type H: IsGraph A H0: Is01Cat A H1: IsGraph B H2: Is01Cat B
Is01Cat (A * B)
A, B: Type H: IsGraph A H0: Is01Cat A H1: IsGraph B H2: Is01Cat B
Is01Cat (A * B)
A, B: Type H: IsGraph A H0: Is01Cat A H1: IsGraph B H2: Is01Cat B
foralla : A * B, a $-> a
A, B: Type H: IsGraph A H0: Is01Cat A H1: IsGraph B H2: Is01Cat B
forallabc : A * B,
(b $-> c) -> (a $-> b) -> a $-> c
A, B: Type H: IsGraph A H0: Is01Cat A H1: IsGraph B H2: Is01Cat B
foralla : A * B, a $-> a
intros [a b]; exact (Id a, Id b).
A, B: Type H: IsGraph A H0: Is01Cat A H1: IsGraph B H2: Is01Cat B
forallabc : A * B,
(b $-> c) -> (a $-> b) -> a $-> c
A, B: Type H: IsGraph A H0: Is01Cat A H1: IsGraph B H2: Is01Cat B a1: A b1: B a2: A b2: B a3: A b3: B f1: a2 $-> a3 g1: b2 $-> b3 f2: a1 $-> a2 g2: b1 $-> b2
(a1 $-> a3) * (b1 $-> b3)
exact (f1 $o f2 , g1 $o g2).Defined.
A, B: Type H: IsGraph A H0: Is01Cat A H1: Is0Gpd A H2: IsGraph B H3: Is01Cat B H4: Is0Gpd B
Is0Gpd (A * B)
A, B: Type H: IsGraph A H0: Is01Cat A H1: Is0Gpd A H2: IsGraph B H3: Is01Cat B H4: Is0Gpd B
Is0Gpd (A * B)
A, B: Type H: IsGraph A H0: Is01Cat A H1: Is0Gpd A H2: IsGraph B H3: Is01Cat B H4: Is0Gpd B
forallab : A * B, (a $-> b) -> b $-> a
A, B: Type H: IsGraph A H0: Is01Cat A H1: Is0Gpd A H2: IsGraph B H3: Is01Cat B H4: Is0Gpd B x1: A x2: B y1: A y2: B f1: fst (x1, x2) $-> fst (y1, y2) f2: snd (x1, x2) $-> snd (y1, y2)
(y1, y2) $-> (x1, x2)
A, B: Type H: IsGraph A H0: Is01Cat A H1: Is0Gpd A H2: IsGraph B H3: Is01Cat B H4: Is0Gpd B x1: A x2: B y1: A y2: B f1: x1 $-> y1 f2: x2 $-> y2
(y1 $-> x1) * (y2 $-> x2)
exact ( (f1^$, f2^$) ).Defined.
A, B: Type H: IsGraph A H0: Is2Graph A H1: IsGraph B H2: Is2Graph B
Is2Graph (A * B)
A, B: Type H: IsGraph A H0: Is2Graph A H1: IsGraph B H2: Is2Graph B
Is2Graph (A * B)
A, B: Type H: IsGraph A H0: Is2Graph A H1: IsGraph B H2: Is2Graph B x1: A x2: B y1: A y2: B
IsGraph ((x1, x2) $-> (y1, y2))
rapply isgraph_prod.Defined.
A, B: 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
Is1Cat (A * B)
A, B: 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
Is1Cat (A * B)
A, B: 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
forall (abc : A * B)
(g : b $-> c), Is0Functor (cat_postcomp a g)
A, B: 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
forall (abc : A * B)
(f : a $-> b), Is0Functor (cat_precomp c f)
A, B: 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
forall (abcd : A * B)
(f : a $-> b) (g : b $-> c)
(h : c $-> d), h $o g $o f $== h $o (g $o f)
A, B: 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
forall (abcd : A * B)
(f : a $-> b) (g : b $-> c)
(h : c $-> d), h $o (g $o f) $== h $o g $o f
A, B: 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
forall (ab : A * B) (f : a $-> b), Id b $o f $== f
A, B: 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
forall (ab : A * B) (f : a $-> b), f $o Id a $== f
A, B: 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
forall (abc : A * B)
(g : b $-> c), Is0Functor (cat_postcomp a g)
A, B: 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 x1: A x2: B y1: A y2: B z1: A z2: B h1: fst (y1, y2) $-> fst (z1, z2) h2: snd (y1, y2) $-> snd (z1, z2)
Is0Functor (cat_postcomp (x1, x2) (h1, h2))
A, B: 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 x1: A x2: B y1: A y2: B z1: A z2: B h1: fst (y1, y2) $-> fst (z1, z2) h2: snd (y1, y2) $-> snd (z1, z2)
forallab : (x1, x2) $-> (y1, y2),
(a $-> b) ->
cat_postcomp (x1, x2) (h1, h2) a $->
cat_postcomp (x1, x2) (h1, h2) b
A, B: 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 x1: A x2: B y1: A y2: B z1: A z2: B h1: y1 $-> z1 h2: y2 $-> z2 f1: x1 $-> y1 f2: x2 $-> y2 g1: x1 $-> y1 g2: x2 $-> y2 p1: f1 $-> g1 p2: f2 $-> g2
(h1 $o f1 $-> h1 $o g1) * (h2 $o f2 $-> h2 $o g2)
exact ( h1 $@L p1 , h2 $@L p2 ).
A, B: 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
forall (abc : A * B)
(f : a $-> b), Is0Functor (cat_precomp c f)
A, B: 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 x1: A x2: B y1: A y2: B z1: A z2: B h1: fst (x1, x2) $-> fst (y1, y2) h2: snd (x1, x2) $-> snd (y1, y2)
Is0Functor (cat_precomp (z1, z2) (h1, h2))
A, B: 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 x1: A x2: B y1: A y2: B z1: A z2: B h1: fst (x1, x2) $-> fst (y1, y2) h2: snd (x1, x2) $-> snd (y1, y2)
forallab : (y1, y2) $-> (z1, z2),
(a $-> b) ->
cat_precomp (z1, z2) (h1, h2) a $->
cat_precomp (z1, z2) (h1, h2) b
A, B: 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 x1: A x2: B y1: A y2: B z1: A z2: B h1: x1 $-> y1 h2: x2 $-> y2 f1: y1 $-> z1 f2: y2 $-> z2 g1: y1 $-> z1 g2: y2 $-> z2 p1: f1 $-> g1 p2: f2 $-> g2
(f1 $o h1 $-> g1 $o h1) * (f2 $o h2 $-> g2 $o h2)
exact ( p1 $@R h1 , p2 $@R h2 ).
A, B: 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
forall (abcd : A * B)
(f : a $-> b) (g : b $-> c)
(h : c $-> d), h $o g $o f $== h $o (g $o f)
A, B: 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 a1: A a2: B b1: A b2: B c1: A c2: B d1: A d2: B f1: fst (a1, a2) $-> fst (b1, b2) f2: snd (a1, a2) $-> snd (b1, b2) g1: fst (b1, b2) $-> fst (c1, c2) g2: snd (b1, b2) $-> snd (c1, c2) h1: fst (c1, c2) $-> fst (d1, d2) h2: snd (c1, c2) $-> snd (d1, d2)
A, B: 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 a1: A a2: B b1: A b2: B c1: A c2: B d1: A d2: B f1: a1 $-> b1 f2: a2 $-> b2 g1: b1 $-> c1 g2: b2 $-> c2 h1: c1 $-> d1 h2: c2 $-> d2
A, B: 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
forall (abcd : A * B)
(f : a $-> b) (g : b $-> c)
(h : c $-> d), h $o (g $o f) $== h $o g $o f
A, B: 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 a1: A a2: B b1: A b2: B c1: A c2: B d1: A d2: B f1: fst (a1, a2) $-> fst (b1, b2) f2: snd (a1, a2) $-> snd (b1, b2) g1: fst (b1, b2) $-> fst (c1, c2) g2: snd (b1, b2) $-> snd (c1, c2) h1: fst (c1, c2) $-> fst (d1, d2) h2: snd (c1, c2) $-> snd (d1, d2)
A, B: 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 a1: A a2: B b1: A b2: B c1: A c2: B d1: A d2: B f1: a1 $-> b1 f2: a2 $-> b2 g1: b1 $-> c1 g2: b2 $-> c2 h1: c1 $-> d1 h2: c2 $-> d2
exact(cat_assoc_opp f1 g1 h1, cat_assoc_opp f2 g2 h2).
A, B: 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
forall (ab : A * B) (f : a $-> b), Id b $o f $== f
A, B: 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 a1: A a2: B b1: A b2: B f1: fst (a1, a2) $-> fst (b1, b2) f2: snd (a1, a2) $-> snd (b1, b2)
Id (b1, b2) $o (f1, f2) $== (f1, f2)
A, B: 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 a1: A a2: B b1: A b2: B f1: a1 $-> b1 f2: a2 $-> b2
(Id b1 $o f1 $-> f1) * (Id b2 $o f2 $-> f2)
exact (cat_idl _, cat_idl _).
A, B: 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
forall (ab : A * B) (f : a $-> b), f $o Id a $== f
A, B: 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 a1: A a2: B b1: A b2: B g1: fst (a1, a2) $-> fst (b1, b2) g2: snd (a1, a2) $-> snd (b1, b2)
(g1, g2) $o Id (a1, a2) $== (g1, g2)
A, B: 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 a1: A a2: B b1: A b2: B g1: a1 $-> b1 g2: a2 $-> b2
A, B: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A IsGraph1: IsGraph B Is2Graph1: Is2Graph B Is01Cat1: Is01Cat B H1: Is1Cat B H2: HasEquivs B
HasEquivs (A * B)
A, B: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A IsGraph1: IsGraph B Is2Graph1: Is2Graph B Is01Cat1: Is01Cat B H1: Is1Cat B H2: HasEquivs B
HasEquivs (A * B)
A, B: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A IsGraph1: IsGraph B Is2Graph1: Is2Graph B Is01Cat1: Is01Cat B H1: Is1Cat B H2: HasEquivs B
forallab : A * B, (a $-> b) -> Type
A, B: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A IsGraph1: IsGraph B Is2Graph1: Is2Graph B Is01Cat1: Is01Cat B H1: Is1Cat B H2: HasEquivs B
forallab : A * B,
(funa0b0 : A * B =>
(fst a0 $<~> fst b0) * (snd a0 $<~> snd b0)) a b ->
a $-> b
A, B: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A IsGraph1: IsGraph B Is2Graph1: Is2Graph B Is01Cat1: Is01Cat B H1: Is1Cat B H2: HasEquivs B
forall (ab : A * B)
(f : (funa0b0 : A * B =>
(fst a0 $<~> fst b0) * (snd a0 $<~> snd b0)) a b),
?CatIsEquiv' a b (?cate_fun' a b f)
A, B: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A IsGraph1: IsGraph B Is2Graph1: Is2Graph B Is01Cat1: Is01Cat B H1: Is1Cat B H2: HasEquivs B
forall (ab : A * B) (f : a $-> b),
?CatIsEquiv' a b f ->
(funa0b0 : A * B =>
(fst a0 $<~> fst b0) * (snd a0 $<~> snd b0)) a b
A, B: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A IsGraph1: IsGraph B Is2Graph1: Is2Graph B Is01Cat1: Is01Cat B H1: Is1Cat B H2: HasEquivs B
forall (ab : A * B) (f : a $-> b)
(fe : ?CatIsEquiv' a b f),
?cate_fun' a b (?cate_buildequiv' a b f fe) $== f
A, B: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A IsGraph1: IsGraph B Is2Graph1: Is2Graph B Is01Cat1: Is01Cat B H1: Is1Cat B H2: HasEquivs B
forallab : A * B,
(funa0b0 : A * B =>
(fst a0 $<~> fst b0) * (snd a0 $<~> snd b0)) a b ->
b $-> a
A, B: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A IsGraph1: IsGraph B Is2Graph1: Is2Graph B Is01Cat1: Is01Cat B H1: Is1Cat B H2: HasEquivs B
forall (ab : A * B)
(f : (funa0b0 : A * B =>
(fst a0 $<~> fst b0) * (snd a0 $<~> snd b0)) a b),
?cate_inv' a b f $o ?cate_fun' a b f $== Id a
A, B: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A IsGraph1: IsGraph B Is2Graph1: Is2Graph B Is01Cat1: Is01Cat B H1: Is1Cat B H2: HasEquivs B
forall (ab : A * B)
(f : (funa0b0 : A * B =>
(fst a0 $<~> fst b0) * (snd a0 $<~> snd b0)) a b),
?cate_fun' a b f $o ?cate_inv' a b f $== Id b
A, B: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A IsGraph1: IsGraph B Is2Graph1: Is2Graph B Is01Cat1: Is01Cat B H1: Is1Cat B H2: HasEquivs B
forall (ab : A * B) (f : a $-> b)
(g : b $-> a),
f $o g $== Id b ->
g $o f $== Id a -> ?CatIsEquiv' a b f
A, B: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A IsGraph1: IsGraph B Is2Graph1: Is2Graph B Is01Cat1: Is01Cat B H1: Is1Cat B H2: HasEquivs B
forallab : A * B,
(funa0b0 : A * B =>
(fst a0 $<~> fst b0) * (snd a0 $<~> snd b0)) a b ->
a $-> b
A, B: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A IsGraph1: IsGraph B Is2Graph1: Is2Graph B Is01Cat1: Is01Cat B H1: Is1Cat B H2: HasEquivs B
forall (ab : A * B)
(f : (funa0b0 : A * B =>
(fst a0 $<~> fst b0) * (snd a0 $<~> snd b0)) a b),
(fun (a0b0 : A * B) (f0 : a0 $-> b0) =>
CatIsEquiv (fst f0) * CatIsEquiv (snd f0)) a b
(?cate_fun' a b f)
A, B: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A IsGraph1: IsGraph B Is2Graph1: Is2Graph B Is01Cat1: Is01Cat B H1: Is1Cat B H2: HasEquivs B
forall (ab : A * B) (f : a $-> b),
(fun (a0b0 : A * B) (f0 : a0 $-> b0) =>
CatIsEquiv (fst f0) * CatIsEquiv (snd f0)) a b f ->
(funa0b0 : A * B =>
(fst a0 $<~> fst b0) * (snd a0 $<~> snd b0)) a b
A, B: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A IsGraph1: IsGraph B Is2Graph1: Is2Graph B Is01Cat1: Is01Cat B H1: Is1Cat B H2: HasEquivs B
forall (ab : A * B) (f : a $-> b)
(fe : (fun (a0b0 : A * B) (f0 : a0 $-> b0) =>
CatIsEquiv (fst f0) * CatIsEquiv (snd f0)) a b
f),
?cate_fun' a b (?cate_buildequiv' a b f fe) $== f
A, B: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A IsGraph1: IsGraph B Is2Graph1: Is2Graph B Is01Cat1: Is01Cat B H1: Is1Cat B H2: HasEquivs B
forallab : A * B,
(funa0b0 : A * B =>
(fst a0 $<~> fst b0) * (snd a0 $<~> snd b0)) a b ->
b $-> a
A, B: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A IsGraph1: IsGraph B Is2Graph1: Is2Graph B Is01Cat1: Is01Cat B H1: Is1Cat B H2: HasEquivs B
forall (ab : A * B)
(f : (funa0b0 : A * B =>
(fst a0 $<~> fst b0) * (snd a0 $<~> snd b0)) a b),
?cate_inv' a b f $o ?cate_fun' a b f $== Id a
A, B: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A IsGraph1: IsGraph B Is2Graph1: Is2Graph B Is01Cat1: Is01Cat B H1: Is1Cat B H2: HasEquivs B
forall (ab : A * B)
(f : (funa0b0 : A * B =>
(fst a0 $<~> fst b0) * (snd a0 $<~> snd b0)) a b),
?cate_fun' a b f $o ?cate_inv' a b f $== Id b
A, B: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A IsGraph1: IsGraph B Is2Graph1: Is2Graph B Is01Cat1: Is01Cat B H1: Is1Cat B H2: HasEquivs B
forall (ab : A * B) (f : a $-> b)
(g : b $-> a),
f $o g $== Id b ->
g $o f $== Id a ->
(fun (a0b0 : A * B) (f0 : a0 $-> b0) =>
CatIsEquiv (fst f0) * CatIsEquiv (snd f0)) a b f
A, B: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A IsGraph1: IsGraph B Is2Graph1: Is2Graph B Is01Cat1: Is01Cat B H1: Is1Cat B H2: HasEquivs B a, b: A * B f: (fst a $<~> fst b) * (snd a $<~> snd b)
(fst a $-> fst b) * (snd a $-> snd b)
A, B: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A IsGraph1: IsGraph B Is2Graph1: Is2Graph B Is01Cat1: Is01Cat B H1: Is1Cat B H2: HasEquivs B a, b: A * B f: (fst a $<~> fst b) * (snd a $<~> snd b)
CatIsEquiv
(fst
((fun (ab : A * B)
(f : (fst a $<~> fst b) * (snd a $<~> snd b))
=> ?Goal) a b f)) *
CatIsEquiv
(snd
((fun (ab : A * B)
(f : (fst a $<~> fst b) * (snd a $<~> snd b))
=> ?Goal) a b f))
A, B: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A IsGraph1: IsGraph B Is2Graph1: Is2Graph B Is01Cat1: Is01Cat B H1: Is1Cat B H2: HasEquivs B a, b: A * B f: (fst a $-> fst b) * (snd a $-> snd b)
CatIsEquiv (fst f) * CatIsEquiv (snd f) ->
(fst a $<~> fst b) * (snd a $<~> snd b)
A, B: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A IsGraph1: IsGraph B Is2Graph1: Is2Graph B Is01Cat1: Is01Cat B H1: Is1Cat B H2: HasEquivs B a, b: A * B f: (fst a $-> fst b) * (snd a $-> snd b)
forallfe : CatIsEquiv (fst f) * CatIsEquiv (snd f),
(fst
((fun (ab : A * B)
(f : (fst a $<~> fst b) * (snd a $<~> snd b))
=> ?Goal) a b
((fun (ab : A * B)
(f : (fst a $-> fst b) * (snd a $-> snd b))
=> ?Goal1) a b f fe)) $->
fst f) *
(snd
((fun (ab : A * B)
(f : (fst a $<~> fst b) * (snd a $<~> snd b))
=> ?Goal) a b
((fun (ab : A * B)
(f : (fst a $-> fst b) * (snd a $-> snd b))
=> ?Goal1) a b f fe)) $->
snd f)
A, B: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A IsGraph1: IsGraph B Is2Graph1: Is2Graph B Is01Cat1: Is01Cat B H1: Is1Cat B H2: HasEquivs B a, b: A * B f: (fst a $<~> fst b) * (snd a $<~> snd b)
(fst b $-> fst a) * (snd b $-> snd a)
A, B: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A IsGraph1: IsGraph B Is2Graph1: Is2Graph B Is01Cat1: Is01Cat B H1: Is1Cat B H2: HasEquivs B a, b: A * B f: (fst a $<~> fst b) * (snd a $<~> snd b)
(fst
((fun (ab : A * B)
(f : (fst a $<~> fst b) * (snd a $<~> snd b))
=> ?Goal3) a b f) $o
fst
((fun (ab : A * B)
(f : (fst a $<~> fst b) * (snd a $<~> snd b))
=> ?Goal) a b f) $->
Id (fst a)) *
(snd
((fun (ab : A * B)
(f : (fst a $<~> fst b) * (snd a $<~> snd b))
=> ?Goal3) a b f) $o
snd
((fun (ab : A * B)
(f : (fst a $<~> fst b) * (snd a $<~> snd b))
=> ?Goal) a b f) $->
Id (snd a))
A, B: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A IsGraph1: IsGraph B Is2Graph1: Is2Graph B Is01Cat1: Is01Cat B H1: Is1Cat B H2: HasEquivs B a, b: A * B f: (fst a $<~> fst b) * (snd a $<~> snd b)
(fst
((fun (ab : A * B)
(f : (fst a $<~> fst b) * (snd a $<~> snd b))
=> ?Goal) a b f) $o
fst
((fun (ab : A * B)
(f : (fst a $<~> fst b) * (snd a $<~> snd b))
=> ?Goal3) a b f) $->
Id (fst b)) *
(snd
((fun (ab : A * B)
(f : (fst a $<~> fst b) * (snd a $<~> snd b))
=> ?Goal) a b f) $o
snd
((fun (ab : A * B)
(f : (fst a $<~> fst b) * (snd a $<~> snd b))
=> ?Goal3) a b f) $->
Id (snd b))
A, B: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A IsGraph1: IsGraph B Is2Graph1: Is2Graph B Is01Cat1: Is01Cat B H1: Is1Cat B H2: HasEquivs B a, b: A * B f: (fst a $-> fst b) * (snd a $-> snd b)
forallg : (fst b $-> fst a) * (snd b $-> snd a),
(fst f $o fst g $-> Id (fst b)) *
(snd f $o snd g $-> Id (snd b)) ->
(fst g $o fst f $-> Id (fst a)) *
(snd g $o snd f $-> Id (snd a)) ->
CatIsEquiv (fst f) * CatIsEquiv (snd f)
A, B: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A IsGraph1: IsGraph B Is2Graph1: Is2Graph B Is01Cat1: Is01Cat B H1: Is1Cat B H2: HasEquivs B a, b: A * B f: (fst a $<~> fst b) * (snd a $<~> snd b)
(fst a $-> fst b) * (snd a $-> snd b)
split; [ exact (fst f) | exact (snd f) ].
A, B: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A IsGraph1: IsGraph B Is2Graph1: Is2Graph B Is01Cat1: Is01Cat B H1: Is1Cat B H2: HasEquivs B a, b: A * B f: (fst a $<~> fst b) * (snd a $<~> snd b)
CatIsEquiv
(fst
((fun (ab : A * B)
(f : (fst a $<~> fst b) * (snd a $<~> snd b))
=> (fst f, snd f)) a b f)) *
CatIsEquiv
(snd
((fun (ab : A * B)
(f : (fst a $<~> fst b) * (snd a $<~> snd b))
=> (fst f, snd f)) a b f))
split; exact _.
A, B: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A IsGraph1: IsGraph B Is2Graph1: Is2Graph B Is01Cat1: Is01Cat B H1: Is1Cat B H2: HasEquivs B a, b: A * B f: (fst a $-> fst b) * (snd a $-> snd b)
CatIsEquiv (fst f) * CatIsEquiv (snd f) ->
(fst a $<~> fst b) * (snd a $<~> snd b)
A, B: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A IsGraph1: IsGraph B Is2Graph1: Is2Graph B Is01Cat1: Is01Cat B H1: Is1Cat B H2: HasEquivs B a, b: A * B f: (fst a $-> fst b) * (snd a $-> snd b) fe1: CatIsEquiv (fst f) fe2: CatIsEquiv (snd f)
fst a $<~> fst b
A, B: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A IsGraph1: IsGraph B Is2Graph1: Is2Graph B Is01Cat1: Is01Cat B H1: Is1Cat B H2: HasEquivs B a, b: A * B f: (fst a $-> fst b) * (snd a $-> snd b) fe1: CatIsEquiv (fst f) fe2: CatIsEquiv (snd f)
snd a $<~> snd b
A, B: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A IsGraph1: IsGraph B Is2Graph1: Is2Graph B Is01Cat1: Is01Cat B H1: Is1Cat B H2: HasEquivs B a, b: A * B f: (fst a $-> fst b) * (snd a $-> snd b) fe1: CatIsEquiv (fst f) fe2: CatIsEquiv (snd f)
fst a $<~> fst b
exact (Build_CatEquiv (fst f)).
A, B: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A IsGraph1: IsGraph B Is2Graph1: Is2Graph B Is01Cat1: Is01Cat B H1: Is1Cat B H2: HasEquivs B a, b: A * B f: (fst a $-> fst b) * (snd a $-> snd b) fe1: CatIsEquiv (fst f) fe2: CatIsEquiv (snd f)
snd a $<~> snd b
exact (Build_CatEquiv (snd f)).
A, B: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A IsGraph1: IsGraph B Is2Graph1: Is2Graph B Is01Cat1: Is01Cat B H1: Is1Cat B H2: HasEquivs B a, b: A * B f: (fst a $-> fst b) * (snd a $-> snd b)
forallfe : CatIsEquiv (fst f) * CatIsEquiv (snd f),
(fst
((fun (ab : A * B)
(f : (fst a $<~> fst b) * (snd a $<~> snd b))
=> (fst f, snd f)) a b
((fun (ab : A * B)
(f : (fst a $-> fst b) * (snd a $-> snd b))
(X : CatIsEquiv (fst f) * CatIsEquiv (snd f))
=>
(fun (fe1 : CatIsEquiv (fst f))
(fe2 : CatIsEquiv (snd f)) =>
(Build_CatEquiv (fst f),
Build_CatEquiv (snd f)))
(fst X) (snd X)) a b f fe)) $->
fst f) *
(snd
((fun (ab : A * B)
(f : (fst a $<~> fst b) * (snd a $<~> snd b))
=> (fst f, snd f)) a b
((fun (ab : A * B)
(f : (fst a $-> fst b) * (snd a $-> snd b))
(X : CatIsEquiv (fst f) * CatIsEquiv (snd f))
=>
(fun (fe1 : CatIsEquiv (fst f))
(fe2 : CatIsEquiv (snd f)) =>
(Build_CatEquiv (fst f),
Build_CatEquiv (snd f)))
(fst X) (snd X)) a b f fe)) $->
snd f)
A, B: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A IsGraph1: IsGraph B Is2Graph1: Is2Graph B Is01Cat1: Is01Cat B H1: Is1Cat B H2: HasEquivs B a, b: A * B f: (fst a $<~> fst b) * (snd a $<~> snd b)
A, B: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A IsGraph1: IsGraph B Is2Graph1: Is2Graph B Is01Cat1: Is01Cat B H1: Is1Cat B H2: HasEquivs B a, b: A * B f: (fst a $<~> fst b) * (snd a $<~> snd b)
(fst
((fun (ab : A * B)
(f : (fst a $<~> fst b) * (snd a $<~> snd b))
=> ((fst f)^-1$, (snd f)^-1$)) a b f) $o
fst
((fun (ab : A * B)
(f : (fst a $<~> fst b) * (snd a $<~> snd b))
=> (fst f, snd f)) a b f) $->
Id (fst a)) *
(snd
((fun (ab : A * B)
(f : (fst a $<~> fst b) * (snd a $<~> snd b))
=> ((fst f)^-1$, (snd f)^-1$)) a b f) $o
snd
((fun (ab : A * B)
(f : (fst a $<~> fst b) * (snd a $<~> snd b))
=> (fst f, snd f)) a b f) $->
Id (snd a))
split; apply cate_issect.
A, B: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A IsGraph1: IsGraph B Is2Graph1: Is2Graph B Is01Cat1: Is01Cat B H1: Is1Cat B H2: HasEquivs B a, b: A * B f: (fst a $<~> fst b) * (snd a $<~> snd b)
(fst
((fun (ab : A * B)
(f : (fst a $<~> fst b) * (snd a $<~> snd b))
=> (fst f, snd f)) a b f) $o
fst
((fun (ab : A * B)
(f : (fst a $<~> fst b) * (snd a $<~> snd b))
=> ((fst f)^-1$, (snd f)^-1$)) a b f) $->
Id (fst b)) *
(snd
((fun (ab : A * B)
(f : (fst a $<~> fst b) * (snd a $<~> snd b))
=> (fst f, snd f)) a b f) $o
snd
((fun (ab : A * B)
(f : (fst a $<~> fst b) * (snd a $<~> snd b))
=> ((fst f)^-1$, (snd f)^-1$)) a b f) $->
Id (snd b))
split; apply cate_isretr.
A, B: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A IsGraph1: IsGraph B Is2Graph1: Is2Graph B Is01Cat1: Is01Cat B H1: Is1Cat B H2: HasEquivs B a, b: A * B f: (fst a $-> fst b) * (snd a $-> snd b)
forallg : (fst b $-> fst a) * (snd b $-> snd a),
(fst f $o fst g $-> Id (fst b)) *
(snd f $o snd g $-> Id (snd b)) ->
(fst g $o fst f $-> Id (fst a)) *
(snd g $o snd f $-> Id (snd a)) ->
CatIsEquiv (fst f) * CatIsEquiv (snd f)
A, B: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A IsGraph1: IsGraph B Is2Graph1: Is2Graph B Is01Cat1: Is01Cat B H1: Is1Cat B H2: HasEquivs B a, b: A * B f: (fst a $-> fst b) * (snd a $-> snd b) g: (fst b $-> fst a) * (snd b $-> snd a) r: (fst f $o fst g $-> Id (fst b)) *
(snd f $o snd g $-> Id (snd b)) s: (fst g $o fst f $-> Id (fst a)) *
(snd g $o snd f $-> Id (snd a))
CatIsEquiv (fst f)
A, B: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A IsGraph1: IsGraph B Is2Graph1: Is2Graph B Is01Cat1: Is01Cat B H1: Is1Cat B H2: HasEquivs B a, b: A * B f: (fst a $-> fst b) * (snd a $-> snd b) g: (fst b $-> fst a) * (snd b $-> snd a) r: (fst f $o fst g $-> Id (fst b)) *
(snd f $o snd g $-> Id (snd b)) s: (fst g $o fst f $-> Id (fst a)) *
(snd g $o snd f $-> Id (snd a))
CatIsEquiv (snd f)
A, B: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A IsGraph1: IsGraph B Is2Graph1: Is2Graph B Is01Cat1: Is01Cat B H1: Is1Cat B H2: HasEquivs B a, b: A * B f: (fst a $-> fst b) * (snd a $-> snd b) g: (fst b $-> fst a) * (snd b $-> snd a) r: (fst f $o fst g $-> Id (fst b)) *
(snd f $o snd g $-> Id (snd b)) s: (fst g $o fst f $-> Id (fst a)) *
(snd g $o snd f $-> Id (snd a))
A, B: Type IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A H0: HasEquivs A IsGraph1: IsGraph B Is2Graph1: Is2Graph B Is01Cat1: Is01Cat B H1: Is1Cat B H2: HasEquivs B a, b: A * B f: (fst a $-> fst b) * (snd a $-> snd b) g: (fst b $-> fst a) * (snd b $-> snd a) r: (fst f $o fst g $-> Id (fst b)) *
(snd f $o snd g $-> Id (snd b)) s: (fst g $o fst f $-> Id (fst a)) *
(snd g $o snd f $-> Id (snd a))
A, B, C, D: Type F: A -> B G: C -> D H: IsGraph A H0: IsGraph B H1: Is0Functor F H2: IsGraph C H3: IsGraph D H4: Is0Functor G
Is0Functor (functor_prod F G)
A, B, C, D: Type F: A -> B G: C -> D H: IsGraph A H0: IsGraph B H1: Is0Functor F H2: IsGraph C H3: IsGraph D H4: Is0Functor G
Is0Functor (functor_prod F G)
A, B, C, D: Type F: A -> B G: C -> D H: IsGraph A H0: IsGraph B H1: Is0Functor F H2: IsGraph C H3: IsGraph D H4: Is0Functor G
forallab : A * C,
(a $-> b) -> functor_prod F G a $-> functor_prod F G b
A, B, C, D: Type F: A -> B G: C -> D H: IsGraph A H0: IsGraph B H1: Is0Functor F H2: IsGraph C H3: IsGraph D H4: Is0Functor G a1: A c1: C a2: A c2: C f: fst (a1, c1) $-> fst (a2, c2) g: snd (a1, c1) $-> snd (a2, c2)
functor_prod F G (a1, c1) $->
functor_prod F G (a2, c2)
exact (fmap F f , fmap G g).Defined.
A, B, C, D: Type F: A -> B G: C -> D IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A IsGraph1: IsGraph B Is2Graph1: Is2Graph B Is01Cat1: Is01Cat B H0: Is1Cat B Is0Functor0: Is0Functor F H1: Is1Functor F IsGraph2: IsGraph C Is2Graph2: Is2Graph C Is01Cat2: Is01Cat C H2: Is1Cat C IsGraph3: IsGraph D Is2Graph3: Is2Graph D Is01Cat3: Is01Cat D H3: Is1Cat D Is0Functor1: Is0Functor G H4: Is1Functor G
Is1Functor (functor_prod F G)
A, B, C, D: Type F: A -> B G: C -> D IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A IsGraph1: IsGraph B Is2Graph1: Is2Graph B Is01Cat1: Is01Cat B H0: Is1Cat B Is0Functor0: Is0Functor F H1: Is1Functor F IsGraph2: IsGraph C Is2Graph2: Is2Graph C Is01Cat2: Is01Cat C H2: Is1Cat C IsGraph3: IsGraph D Is2Graph3: Is2Graph D Is01Cat3: Is01Cat D H3: Is1Cat D Is0Functor1: Is0Functor G H4: Is1Functor G
Is1Functor (functor_prod F G)
A, B, C, D: Type F: A -> B G: C -> D IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A IsGraph1: IsGraph B Is2Graph1: Is2Graph B Is01Cat1: Is01Cat B H0: Is1Cat B Is0Functor0: Is0Functor F H1: Is1Functor F IsGraph2: IsGraph C Is2Graph2: Is2Graph C Is01Cat2: Is01Cat C H2: Is1Cat C IsGraph3: IsGraph D Is2Graph3: Is2Graph D Is01Cat3: Is01Cat D H3: Is1Cat D Is0Functor1: Is0Functor G H4: Is1Functor G
forall (ab : A * C) (fg : a $-> b),
f $== g ->
fmap (functor_prod F G) f $==
fmap (functor_prod F G) g
A, B, C, D: Type F: A -> B G: C -> D IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A IsGraph1: IsGraph B Is2Graph1: Is2Graph B Is01Cat1: Is01Cat B H0: Is1Cat B Is0Functor0: Is0Functor F H1: Is1Functor F IsGraph2: IsGraph C Is2Graph2: Is2Graph C Is01Cat2: Is01Cat C H2: Is1Cat C IsGraph3: IsGraph D Is2Graph3: Is2Graph D Is01Cat3: Is01Cat D H3: Is1Cat D Is0Functor1: Is0Functor G H4: Is1Functor G
foralla : A * C,
fmap (functor_prod F G) (Id a) $==
Id (functor_prod F G a)
A, B, C, D: Type F: A -> B G: C -> D IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A IsGraph1: IsGraph B Is2Graph1: Is2Graph B Is01Cat1: Is01Cat B H0: Is1Cat B Is0Functor0: Is0Functor F H1: Is1Functor F IsGraph2: IsGraph C Is2Graph2: Is2Graph C Is01Cat2: Is01Cat C H2: Is1Cat C IsGraph3: IsGraph D Is2Graph3: Is2Graph D Is01Cat3: Is01Cat D H3: Is1Cat D Is0Functor1: Is0Functor G H4: Is1Functor G
forall (abc : A * C)
(f : a $-> b) (g : b $-> c),
fmap (functor_prod F G) (g $o f) $==
fmap (functor_prod F G) g $o fmap (functor_prod F G) f
A, B, C, D: Type F: A -> B G: C -> D IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A IsGraph1: IsGraph B Is2Graph1: Is2Graph B Is01Cat1: Is01Cat B H0: Is1Cat B Is0Functor0: Is0Functor F H1: Is1Functor F IsGraph2: IsGraph C Is2Graph2: Is2Graph C Is01Cat2: Is01Cat C H2: Is1Cat C IsGraph3: IsGraph D Is2Graph3: Is2Graph D Is01Cat3: Is01Cat D H3: Is1Cat D Is0Functor1: Is0Functor G H4: Is1Functor G
forall (ab : A * C) (fg : a $-> b),
f $== g ->
fmap (functor_prod F G) f $==
fmap (functor_prod F G) g
A, B, C, D: Type F: A -> B G: C -> D IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A IsGraph1: IsGraph B Is2Graph1: Is2Graph B Is01Cat1: Is01Cat B H0: Is1Cat B Is0Functor0: Is0Functor F H1: Is1Functor F IsGraph2: IsGraph C Is2Graph2: Is2Graph C Is01Cat2: Is01Cat C H2: Is1Cat C IsGraph3: IsGraph D Is2Graph3: Is2Graph D Is01Cat3: Is01Cat D H3: Is1Cat D Is0Functor1: Is0Functor G H4: Is1Functor G a1: A c1: C a2: A c2: C f1: fst (a1, c1) $-> fst (a2, c2) g1: snd (a1, c1) $-> snd (a2, c2) f2: fst (a1, c1) $-> fst (a2, c2) g2: snd (a1, c1) $-> snd (a2, c2) p: fst (f1, g1) $-> fst (f2, g2) q: snd (f1, g1) $-> snd (f2, g2)
fmap (functor_prod F G) (f1, g1) $==
fmap (functor_prod F G) (f2, g2)
exact (fmap2 F p , fmap2 G q).
A, B, C, D: Type F: A -> B G: C -> D IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A IsGraph1: IsGraph B Is2Graph1: Is2Graph B Is01Cat1: Is01Cat B H0: Is1Cat B Is0Functor0: Is0Functor F H1: Is1Functor F IsGraph2: IsGraph C Is2Graph2: Is2Graph C Is01Cat2: Is01Cat C H2: Is1Cat C IsGraph3: IsGraph D Is2Graph3: Is2Graph D Is01Cat3: Is01Cat D H3: Is1Cat D Is0Functor1: Is0Functor G H4: Is1Functor G
foralla : A * C,
fmap (functor_prod F G) (Id a) $==
Id (functor_prod F G a)
A, B, C, D: Type F: A -> B G: C -> D IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A IsGraph1: IsGraph B Is2Graph1: Is2Graph B Is01Cat1: Is01Cat B H0: Is1Cat B Is0Functor0: Is0Functor F H1: Is1Functor F IsGraph2: IsGraph C Is2Graph2: Is2Graph C Is01Cat2: Is01Cat C H2: Is1Cat C IsGraph3: IsGraph D Is2Graph3: Is2Graph D Is01Cat3: Is01Cat D H3: Is1Cat D Is0Functor1: Is0Functor G H4: Is1Functor G a: A c: C
fmap (functor_prod F G) (Id (a, c)) $==
Id (functor_prod F G (a, c))
exact (fmap_id F a, fmap_id G c).
A, B, C, D: Type F: A -> B G: C -> D IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A IsGraph1: IsGraph B Is2Graph1: Is2Graph B Is01Cat1: Is01Cat B H0: Is1Cat B Is0Functor0: Is0Functor F H1: Is1Functor F IsGraph2: IsGraph C Is2Graph2: Is2Graph C Is01Cat2: Is01Cat C H2: Is1Cat C IsGraph3: IsGraph D Is2Graph3: Is2Graph D Is01Cat3: Is01Cat D H3: Is1Cat D Is0Functor1: Is0Functor G H4: Is1Functor G
forall (abc : A * C)
(f : a $-> b) (g : b $-> c),
fmap (functor_prod F G) (g $o f) $==
fmap (functor_prod F G) g $o fmap (functor_prod F G) f
A, B, C, D: Type F: A -> B G: C -> D IsGraph0: IsGraph A Is2Graph0: Is2Graph A Is01Cat0: Is01Cat A H: Is1Cat A IsGraph1: IsGraph B Is2Graph1: Is2Graph B Is01Cat1: Is01Cat B H0: Is1Cat B Is0Functor0: Is0Functor F H1: Is1Functor F IsGraph2: IsGraph C Is2Graph2: Is2Graph C Is01Cat2: Is01Cat C H2: Is1Cat C IsGraph3: IsGraph D Is2Graph3: Is2Graph D Is01Cat3: Is01Cat D H3: Is1Cat D Is0Functor1: Is0Functor G H4: Is1Functor G a1: A c1: C a2: A c2: C a3: A c3: C f1: fst (a1, c1) $-> fst (a2, c2) g1: snd (a1, c1) $-> snd (a2, c2) f2: fst (a2, c2) $-> fst (a3, c3) g2: snd (a2, c2) $-> snd (a3, c3)
fmap (functor_prod F G) ((f2, g2) $o (f1, g1)) $==
fmap (functor_prod F G) (f2, g2) $o
fmap (functor_prod F G) (f1, g1)
exact (fmap_comp F f1 f2 , fmap_comp G g1 g2).Defined.
A, B: Type IsGraph0: IsGraph A IsGraph1: IsGraph B
Is0Functor fst
A, B: Type IsGraph0: IsGraph A IsGraph1: IsGraph B
Is0Functor fst
A, B: Type IsGraph0: IsGraph A IsGraph1: IsGraph B
forallab : A * B, (a $-> b) -> fst a $-> fst b
intros ? ? f; exact (fst f).Defined.
A, B: Type IsGraph0: IsGraph A IsGraph1: IsGraph B
Is0Functor snd
A, B: Type IsGraph0: IsGraph A IsGraph1: IsGraph B
Is0Functor snd
A, B: Type IsGraph0: IsGraph A IsGraph1: IsGraph B
forallab : A * B,
(a $-> b) ->
equiv_prod_symm A B a $-> equiv_prod_symm A B b
A, B: Type H: IsGraph A H0: IsGraph B a, b: A * B
(a $-> b) ->
equiv_prod_symm A B a $-> equiv_prod_symm A B b
apply equiv_prod_symm.Defined.
A, B: 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
Is1Functor (equiv_prod_symm A B)
A, B: 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
Is1Functor (equiv_prod_symm A B)
A, B: 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
forall (ab : A * B) (fg : a $-> b),
f $== g ->
fmap (equiv_prod_symm A B) f $==
fmap (equiv_prod_symm A B) g
A, B: 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
foralla : A * B,
fmap (equiv_prod_symm A B) (Id a) $==
Id (equiv_prod_symm A B a)
A, B: 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
forall (abc : A * B)
(f : a $-> b) (g : b $-> c),
fmap (equiv_prod_symm A B) (g $o f) $==
fmap (equiv_prod_symm A B) g $o
fmap (equiv_prod_symm A B) f
A, B: 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
forall (ab : A * B) (fg : a $-> b),
f $== g ->
fmap (equiv_prod_symm A B) f $==
fmap (equiv_prod_symm A B) g
A, B: 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 a, b: A * B f, g: a $-> b
f $== g ->
fmap (equiv_prod_symm A B) f $==
fmap (equiv_prod_symm A B) g
apply equiv_prod_symm.
A, B: 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
foralla : A * B,
fmap (equiv_prod_symm A B) (Id a) $==
Id (equiv_prod_symm A B a)
A, B: 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 a: A * B
fmap (equiv_prod_symm A B) (Id a) $==
Id (equiv_prod_symm A B a)
reflexivity.
A, B: 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
forall (abc : A * B)
(f : a $-> b) (g : b $-> c),
fmap (equiv_prod_symm A B) (g $o f) $==
fmap (equiv_prod_symm A B) g $o
fmap (equiv_prod_symm A B) f
reflexivity.Defined.(** Inclusions into a product category are functorial. *)
A, B: Type H: IsGraph A H0: IsGraph B H1: Is01Cat B b: B
Is0Functor (funa : A => (a, b))
A, B: Type H: IsGraph A H0: IsGraph B H1: Is01Cat B b: B
Is0Functor (funa : A => (a, b))
A, B: Type H: IsGraph A H0: IsGraph B H1: Is01Cat B b: B
forallab0 : A, (a $-> b0) -> (a, b) $-> (b0, b)
A, B: Type H: IsGraph A H0: IsGraph B H1: Is01Cat B b: B a, c: A f: a $-> c
(a, b) $-> (c, b)
exact (f, Id b).Defined.
A, B: 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 b: B
Is1Functor (funa : A => (a, b))
A, B: 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 b: B
Is1Functor (funa : A => (a, b))
A, B: 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 b: B
forall (ab0 : A) (fg : a $-> b0),
f $== g ->
fmap (funa0 : A => (a0, b)) f $==
fmap (funa0 : A => (a0, b)) g
A, B: 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 b: B
foralla : A,
fmap (funa0 : A => (a0, b)) (Id a) $== Id (a, b)
A, B: 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 b: B
forall (ab0c : A) (f : a $-> b0)
(g : b0 $-> c),
fmap (funa0 : A => (a0, b)) (g $o f) $==
fmap (funa0 : A => (a0, b)) g $o
fmap (funa0 : A => (a0, b)) f
A, B: 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 b: B
forall (ab0 : A) (fg : a $-> b0),
f $== g ->
fmap (funa0 : A => (a0, b)) f $==
fmap (funa0 : A => (a0, b)) g
A, B: 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 b: B a, c: A f, g: a $-> c p: f $== g
fmap (funa : A => (a, b)) f $==
fmap (funa : A => (a, b)) g
exact (p, Id _).
A, B: 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 b: B
foralla : A,
fmap (funa0 : A => (a0, b)) (Id a) $== Id (a, b)
intros a; reflexivity.
A, B: 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 b: B
forall (ab0c : A) (f : a $-> b0)
(g : b0 $-> c),
fmap (funa0 : A => (a0, b)) (g $o f) $==
fmap (funa0 : A => (a0, b)) g $o
fmap (funa0 : A => (a0, b)) f
A, B: 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 b: B a, c, d: A f: a $-> c g: c $-> d
fmap (funa : A => (a, b)) (g $o f) $==
fmap (funa : A => (a, b)) g $o
fmap (funa : A => (a, b)) f
exact (Id _, (cat_idl _)^$).Defined.
A, B: Type H: IsGraph A H0: Is01Cat A H1: IsGraph B a: A
Is0Functor (funb : B => (a, b))
A, B: Type H: IsGraph A H0: Is01Cat A H1: IsGraph B a: A
Is0Functor (funb : B => (a, b))
A, B: Type H: IsGraph A H0: Is01Cat A H1: IsGraph B a: A
foralla0b : B, (a0 $-> b) -> (a, a0) $-> (a, b)
A, B: Type H: IsGraph A H0: Is01Cat A H1: IsGraph B a: A b, c: B f: b $-> c
(a, b) $-> (a, c)
exact (Id a, f).Defined.
A, B: 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 a: A
Is1Functor (funb : B => (a, b))
A, B: 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 a: A
Is1Functor (funb : B => (a, b))
A, B: 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 a: A
forall (a0b : B) (fg : a0 $-> b),
f $== g ->
fmap (funb0 : B => (a, b0)) f $==
fmap (funb0 : B => (a, b0)) g
A, B: 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 a: A
foralla0 : B,
fmap (funb : B => (a, b)) (Id a0) $== Id (a, a0)
A, B: 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 a: A
forall (a0bc : B) (f : a0 $-> b)
(g : b $-> c),
fmap (funb0 : B => (a, b0)) (g $o f) $==
fmap (funb0 : B => (a, b0)) g $o
fmap (funb0 : B => (a, b0)) f
A, B: 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 a: A
forall (a0b : B) (fg : a0 $-> b),
f $== g ->
fmap (funb0 : B => (a, b0)) f $==
fmap (funb0 : B => (a, b0)) g
A, B: 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 a: A b, c: B f, g: b $-> c p: f $== g
fmap (funb : B => (a, b)) f $==
fmap (funb : B => (a, b)) g
exact (Id _, p).
A, B: 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 a: A
foralla0 : B,
fmap (funb : B => (a, b)) (Id a0) $== Id (a, a0)
intros b; reflexivity.
A, B: 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 a: A
forall (a0bc : B) (f : a0 $-> b)
(g : b $-> c),
fmap (funb0 : B => (a, b0)) (g $o f) $==
fmap (funb0 : B => (a, b0)) g $o
fmap (funb0 : B => (a, b0)) f
A, B: 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 a: A b, c, d: B f: b $-> c g: c $-> d
fmap (funb : B => (a, b)) (g $o f) $==
fmap (funb : B => (a, b)) g $o
fmap (funb : B => (a, b)) f
exact ((cat_idl _)^$, Id _).Defined.(** Functors from a product category are functorial in each argument *)Global Instanceis0functor_functor_uncurried01 {ABC : Type}
`{Is01Cat A, IsGraph B, IsGraph C}
(F : A * B -> C) `{!Is0Functor F} (a : A)
: Is0Functor (funb => F (a, b))
:= is0functor_compose (funb => (a, b)) F.Global Instanceis1functor_functor_uncurried01 {ABC : Type}
`{Is1Cat A, Is1Cat B, Is1Cat C}
(F : A * B -> C) `{!Is0Functor F, !Is1Functor F} (a : A)
: Is1Functor (funb => F (a, b))
:= is1functor_compose (funb => (a, b)) F.Global Instanceis0functor_functor_uncurried10 {ABC : Type}
`{IsGraph A, Is01Cat B, IsGraph C}
(F : A * B -> C) `{!Is0Functor F} (b : B)
: Is0Functor (funa => F (a, b))
:= is0functor_compose (funa => (a, b)) F.Global Instanceis1functor_functor_uncurried10 {ABC : Type}
`{Is1Cat A, Is1Cat B, Is1Cat C}
(F : A * B -> C) `{!Is0Functor F, !Is1Functor F} (b : B)
: Is1Functor (funa => F (a, b))
:= is1functor_compose (funa => (a, b)) F.(** Conversely, if [F : A * B -> C] is a 0-functor in each variable, then it is a 0-functor. *)
A, B, C: Type H: IsGraph A H0: IsGraph B H1: IsGraph C H2: Is01Cat C F: A * B -> C H3: foralla : A, Is0Functor (funb : B => F (a, b)) H4: forallb : B, Is0Functor (funa : A => F (a, b))
Is0Functor 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 (funb : B => F (a, b)) H4: forallb : B, Is0Functor (funa : A => F (a, b))
Is0Functor 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 (funb : B => F (a, b)) H4: forallb : B, Is0Functor (funa : A => F (a, b))
forallab : A * B, (a $-> b) -> F a $-> F b
A, B, C: Type H: IsGraph A H0: IsGraph B H1: IsGraph C H2: Is01Cat C F: A * B -> C H3: foralla : A, Is0Functor (funb : B => F (a, b)) H4: forallb : B, Is0Functor (funa : A => F (a, b)) a: A b: B a': A b': B f: fst (a, b) $-> fst (a', b') g: snd (a, b) $-> snd (a', b')
F (a, b) $-> F (a', b')
exact (fmap (funa0 => F (a0,b')) f $o fmap (funb0 => F (a,b0)) g).Defined.(** TODO: If we make this an instance, will it cause typeclass search to spin? *)Hint Immediate is0functor_prod_is0functor : typeclass_instances.(** And if [F : A * B -> C] is a 1-functor in each variable and satisfies a coherence, then it is a 1-functor. *)
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 (funb : B => F (a, b)) H3: forallb : B, Is0Functor (funa : A => F (a, b)) H4: foralla : A, Is1Functor (funb : B => F (a, b)) H5: forallb : B, Is1Functor (funa : A => F (a, b)) bifunctor_coh: forall (a0a1 : A) (f : a0 $-> a1)
(b0b1 : B) (g : b0 $-> b1),
fmap (funb : B => F (a1, b)) g $o
fmap (funa : A => F (a, b0)) f $==
fmap (funa : A => F (a, b1)) f $o
fmap (funb : B => F (a0, b)) g
Is1Functor 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 (funb : B => F (a, b)) H3: forallb : B, Is0Functor (funa : A => F (a, b)) H4: foralla : A, Is1Functor (funb : B => F (a, b)) H5: forallb : B, Is1Functor (funa : A => F (a, b)) bifunctor_coh: forall (a0a1 : A) (f : a0 $-> a1)
(b0b1 : B) (g : b0 $-> b1),
fmap (funb : B => F (a1, b)) g $o
fmap (funa : A => F (a, b0)) f $==
fmap (funa : A => F (a, b1)) f $o
fmap (funb : B => F (a0, b)) g
Is1Functor 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 (funb : B => F (a, b)) H3: forallb : B, Is0Functor (funa : A => F (a, b)) H4: foralla : A, Is1Functor (funb : B => F (a, b)) H5: forallb : B, Is1Functor (funa : A => F (a, b)) bifunctor_coh: forall (a0a1 : A) (f : a0 $-> a1)
(b0b1 : B) (g : b0 $-> b1),
fmap (funb : B => F (a1, b)) g $o
fmap (funa : A => F (a, b0)) f $==
fmap (funa : A => F (a, b1)) f $o
fmap (funb : B => F (a0, b)) g
forall (ab : A * B) (fg : a $-> b),
f $== g -> fmap F f $== fmap 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 (funb : B => F (a, b)) H3: forallb : B, Is0Functor (funa : A => F (a, b)) H4: foralla : A, Is1Functor (funb : B => F (a, b)) H5: forallb : B, Is1Functor (funa : A => F (a, b)) bifunctor_coh: forall (a0a1 : A) (f : a0 $-> a1)
(b0b1 : B) (g : b0 $-> b1),
fmap (funb : B => F (a1, b)) g $o
fmap (funa : A => F (a, b0)) f $==
fmap (funa : A => F (a, b1)) f $o
fmap (funb : B => F (a0, b)) g
foralla : A * B, fmap F (Id a) $== Id (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 (funb : B => F (a, b)) H3: forallb : B, Is0Functor (funa : A => F (a, b)) H4: foralla : A, Is1Functor (funb : B => F (a, b)) H5: forallb : B, Is1Functor (funa : A => F (a, b)) bifunctor_coh: forall (a0a1 : A) (f : a0 $-> a1)
(b0b1 : B) (g : b0 $-> b1),
fmap (funb : B => F (a1, b)) g $o
fmap (funa : A => F (a, b0)) f $==
fmap (funa : A => F (a, b1)) f $o
fmap (funb : B => F (a0, b)) g
forall (abc : A * B)
(f : a $-> b) (g : b $-> c),
fmap F (g $o f) $== fmap F g $o fmap 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 H2: foralla : A, Is0Functor (funb : B => F (a, b)) H3: forallb : B, Is0Functor (funa : A => F (a, b)) H4: foralla : A, Is1Functor (funb : B => F (a, b)) H5: forallb : B, Is1Functor (funa : A => F (a, b)) bifunctor_coh: forall (a0a1 : A) (f : a0 $-> a1)
(b0b1 : B) (g : b0 $-> b1),
fmap (funb : B => F (a1, b)) g $o
fmap (funa : A => F (a, b0)) f $==
fmap (funa : A => F (a, b1)) f $o
fmap (funb : B => F (a0, b)) g
forall (ab : A * B) (fg : a $-> b),
f $== g -> fmap F f $== fmap 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 (funb : B => F (a, b)) H3: forallb : B, Is0Functor (funa : A => F (a, b)) H4: foralla : A, Is1Functor (funb : B => F (a, b)) H5: forallb : B, Is1Functor (funa : A => F (a, b)) bifunctor_coh: forall (a0a1 : A) (f : a0 $-> a1)
(b0b1 : B) (g : b0 $-> b1),
fmap (funb : B => F (a1, b)) g $o
fmap (funa : A => F (a, b0)) f $==
fmap (funa : A => F (a, b1)) f $o
fmap (funb : B => F (a0, b)) g a: A b: B a': A b': B f: a $-> a' g: b $-> b' f': a $-> a' g': b $-> b' p: f $-> f' p': g $-> g'
fmap F (f, g) $== fmap F (f', g')
exact (fmap2 (funb0 => F (a,b0)) p' $@@ fmap2 (funa0 => F (a0,b')) p).
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 (funb : B => F (a, b)) H3: forallb : B, Is0Functor (funa : A => F (a, b)) H4: foralla : A, Is1Functor (funb : B => F (a, b)) H5: forallb : B, Is1Functor (funa : A => F (a, b)) bifunctor_coh: forall (a0a1 : A) (f : a0 $-> a1)
(b0b1 : B) (g : b0 $-> b1),
fmap (funb : B => F (a1, b)) g $o
fmap (funa : A => F (a, b0)) f $==
fmap (funa : A => F (a, b1)) f $o
fmap (funb : B => F (a0, b)) g
foralla : A * B, fmap F (Id a) $== Id (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 (funb : B => F (a, b)) H3: forallb : B, Is0Functor (funa : A => F (a, b)) H4: foralla : A, Is1Functor (funb : B => F (a, b)) H5: forallb : B, Is1Functor (funa : A => F (a, b)) bifunctor_coh: forall (a0a1 : A) (f : a0 $-> a1)
(b0b1 : B) (g : b0 $-> b1),
fmap (funb : B => F (a1, b)) g $o
fmap (funa : A => F (a, b0)) f $==
fmap (funa : A => F (a, b1)) f $o
fmap (funb : B => F (a0, b)) g a: A b: B
fmap F (Id (a, b)) $== Id (F (a, b))
exact ((fmap_id (funb0 => F (a,b0)) b $@@ fmap_id (funa0 => F (a0,b)) _) $@ cat_idr _).
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 (funb : B => F (a, b)) H3: forallb : B, Is0Functor (funa : A => F (a, b)) H4: foralla : A, Is1Functor (funb : B => F (a, b)) H5: forallb : B, Is1Functor (funa : A => F (a, b)) bifunctor_coh: forall (a0a1 : A) (f : a0 $-> a1)
(b0b1 : B) (g : b0 $-> b1),
fmap (funb : B => F (a1, b)) g $o
fmap (funa : A => F (a, b0)) f $==
fmap (funa : A => F (a, b1)) f $o
fmap (funb : B => F (a0, b)) g
forall (abc : A * B)
(f : a $-> b) (g : b $-> c),
fmap F (g $o f) $== fmap F g $o fmap 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 H2: foralla : A, Is0Functor (funb : B => F (a, b)) H3: forallb : B, Is0Functor (funa : A => F (a, b)) H4: foralla : A, Is1Functor (funb : B => F (a, b)) H5: forallb : B, Is1Functor (funa : A => F (a, b)) bifunctor_coh: forall (a0a1 : A) (f : a0 $-> a1)
(b0b1 : B) (g : b0 $-> b1),
fmap (funb : B => F (a1, b)) g $o
fmap (funa : A => F (a, b0)) f $==
fmap (funa : A => F (a, b1)) f $o
fmap (funb : B => F (a0, b)) g a: A b: B a': A b': B a'': A b'': B f: a $-> a' g: b $-> b' f': a' $-> a'' g': b' $-> b''
fmap F ((f', g') $o (f, g)) $==
fmap F (f', g') $o fmap 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 (funb : B => F (a, b)) H3: forallb : B, Is0Functor (funa : A => F (a, b)) H4: foralla : A, Is1Functor (funb : B => F (a, b)) H5: forallb : B, Is1Functor (funa : A => F (a, b)) bifunctor_coh: forall (a0a1 : A) (f : a0 $-> a1)
(b0b1 : B) (g : b0 $-> b1),
fmap (funb : B => F (a1, b)) g $o
fmap (funa : A => F (a, b0)) f $==
fmap (funa : A => F (a, b1)) f $o
fmap (funb : B => F (a0, b)) g a: A b: B a': A b': B a'': A b'': B f: a $-> a' g: b $-> b' f': a' $-> a'' g': b' $-> b''
fmap (funa : A => F (a, b'')) f' $o
fmap (funa : A => F (a, b'')) f $o
(fmap (funb : B => F (a, b)) g' $o
fmap (funb : B => F (a, b)) g) $==
fmap F (f', g') $o fmap 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 (funb : B => F (a, b)) H3: forallb : B, Is0Functor (funa : A => F (a, b)) H4: foralla : A, Is1Functor (funb : B => F (a, b)) H5: forallb : B, Is1Functor (funa : A => F (a, b)) bifunctor_coh: forall (a0a1 : A) (f : a0 $-> a1)
(b0b1 : B) (g : b0 $-> b1),
fmap (funb : B => F (a1, b)) g $o
fmap (funa : A => F (a, b0)) f $==
fmap (funa : A => F (a, b1)) f $o
fmap (funb : B => F (a0, b)) g a: A b: B a': A b': B a'': A b'': B f: a $-> a' g: b $-> b' f': a' $-> a'' g': b' $-> b''
fmap (funa : A => F (a, b'')) f' $o
fmap (funa : A => F (a, b'')) f $o
fmap (funb : B => F (a, b)) g' $==
fmap F (f', g') $o fmap (funa : A => F (a, b')) 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 (funb : B => F (a, b)) H3: forallb : B, Is0Functor (funa : A => F (a, b)) H4: foralla : A, Is1Functor (funb : B => F (a, b)) H5: forallb : B, Is1Functor (funa : A => F (a, b)) bifunctor_coh: forall (a0a1 : A) (f : a0 $-> a1)
(b0b1 : B) (g : b0 $-> b1),
fmap (funb : B => F (a1, b)) g $o
fmap (funa : A => F (a, b0)) f $==
fmap (funa : A => F (a, b1)) f $o
fmap (funb : B => F (a0, b)) g a: A b: B a': A b': B a'': A b'': B f: a $-> a' g: b $-> b' f': a' $-> a'' g': b' $-> b''
fmap (funb : B => F (a', b)) g' $o
fmap (funa : A => F (a, b')) f $->
fmap (funa : A => F (a, b'')) f $o
fmap (funb : B => F (a, b)) g'
nrapply bifunctor_coh.Defined.Hint Immediate is1functor_prod_is1functor : typeclass_instances.(** Applies a two variable functor via uncurrying. Note that the precondition on [C] is slightly weaker than that of [Bifunctor.fmap11]. *)Definitionfmap11_uncurry {ABC : Type} `{IsGraph A, IsGraph B, IsGraph C}
(F : A -> B -> C) {H2 : Is0Functor (uncurry F)}
{a0 a1 : A} (f : a0 $-> a1) {b0 b1 : B} (g : b0 $-> b1)
: F a0 b0 $-> F a1 b1
:= @fmap _ _ _ _ (uncurry F) H2 (a0, b0) (a1, b1) (f, g).Definitionfmap_pair {ABC : Type}
`{IsGraph A, IsGraph B, IsGraph C}
(F : A * B -> C) `{!Is0Functor F}
{a0 a1 : A} (f : a0 $-> a1) {b0 b1 : B} (g : b0 $-> b1)
: F (a0, b0) $-> F (a1, b1)
:= fmap (a := (a0, b0)) (b := (a1, b1)) F (f, g).Definitionfmap_pair_comp {ABC : Type}
`{Is1Cat A, Is1Cat B, Is1Cat C}
(F : A * B -> C) `{!Is0Functor F, !Is1Functor F}
{a0 a1 a2 : A} {b0 b1 b2 : B}
(f : a0 $-> a1) (h : b0 $-> b1) (g : a1 $-> a2) (i : b1 $-> b2)
: fmap_pair F (g $o f) (i $o h)
$== fmap_pair F g i $o fmap_pair F f h
:= fmap_comp (a := (a0, b0)) (b := (a1, b1)) (c := (a2, b2)) F (f, h) (g, i).Definitionfmap2_pair {ABC : Type}
`{Is1Cat A, Is1Cat B, Is1Cat C}
(F : A * B -> C) `{!Is0Functor F, !Is1Functor F}
{a0 a1 : A} {f f' : a0 $-> a1} (p : f $== f')
{b0 b1 : B} {g g' : b0 $-> b1} (q : g $== g')
: fmap_pair F f g $== fmap_pair F f' g'
:= fmap2 F (a := (a0, b0)) (b := (a1, b1)) (f := (f, g)) (g := (f' ,g')) (p, q).