Built with Alectryon, running Coq+SerAPI v8.19.0+0.19.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.Require Import Diagrams.Graph.Require Import Diagrams.Diagram.LocalOpen Scope path_scope.Generalizable All Variables.(** * Cocones *)(** A Cocone over a diagram [D] to a type [X] is a family of maps from the types of [D] to [X] making the triangles formed with the arrows of [D] commuting. *)ClassCocone {G : Graph} (D : Diagram G) (X : Type) := {
legs : foralli, D i -> X;
legs_comm : forallij (g : G i j), legs j o (D _f g) == legs i;
}.Arguments Build_Cocone {G D X} legs legs_comm.Arguments legs {G D X} C i x : rename.Arguments legs_comm {G D X} C i j g x : rename.Coercionlegs : Cocone >-> Funclass.Definitionissig_Cocone {G : Graph} (D : Diagram G) (X : Type)
: _ <~> Cocone D X := ltac:(issig).SectionCocone.Context `{Funext} {G : Graph} {D : Diagram G} {X : Type}.(** [path_cocone] says when two cocones are equal (up to funext). *)Definitionpath_cocone_naive {C1C2 : Cocone D X}
(P := funq' => forall (ij : G) (g : G i j) (x : D i),
q' j (D _f g x) = q' i x)
(path_legs : legs C1 = legs C2)
(path_legs_comm : transport P path_legs (legs_comm C1) = legs_comm C2)
: C1 = C2 :=
match path_legs_comm in (_ = v1)
return C1 = {|legs := legs C2; legs_comm := v1 |}
with
| idpath => match path_legs in (_ = v0)
return C1 = {|legs := v0; legs_comm := path_legs # (legs_comm C1) |}
with
| idpath => 1endend.
H: Funext G: Graph D: Diagram G X: Type C1, C2: Cocone D X path_legs: foralli : G, C1 i == C2 i path_legs_comm: forall (ij : G) (g : G i j)
(x : D i),
legs_comm C1 i j g x @ path_legs i x =
path_legs j ((D _f g) x) @
legs_comm C2 i j g x
C1 = C2
H: Funext G: Graph D: Diagram G X: Type C1, C2: Cocone D X path_legs: foralli : G, C1 i == C2 i path_legs_comm: forall (ij : G) (g : G i j)
(x : D i),
legs_comm C1 i j g x @ path_legs i x =
path_legs j ((D _f g) x) @
legs_comm C2 i j g x
C1 = C2
H: Funext G: Graph D: Diagram G X: Type legs: foralli : G, D i -> X pp_q: forall (ij : G) (g : G i j),
(funx : D i => legs j ((D _f g) x)) == legs i r: foralli : G, D i -> X pp_r: forall (ij : G) (g : G i j),
(funx : D i => r j ((D _f g) x)) == r i path_legs: foralli : G,
{| legs := legs; legs_comm := pp_q |} i ==
{| legs := r; legs_comm := pp_r |} i path_legs_comm: forall (ij : G) (g : G i j)
(x : D i),
legs_comm
{|
legs := legs; legs_comm := pp_q
|} i j g x @ path_legs i x =
path_legs j ((D _f g) x) @
legs_comm
{| legs := r; legs_comm := pp_r |}
i j g x
{| legs := legs; legs_comm := pp_q |} =
{| legs := r; legs_comm := pp_r |}
H: Funext G: Graph D: Diagram G X: Type legs: foralli : G, D i -> X pp_q: forall (ij : G) (g : G i j),
(funx : D i => legs j ((D _f g) x)) == legs i r: foralli : G, D i -> X pp_r: forall (ij : G) (g : G i j),
(funx : D i => r j ((D _f g) x)) == r i path_legs: foralli : G,
{| legs := legs; legs_comm := pp_q |} i ==
{| legs := r; legs_comm := pp_r |} i path_legs_comm: forall (ij : G) (g : G i j)
(x : D i),
legs_comm
{|
legs := legs; legs_comm := pp_q
|} i j g x @ path_legs i x =
path_legs j ((D _f g) x) @
legs_comm
{| legs := r; legs_comm := pp_r |}
i j g x
transport
(funq' : forallx : G, D x -> X =>
forall (ij : G) (g : G i j) (x : D i),
q' j ((D _f g) x) = q' i x)
(path_forall {| legs := legs; legs_comm := pp_q |}
{| legs := r; legs_comm := pp_r |}
(funi : G =>
path_forall
({| legs := legs; legs_comm := pp_q |} i)
({| legs := r; legs_comm := pp_r |} i)
(path_legs i)))
(legs_comm {| legs := legs; legs_comm := pp_q |}) =
legs_comm {| legs := r; legs_comm := pp_r |}
H: Funext G: Graph D: Diagram G X: Type legs: foralli : G, D i -> X pp_q: forall (ij : G) (g : G i j),
(funx : D i => legs j ((D _f g) x)) == legs i r: foralli : G, D i -> X pp_r: forall (ij : G) (g : G i j),
(funx : D i => r j ((D _f g) x)) == r i path_legs: foralli : G,
{| legs := legs; legs_comm := pp_q |} i ==
{| legs := r; legs_comm := pp_r |} i path_legs_comm: forall (ij : G) (g : G i j)
(x : D i),
legs_comm
{|
legs := legs; legs_comm := pp_q
|} i j g x @ path_legs i x =
path_legs j ((D _f g) x) @
legs_comm
{| legs := r; legs_comm := pp_r |}
i j g x i, j: G f: G i j x: D i
transport
(funq' : forallx : G, D x -> X =>
forall (ij : G) (g : G i j) (x : D i),
q' j ((D _f g) x) = q' i x)
(path_forall legs r
(funi : G =>
path_forall (legs i) (r i) (path_legs i))) pp_q
i j f x = pp_r i j f x
H: Funext G: Graph D: Diagram G X: Type legs: foralli : G, D i -> X pp_q: forall (ij : G) (g : G i j),
(funx : D i => legs j ((D _f g) x)) == legs i r: foralli : G, D i -> X pp_r: forall (ij : G) (g : G i j),
(funx : D i => r j ((D _f g) x)) == r i path_legs: foralli : G,
{| legs := legs; legs_comm := pp_q |} i ==
{| legs := r; legs_comm := pp_r |} i path_legs_comm: forall (ij : G) (g : G i j)
(x : D i),
legs_comm
{|
legs := legs; legs_comm := pp_q
|} i j g x @ path_legs i x =
path_legs j ((D _f g) x) @
legs_comm
{| legs := r; legs_comm := pp_r |}
i j g x i, j: G f: G i j x: D i
((ap
(funx0 : forallx : G, D x -> X =>
x0 j ((D _f f) x))
(path_forall legs r
(funi : G =>
path_forall (legs i) (r i) (path_legs i))))^ @
pp_q i j f x) @
ap (funx0 : forallx : G, D x -> X => x0 i x)
(path_forall legs r
(funi : G =>
path_forall (legs i) (r i) (path_legs i))) =
pp_r i j f x
H: Funext G: Graph D: Diagram G X: Type legs: foralli : G, D i -> X pp_q: forall (ij : G) (g : G i j),
(funx : D i => legs j ((D _f g) x)) == legs i r: foralli : G, D i -> X pp_r: forall (ij : G) (g : G i j),
(funx : D i => r j ((D _f g) x)) == r i path_legs: foralli : G,
{| legs := legs; legs_comm := pp_q |} i ==
{| legs := r; legs_comm := pp_r |} i path_legs_comm: forall (ij : G) (g : G i j)
(x : D i),
legs_comm
{|
legs := legs; legs_comm := pp_q
|} i j g x @ path_legs i x =
path_legs j ((D _f g) x) @
legs_comm
{| legs := r; legs_comm := pp_r |}
i j g x i, j: G f: G i j x: D i
pp_q i j f x @
ap (funx0 : forallx : G, D x -> X => x0 i x)
(path_forall legs r
(funi : G =>
path_forall (legs i) (r i) (path_legs i))) =
ap
(funx0 : forallx : G, D x -> X =>
x0 j ((D _f f) x))
(path_forall legs r
(funi : G =>
path_forall (legs i) (r i) (path_legs i))) @
pp_r i j f x
H: Funext G: Graph D: Diagram G X: Type legs: foralli : G, D i -> X pp_q: forall (ij : G) (g : G i j),
(funx : D i => legs j ((D _f g) x)) == legs i r: foralli : G, D i -> X pp_r: forall (ij : G) (g : G i j),
(funx : D i => r j ((D _f g) x)) == r i path_legs: foralli : G,
{| legs := legs; legs_comm := pp_q |} i ==
{| legs := r; legs_comm := pp_r |} i path_legs_comm: forall (ij : G) (g : G i j)
(x : D i),
legs_comm
{|
legs := legs; legs_comm := pp_q
|} i j g x @ path_legs i x =
path_legs j ((D _f g) x) @
legs_comm
{| legs := r; legs_comm := pp_r |}
i j g x i, j: G f: G i j x: D i
pp_q i j f x @
apD10
(apD10
(path_forall
{| legs := legs; legs_comm := pp_q |}
{| legs := r; legs_comm := pp_r |}
(funi : G =>
path_forall
({| legs := legs; legs_comm := pp_q |} i)
({| legs := r; legs_comm := pp_r |} i)
(path_legs i))) i) x =
apD10
(apD10
(path_forall
{| legs := legs; legs_comm := pp_q |}
{| legs := r; legs_comm := pp_r |}
(funi : G =>
path_forall
({| legs := legs; legs_comm := pp_q |} i)
({| legs := r; legs_comm := pp_r |} i)
(path_legs i))) j) ((D _f f) x) @
pp_r i j f x
H: Funext G: Graph D: Diagram G X: Type legs: foralli : G, D i -> X pp_q: forall (ij : G) (g : G i j),
(funx : D i => legs j ((D _f g) x)) == legs i r: foralli : G, D i -> X pp_r: forall (ij : G) (g : G i j),
(funx : D i => r j ((D _f g) x)) == r i path_legs: foralli : G,
{| legs := legs; legs_comm := pp_q |} i ==
{| legs := r; legs_comm := pp_r |} i path_legs_comm: forall (ij : G) (g : G i j)
(x : D i),
legs_comm
{|
legs := legs; legs_comm := pp_q
|} i j g x @ path_legs i x =
path_legs j ((D _f g) x) @
legs_comm
{| legs := r; legs_comm := pp_r |}
i j g x i, j: G f: G i j x: D i
pp_q i j f x @ path_legs i x =
path_legs j ((D _f f) x) @ pp_r i j f x
apply path_legs_comm.Defined.(** Given a cocone [C] to [X] and a map from [X] to [Y], one can postcompose each map of [C] to get a cocone to [Y]. *)
H: Funext G: Graph D: Diagram G X: Type C: Cocone D X Y: Type
(X -> Y) -> Cocone D Y
H: Funext G: Graph D: Diagram G X: Type C: Cocone D X Y: Type
(X -> Y) -> Cocone D Y
H: Funext G: Graph D: Diagram G X: Type C: Cocone D X Y: Type f: X -> Y
Cocone D Y
H: Funext G: Graph D: Diagram G X: Type C: Cocone D X Y: Type f: X -> Y i: G
D i -> Y
H: Funext G: Graph D: Diagram G X: Type C: Cocone D X Y: Type f: X -> Y i: G
forall (j : G) (g : G i j),
(funi : G => ?Goal) j o D _f g ==
(funi : G => ?Goal) i
H: Funext G: Graph D: Diagram G X: Type C: Cocone D X Y: Type f: X -> Y i: G
forall (j : G) (g : G i j),
(funi : G => f o C i) j o D _f g ==
(funi : G => f o C i) i
H: Funext G: Graph D: Diagram G X: Type C: Cocone D X Y: Type f: X -> Y i, j: G g: G i j x: D i
f (C j ((D _f g) x)) = f (C i x)
exact (ap f (legs_comm _ i j g x)).Defined.(** ** Universality of a cocone. *)(** A colimit will be the extremity of a universal cocone. *)(** A cocone [C] over [D] to [X] is said universal when for all [Y] the map [cocone_postcompose] is an equivalence. In particular, given another cocone [C'] over [D] to [X'] the inverse of the map allows to recover a map [h] : [X] -> [X'] such that [C'] is [C] postcomposed with [h]. The fact that [cocone_postcompose] is an equivalence is an elegant way of stating the usual "unique existence" of category theory. *)ClassUniversalCocone (C : Cocone D X) := {
is_universal :: forallY, IsEquiv (@cocone_postcompose C Y);
}.Coercionis_universal : UniversalCocone >-> Funclass.EndCocone.(** We now prove several functoriality results, first on cocone and then on colimits. *)SectionFunctorialityCocone.Context `{Funext} {G: Graph}.(** ** Postcomposition for cocones *)(** Identity and associativity for the postcomposition of a cocone with a map. *)
H: Funext G: Graph D: Diagram G X: Type C: Cocone D X
cocone_postcompose C idmap = C
H: Funext G: Graph D: Diagram G X: Type C: Cocone D X
cocone_postcompose C idmap = C
H: Funext G: Graph D: Diagram G X: Type C: Cocone D X i: G
cocone_postcompose C idmap i == C i
H: Funext G: Graph D: Diagram G X: Type C: Cocone D X i: G
forall (j : G) (g : G i j) (x : D i),
legs_comm (cocone_postcompose C idmap) i j g x @
(funi : G => ?Goal) i x =
(funi : G => ?Goal) j ((D _f g) x) @
legs_comm C i j g x
H: Funext G: Graph D: Diagram G X: Type C: Cocone D X i: G
forall (j : G) (g : G i j) (x : D i),
legs_comm (cocone_postcompose C idmap) i j g x @
(fun (i : G) (x0 : D i) => 1) i x =
(fun (i : G) (x0 : D i) => 1) j ((D _f g) x) @
legs_comm C i j g x
H: Funext G: Graph D: Diagram G X: Type C: Cocone D X i, j: G g: G i j x: D i
ap idmap (legs_comm C i j g x) @ 1 =
1 @ legs_comm C i j g x
apply equiv_p1_1q, ap_idmap.Defined.
H: Funext G: Graph D: Diagram G X, Y: Type f: X -> Y Z: Type g: Y -> Z C: Cocone D X
cocone_postcompose C (g o f) =
cocone_postcompose (cocone_postcompose C f) g
H: Funext G: Graph D: Diagram G X, Y: Type f: X -> Y Z: Type g: Y -> Z C: Cocone D X
cocone_postcompose C (g o f) =
cocone_postcompose (cocone_postcompose C f) g
H: Funext G: Graph D: Diagram G X, Y: Type f: X -> Y Z: Type g: Y -> Z C: Cocone D X i: G
cocone_postcompose C (g o f) i ==
cocone_postcompose (cocone_postcompose C f) g i
H: Funext G: Graph D: Diagram G X, Y: Type f: X -> Y Z: Type g: Y -> Z C: Cocone D X i: G
forall (j : G) (g0 : G i j) (x : D i),
legs_comm (cocone_postcompose C (g o f)) i j g0 x @
(funi : G => ?Goal) i x =
(funi : G => ?Goal) j ((D _f g0) x) @
legs_comm
(cocone_postcompose (cocone_postcompose C f) g) i j
g0 x
H: Funext G: Graph D: Diagram G X, Y: Type f: X -> Y Z: Type g: Y -> Z C: Cocone D X i: G
forall (j : G) (g0 : G i j) (x : D i),
legs_comm (cocone_postcompose C (g o f)) i j g0 x @
(fun (i : G) (x0 : D i) => 1) i x =
(fun (i : G) (x0 : D i) => 1) j ((D _f g0) x) @
legs_comm
(cocone_postcompose (cocone_postcompose C f) g) i j
g0 x
H: Funext G: Graph D: Diagram G X, Y: Type f: X -> Y Z: Type g: Y -> Z C: Cocone D X i, j: G h: G i j x: D i
ap (funx : X => g (f x)) (legs_comm C i j h x) @ 1 =
1 @ ap g (ap f (legs_comm C i j h x))
apply equiv_p1_1q, ap_compose.Defined.(** ** Precomposition for cocones *)(** Given a cocone over [D2] and a Diagram map [m] : [D1] => [D2], one can precompose each map of the cocone by the corresponding one of [m] to get a cocone over [D1]. *)
H: Funext G: Graph D1, D2: Diagram G m: DiagramMap D1 D2 X: Type
Cocone D2 X -> Cocone D1 X
H: Funext G: Graph D1, D2: Diagram G m: DiagramMap D1 D2 X: Type
Cocone D2 X -> Cocone D1 X
H: Funext G: Graph D1, D2: Diagram G m: DiagramMap D1 D2 X: Type C: Cocone D2 X
Cocone D1 X
H: Funext G: Graph D1, D2: Diagram G m: DiagramMap D1 D2 X: Type C: Cocone D2 X i: G
D1 i -> X
H: Funext G: Graph D1, D2: Diagram G m: DiagramMap D1 D2 X: Type C: Cocone D2 X i: G
forall (j : G) (g : G i j),
(funi : G => ?Goal) j o D1 _f g ==
(funi : G => ?Goal) i
H: Funext G: Graph D1, D2: Diagram G m: DiagramMap D1 D2 X: Type C: Cocone D2 X i: G
forall (j : G) (g : G i j),
(funi : G => C i o m i) j o D1 _f g ==
(funi : G => C i o m i) i
H: Funext G: Graph D1, D2: Diagram G m: DiagramMap D1 D2 X: Type C: Cocone D2 X i, j: G g: G i j x: D1 i
C j (m j ((D1 _f g) x)) = C i (m i x)
H: Funext G: Graph D1, D2: Diagram G m: DiagramMap D1 D2 X: Type C: Cocone D2 X i, j: G g: G i j x: D1 i
C j (m j ((D1 _f g) x)) = ?Goal
H: Funext G: Graph D1, D2: Diagram G m: DiagramMap D1 D2 X: Type C: Cocone D2 X i, j: G g: G i j x: D1 i
?Goal = C i (m i x)
H: Funext G: Graph D1, D2: Diagram G m: DiagramMap D1 D2 X: Type C: Cocone D2 X i, j: G g: G i j x: D1 i
C j (m j ((D1 _f g) x)) = ?Goal
H: Funext G: Graph D1, D2: Diagram G m: DiagramMap D1 D2 X: Type C: Cocone D2 X i, j: G g: G i j x: D1 i
m j ((D1 _f g) x) = ?y
H: Funext G: Graph D1, D2: Diagram G m: DiagramMap D1 D2 X: Type C: Cocone D2 X i, j: G g: G i j x: D1 i
?y = m j ((D1 _f g) x)
apply DiagramMap_comm.
H: Funext G: Graph D1, D2: Diagram G m: DiagramMap D1 D2 X: Type C: Cocone D2 X i, j: G g: G i j x: D1 i
C j ((D2 _f g) (m i x)) = C i (m i x)
apply legs_comm.Defined.(** Identity and associativity for the precomposition of a cocone with a diagram map. *)
H: Funext G: Graph D: Diagram G X: Type
cocone_precompose (diagram_idmap D) == idmap
H: Funext G: Graph D: Diagram G X: Type
cocone_precompose (diagram_idmap D) == idmap
H: Funext G: Graph D: Diagram G X: Type C: Cocone D X
foralli : G, (funx : D i => C i x) == C i
H: Funext G: Graph D: Diagram G X: Type C: Cocone D X
forall (ij : G) (g : G i j) (x : D i),
(1 @ legs_comm C i j g x) @ ?Goal i x =
?Goal j ((D _f g) x) @ legs_comm C i j g x
H: Funext G: Graph D: Diagram G X: Type C: Cocone D X
forall (ij : G) (g : G i j) (x : D i),
(1 @ legs_comm C i j g x) @
(fun (i0 : G) (x0 : D i0) => 1) i x =
(fun (i0 : G) (x0 : D i0) => 1) j ((D _f g) x) @
legs_comm C i j g x
H: Funext G: Graph D: Diagram G X: Type C: Cocone D X i, j: G g: G i j x: D i
(1 @ legs_comm C i j g x) @ 1 =
1 @ legs_comm C i j g x
apply concat_p1.Defined.
H: Funext G: Graph D1, D2, D3: Diagram G m2: DiagramMap D2 D3 m1: DiagramMap D1 D2 X: Type
cocone_precompose m1 o cocone_precompose m2 ==
cocone_precompose (diagram_comp m2 m1)
H: Funext G: Graph D1, D2, D3: Diagram G m2: DiagramMap D2 D3 m1: DiagramMap D1 D2 X: Type
cocone_precompose m1 o cocone_precompose m2 ==
cocone_precompose (diagram_comp m2 m1)
H: Funext G: Graph D1, D2, D3: Diagram G m2: DiagramMap D2 D3 m1: DiagramMap D1 D2 X: Type C: Cocone D3 X
cocone_precompose m1 (cocone_precompose m2 C) =
cocone_precompose (diagram_comp m2 m1) C
H: Funext G: Graph D1, D2, D3: Diagram G m2: DiagramMap D2 D3 m1: DiagramMap D1 D2 X: Type C: Cocone D3 X
foralli : G,
cocone_precompose m1 (cocone_precompose m2 C) i ==
cocone_precompose (diagram_comp m2 m1) C i
H: Funext G: Graph D1, D2, D3: Diagram G m2: DiagramMap D2 D3 m1: DiagramMap D1 D2 X: Type C: Cocone D3 X
forall (ij : G) (g : G i j) (x : D1 i),
legs_comm
(cocone_precompose m1 (cocone_precompose m2 C)) i j
g x @ ?path_legs i x =
?path_legs j ((D1 _f g) x) @
legs_comm (cocone_precompose (diagram_comp m2 m1) C) i
j g x
H: Funext G: Graph D1, D2, D3: Diagram G m2: DiagramMap D2 D3 m1: DiagramMap D1 D2 X: Type C: Cocone D3 X
forall (ij : G) (g : G i j) (x : D1 i),
legs_comm
(cocone_precompose m1 (cocone_precompose m2 C)) i j
g x @ (fun (i0 : G) (x0 : D1 i0) => 1) i x =
(fun (i0 : G) (x0 : D1 i0) => 1) j ((D1 _f g) x) @
legs_comm (cocone_precompose (diagram_comp m2 m1) C) i
j g x
H: Funext G: Graph D1, D2, D3: Diagram G m2: DiagramMap D2 D3 m1: DiagramMap D1 D2 X: Type C: Cocone D3 X i, j: G g: G i j x: D1 i
(ap (funx : D2 j => C j (m2 j x))
(DiagramMap_comm m1 g x)^ @
(ap (C j) (DiagramMap_comm m2 g (m1 i x))^ @
legs_comm C i j g (m2 i (m1 i x)))) @ 1 =
1 @
(ap (C j)
(CommutativeSquares.comm_square_comp
(DiagramMap_comm m1 g) (DiagramMap_comm m2 g) x)^ @
legs_comm C i j g (m2 i (m1 i x)))
H: Funext G: Graph D1, D2, D3: Diagram G m2: DiagramMap D2 D3 m1: DiagramMap D1 D2 X: Type C: Cocone D3 X i, j: G g: G i j x: D1 i
ap (funx : D2 j => C j (m2 j x))
(DiagramMap_comm m1 g x)^ @
(ap (C j) (DiagramMap_comm m2 g (m1 i x))^ @
legs_comm C i j g (m2 i (m1 i x))) =
ap (C j)
(CommutativeSquares.comm_square_comp
(DiagramMap_comm m1 g) (DiagramMap_comm m2 g) x)^ @
legs_comm C i j g (m2 i (m1 i x))
H: Funext G: Graph D1, D2, D3: Diagram G m2: DiagramMap D2 D3 m1: DiagramMap D1 D2 X: Type C: Cocone D3 X i, j: G g: G i j x: D1 i
ap (funx : D2 j => C j (m2 j x))
(DiagramMap_comm m1 g x)^ @
(ap (C j) (DiagramMap_comm m2 g (m1 i x))^ @
legs_comm C i j g (m2 i (m1 i x))) =
ap (C j)
(DiagramMap_comm m2 g (m1 i x) @
ap (m2 j) (DiagramMap_comm m1 g x))^ @
legs_comm C i j g (m2 i (m1 i x))
H: Funext G: Graph D1, D2, D3: Diagram G m2: DiagramMap D2 D3 m1: DiagramMap D1 D2 X: Type C: Cocone D3 X i, j: G g: G i j x: D1 i
(ap (funx : D2 j => C j (m2 j x))
(DiagramMap_comm m1 g x)^ @
ap (C j) (DiagramMap_comm m2 g (m1 i x))^) @
legs_comm C i j g (m2 i (m1 i x)) =
ap (C j)
(DiagramMap_comm m2 g (m1 i x) @
ap (m2 j) (DiagramMap_comm m1 g x))^ @
legs_comm C i j g (m2 i (m1 i x))
H: Funext G: Graph D1, D2, D3: Diagram G m2: DiagramMap D2 D3 m1: DiagramMap D1 D2 X: Type C: Cocone D3 X i, j: G g: G i j x: D1 i
ap (funx : D2 j => C j (m2 j x))
(DiagramMap_comm m1 g x)^ @
ap (C j) (DiagramMap_comm m2 g (m1 i x))^ =
ap (C j)
(DiagramMap_comm m2 g (m1 i x) @
ap (m2 j) (DiagramMap_comm m1 g x))^
H: Funext G: Graph D1, D2, D3: Diagram G m2: DiagramMap D2 D3 m1: DiagramMap D1 D2 X: Type C: Cocone D3 X i, j: G g: G i j x: D1 i
(ap (funx : D2 j => C j (m2 j x))
(DiagramMap_comm m1 g x))^ @
(ap (C j) (DiagramMap_comm m2 g (m1 i x)))^ =
(ap (C j)
(DiagramMap_comm m2 g (m1 i x) @
ap (m2 j) (DiagramMap_comm m1 g x)))^
H: Funext G: Graph D1, D2, D3: Diagram G m2: DiagramMap D2 D3 m1: DiagramMap D1 D2 X: Type C: Cocone D3 X i, j: G g: G i j x: D1 i
(ap (C j) (DiagramMap_comm m2 g (m1 i x)) @
ap (funx : D2 j => C j (m2 j x))
(DiagramMap_comm m1 g x))^ =
(ap (C j)
(DiagramMap_comm m2 g (m1 i x) @
ap (m2 j) (DiagramMap_comm m1 g x)))^
H: Funext G: Graph D1, D2, D3: Diagram G m2: DiagramMap D2 D3 m1: DiagramMap D1 D2 X: Type C: Cocone D3 X i, j: G g: G i j x: D1 i
ap (C j) (DiagramMap_comm m2 g (m1 i x)) @
ap (funx : D2 j => C j (m2 j x))
(DiagramMap_comm m1 g x) =
ap (C j)
(DiagramMap_comm m2 g (m1 i x) @
ap (m2 j) (DiagramMap_comm m1 g x))
H: Funext G: Graph D1, D2, D3: Diagram G m2: DiagramMap D2 D3 m1: DiagramMap D1 D2 X: Type C: Cocone D3 X i, j: G g: G i j x: D1 i
ap (C j) (DiagramMap_comm m2 g (m1 i x)) @
ap (funx : D2 j => C j (m2 j x))
(DiagramMap_comm m1 g x) =
ap (C j) (DiagramMap_comm m2 g (m1 i x)) @
ap (C j) (ap (m2 j) (DiagramMap_comm m1 g x))
H: Funext G: Graph D1, D2, D3: Diagram G m2: DiagramMap D2 D3 m1: DiagramMap D1 D2 X: Type C: Cocone D3 X i, j: G g: G i j x: D1 i
ap (funx : D2 j => C j (m2 j x))
(DiagramMap_comm m1 g x) =
ap (C j) (ap (m2 j) (DiagramMap_comm m1 g x))
byrewrite ap_compose.Defined.(** Associativity of a precomposition and a postcomposition. *)
H: Funext G: Graph D1, D2: Diagram G m: DiagramMap D1 D2 X, Y: Type f: X -> Y C: Cocone D2 X
cocone_postcompose (cocone_precompose m C) f =
cocone_precompose m (cocone_postcompose C f)
H: Funext G: Graph D1, D2: Diagram G m: DiagramMap D1 D2 X, Y: Type f: X -> Y C: Cocone D2 X
cocone_postcompose (cocone_precompose m C) f =
cocone_precompose m (cocone_postcompose C f)
H: Funext G: Graph D1, D2: Diagram G m: DiagramMap D1 D2 X, Y: Type f: X -> Y C: Cocone D2 X i: G
cocone_postcompose (cocone_precompose m C) f i ==
cocone_precompose m (cocone_postcompose C f) i
H: Funext G: Graph D1, D2: Diagram G m: DiagramMap D1 D2 X, Y: Type f: X -> Y C: Cocone D2 X i: G
forall (j : G) (g : G i j) (x : D1 i),
legs_comm
(cocone_postcompose (cocone_precompose m C) f) i j g
x @ (funi : G => ?Goal) i x =
(funi : G => ?Goal) j ((D1 _f g) x) @
legs_comm
(cocone_precompose m (cocone_postcompose C f)) i j g
x
H: Funext G: Graph D1, D2: Diagram G m: DiagramMap D1 D2 X, Y: Type f: X -> Y C: Cocone D2 X i: G
forall (j : G) (g : G i j) (x : D1 i),
legs_comm
(cocone_postcompose (cocone_precompose m C) f) i j g
x @ (fun (i : G) (x0 : D1 i) => 1) i x =
(fun (i : G) (x0 : D1 i) => 1) j ((D1 _f g) x) @
legs_comm
(cocone_precompose m (cocone_postcompose C f)) i j g
x
H: Funext G: Graph D1, D2: Diagram G m: DiagramMap D1 D2 X, Y: Type f: X -> Y C: Cocone D2 X i, j: G g: G i j x: D1 i
ap f
(ap (C j) (DiagramMap_comm m g x)^ @
legs_comm C i j g (m i x)) @ 1 =
1 @
(ap (funx : D2 j => f (C j x))
(DiagramMap_comm m g x)^ @
ap f (legs_comm C i j g (m i x)))
H: Funext G: Graph D1, D2: Diagram G m: DiagramMap D1 D2 X, Y: Type f: X -> Y C: Cocone D2 X i, j: G g: G i j x: D1 i
ap f
(ap (C j) (DiagramMap_comm m g x)^ @
legs_comm C i j g (m i x)) =
ap (funx : D2 j => f (C j x))
(DiagramMap_comm m g x)^ @
ap f (legs_comm C i j g (m i x))
H: Funext G: Graph D1, D2: Diagram G m: DiagramMap D1 D2 X, Y: Type f: X -> Y C: Cocone D2 X i, j: G g: G i j x: D1 i
ap f
(ap (C j) (DiagramMap_comm m g x)^ @
legs_comm C i j g (m i x)) = ?Goal
H: Funext G: Graph D1, D2: Diagram G m: DiagramMap D1 D2 X, Y: Type f: X -> Y C: Cocone D2 X i, j: G g: G i j x: D1 i
?Goal =
ap (funx : D2 j => f (C j x))
(DiagramMap_comm m g x)^ @
ap f (legs_comm C i j g (m i x))
H: Funext G: Graph D1, D2: Diagram G m: DiagramMap D1 D2 X, Y: Type f: X -> Y C: Cocone D2 X i, j: G g: G i j x: D1 i
ap f
(ap (C j) (DiagramMap_comm m g x)^ @
legs_comm C i j g (m i x)) = ?Goal
apply ap_pp.
H: Funext G: Graph D1, D2: Diagram G m: DiagramMap D1 D2 X, Y: Type f: X -> Y C: Cocone D2 X i, j: G g: G i j x: D1 i
ap f (ap (C j) (DiagramMap_comm m g x)^) @
ap f (legs_comm C i j g (m i x)) =
ap (funx : D2 j => f (C j x))
(DiagramMap_comm m g x)^ @
ap f (legs_comm C i j g (m i x))
H: Funext G: Graph D1, D2: Diagram G m: DiagramMap D1 D2 X, Y: Type f: X -> Y C: Cocone D2 X i, j: G g: G i j x: D1 i
ap f (ap (C j) (DiagramMap_comm m g x)^) =
ap (funx : D2 j => f (C j x))
(DiagramMap_comm m g x)^
H: Funext G: Graph D1, D2: Diagram G m: DiagramMap D1 D2 X, Y: Type f: X -> Y C: Cocone D2 X i, j: G g: G i j x: D1 i
ap (funx : D2 j => f (C j x))
(DiagramMap_comm m g x)^ =
ap f (ap (C j) (DiagramMap_comm m g x)^)
apply ap_compose.Defined.(** The precomposition with a diagram equivalence is an equivalence. *)
H: Funext G: Graph D1, D2: Diagram G m: D1 ~d~ D2 X: Type
IsEquiv (cocone_precompose m)
H: Funext G: Graph D1, D2: Diagram G m: D1 ~d~ D2 X: Type
IsEquiv (cocone_precompose m)
H: Funext G: Graph D1, D2: Diagram G m: D1 ~d~ D2 X: Type
Cocone D1 X -> Cocone D2 X
H: Funext G: Graph D1, D2: Diagram G m: D1 ~d~ D2 X: Type
cocone_precompose m o ?g == idmap
H: Funext G: Graph D1, D2: Diagram G m: D1 ~d~ D2 X: Type
?g o cocone_precompose m == idmap
H: Funext G: Graph D1, D2: Diagram G m: D1 ~d~ D2 X: Type
cocone_precompose m
o cocone_precompose (diagram_equiv_inv m) == idmap
H: Funext G: Graph D1, D2: Diagram G m: D1 ~d~ D2 X: Type
cocone_precompose (diagram_equiv_inv m)
o cocone_precompose m == idmap
H: Funext G: Graph D1, D2: Diagram G m: D1 ~d~ D2 X: Type
cocone_precompose m
o cocone_precompose (diagram_equiv_inv m) == idmap
H: Funext G: Graph D1, D2: Diagram G m: D1 ~d~ D2 X: Type C: Cocone D1 X
cocone_precompose m
(cocone_precompose (diagram_equiv_inv m) C) = C
H: Funext G: Graph D1, D2: Diagram G m: D1 ~d~ D2 X: Type C: Cocone D1 X
cocone_precompose m
(cocone_precompose (diagram_equiv_inv m) C) = ?Goal
H: Funext G: Graph D1, D2: Diagram G m: D1 ~d~ D2 X: Type C: Cocone D1 X
?Goal = C
H: Funext G: Graph D1, D2: Diagram G m: D1 ~d~ D2 X: Type C: Cocone D1 X
cocone_precompose m
(cocone_precompose (diagram_equiv_inv m) C) = ?Goal
apply cocone_precompose_comp.
H: Funext G: Graph D1, D2: Diagram G m: D1 ~d~ D2 X: Type C: Cocone D1 X
cocone_precompose
(diagram_comp (diagram_equiv_inv m) m) C = C
H: Funext G: Graph D1, D2: Diagram G m: D1 ~d~ D2 X: Type C: Cocone D1 X
cocone_precompose (diagram_idmap D1) C = C
apply cocone_precompose_identity.
H: Funext G: Graph D1, D2: Diagram G m: D1 ~d~ D2 X: Type
cocone_precompose (diagram_equiv_inv m)
o cocone_precompose m == idmap
H: Funext G: Graph D1, D2: Diagram G m: D1 ~d~ D2 X: Type C: Cocone D2 X
cocone_precompose (diagram_equiv_inv m)
(cocone_precompose m C) = C
H: Funext G: Graph D1, D2: Diagram G m: D1 ~d~ D2 X: Type C: Cocone D2 X
cocone_precompose (diagram_equiv_inv m)
(cocone_precompose m C) = ?Goal
H: Funext G: Graph D1, D2: Diagram G m: D1 ~d~ D2 X: Type C: Cocone D2 X
?Goal = C
H: Funext G: Graph D1, D2: Diagram G m: D1 ~d~ D2 X: Type C: Cocone D2 X
cocone_precompose (diagram_equiv_inv m)
(cocone_precompose m C) = ?Goal
apply cocone_precompose_comp.
H: Funext G: Graph D1, D2: Diagram G m: D1 ~d~ D2 X: Type C: Cocone D2 X
cocone_precompose
(diagram_comp m (diagram_equiv_inv m)) C = C
H: Funext G: Graph D1, D2: Diagram G m: D1 ~d~ D2 X: Type C: Cocone D2 X
cocone_precompose (diagram_idmap D2) C = C
apply cocone_precompose_identity.Defined.(** The postcomposition with an equivalence is an equivalence. *)
H: Funext G: Graph D: Diagram G X, Y: Type f: X <~> Y
IsEquiv (funC : Cocone D X => cocone_postcompose C f)
H: Funext G: Graph D: Diagram G X, Y: Type f: X <~> Y
IsEquiv (funC : Cocone D X => cocone_postcompose C f)
H: Funext G: Graph D: Diagram G X, Y: Type f: X <~> Y
Cocone D Y -> Cocone D X
H: Funext G: Graph D: Diagram G X, Y: Type f: X <~> Y
(funC : Cocone D X => cocone_postcompose C f) o ?g ==
idmap
H: Funext G: Graph D: Diagram G X, Y: Type f: X <~> Y
?g o (funC : Cocone D X => cocone_postcompose C f) ==
idmap
H: Funext G: Graph D: Diagram G X, Y: Type f: X <~> Y
(funC : Cocone D X => cocone_postcompose C f)
o (funC : Cocone D Y => cocone_postcompose C f^-1) ==
idmap
H: Funext G: Graph D: Diagram G X, Y: Type f: X <~> Y
(funC : Cocone D Y => cocone_postcompose C f^-1)
o (funC : Cocone D X => cocone_postcompose C f) ==
idmap
H: Funext G: Graph D: Diagram G X, Y: Type f: X <~> Y
(funC : Cocone D X => cocone_postcompose C f)
o (funC : Cocone D Y => cocone_postcompose C f^-1) ==
idmap
H: Funext G: Graph D: Diagram G X, Y: Type f: X <~> Y C: Cocone D Y
cocone_postcompose (cocone_postcompose C f^-1) f = C
H: Funext G: Graph D: Diagram G X, Y: Type f: X <~> Y C: Cocone D Y
cocone_postcompose (cocone_postcompose C f^-1) f =
?Goal
H: Funext G: Graph D: Diagram G X, Y: Type f: X <~> Y C: Cocone D Y
?Goal = C
H: Funext G: Graph D: Diagram G X, Y: Type f: X <~> Y C: Cocone D Y
cocone_postcompose (cocone_postcompose C f^-1) f =
?Goal
H: Funext G: Graph D: Diagram G X, Y: Type f: X <~> Y C: Cocone D Y
?Goal =
cocone_postcompose (cocone_postcompose C f^-1) f
apply cocone_postcompose_comp.
H: Funext G: Graph D: Diagram G X, Y: Type f: X <~> Y C: Cocone D Y
cocone_postcompose C (funx : Y => f (f^-1 x)) = C
H: Funext G: Graph D: Diagram G X, Y: Type f: X <~> Y C: Cocone D Y
cocone_postcompose C (funx : Y => f (f^-1 x)) = ?Goal
H: Funext G: Graph D: Diagram G X, Y: Type f: X <~> Y C: Cocone D Y
?Goal = C
H: Funext G: Graph D: Diagram G X, Y: Type f: X <~> Y C: Cocone D Y
cocone_postcompose C (funx : Y => f (f^-1 x)) =
cocone_postcompose C idmap
H: Funext G: Graph D: Diagram G X, Y: Type f: X <~> Y C: Cocone D Y
(funx : Y => f (f^-1 x)) = idmap
funext x; apply eisretr.
H: Funext G: Graph D: Diagram G X, Y: Type f: X <~> Y
(funC : Cocone D Y => cocone_postcompose C f^-1)
o (funC : Cocone D X => cocone_postcompose C f) ==
idmap
H: Funext G: Graph D: Diagram G X, Y: Type f: X <~> Y C: Cocone D X
cocone_postcompose (cocone_postcompose C f) f^-1 = C
H: Funext G: Graph D: Diagram G X, Y: Type f: X <~> Y C: Cocone D X
cocone_postcompose (cocone_postcompose C f) f^-1 =
?Goal
H: Funext G: Graph D: Diagram G X, Y: Type f: X <~> Y C: Cocone D X
?Goal = C
H: Funext G: Graph D: Diagram G X, Y: Type f: X <~> Y C: Cocone D X
cocone_postcompose (cocone_postcompose C f) f^-1 =
?Goal
H: Funext G: Graph D: Diagram G X, Y: Type f: X <~> Y C: Cocone D X
?Goal =
cocone_postcompose (cocone_postcompose C f) f^-1
apply cocone_postcompose_comp.
H: Funext G: Graph D: Diagram G X, Y: Type f: X <~> Y C: Cocone D X
cocone_postcompose C (funx : X => f^-1 (f x)) = C
H: Funext G: Graph D: Diagram G X, Y: Type f: X <~> Y C: Cocone D X
cocone_postcompose C (funx : X => f^-1 (f x)) = ?Goal
H: Funext G: Graph D: Diagram G X, Y: Type f: X <~> Y C: Cocone D X
?Goal = C
H: Funext G: Graph D: Diagram G X, Y: Type f: X <~> Y C: Cocone D X
cocone_postcompose C (funx : X => f^-1 (f x)) =
cocone_postcompose C idmap
H: Funext G: Graph D: Diagram G X, Y: Type f: X <~> Y C: Cocone D X
(funx : X => f^-1 (f x)) = idmap
funext x; apply eissect.Defined.(** ** Universality preservation *)(** Universality of a cocone is preserved by composition with a (diagram) equivalence. *)
H: Funext G: Graph D1, D2: Diagram G m: D1 ~d~ D2 X: Type C: Cocone D2 X X0: UniversalCocone C
UniversalCocone (cocone_precompose m C)
H: Funext G: Graph D1, D2: Diagram G m: D1 ~d~ D2 X: Type C: Cocone D2 X X0: UniversalCocone C
UniversalCocone (cocone_precompose m C)
H: Funext G: Graph D1, D2: Diagram G m: D1 ~d~ D2 X: Type C: Cocone D2 X X0: UniversalCocone C Y: Type
IsEquiv (cocone_postcompose (cocone_precompose m C))
H: Funext G: Graph D1, D2: Diagram G m: D1 ~d~ D2 X: Type C: Cocone D2 X X0: UniversalCocone C Y: Type
IsEquiv
(funf : X -> Y =>
cocone_precompose m (cocone_postcompose C f))
rapply isequiv_compose.Defined.
H: Funext G: Graph D: Diagram G X, Y: Type f: X <~> Y C: Cocone D X X0: UniversalCocone C
UniversalCocone (cocone_postcompose C f)
H: Funext G: Graph D: Diagram G X, Y: Type f: X <~> Y C: Cocone D X X0: UniversalCocone C
UniversalCocone (cocone_postcompose C f)
H: Funext G: Graph D: Diagram G X, Y: Type f: X <~> Y C: Cocone D X X0: UniversalCocone C Y0: Type
IsEquiv (cocone_postcompose (cocone_postcompose C f))
H: Funext G: Graph D: Diagram G X, Y: Type f: X <~> Y C: Cocone D X X0: UniversalCocone C Y0: Type
IsEquiv
(fung : Y -> Y0 =>
cocone_postcompose C (funx : X => g (f x)))