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 Diagrams.Diagram.Require Import Diagrams.Graph.Require Import Diagrams.Cocone.Require Import Diagrams.ConstantDiagram.Require Import Diagrams.CommutativeSquares.Require Import Colimits.Coeq.LocalOpen Scope path_scope.Generalizable All Variables.(** This file contains the definition of colimits, and functoriality results on colimits. *)(** * Colimits *)(** ** Abstract definition *)(** A colimit is the extremity of a cocone. *)ClassIsColimit `(D: Diagram G) (Q: Type) := {
iscolimit_cocone :: Cocone D Q;
iscolimit_unicocone : UniversalCocone iscolimit_cocone;
}.Coercioniscolimit_cocone : IsColimit >-> Cocone.Arguments Build_IsColimit {G D Q} C H : rename.Arguments iscolimit_cocone {G D Q} C : rename.Arguments iscolimit_unicocone {G D Q} H : rename.(** [cocone_postcompose_inv] is defined for convenience: it is only the inverse of [cocone_postcompose]. It allows to recover the map [h] from a cocone [C']. *)Definitioncocone_postcompose_inv `{D: Diagram G} {Q X}
(H : IsColimit D Q) (C' : Cocone D X) : Q -> X
:= @equiv_inv _ _ _ (iscolimit_unicocone H X) C'.(** ** Existence of colimits *)(** Every diagram has a colimit. It could be described as the following HIT<< HIT Colimit {G : Graph} (D : Diagram G) : Type := | colim : forall i, D i -> Colimit D | colimp : forall i j (f : G i j) (x : D i) : colim j (D _f f x) = colim i x .>>but we instead describe it as the coequalizer of the source and target maps of the diagram. The source type in the coequalizer ought to be:<<{x : sig D & {y : sig D & {f : G x.1 y.1 & D _f f x.2 = y.2}}}>>However we notice that the path type forms a contractible component, so we can use the more efficient:<<{x : sig D & {j : G & G x.1 j}}>>*)DefinitionColimit {G : Graph} (D : Diagram G) : Type :=
@Coeq
{x : sig D & {j : G & G x.1 j}}
(sig D)
(funt => t.1)
(funt => (t.2.1; D _f t.2.2 t.1.2))
.Definitioncolim {G : Graph} {D : Diagram G} (i : G) (x : D i) : Colimit D :=
coeq (i ; x).Definitioncolimp {G : Graph} {D : Diagram G} (ij : G) (f : G i j) (x : D i)
: colim j (D _f f x) = colim i x
:= (cglue ((i; x); j; f))^.(** To obtain a path [colim j (D _f f x) = colim j (D _f f y)] from a path [x = y], one can either use [ap (D _f f)] followed by [ap (colim j)], or conjugate [ap (colim i)] by [colimp i j f]. These paths are equivalent. *)
G: Graph D: Diagram G i, j: G f: G i j x, y: D i p: x = y
ap (colim j) (ap (D _f f) p) =
(colimp i j f x @ ap (colim i) p) @ (colimp i j f y)^
G: Graph D: Diagram G i, j: G f: G i j x, y: D i p: x = y
ap (colim j) (ap (D _f f) p) =
(colimp i j f x @ ap (colim i) p) @ (colimp i j f y)^
G: Graph D: Diagram G i, j: G f: G i j x, y: D i p: x = y
ap (funx : D i => colim j ((D _f f) x)) p =
(colimp i j f x @ ap (colim i) p) @ (colimp i j f y)^
exact (ap_homotopic (colimp _ _ _) p).Defined.
G: Graph D: Diagram G P: Colimit D -> Type q: forall (i : G) (x : D i), P (colim i x) pp_q: forall (ij : G) (g : G i j)
(x : D i),
transport P (colimp i j g x) (q j ((D _f g) x)) =
q i x
forallw : Colimit D, P w
G: Graph D: Diagram G P: Colimit D -> Type q: forall (i : G) (x : D i), P (colim i x) pp_q: forall (ij : G) (g : G i j)
(x : D i),
transport P (colimp i j g x) (q j ((D _f g) x)) =
q i x
forallw : Colimit D, P w
G: Graph D: Diagram G P: Colimit D -> Type q: forall (i : G) (x : D i), P (colim i x) pp_q: forall (ij : G) (g : G i j)
(x : D i),
transport P (colimp i j g x) (q j ((D _f g) x)) =
q i x
foralla : {x : _ & D x}, P (coeq a)
G: Graph D: Diagram G P: Colimit D -> Type q: forall (i : G) (x : D i), P (colim i x) pp_q: forall (ij : G) (g : G i j)
(x : D i),
transport P (colimp i j g x) (q j ((D _f g) x)) =
q i x
forallb : {x : {x : _ & D x} & {j : G & G x.1 j}},
transport P (cglue b)
(?coeq'
((funt : {x : {x : _ & D x} & {j : G & G x.1 j}}
=> t.1) b)) =
?coeq'
((funt : {x : {x : _ & D x} & {j : G & G x.1 j}} =>
((t.2).1; (D _f (t.2).2) (t.1).2)) b)
G: Graph D: Diagram G P: Colimit D -> Type q: forall (i : G) (x : D i), P (colim i x) pp_q: forall (ij : G) (g : G i j)
(x : D i),
transport P (colimp i j g x) (q j ((D _f g) x)) =
q i x
foralla : {x : _ & D x}, P (coeq a)
G: Graph D: Diagram G P: Colimit D -> Type q: forall (i : G) (x : D i), P (colim i x) pp_q: forall (ij : G) (g : G i j)
(x : D i),
transport P (colimp i j g x) (q j ((D _f g) x)) =
q i x x: G i: D x
P (coeq (x; i))
exact (q x i).
G: Graph D: Diagram G P: Colimit D -> Type q: forall (i : G) (x : D i), P (colim i x) pp_q: forall (ij : G) (g : G i j)
(x : D i),
transport P (colimp i j g x) (q j ((D _f g) x)) =
q i x
forallb : {x : {x : _ & D x} & {j : G & G x.1 j}},
transport P (cglue b)
((funa : {x : _ & D x} =>
(fun (x : G) (i : D x) => q x i) a.1 a.2)
((funt : {x : {x : _ & D x} & {j : G & G x.1 j}}
=> t.1) b)) =
(funa : {x : _ & D x} =>
(fun (x : G) (i : D x) => q x i) a.1 a.2)
((funt : {x : {x : _ & D x} & {j : G & G x.1 j}} =>
((t.2).1; (D _f (t.2).2) (t.1).2)) b)
G: Graph D: Diagram G P: Colimit D -> Type q: forall (i : G) (x : D i), P (colim i x) pp_q: forall (ij : G) (g : G i j)
(x : D i),
transport P (colimp i j g x) (q j ((D _f g) x)) =
q i x i: G x: D i j: G f: G (i; x).1 j
G: Graph D: Diagram G P: Colimit D -> Type q: forall (i : G) (x : D i), P (colim i x) pp_q: forall (ij : G) (g : G i j)
(x : D i),
transport P (colimp i j g x) (q j ((D _f g) x)) =
q i x i: G x: D i j: G f: G i j
transport P (cglue ((i; x); j; f)) (q i x) =
q j ((D _f f) x)
G: Graph D: Diagram G P: Colimit D -> Type q: forall (i : G) (x : D i), P (colim i x) pp_q: forall (ij : G) (g : G i j)
(x : D i),
transport P (colimp i j g x) (q j ((D _f g) x)) =
q i x i: G x: D i j: G f: G i j
q i x =
transport P (cglue ((i; x); j; f))^ (q j ((D _f f) x))
G: Graph D: Diagram G P: Colimit D -> Type q: forall (i : G) (x : D i), P (colim i x) pp_q: forall (ij : G) (g : G i j)
(x : D i),
transport P (colimp i j g x) (q j ((D _f g) x)) =
q i x i: G x: D i j: G f: G i j
transport P (cglue ((i; x); j; f))^ (q j ((D _f f) x)) =
q i x
exact (pp_q _ _ _ _).Defined.
G: Graph D: Diagram G P: Colimit D -> Type q: forall (i : G) (x : D i), P (colim i x) pp_q: forall (ij : G) (g : G i j)
(x : D i),
transport P (colimp i j g x) (q j ((D _f g) x)) =
q i x i, j: G g: G i j x: D i
apD (Colimit_ind P q pp_q) (colimp i j g x) =
pp_q i j g x
G: Graph D: Diagram G P: Colimit D -> Type q: forall (i : G) (x : D i), P (colim i x) pp_q: forall (ij : G) (g : G i j)
(x : D i),
transport P (colimp i j g x) (q j ((D _f g) x)) =
q i x i, j: G g: G i j x: D i
apD (Colimit_ind P q pp_q) (colimp i j g x) =
pp_q i j g x
G: Graph D: Diagram G P: Colimit D -> Type q: forall (i : G) (x : D i), P (colim i x) pp_q: forall (ij : G) (g : G i j)
(x : D i),
transport P (colimp i j g x) (q j ((D _f g) x)) =
q i x i, j: G g: G i j x: D i
moveR_transport_V P (cglue ((i; x); j; g))
(Colimit_ind P q pp_q (colim j ((D _f g) x)))
(Colimit_ind P q pp_q (colim i x))
(apD (Colimit_ind P q pp_q) (cglue ((i; x); j; g)))^ =
pp_q i j g x
G: Graph D: Diagram G P: Colimit D -> Type q: forall (i : G) (x : D i), P (colim i x) pp_q: forall (ij : G) (g : G i j)
(x : D i),
transport P (colimp i j g x) (q j ((D _f g) x)) =
q i x i, j: G g: G i j x: D i
(apD (Colimit_ind P q pp_q) (cglue ((i; x); j; g)))^ =
(moveR_transport_V P (cglue ((i; x); j; g))
(Colimit_ind P q pp_q (colim j ((D _f g) x)))
(Colimit_ind P q pp_q (colim i x)))^-1
(pp_q i j g x)
G: Graph D: Diagram G P: Colimit D -> Type q: forall (i : G) (x : D i), P (colim i x) pp_q: forall (ij : G) (g : G i j)
(x : D i),
transport P (colimp i j g x) (q j ((D _f g) x)) =
q i x i, j: G g: G i j x: D i
apD (Colimit_ind P q pp_q) (cglue ((i; x); j; g)) =
inverse^-1
((moveR_transport_V P (cglue ((i; x); j; g))
(Colimit_ind P q pp_q (colim j ((D _f g) x)))
(Colimit_ind P q pp_q (colim i x)))^-1
(pp_q i j g x))
G: Graph D: Diagram G P: Colimit D -> Type q: forall (i : G) (x : D i), P (colim i x) pp_q: forall (ij : G) (g : G i j)
(x : D i),
transport P (colimp i j g x) (q j ((D _f g) x)) =
q i x i, j: G g: G i j x: D i
moveR_transport_p P (cglue ((i; x); j; g)) (q i x)
(q j ((D _f g) x)) (pp_q i j g x)^ =
inverse^-1
((moveR_transport_V P (cglue ((i; x); j; g))
(Colimit_ind P q pp_q (colim j ((D _f g) x)))
(Colimit_ind P q pp_q (colim i x)))^-1
(pp_q i j g x))
G: Graph D: Diagram G P: Colimit D -> Type q: forall (i : G) (x : D i), P (colim i x) pp_q: forall (ij : G) (g : G i j)
(x : D i),
transport P (colimp i j g x) (q j ((D _f g) x)) =
q i x i, j: G g: G i j x: D i
inverse^-1
((moveR_transport_V P (cglue ((i; x); j; g))
(Colimit_ind P q pp_q (colim j ((D _f g) x)))
(Colimit_ind P q pp_q (colim i x)))^-1
(pp_q i j g x)) =
moveR_transport_p P (cglue ((i; x); j; g)) (q i x)
(q j ((D _f g) x)) (pp_q i j g x)^
apply moveL_transport_p_V.Defined.
G: Graph D: Diagram G P: Type C: Cocone D P
Colimit D -> P
G: Graph D: Diagram G P: Type C: Cocone D P
Colimit D -> P
G: Graph D: Diagram G P: Type C: Cocone D P
forall (ij : G) (g : G i j) (x : D i),
transport (fun_ : Colimit D => P) (colimp i j g x)
(C j ((D _f g) x)) = C i x
G: Graph D: Diagram G P: Type C: Cocone D P i, j: G g: G i j x: D i
transport (fun_ : Colimit D => P) (colimp i j g x)
(C j ((D _f g) x)) = C i x
G: Graph D: Diagram G P: Type C: Cocone D P i, j: G g: G i j x: D i
C j ((D _f g) x) = C i x
apply legs_comm.Defined.
G: Graph D: Diagram G P: Type C: Cocone D P i, j: G g: G i j x: D i
ap (Colimit_rec P C) (colimp i j g x) =
legs_comm C i j g x
G: Graph D: Diagram G P: Type C: Cocone D P i, j: G g: G i j x: D i
ap (Colimit_rec P C) (colimp i j g x) =
legs_comm C i j g x
G: Graph D: Diagram G P: Type C: Cocone D P i, j: G g: G i j x: D i
transport_const (colimp i j g x)
(Colimit_rec P C (colim j ((D _f g) x))) @
ap (Colimit_rec P C) (colimp i j g x) =
transport_const (colimp i j g x)
(Colimit_rec P C (colim j ((D _f g) x))) @
legs_comm C i j g x
G: Graph D: Diagram G P: Type C: Cocone D P i, j: G g: G i j x: D i
apD
(Colimit_ind (fun_ : Colimit D => P) C
(fun (ij : G) (g : G i j) (x : D i) =>
transport_const (colimp i j g x)
(C j ((D _f g) x)) @ legs_comm C i j g x))
(colimp i j g x) =
transport_const (colimp i j g x)
(Colimit_rec P C (colim j ((D _f g) x))) @
legs_comm C i j g x
exact (Colimit_ind_beta_colimp (fun_ => P) C _ i j g x).Defined.Arguments colim : simpl never.Arguments colimp : simpl never.(** The natural cocone to the colimit. *)Definitioncocone_colimit {G : Graph} (D : Diagram G) : Cocone D (Colimit D)
:= Build_Cocone colim colimp.(** Given a cocone [C] and [f : Colimit D -> P] inducing a "homotopic" cocone, [Colimit_rec P C] is homotopic to [f]. *)
G: Graph D: Diagram G P: Type C: Cocone D P f: Colimit D -> P h_obj: foralli : G, C i == f o colim i h_comm: forall (ij : G) (g : G i j)
(x : D i),
legs_comm C i j g x @ h_obj i x =
h_obj j ((D _f g) x) @ ap f (colimp i j g x)
Colimit_rec P C == f
G: Graph D: Diagram G P: Type C: Cocone D P f: Colimit D -> P h_obj: foralli : G, C i == f o colim i h_comm: forall (ij : G) (g : G i j)
(x : D i),
legs_comm C i j g x @ h_obj i x =
h_obj j ((D _f g) x) @ ap f (colimp i j g x)
Colimit_rec P C == f
G: Graph D: Diagram G P: Type C: Cocone D P f: Colimit D -> P h_obj: foralli : G, C i == f o colim i h_comm: forall (ij : G) (g : G i j)
(x : D i),
legs_comm C i j g x @ h_obj i x =
h_obj j ((D _f g) x) @ ap f (colimp i j g x)
forall (i : G) (x : D i),
(funw : Colimit D => Colimit_rec P C w = f w)
(colim i x)
G: Graph D: Diagram G P: Type C: Cocone D P f: Colimit D -> P h_obj: foralli : G, C i == f o colim i h_comm: forall (ij : G) (g : G i j)
(x : D i),
legs_comm C i j g x @ h_obj i x =
h_obj j ((D _f g) x) @ ap f (colimp i j g x)
forall (ij : G) (g : G i j)
(x : D i),
transport
(funw : Colimit D => Colimit_rec P C w = f w)
(colimp i j g x) (?q j ((D _f g) x)) =
?q i x
G: Graph D: Diagram G P: Type C: Cocone D P f: Colimit D -> P h_obj: foralli : G, C i == f o colim i h_comm: forall (ij : G) (g : G i j)
(x : D i),
legs_comm C i j g x @ h_obj i x =
h_obj j ((D _f g) x) @ ap f (colimp i j g x)
forall (i : G) (x : D i),
(funw : Colimit D => Colimit_rec P C w = f w)
(colim i x)
G: Graph D: Diagram G P: Type C: Cocone D P f: Colimit D -> P h_obj: foralli : G, C i == f o colim i h_comm: forall (ij : G) (g : G i j)
(x : D i),
legs_comm C i j g x @ h_obj i x =
h_obj j ((D _f g) x) @ ap f (colimp i j g x)
forall (i : G) (x : D i), C i x = f (colim i x)
exact h_obj.
G: Graph D: Diagram G P: Type C: Cocone D P f: Colimit D -> P h_obj: foralli : G, C i == f o colim i h_comm: forall (ij : G) (g : G i j)
(x : D i),
legs_comm C i j g x @ h_obj i x =
h_obj j ((D _f g) x) @ ap f (colimp i j g x)
forall (ij : G) (g : G i j) (x : D i),
transport
(funw : Colimit D => Colimit_rec P C w = f w)
(colimp i j g x)
((h_obj
:
forall (i0 : G) (x0 : D i0),
(funw : Colimit D => Colimit_rec P C w = f w)
(colim i0 x0)) j ((D _f g) x)) =
(h_obj
:
forall (i0 : G) (x0 : D i0),
(funw : Colimit D => Colimit_rec P C w = f w)
(colim i0 x0)) i x
G: Graph D: Diagram G P: Type C: Cocone D P f: Colimit D -> P h_obj: foralli : G, C i == f o colim i h_comm: forall (ij : G) (g : G i j)
(x : D i),
legs_comm C i j g x @ h_obj i x =
h_obj j ((D _f g) x) @ ap f (colimp i j g x) i, j: G g: G i j x: D i
transport
(funw : Colimit D => Colimit_rec P C w = f w)
(colimp i j g x) (h_obj j ((D _f g) x)) = h_obj i x
G: Graph D: Diagram G P: Type C: Cocone D P f: Colimit D -> P h_obj: foralli : G, C i == f o colim i h_comm: forall (ij : G) (g : G i j)
(x : D i),
legs_comm C i j g x @ h_obj i x =
h_obj j ((D _f g) x) @ ap f (colimp i j g x) i, j: G g: G i j x: D i
ap (Colimit_rec P C) (colimp i j g x) @ h_obj i x =
h_obj j ((D _f g) x) @ ap f (colimp i j g x)
G: Graph D: Diagram G P: Type C: Cocone D P f: Colimit D -> P h_obj: foralli : G, C i == f o colim i h_comm: forall (ij : G) (g : G i j)
(x : D i),
legs_comm C i j g x @ h_obj i x =
h_obj j ((D _f g) x) @ ap f (colimp i j g x) i, j: G g: G i j x: D i
legs_comm C i j g x @ h_obj i x =
h_obj j ((D _f g) x) @ ap f (colimp i j g x)
G: Graph D: Diagram G P: Type C1, C2: Cocone D P h_obj: foralli : G, C1 i == C2 i h_comm: forall (ij : G) (g : G i j)
(x : D i),
legs_comm C1 i j g x @ h_obj i x =
h_obj j ((D _f g) x) @ legs_comm C2 i j g x
Colimit_rec P C1 == Colimit_rec P C2
G: Graph D: Diagram G P: Type C1, C2: Cocone D P h_obj: foralli : G, C1 i == C2 i h_comm: forall (ij : G) (g : G i j)
(x : D i),
legs_comm C1 i j g x @ h_obj i x =
h_obj j ((D _f g) x) @ legs_comm C2 i j g x
Colimit_rec P C1 == Colimit_rec P C2
G: Graph D: Diagram G P: Type C1, C2: Cocone D P h_obj: foralli : G, C1 i == C2 i h_comm: forall (ij : G) (g : G i j)
(x : D i),
legs_comm C1 i j g x @ h_obj i x =
h_obj j ((D _f g) x) @ legs_comm C2 i j g x
foralli : G, C1 i == Colimit_rec P C2 o colim i
G: Graph D: Diagram G P: Type C1, C2: Cocone D P h_obj: foralli : G, C1 i == C2 i h_comm: forall (ij : G) (g : G i j)
(x : D i),
legs_comm C1 i j g x @ h_obj i x =
h_obj j ((D _f g) x) @ legs_comm C2 i j g x
forall (ij : G) (g : G i j)
(x : D i),
legs_comm C1 i j g x @ ?h_obj i x =
?h_obj j ((D _f g) x) @
ap (Colimit_rec P C2) (colimp i j g x)
G: Graph D: Diagram G P: Type C1, C2: Cocone D P h_obj: foralli : G, C1 i == C2 i h_comm: forall (ij : G) (g : G i j)
(x : D i),
legs_comm C1 i j g x @ h_obj i x =
h_obj j ((D _f g) x) @ legs_comm C2 i j g x
foralli : G, C1 i == Colimit_rec P C2 o colim i
exact h_obj.
G: Graph D: Diagram G P: Type C1, C2: Cocone D P h_obj: foralli : G, C1 i == C2 i h_comm: forall (ij : G) (g : G i j)
(x : D i),
legs_comm C1 i j g x @ h_obj i x =
h_obj j ((D _f g) x) @ legs_comm C2 i j g x
forall (ij : G) (g : G i j) (x : D i),
legs_comm C1 i j g x @ h_obj i x =
h_obj j ((D _f g) x) @
ap (Colimit_rec P C2) (colimp i j g x)
G: Graph D: Diagram G P: Type C1, C2: Cocone D P h_obj: foralli : G, C1 i == C2 i h_comm: forall (ij : G) (g : G i j)
(x : D i),
legs_comm C1 i j g x @ h_obj i x =
h_obj j ((D _f g) x) @ legs_comm C2 i j g x i, j: G g: G i j x: D i
legs_comm C1 i j g x @ h_obj i x =
h_obj j ((D _f g) x) @
ap (Colimit_rec P C2) (colimp i j g x)
G: Graph D: Diagram G P: Type C1, C2: Cocone D P h_obj: foralli : G, C1 i == C2 i h_comm: forall (ij : G) (g : G i j)
(x : D i),
legs_comm C1 i j g x @ h_obj i x =
h_obj j ((D _f g) x) @ legs_comm C2 i j g x i, j: G g: G i j x: D i
legs_comm C1 i j g x @ h_obj i x =
h_obj j ((D _f g) x) @ legs_comm C2 i j g x
apply h_comm.Defined.(** [Colimit_rec] is an equivalence. *)
H: Funext G: Graph D: Diagram G P: Type
IsEquiv (Colimit_rec P)
H: Funext G: Graph D: Diagram G P: Type
IsEquiv (Colimit_rec P)
H: Funext G: Graph D: Diagram G P: Type
(Colimit D -> P) -> Cocone D P
H: Funext G: Graph D: Diagram G P: Type
Colimit_rec P o ?g == idmap
H: Funext G: Graph D: Diagram G P: Type
?g o Colimit_rec P == idmap
H: Funext G: Graph D: Diagram G P: Type
(Colimit D -> P) -> Cocone D P
exact (cocone_postcompose (cocone_colimit D)).
H: Funext G: Graph D: Diagram G P: Type
Colimit_rec P o cocone_postcompose (cocone_colimit D) ==
idmap
H: Funext G: Graph D: Diagram G P: Type f: Colimit D -> P
Colimit_rec P
(cocone_postcompose (cocone_colimit D) f) = f
H: Funext G: Graph D: Diagram G P: Type f: Colimit D -> P
Colimit_rec P
(cocone_postcompose (cocone_colimit D) f) == f
H: Funext G: Graph D: Diagram G P: Type f: Colimit D -> P
foralli : G,
cocone_postcompose (cocone_colimit D) f i ==
f o colim i
H: Funext G: Graph D: Diagram G P: Type f: Colimit D -> P
forall (ij : G) (g : G i j) (x : D i),
legs_comm (cocone_postcompose (cocone_colimit D) f) i
j g x @ ?h_obj i x =
?h_obj j ((D _f g) x) @ ap f (colimp i j g x)
H: Funext G: Graph D: Diagram G P: Type f: Colimit D -> P
forall (ij : G) (g : G i j) (x : D i),
legs_comm (cocone_postcompose (cocone_colimit D) f) 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) @
ap f (colimp i j g x)
H: Funext G: Graph D: Diagram G P: Type f: Colimit D -> P i, j: G g: G i j x: D i
ap f (colimp i j g x) @ 1 = 1 @ ap f (colimp i j g x)
apply concat_p1_1p.
H: Funext G: Graph D: Diagram G P: Type
cocone_postcompose (cocone_colimit D) o Colimit_rec P ==
idmap
H: Funext G: Graph D: Diagram G P: Type legs: foralli : G, D i -> P legs_comm: forall (ij : G) (g : G i j),
(funx : D i => legs j ((D _f g) x)) ==
legs i
cocone_postcompose (cocone_colimit D)
(Colimit_rec P
{| legs := legs; legs_comm := legs_comm |}) =
{| legs := legs; legs_comm := legs_comm |}
H: Funext G: Graph D: Diagram G P: Type legs: foralli : G, D i -> P legs_comm: forall (ij : G) (g : G i j),
(funx : D i => legs j ((D _f g) x)) ==
legs i
foralli : G,
cocone_postcompose (cocone_colimit D)
(Colimit_rec P
{| legs := legs; legs_comm := legs_comm |}) i ==
{| legs := legs; legs_comm := legs_comm |} i
H: Funext G: Graph D: Diagram G P: Type legs: foralli : G, D i -> P legs_comm: forall (ij : G) (g : G i j),
(funx : D i => legs j ((D _f g) x)) ==
legs i
forall (ij : G) (g : G i j)
(x : D i),
Cocone.legs_comm
(cocone_postcompose (cocone_colimit D)
(Colimit_rec P
{| legs := legs; legs_comm := legs_comm |})) i
j g x @ ?path_legs i x =
?path_legs j ((D _f g) x) @
Cocone.legs_comm
{| legs := legs; legs_comm := legs_comm |} i j g x
H: Funext G: Graph D: Diagram G P: Type legs: foralli : G, D i -> P legs_comm: forall (ij : G) (g : G i j),
(funx : D i => legs j ((D _f g) x)) ==
legs i
forall (ij : G) (g : G i j) (x : D i),
Cocone.legs_comm
(cocone_postcompose (cocone_colimit D)
(Colimit_rec P
{| legs := legs; legs_comm := legs_comm |})) 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) @
Cocone.legs_comm
{| legs := legs; legs_comm := legs_comm |} i j g x
H: Funext G: Graph D: Diagram G P: Type legs: foralli : G, D i -> P legs_comm: forall (ij : G) (g : G i j),
(funx : D i => legs j ((D _f g) x)) ==
legs i i, j: G g: G i j x: D i
ap
(Colimit_rec P
{| legs := legs; legs_comm := legs_comm |})
(colimp i j g x) @ 1 = 1 @ legs_comm i j g x
H: Funext G: Graph D: Diagram G P: Type legs: foralli : G, D i -> P legs_comm: forall (ij : G) (g : G i j),
(funx : D i => legs j ((D _f g) x)) ==
legs i i, j: G g: G i j x: D i
ap
(Colimit_rec P
{| legs := legs; legs_comm := legs_comm |})
(colimp i j g x) = legs_comm i j g x
apply Colimit_rec_beta_colimp.Defined.Definitionequiv_colimit_rec `{Funext} {G : Graph} {D : Diagram G} (P : Type)
: Cocone D P <~> (Colimit D -> P) := Build_Equiv _ _ _ (isequiv_colimit_rec P).(** It follows that the HIT Colimit is an abstract colimit. *)
H: Funext G: Graph D: Diagram G
UniversalCocone (cocone_colimit D)
H: Funext G: Graph D: Diagram G
UniversalCocone (cocone_colimit D)
H: Funext G: Graph D: Diagram G Y: Type
IsEquiv (cocone_postcompose (cocone_colimit D))
(* The goal is to show that [cocone_postcompose (cocone_colimit D)] is an equivalence, but that's the inverse to the equivalence we just defined. *)exact (isequiv_inverse (equiv_colimit_rec Y)).Defined.Instanceiscolimit_colimit `{Funext} {G : Graph} (D : Diagram G)
: IsColimit D (Colimit D)
:= Build_IsColimit _ (unicocone_colimit D).(** ** Functoriality of concrete colimits *)(** We will capitalize [Colimit] in the identifiers to indicate that these definitions relate to the concrete colimit defined above. Below, we will also get functoriality for abstract colimits, without the capital C. However, to apply those results to the concrete colimit uses [iscolimit_colimit], which requires [Funext], so it is also useful to give direct proofs of some facts. *)(** We first work in a more general situation. Any diagram map [m : D1 => D2] induces a map between the canonical colimit of [D1] and any cocone over [D2]. We use "half" to indicate this situation. *)
G: Graph D1, D2: Diagram G m: DiagramMap D1 D2 Q: Type HQ: Cocone D2 Q
Colimit D1 -> Q
G: Graph D1, D2: Diagram G m: DiagramMap D1 D2 Q: Type HQ: Cocone D2 Q
Colimit D1 -> Q
G: Graph D1, D2: Diagram G m: DiagramMap D1 D2 Q: Type HQ: Cocone D2 Q
Cocone D1 Q
exact (cocone_precompose m HQ).Defined.Definitionfunctor_Colimit_half_beta_colimp {G : Graph} {D1D2 : Diagram G} (m : DiagramMap D1 D2) {Q} (HQ : Cocone D2 Q) (ij : G) (g : G i j) (x : D1 i)
: ap (functor_Colimit_half m HQ) (colimp i j g x) = legs_comm (cocone_precompose m HQ) i j g x
:= Colimit_rec_beta_colimp _ _ _ _ _ _.(** Homotopic diagram maps induce homotopic maps. *)
G: Graph D1, D2: Diagram G m1, m2: DiagramMap D1 D2 h_obj: foralli : G, m1 i == m2 i h_comm: forall (ij : G) (g : G i j)
(x : D1 i),
DiagramMap_comm m1 g x @
h_obj j ((D1 _f g) x) =
ap (D2 _f g) (h_obj i x) @
DiagramMap_comm m2 g x Q: Type HQ: Cocone D2 Q
foralli : G,
cocone_precompose m1 HQ i == cocone_precompose m2 HQ i
G: Graph D1, D2: Diagram G m1, m2: DiagramMap D1 D2 h_obj: foralli : G, m1 i == m2 i h_comm: forall (ij : G) (g : G i j)
(x : D1 i),
DiagramMap_comm m1 g x @
h_obj j ((D1 _f g) x) =
ap (D2 _f g) (h_obj i x) @
DiagramMap_comm m2 g x Q: Type HQ: Cocone D2 Q
forall (ij : G) (g : G i j)
(x : D1 i),
legs_comm (cocone_precompose m1 HQ) i j g x @
?h_obj i x =
?h_obj j ((D1 _f g) x) @
legs_comm (cocone_precompose m2 HQ) i j g x
G: Graph D1, D2: Diagram G m1, m2: DiagramMap D1 D2 h_obj: foralli : G, m1 i == m2 i h_comm: forall (ij : G) (g : G i j)
(x : D1 i),
DiagramMap_comm m1 g x @
h_obj j ((D1 _f g) x) =
ap (D2 _f g) (h_obj i x) @
DiagramMap_comm m2 g x Q: Type HQ: Cocone D2 Q
foralli : G,
cocone_precompose m1 HQ i == cocone_precompose m2 HQ i
G: Graph D1, D2: Diagram G m1, m2: DiagramMap D1 D2 h_obj: foralli : G, m1 i == m2 i h_comm: forall (ij : G) (g : G i j)
(x : D1 i),
DiagramMap_comm m1 g x @
h_obj j ((D1 _f g) x) =
ap (D2 _f g) (h_obj i x) @
DiagramMap_comm m2 g x Q: Type HQ: Cocone D2 Q i: G x: D1 i
HQ i (m1 i x) = HQ i (m2 i x)
apply ap, h_obj.
G: Graph D1, D2: Diagram G m1, m2: DiagramMap D1 D2 h_obj: foralli : G, m1 i == m2 i h_comm: forall (ij : G) (g : G i j)
(x : D1 i),
DiagramMap_comm m1 g x @
h_obj j ((D1 _f g) x) =
ap (D2 _f g) (h_obj i x) @
DiagramMap_comm m2 g x Q: Type HQ: Cocone D2 Q
forall (ij : G) (g : G i j) (x : D1 i),
legs_comm (cocone_precompose m1 HQ) i j g x @
(funi0 : G =>
(funx0 : D1 i0 =>
ap (HQ i0) (h_obj i0 x0)
:
cocone_precompose m1 HQ i0 x0 =
cocone_precompose m2 HQ i0 x0)
:
cocone_precompose m1 HQ i0 ==
cocone_precompose m2 HQ i0) i x =
(funi0 : G =>
(funx0 : D1 i0 =>
ap (HQ i0) (h_obj i0 x0)
:
cocone_precompose m1 HQ i0 x0 =
cocone_precompose m2 HQ i0 x0)
:
cocone_precompose m1 HQ i0 ==
cocone_precompose m2 HQ i0) j ((D1 _f g) x) @
legs_comm (cocone_precompose m2 HQ) i j g x
G: Graph D1, D2: Diagram G m1, m2: DiagramMap D1 D2 h_obj: foralli : G, m1 i == m2 i h_comm: forall (ij : G) (g : G i j)
(x : D1 i),
DiagramMap_comm m1 g x @
h_obj j ((D1 _f g) x) =
ap (D2 _f g) (h_obj i x) @
DiagramMap_comm m2 g x Q: Type HQ: Cocone D2 Q i, j: G g: G i j x: D1 i
(ap (HQ j) (DiagramMap_comm m1 g x)^ @
legs_comm HQ i j g (m1 i x)) @ ap (HQ i) (h_obj i x) =
ap (HQ j) (h_obj j ((D1 _f g) x)) @
(ap (HQ j) (DiagramMap_comm m2 g x)^ @
legs_comm HQ i j g (m2 i x))
G: Graph D1, D2: Diagram G m1, m2: DiagramMap D1 D2 h_obj: foralli : G, m1 i == m2 i h_comm: forall (ij : G) (g : G i j)
(x : D1 i),
DiagramMap_comm m1 g x
@' h_obj j ((D1 _f g) x) =
ap (D2 _f g) (h_obj i x)
@' DiagramMap_comm m2 g x Q: Type HQ: Cocone D2 Q i, j: G g: G i j x: D1 i
ap (HQ j) (DiagramMap_comm m1 g x)^
@' legs_comm HQ i j g (m1 i x)
@' ap (HQ i) (h_obj i x) =
ap (HQ j) (h_obj j ((D1 _f g) x))
@' (ap (HQ j) (DiagramMap_comm m2 g x)^
@' legs_comm HQ i j g (m2 i x))
(* TODO: Most of the work here comes from a mismatch between the direction of the path in [DiagramMap_comm] and [legs_comm] in the [Cocone] record, causing a reversal in [cocone_precompose]. There is no reversal in [cocone_postcompose], so I think [Cocone] should change. If that is done, then this result wouldn't be needed at all, and one could directly use [Colimit_rec_homotopy']. *)
G: Graph D1, D2: Diagram G m1, m2: DiagramMap D1 D2 h_obj: foralli : G, m1 i == m2 i h_comm: forall (ij : G) (g : G i j)
(x : D1 i),
DiagramMap_comm m1 g x
@' h_obj j ((D1 _f g) x) =
ap (D2 _f g) (h_obj i x)
@' DiagramMap_comm m2 g x Q: Type HQ: Cocone D2 Q i, j: G g: G i j x: D1 i
(ap (HQ j) (DiagramMap_comm m1 g x))^
@' legs_comm HQ i j g (m1 i x)
@' ap (HQ i) (h_obj i x) =
ap (HQ j) (h_obj j ((D1 _f g) x))
@' (ap (HQ j) (DiagramMap_comm m2 g x)^
@' legs_comm HQ i j g (m2 i x))
G: Graph D1, D2: Diagram G m1, m2: DiagramMap D1 D2 h_obj: foralli : G, m1 i == m2 i h_comm: forall (ij : G) (g : G i j)
(x : D1 i),
DiagramMap_comm m1 g x
@' h_obj j ((D1 _f g) x) =
ap (D2 _f g) (h_obj i x)
@' DiagramMap_comm m2 g x Q: Type HQ: Cocone D2 Q i, j: G g: G i j x: D1 i
(ap (HQ j) (DiagramMap_comm m1 g x))^
@' (legs_comm HQ i j g (m1 i x)
@' ap (HQ i) (h_obj i x)) =
ap (HQ j) (h_obj j ((D1 _f g) x))
@' (ap (HQ j) (DiagramMap_comm m2 g x)^
@' legs_comm HQ i j g (m2 i x))
G: Graph D1, D2: Diagram G m1, m2: DiagramMap D1 D2 h_obj: foralli : G, m1 i == m2 i h_comm: forall (ij : G) (g : G i j)
(x : D1 i),
DiagramMap_comm m1 g x
@' h_obj j ((D1 _f g) x) =
ap (D2 _f g) (h_obj i x)
@' DiagramMap_comm m2 g x Q: Type HQ: Cocone D2 Q i, j: G g: G i j x: D1 i
legs_comm HQ i j g (m1 i x)
@' ap (HQ i) (h_obj i x) =
ap (HQ j) (DiagramMap_comm m1 g x)
@' (ap (HQ j) (h_obj j ((D1 _f g) x))
@' (ap (HQ j) (DiagramMap_comm m2 g x)^
@' legs_comm HQ i j g (m2 i x)))
G: Graph D1, D2: Diagram G m1, m2: DiagramMap D1 D2 h_obj: foralli : G, m1 i == m2 i h_comm: forall (ij : G) (g : G i j)
(x : D1 i),
DiagramMap_comm m1 g x
@' h_obj j ((D1 _f g) x) =
ap (D2 _f g) (h_obj i x)
@' DiagramMap_comm m2 g x Q: Type HQ: Cocone D2 Q i, j: G g: G i j x: D1 i
legs_comm HQ i j g (m1 i x)
@' ap (HQ i) (h_obj i x) =
ap (HQ j) (DiagramMap_comm m1 g x)
@' ap (HQ j) (h_obj j ((D1 _f g) x))
@' ap (HQ j) (DiagramMap_comm m2 g x)^
@' legs_comm HQ i j g (m2 i x)
G: Graph D1, D2: Diagram G m1, m2: DiagramMap D1 D2 h_obj: foralli : G, m1 i == m2 i h_comm: forall (ij : G) (g : G i j)
(x : D1 i),
DiagramMap_comm m1 g x
@' h_obj j ((D1 _f g) x) =
ap (D2 _f g) (h_obj i x)
@' DiagramMap_comm m2 g x Q: Type HQ: Cocone D2 Q i, j: G g: G i j x: D1 i
legs_comm HQ i j g (m1 i x)
@' ap (HQ i) (h_obj i x) =
ap (HQ j)
(DiagramMap_comm m1 g x
@' h_obj j ((D1 _f g) x)
@' (DiagramMap_comm m2 g x)^)
@' legs_comm HQ i j g (m2 i x)
G: Graph D1, D2: Diagram G m1, m2: DiagramMap D1 D2 h_obj: foralli : G, m1 i == m2 i h_comm: forall (ij : G) (g : G i j)
(x : D1 i),
DiagramMap_comm m1 g x
@' h_obj j ((D1 _f g) x) =
ap (D2 _f g) (h_obj i x)
@' DiagramMap_comm m2 g x Q: Type HQ: Cocone D2 Q i, j: G g: G i j x: D1 i
legs_comm HQ i j g (m1 i x)
@' ap (HQ i) (h_obj i x) =
ap (HQ j)
(ap (D2 _f g) (h_obj i x)
@' DiagramMap_comm m2 g x
@' (DiagramMap_comm m2 g x)^)
@' legs_comm HQ i j g (m2 i x)
G: Graph D1, D2: Diagram G m1, m2: DiagramMap D1 D2 h_obj: foralli : G, m1 i == m2 i h_comm: forall (ij : G) (g : G i j)
(x : D1 i),
DiagramMap_comm m1 g x
@' h_obj j ((D1 _f g) x) =
ap (D2 _f g) (h_obj i x)
@' DiagramMap_comm m2 g x Q: Type HQ: Cocone D2 Q i, j: G g: G i j x: D1 i
legs_comm HQ i j g (m1 i x)
@' ap (HQ i) (h_obj i x) =
ap (HQ j) (ap (D2 _f g) (h_obj i x))
@' legs_comm HQ i j g (m2 i x)
G: Graph D1, D2: Diagram G m1, m2: DiagramMap D1 D2 h_obj: foralli : G, m1 i == m2 i h_comm: forall (ij : G) (g : G i j)
(x : D1 i),
DiagramMap_comm m1 g x
@' h_obj j ((D1 _f g) x) =
ap (D2 _f g) (h_obj i x)
@' DiagramMap_comm m2 g x Q: Type HQ: Cocone D2 Q i, j: G g: G i j x: D1 i
legs_comm HQ i j g (m1 i x)
@' ap (HQ i) (h_obj i x) =
ap (funx : D2 i => HQ j ((D2 _f g) x)) (h_obj i x)
@' legs_comm HQ i j g (m2 i x)
exact (concat_Ap (legs_comm HQ i j g) (h_obj i x))^.Close Scope long_path_scope.Defined.(** Now we specialize to the case where the second cone is a colimiting cone. *)Definitionfunctor_Colimit {G : Graph} {D1D2 : Diagram G} (m : DiagramMap D1 D2)
: Colimit D1 -> Colimit D2
:= functor_Colimit_half m (cocone_colimit D2).(** A homotopy between diagram maps [m1, m2 : D1 => D2] gives a homotopy between the induced maps. *)Definitionfunctor_Colimit_homotopy {G : Graph} {D1D2 : Diagram G}
{m1m2 : DiagramMap D1 D2} (h : DiagramMap_homotopy m1 m2)
: functor_Colimit m1 == functor_Colimit m2
:= functor_Colimit_half_homotopy h _.(** Composition of diagram maps commutes with [functor_Colimit_half], provided the first map uses [functor_Colimit]. *)
G: Graph A, B, C: Diagram G f: DiagramMap A B g: DiagramMap B C Q: Type HQ: Cocone C Q
functor_Colimit_half (diagram_comp g f) HQ ==
functor_Colimit_half g HQ o functor_Colimit f
G: Graph A, B, C: Diagram G f: DiagramMap A B g: DiagramMap B C Q: Type HQ: Cocone C Q
functor_Colimit_half (diagram_comp g f) HQ ==
functor_Colimit_half g HQ o functor_Colimit f
G: Graph A, B, C: Diagram G f: DiagramMap A B g: DiagramMap B C Q: Type HQ: Cocone C Q
foralli : G,
cocone_precompose (diagram_comp g f) HQ i ==
(funx : Colimit A =>
functor_Colimit_half g HQ (functor_Colimit f x))
o colim i
G: Graph A, B, C: Diagram G f: DiagramMap A B g: DiagramMap B C Q: Type HQ: Cocone C Q
forall (ij : G) (g0 : G i j) (x : A i),
legs_comm (cocone_precompose (diagram_comp g f) HQ) i
j g0 x @ ?h_obj i x =
?h_obj j ((A _f g0) x) @
ap
(funx0 : Colimit A =>
functor_Colimit_half g HQ (functor_Colimit f x0))
(colimp i j g0 x)
G: Graph A, B, C: Diagram G f: DiagramMap A B g: DiagramMap B C Q: Type HQ: Cocone C Q
foralli : G,
cocone_precompose (diagram_comp g f) HQ i ==
(funx : Colimit A =>
functor_Colimit_half g HQ (functor_Colimit f x))
o colim i
reflexivity.
G: Graph A, B, C: Diagram G f: DiagramMap A B g: DiagramMap B C Q: Type HQ: Cocone C Q
forall (ij : G) (g0 : G i j) (x : A i),
legs_comm (cocone_precompose (diagram_comp g f) HQ) i
j g0 x @ (fun (i0 : G) (x0 : A i0) => 1) i x =
(fun (i0 : G) (x0 : A i0) => 1) j ((A _f g0) x) @
ap
(funx0 : Colimit A =>
functor_Colimit_half g HQ (functor_Colimit f x0))
(colimp i j g0 x)
G: Graph A, B, C: Diagram G f: DiagramMap A B g: DiagramMap B C Q: Type HQ: Cocone C Q i, j: G k: G i j x: A i
(ap (HQ j)
(comm_square_comp (DiagramMap_comm f k)
(DiagramMap_comm g k) x)^ @
legs_comm HQ i j k (g i (f i x))) @ 1 =
1 @
ap
(funx : Colimit A =>
functor_Colimit_half g HQ (functor_Colimit f x))
(colimp i j k x)
G: Graph A, B, C: Diagram G f: DiagramMap A B g: DiagramMap B C Q: Type HQ: Cocone C Q i, j: G k: G i j x: A i
ap (HQ j)
(comm_square_comp (DiagramMap_comm f k)
(DiagramMap_comm g k) x)^ @
legs_comm HQ i j k (g i (f i x)) =
ap
(funx : Colimit A =>
functor_Colimit_half g HQ (functor_Colimit f x))
(colimp i j k x)
G: Graph A, B, C: Diagram G f: DiagramMap A B g: DiagramMap B C Q: Type HQ: Cocone C Q i, j: G k: G i j x: A i
ap (HQ j)
(DiagramMap_comm g k (f i x) @
ap (g j) (DiagramMap_comm f k x))^ @
legs_comm HQ i j k (g i (f i x)) =
ap
(funx : Colimit A =>
functor_Colimit_half g HQ (functor_Colimit f x))
(colimp i j k x)
G: Graph A, B, C: Diagram G f: DiagramMap A B g: DiagramMap B C Q: Type HQ: Cocone C Q i, j: G k: G i j x: A i
ap (HQ j)
(DiagramMap_comm g k (f i x)
@' ap (g j) (DiagramMap_comm f k x))^
@' legs_comm HQ i j k (g i (f i x)) =
ap
(funx : Colimit A =>
functor_Colimit_half g HQ (functor_Colimit f x))
(colimp i j k x)
G: Graph A, B, C: Diagram G f: DiagramMap A B g: DiagramMap B C Q: Type HQ: Cocone C Q i, j: G k: G i j x: A i
(ap (HQ j)
(DiagramMap_comm g k (f i x)
@' ap (g j) (DiagramMap_comm f k x)))^
@' legs_comm HQ i j k (g i (f i x)) =
ap
(funx : Colimit A =>
functor_Colimit_half g HQ (functor_Colimit f x))
(colimp i j k x)
G: Graph A, B, C: Diagram G f: DiagramMap A B g: DiagramMap B C Q: Type HQ: Cocone C Q i, j: G k: G i j x: A i
(ap (HQ j) (DiagramMap_comm g k (f i x))
@' ap (HQ j) (ap (g j) (DiagramMap_comm f k x)))^
@' legs_comm HQ i j k (g i (f i x)) =
ap
(funx : Colimit A =>
functor_Colimit_half g HQ (functor_Colimit f x))
(colimp i j k x)
G: Graph A, B, C: Diagram G f: DiagramMap A B g: DiagramMap B C Q: Type HQ: Cocone C Q i, j: G k: G i j x: A i
(ap (HQ j) (ap (g j) (DiagramMap_comm f k x)))^
@' (ap (HQ j) (DiagramMap_comm g k (f i x)))^
@' legs_comm HQ i j k (g i (f i x)) =
ap
(funx : Colimit A =>
functor_Colimit_half g HQ (functor_Colimit f x))
(colimp i j k x)
G: Graph A, B, C: Diagram G f: DiagramMap A B g: DiagramMap B C Q: Type HQ: Cocone C Q i, j: G k: G i j x: A i
ap
(funx : Colimit A =>
functor_Colimit_half g HQ (functor_Colimit f x))
(colimp i j k x) =
(ap (HQ j) (ap (g j) (DiagramMap_comm f k x)))^
@' (ap (HQ j) (DiagramMap_comm g k (f i x)))^
@' legs_comm HQ i j k (g i (f i x))
G: Graph A, B, C: Diagram G f: DiagramMap A B g: DiagramMap B C Q: Type HQ: Cocone C Q i, j: G k: G i j x: A i
ap (functor_Colimit_half g HQ)
(ap (functor_Colimit f) (colimp i j k x)) =
(ap (HQ j) (ap (g j) (DiagramMap_comm f k x)))^
@' (ap (HQ j) (DiagramMap_comm g k (f i x)))^
@' legs_comm HQ i j k (g i (f i x))
G: Graph A, B, C: Diagram G f: DiagramMap A B g: DiagramMap B C Q: Type HQ: Cocone C Q i, j: G k: G i j x: A i
ap (functor_Colimit_half g HQ)
(legs_comm (cocone_precompose f (cocone_colimit B))
i j k x) =
(ap (HQ j) (ap (g j) (DiagramMap_comm f k x)))^
@' (ap (HQ j) (DiagramMap_comm g k (f i x)))^
@' legs_comm HQ i j k (g i (f i x))
(* [legs_comm] unfolds to a composite of paths, but the next line works best without unfolding it. *)
G: Graph A, B, C: Diagram G f: DiagramMap A B g: DiagramMap B C Q: Type HQ: Cocone C Q i, j: G k: G i j x: A i
ap (functor_Colimit_half g HQ)
(ap (cocone_colimit B j) (DiagramMap_comm f k x)^)
@' ap (functor_Colimit_half g HQ)
(legs_comm (cocone_colimit B) i j k (f i x)) =
(ap (HQ j) (ap (g j) (DiagramMap_comm f k x)))^
@' (ap (HQ j) (DiagramMap_comm g k (f i x)))^
@' legs_comm HQ i j k (g i (f i x))
G: Graph A, B, C: Diagram G f: DiagramMap A B g: DiagramMap B C Q: Type HQ: Cocone C Q i, j: G k: G i j x: A i
ap (functor_Colimit_half g HQ)
(legs_comm (cocone_colimit B) i j k (f i x)) = ?Goal
G: Graph A, B, C: Diagram G f: DiagramMap A B g: DiagramMap B C Q: Type HQ: Cocone C Q i, j: G k: G i j x: A i
ap (functor_Colimit_half g HQ)
(ap (cocone_colimit B j) (DiagramMap_comm f k x)^)
@' ?Goal =
(ap (HQ j) (ap (g j) (DiagramMap_comm f k x)))^
@' (ap (HQ j) (DiagramMap_comm g k (f i x)))^
@' legs_comm HQ i j k (g i (f i x))
G: Graph A, B, C: Diagram G f: DiagramMap A B g: DiagramMap B C Q: Type HQ: Cocone C Q i, j: G k: G i j x: A i
ap (functor_Colimit_half g HQ)
(ap (cocone_colimit B j) (DiagramMap_comm f k x)^)
@' legs_comm (cocone_precompose g HQ) i j k (f i x) =
(ap (HQ j) (ap (g j) (DiagramMap_comm f k x)))^
@' (ap (HQ j) (DiagramMap_comm g k (f i x)))^
@' legs_comm HQ i j k (g i (f i x))
G: Graph A, B, C: Diagram G f: DiagramMap A B g: DiagramMap B C Q: Type HQ: Cocone C Q i, j: G k: G i j x: A i
ap (functor_Colimit_half g HQ)
(ap (colim j) (DiagramMap_comm f k x)^)
@' (ap (HQ j) (DiagramMap_comm g k (f i x))^
@' legs_comm HQ i j k (g i (f i x))) =
(ap (HQ j) (ap (g j) (DiagramMap_comm f k x)))^
@' (ap (HQ j) (DiagramMap_comm g k (f i x)))^
@' legs_comm HQ i j k (g i (f i x))
G: Graph A, B, C: Diagram G f: DiagramMap A B g: DiagramMap B C Q: Type HQ: Cocone C Q i, j: G k: G i j x: A i
ap (functor_Colimit_half g HQ)
(ap (colim j) (DiagramMap_comm f k x)^)
@' ap (HQ j) (DiagramMap_comm g k (f i x))^
@' legs_comm HQ i j k (g i (f i x)) =
(ap (HQ j) (ap (g j) (DiagramMap_comm f k x)))^
@' (ap (HQ j) (DiagramMap_comm g k (f i x)))^
@' legs_comm HQ i j k (g i (f i x))
G: Graph A, B, C: Diagram G f: DiagramMap A B g: DiagramMap B C Q: Type HQ: Cocone C Q i, j: G k: G i j x: A i
ap (functor_Colimit_half g HQ)
(ap (colim j) (DiagramMap_comm f k x)^)
@' ap (HQ j) (DiagramMap_comm g k (f i x))^ =
(ap (HQ j) (ap (g j) (DiagramMap_comm f k x)))^
@' (ap (HQ j) (DiagramMap_comm g k (f i x)))^
G: Graph A, B, C: Diagram G f: DiagramMap A B g: DiagramMap B C Q: Type HQ: Cocone C Q i, j: G k: G i j x: A i
ap (functor_Colimit_half g HQ)
(ap (colim j) (DiagramMap_comm f k x)^) =
(ap (HQ j) (ap (g j) (DiagramMap_comm f k x)))^
G: Graph A, B, C: Diagram G f: DiagramMap A B g: DiagramMap B C Q: Type HQ: Cocone C Q i, j: G k: G i j x: A i
ap (HQ j) (DiagramMap_comm g k (f i x))^ =
(ap (HQ j) (DiagramMap_comm g k (f i x)))^
G: Graph A, B, C: Diagram G f: DiagramMap A B g: DiagramMap B C Q: Type HQ: Cocone C Q i, j: G k: G i j x: A i
ap (functor_Colimit_half g HQ)
(ap (colim j) (DiagramMap_comm f k x)^) =
(ap (HQ j) (ap (g j) (DiagramMap_comm f k x)))^
G: Graph A, B, C: Diagram G f: DiagramMap A B g: DiagramMap B C Q: Type HQ: Cocone C Q i, j: G k: G i j x: A i
ap (funx : B j => HQ j (g j x))
(DiagramMap_comm f k x)^ =
(ap (HQ j) (ap (g j) (DiagramMap_comm f k x)))^
G: Graph A, B, C: Diagram G f: DiagramMap A B g: DiagramMap B C Q: Type HQ: Cocone C Q i, j: G k: G i j x: A i
(ap (funx : B j => HQ j (g j x))
(DiagramMap_comm f k x))^ =
(ap (HQ j) (ap (g j) (DiagramMap_comm f k x)))^
apply ap, ap_compose.Close Scope long_path_scope.Defined.(** ** Functoriality of abstract colimits *)SectionFunctorialityColimit.Context `{Funext} {G : Graph}.(** Colimits are preserved by composition with a (diagram) equivalence. *)
H: Funext G: Graph D1, D2: Diagram G m: D1 ~d~ D2 Q: Type
IsColimit D2 Q -> IsColimit D1 Q
H: Funext G: Graph D1, D2: Diagram G m: D1 ~d~ D2 Q: Type
IsColimit D2 Q -> IsColimit D1 Q
H: Funext G: Graph D1, D2: Diagram G m: D1 ~d~ D2 Q: Type HQ: IsColimit D2 Q
IsColimit D1 Q
H: Funext G: Graph D1, D2: Diagram G m: D1 ~d~ D2 Q: Type HQ: IsColimit D2 Q
H: Funext G: Graph D: Diagram G Q, Q': Type f: Q <~> Q'
IsColimit D Q -> IsColimit D Q'
H: Funext G: Graph D: Diagram G Q, Q': Type f: Q <~> Q'
IsColimit D Q -> IsColimit D Q'
H: Funext G: Graph D: Diagram G Q, Q': Type f: Q <~> Q' HQ: IsColimit D Q
IsColimit D Q'
H: Funext G: Graph D: Diagram G Q, Q': Type f: Q <~> Q' HQ: IsColimit D Q
UniversalCocone (cocone_postcompose HQ f)
apply cocone_postcompose_equiv_universality, HQ.Defined.(** A diagram map [m : D1 => D2] induces a map between any two colimits of [D1] and [D2]. *)Definitionfunctor_colimit {D1D2 : Diagram G} (m : DiagramMap D1 D2)
{Q1Q2} (HQ1 : IsColimit D1 Q1) (HQ2 : IsColimit D2 Q2)
: Q1 -> Q2 := cocone_postcompose_inv HQ1 (cocone_precompose m HQ2).(** And this map commutes with diagram map. *)Definitionfunctor_colimit_commute {D1D2 : Diagram G}
(m : DiagramMap D1 D2) {Q1Q2}
(HQ1 : IsColimit D1 Q1) (HQ2: IsColimit D2 Q2)
: cocone_precompose m HQ2
= cocone_postcompose HQ1 (functor_colimit m HQ1 HQ2)
:= (eisretr (cocone_postcompose HQ1) _)^.(** Additional coherence with postcompose and precompose. *)
H: Funext G: Graph D1, D2: Diagram G m: DiagramMap D1 D2 Q1, Q2: Type HQ1: IsColimit D1 Q1 HQ2: IsColimit D2 Q2 T: Type t: Q2 -> T
cocone_postcompose HQ1 (t o functor_colimit m HQ1 HQ2) =
cocone_precompose m (cocone_postcompose HQ2 t)
H: Funext G: Graph D1, D2: Diagram G m: DiagramMap D1 D2 Q1, Q2: Type HQ1: IsColimit D1 Q1 HQ2: IsColimit D2 Q2 T: Type t: Q2 -> T
cocone_postcompose HQ1 (t o functor_colimit m HQ1 HQ2) =
cocone_precompose m (cocone_postcompose HQ2 t)
H: Funext G: Graph D1, D2: Diagram G m: DiagramMap D1 D2 Q1, Q2: Type HQ1: IsColimit D1 Q1 HQ2: IsColimit D2 Q2 T: Type t: Q2 -> T
cocone_postcompose
(cocone_postcompose HQ1 (functor_colimit m HQ1 HQ2))
t = cocone_precompose m (cocone_postcompose HQ2 t)
H: Funext G: Graph D1, D2: Diagram G m: DiagramMap D1 D2 Q1, Q2: Type HQ1: IsColimit D1 Q1 HQ2: IsColimit D2 Q2 T: Type t: Q2 -> T
cocone_postcompose (cocone_precompose m HQ2) t =
cocone_precompose m (cocone_postcompose HQ2 t)
napply cocone_precompose_postcompose.Defined.(** In order to show that colimits are functorial, we show that this is true after precomposing with the cocone. *)
apply cocone_precompose_identity.Defined.#[export] Instanceisequiv_functor_colimit
: IsEquiv (functor_colimit m HQ1 HQ2)
:= isequiv_adjointify _ _
functor_colimit_eissect functor_colimit_eisretr.Definitionequiv_functor_colimit : Q1 <~> Q2
:= Build_Equiv _ _ _ isequiv_functor_colimit.EndFunctorialityColimit.(** ** Unicity of colimits *)(** A particular case of the functoriality result is that all colimits of a diagram are equivalent (and hence equal in presence of univalence). *)
H: Funext G: Graph D: Diagram G Q1, Q2: Type HQ1: IsColimit D Q1 HQ2: IsColimit D Q2
Q1 <~> Q2
H: Funext G: Graph D: Diagram G Q1, Q2: Type HQ1: IsColimit D Q1 HQ2: IsColimit D Q2
Q1 <~> Q2
H: Funext G: Graph D: Diagram G Q1, Q2: Type HQ1: IsColimit D Q1 HQ2: IsColimit D Q2
D ~d~ D
srapply (Build_diagram_equiv (diagram_idmap D)).Defined.(** ** Colimits are left adjoint to constant diagram *)
H: Funext G: Graph D: Diagram G C: Type
(Colimit D -> C) <~> DiagramMap D (diagram_const C)
H: Funext G: Graph D: Diagram G C: Type
(Colimit D -> C) <~> DiagramMap D (diagram_const C)
H: Funext G: Graph D: Diagram G C: Type
DiagramMap D (diagram_const C) <~> (Colimit D -> C)