Built with Alectryon, running Coq+SerAPI v8.18.0+0.18.3. Bubbles () indicate interactive fragments: hover for details, tap to reveal contents. Use Ctrl+↑Ctrl+↓ to navigate, Ctrl+🖱️ to focus. On Mac, use ⌘ instead of Ctrl.
[Loading ML file number_string_notation_plugin.cmxs (using legacy method) ... done]
Require Import Diagrams.Diagram.Require Import Diagrams.Graph.Require Import Diagrams.Cocone.Require Import Diagrams.ConstantDiagram.Require Import Colimits.Coeq.LocalOpen Scope path_scope.Generalizable All Variables.(** This file contains the definition of colimits, and functoriality results on colimits. *)(** * Colimits *)(** A colimit is the extremity of a cocone. *)ClassIsColimit `(D: Diagram G) (Q: Type) := {
iscolimit_cocone : Cocone D Q;
iscolimit_unicocone : UniversalCocone iscolimit_cocone;
}.(* Use :> and remove the two following lines, once Coq 8.16 is the minimum required version. *)#[export] Existing Instanceiscolimit_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 *)(** Whatever the diagram considered, there exists a colimit of it. The existence is given by the HIT [colimit]. *)(** ** Definition of the 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 .>>*)(** A colimit is just 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))^.
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
srapply (Colimit_ind_beta_colimp (fun_ => P) C _ i j g x).Defined.Arguments colim : simpl never.Arguments colimp : simpl never.(** 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
H: Funext G: Graph D: Diagram G P: Type f: Colimit D -> P
Cocone D P
H: Funext G: Graph D: Diagram G P: Type f: Colimit D -> P
foralli : G, D i -> P
H: Funext G: Graph D: Diagram G P: Type f: Colimit D -> P
forall (ij : G) (g : G i j),
?legs j o D _f g == ?legs i
H: Funext G: Graph D: Diagram G P: Type f: Colimit D -> P
forall (ij : G) (g : G i j),
(fun (i0 : G) (g0 : D i0) => f (colim i0 g0)) j
o D _f g ==
(fun (i0 : G) (g0 : D i0) => f (colim i0 g0)) i
H: Funext G: Graph D: Diagram G P: Type f: Colimit D -> P i, j: G g: G i j x: D i
f (colim j ((D _f g) x)) = f (colim i x)
apply ap, colimp.
H: Funext G: Graph D: Diagram G P: Type
Colimit_rec P
o (funf : Colimit D -> P =>
{|
legs := fun (i : G) (g : D i) => f (colim i g);
legs_comm :=
fun (ij : G) (g : G i j) =>
(funx : D i => ap f (colimp i j g x))
:
(fun (i0 : G) (g0 : D i0) => f (colim i0 g0)) j
o D _f g ==
(fun (i0 : G) (g0 : D i0) => f (colim i0 g0)) i
|}) == idmap
H: Funext G: Graph D: Diagram G P: Type
(funf : Colimit D -> P =>
{|
legs := fun (i : G) (g : D i) => f (colim i g);
legs_comm :=
fun (ij : G) (g : G i j) =>
(funx : D i => ap f (colimp i j g x))
:
(fun (i0 : G) (g0 : D i0) => f (colim i0 g0)) j
o D _f g ==
(fun (i0 : G) (g0 : D i0) => f (colim i0 g0)) i
|}) o Colimit_rec P == idmap
H: Funext G: Graph D: Diagram G P: Type
Colimit_rec P
o (funf : Colimit D -> P =>
{|
legs := fun (i : G) (g : D i) => f (colim i g);
legs_comm :=
fun (ij : G) (g : G i j) =>
(funx : D i => ap f (colimp i j g x))
:
(fun (i0 : G) (g0 : D i0) => f (colim i0 g0)) j
o D _f g ==
(fun (i0 : G) (g0 : D i0) => f (colim i0 g0)) i
|}) == idmap
H: Funext G: Graph D: Diagram G P: Type x: Colimit D -> P
Colimit_rec P
{|
legs := fun (i : G) (g : D i) => x (colim i g);
legs_comm :=
fun (ij : G) (g : G i j) (x0 : D i) =>
ap x (colimp i j g x0)
|} = x
H: Funext G: Graph D: Diagram G P: Type x: Colimit D -> P
Colimit_rec P
{|
legs := fun (i : G) (g : D i) => x (colim i g);
legs_comm :=
fun (ij : G) (g : G i j) (x0 : D i) =>
ap x (colimp i j g x0)
|} == x
H: Funext G: Graph D: Diagram G P: Type x: Colimit D -> P
forall (i : G) (x0 : D i),
(funw : Colimit D =>
Colimit_rec P
{|
legs := fun (i0 : G) (g : D i0) => x (colim i0 g);
legs_comm :=
fun (i0j : G) (g : G i0 j) (x1 : D i0) =>
ap x (colimp i0 j g x1)
|} w = x w) (colim i x0)
H: Funext G: Graph D: Diagram G P: Type x: Colimit D -> P
forall (ij : G) (g : G i j) (x0 : D i),
transport
(funw : Colimit D =>
Colimit_rec P
{|
legs :=
fun (i0 : G) (g0 : D i0) => x (colim i0 g0);
legs_comm :=
fun (i0j0 : G) (g0 : G i0 j0) (x1 : D i0) =>
ap x (colimp i0 j0 g0 x1)
|} w = x w) (colimp i j g x0)
(?q j ((D _f g) x0)) = ?q i x0
H: Funext G: Graph D: Diagram G P: Type x: Colimit D -> P
forall (ij : G) (g : G i j) (x0 : D i),
transport
(funw : Colimit D =>
Colimit_rec P
{|
legs :=
fun (i0 : G) (g0 : D i0) => x (colim i0 g0);
legs_comm :=
fun (i0j0 : G) (g0 : G i0 j0) (x1 : D i0) =>
ap x (colimp i0 j0 g0 x1)
|} w = x w) (colimp i j g x0)
((fun (i0 : G) (x1 : D i0) => 1) j ((D _f g) x0)) =
(fun (i0 : G) (x1 : D i0) => 1) i x0
H: Funext G: Graph D: Diagram G P: Type x: Colimit D -> P i, j: G g: G i j x0: D i
transport
(funw : Colimit D =>
Colimit_rec P
{|
legs := fun (i : G) (g : D i) => x (colim i g);
legs_comm :=
fun (ij : G) (g : G i j) (x0 : D i) =>
ap x (colimp i j g x0)
|} w = x w) (colimp i j g x0) 1 = 1
H: Funext G: Graph D: Diagram G P: Type x: Colimit D -> P i, j: G g: G i j x0: D i
ap
(Colimit_rec P
{|
legs := fun (i : G) (g : D i) => x (colim i g);
legs_comm :=
fun (ij : G) (g : G i j) (x0 : D i) =>
ap x (colimp i j g x0)
|}) (colimp i j g x0) @ 1 =
1 @ ap x (colimp i j g x0)
H: Funext G: Graph D: Diagram G P: Type x: Colimit D -> P i, j: G g: G i j x0: D i
ap
(Colimit_rec P
{|
legs := fun (i : G) (g : D i) => x (colim i g);
legs_comm :=
fun (ij : G) (g : G i j) (x0 : D i) =>
ap x (colimp i j g x0)
|}) (colimp i j g x0) = ap x (colimp i j g x0)
apply Colimit_rec_beta_colimp.
H: Funext G: Graph D: Diagram G P: Type
(funf : Colimit D -> P =>
{|
legs := fun (i : G) (g : D i) => f (colim i g);
legs_comm :=
fun (ij : G) (g : G i j) =>
(funx : D i => ap f (colimp i j g x))
:
(fun (i0 : G) (g0 : D i0) => f (colim i0 g0)) j
o D _f g ==
(fun (i0 : G) (g0 : D i0) => f (colim i0 g0)) i
|}) o Colimit_rec P == idmap
H: Funext G: Graph D: Diagram G P: Type
(funf : Colimit D -> P =>
{|
legs := fun (i : G) (g : D i) => f (colim i g);
legs_comm :=
fun (ij : G) (g : G i j) =>
(funx : D i => ap f (colimp i j g x))
:
(fun (i0 : G) (g0 : D i0) => f (colim i0 g0)) j
o D _f g ==
(fun (i0 : G) (g0 : D i0) => f (colim i0 g0)) i
|}) 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
{|
legs :=
fun (i : G) (g : D i) =>
Colimit_rec P
{| legs := legs; legs_comm := legs_comm |}
(colim i g);
legs_comm :=
fun (ij : G) (g : G i j) (x : D i) =>
ap
(Colimit_rec P
{| legs := legs; legs_comm := legs_comm |})
(colimp i j g x)
|} = {| 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,
{|
legs :=
fun (i0 : G) (g : D i0) =>
Colimit_rec P
{| legs := legs; legs_comm := legs_comm |}
(colim i0 g);
legs_comm :=
fun (i0j : G) (g : G i0 j) (x : D i0) =>
ap
(Colimit_rec P
{| legs := legs; legs_comm := legs_comm |})
(colimp i0 j g x)
|} 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
{|
legs :=
fun (i0 : G) (g0 : D i0) =>
Colimit_rec P
{| legs := legs; legs_comm := legs_comm |}
(colim i0 g0);
legs_comm :=
fun (i0j0 : G) (g0 : G i0 j0) (x0 : D i0) =>
ap
(Colimit_rec P
{| legs := legs; legs_comm := legs_comm |})
(colimp i0 j0 g0 x0)
|} 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
{|
legs :=
fun (i0 : G) (g0 : D i0) =>
Colimit_rec P
{| legs := legs; legs_comm := legs_comm |}
(colim i0 g0);
legs_comm :=
fun (i0j0 : G) (g0 : G i0 j0) (x0 : D i0) =>
ap
(Colimit_rec P
{| legs := legs; legs_comm := legs_comm |})
(colimp i0 j0 g0 x0)
|} 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
Cocone.legs_comm
{| legs := legs; legs_comm := legs_comm |} i j g x @
1 = 1 @ legs_comm i j g x
hott_simpl.}Defined.Definitionequiv_colimit_rec `{Funext} {G : Graph} {D : Diagram G} (P : Type)
: Cocone D P <~> (Colimit D -> P) := Build_Equiv _ _ _ (isequiv_colimit_rec P).(** And we can now show that the HIT is actually a colimit. *)Definitioncocone_colimit {G : Graph} (D : Diagram G) : Cocone D (Colimit D)
:= Build_Cocone colim colimp.
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))
H: Funext G: Graph D: Diagram G Y: Type
cocone_postcompose (cocone_colimit D) o Colimit_rec Y ==
idmap
H: Funext G: Graph D: Diagram G Y: Type
Colimit_rec Y o cocone_postcompose (cocone_colimit D) ==
idmap
H: Funext G: Graph D: Diagram G Y: Type
cocone_postcompose (cocone_colimit D) o Colimit_rec Y ==
idmap
H: Funext G: Graph D: Diagram G Y: Type C: Cocone D Y
cocone_postcompose (cocone_colimit D)
(Colimit_rec Y C) = C
H: Funext G: Graph D: Diagram G Y: Type C: Cocone D Y
foralli : G,
cocone_postcompose (cocone_colimit D)
(Colimit_rec Y C) i == C i
H: Funext G: Graph D: Diagram G Y: Type C: Cocone D Y
forall (ij : G) (g : G i j) (x : D i),
legs_comm
(cocone_postcompose (cocone_colimit D)
(Colimit_rec Y C)) i j g x @ ?path_legs i x =
?path_legs j ((D _f g) x) @ legs_comm C i j g x
H: Funext G: Graph D: Diagram G Y: Type C: Cocone D Y
forall (ij : G) (g : G i j) (x : D i),
legs_comm
(cocone_postcompose (cocone_colimit D)
(Colimit_rec Y 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 Y: Type C: Cocone D Y i, j: G f: G i j x: D i
ap (Colimit_rec Y C) (colimp i j f x) @ 1 =
1 @ legs_comm C i j f x
H: Funext G: Graph D: Diagram G Y: Type C: Cocone D Y i, j: G f: G i j x: D i
ap (Colimit_rec Y C) (colimp i j f x) =
legs_comm C i j f x
apply Colimit_rec_beta_colimp.
H: Funext G: Graph D: Diagram G Y: Type
Colimit_rec Y o cocone_postcompose (cocone_colimit D) ==
idmap
H: Funext G: Graph D: Diagram G Y: Type f: Colimit D -> Y
Colimit_rec Y
(cocone_postcompose (cocone_colimit D) f) = f
H: Funext G: Graph D: Diagram G Y: Type f: Colimit D -> Y
Colimit_rec Y
(cocone_postcompose (cocone_colimit D) f) == f
H: Funext G: Graph D: Diagram G Y: Type f: Colimit D -> Y
forall (i : G) (x : D i),
(funw : Colimit D =>
Colimit_rec Y
(cocone_postcompose (cocone_colimit D) f) w = f w)
(colim i x)
H: Funext G: Graph D: Diagram G Y: Type f: Colimit D -> Y
forall (ij : G) (g : G i j) (x : D i),
transport
(funw : Colimit D =>
Colimit_rec Y
(cocone_postcompose (cocone_colimit D) f) w =
f w) (colimp i j g x) (?q j ((D _f g) x)) = ?q i x
H: Funext G: Graph D: Diagram G Y: Type f: Colimit D -> Y
forall (ij : G) (g : G i j) (x : D i),
transport
(funw : Colimit D =>
Colimit_rec Y
(cocone_postcompose (cocone_colimit D) f) w =
f w) (colimp i j g x)
((fun (i0 : G) (x0 : D i0) => 1) j ((D _f g) x)) =
(fun (i0 : G) (x0 : D i0) => 1) i x
H: Funext G: Graph D: Diagram G Y: Type f: Colimit D -> Y i, j: G g: G i j x: D i
transport
(funw : Colimit D =>
Colimit_rec Y
(cocone_postcompose (cocone_colimit D) f) w =
f w) (colimp i j g x) 1 = 1
H: Funext G: Graph D: Diagram G Y: Type f: Colimit D -> Y i, j: G g: G i j x: D i
ap
(Colimit_rec Y
(cocone_postcompose (cocone_colimit D) f))
(colimp i j g x) @ 1 = 1 @ ap f (colimp i j g x)
H: Funext G: Graph D: Diagram G Y: Type f: Colimit D -> Y i, j: G g: G i j x: D i
ap
(Colimit_rec Y
(cocone_postcompose (cocone_colimit D) f))
(colimp i j g x) = ap f (colimp i j g x)
apply Colimit_rec_beta_colimp.Defined.Global Instanceiscolimit_colimit `{Funext} {G : Graph} (D : Diagram G)
: IsColimit D (Colimit D) := Build_IsColimit _ (unicocone_colimit D).(** * Functoriality of 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
apply cocone_precompose_identity.Defined.Global 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 particuliar 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)