Built with Alectryon. 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.
From HoTT Require Import Basics.From HoTT Require Import Basics.Require Import Diagrams.Diagram.Require Import Diagrams.Graph.Require Import Diagrams.Cone.Require Import Diagrams.ConstantDiagram.LocalOpen Scope path_scope.Generalizable All Variables.(** This file contains the definition of limits, and functoriality results on limits. *)(** * Limits *)(** A Limit is the extremity of a cone. *)ClassIsLimit `(D : Diagram G) (Q : Type) := {
islimit_cone :: Cone Q D;
islimit_unicone : UniversalCone islimit_cone;
}.Coercionislimit_cone : IsLimit >-> Cone.Arguments Build_IsLimit {G D Q} C H : rename.Arguments islimit_cone {G D Q} C : rename.Arguments islimit_unicone {G D Q} H : rename.(** [cone_precompose_inv] is defined for convenience: it is only the inverse of [cone_precompose]. It allows to recover the map [h] from a cone [C']. *)Definitioncone_precompose_inv `{D: Diagram G} {Q X}
(H : IsLimit D Q) (C' : Cone X D) : X -> Q
:= @equiv_inv _ _ _ (islimit_unicone H X) C'.(** * Existence of limits *)RecordLimit `(D : Diagram G) := {
lim : foralli, D i;
limp : forallij (g : G i j), D _f g (lim i) = lim j;
}.Arguments lim {_ _}.Arguments limp {_ _}.
G: Graph D: Diagram G
Cone (Limit D) D
G: Graph D: Diagram G
Cone (Limit D) D
G: Graph D: Diagram G
foralli : G, Limit D -> D i
G: Graph D: Diagram G
forall (ij : G) (g : G i j), D _f g o ?legs i == ?legs j
G: Graph D: Diagram G
foralli : G, Limit D -> D i
G: Graph D: Diagram G i: G x: Limit D
D i
exact (lim x i).
G: Graph D: Diagram G
forall (ij : G) (g : G i j),
D _f g o (fun (i0 : G) (x : Limit D) => lim x i0) i ==
(fun (i0 : G) (x : Limit D) => lim x i0) j
G: Graph D: Diagram G i, j: G g: G i j x: Limit D
(D _f g) (lim x i) = lim x j
apply limp.Defined.
G: Graph D: Diagram G
UniversalCone (cone_limit D)
G: Graph D: Diagram G
UniversalCone (cone_limit D)
G: Graph D: Diagram G Y: Type
IsEquiv (cone_precompose (cone_limit D))
G: Graph D: Diagram G Y: Type
Cone Y D -> Y -> Limit D
G: Graph D: Diagram G Y: Type
cone_precompose (cone_limit D) o ?g == idmap
G: Graph D: Diagram G Y: Type
?g o cone_precompose (cone_limit D) == idmap
G: Graph D: Diagram G Y: Type
Cone Y D -> Y -> Limit D
G: Graph D: Diagram G Y: Type c: Cone Y D y: Y
Limit D
G: Graph D: Diagram G Y: Type c: Cone Y D y: Y
foralli : G, D i
G: Graph D: Diagram G Y: Type c: Cone Y D y: Y
forall (ij : G) (g : G i j), (D _f g) (?lim i) = ?lim j
G: Graph D: Diagram G Y: Type c: Cone Y D y: Y
foralli : G, D i
G: Graph D: Diagram G Y: Type c: Cone Y D y: Y i: G
D i
exact (legs c i y).
G: Graph D: Diagram G Y: Type c: Cone Y D y: Y
forall (ij : G) (g : G i j),
(D _f g) ((funi0 : G => c i0 y) i) = (funi0 : G => c i0 y) j
G: Graph D: Diagram G Y: Type c: Cone Y D y: Y i, j: G g: G i j
(D _f g) ((funi0 : G => c i0 y) i) = (funi0 : G => c i0 y) j
apply legs_comm.
G: Graph D: Diagram G Y: Type
cone_precompose (cone_limit D)
o (fun (c : Cone Y D) (y : Y) =>
{|
lim := funi : G => c i y;
limp := fun (ij : G) (g : G i j) => legs_comm c i j g y
|}) ==
idmap
G: Graph D: Diagram G Y: Type
(fun (c : Cone Y D) (y : Y) =>
{|
lim := funi : G => c i y;
limp := fun (ij : G) (g : G i j) => legs_comm c i j g y
|})
o cone_precompose (cone_limit D) == idmap
all: intro; reflexivity.Defined.Instanceislimit_limit `(D : Diagram G) : IsLimit D (Limit D)
:= Build_IsLimit (cone_limit _) _.(** * Functoriality of limits *)SectionFunctorialityLimit.Context `{Funext} {G : Graph}.(** Limits are preserved by composition with a (diagram) equivalence. *)
H: Funext G: Graph D: Diagram G Q, Q': Type f: Q <~> Q'
IsLimit D Q' -> IsLimit D Q
H: Funext G: Graph D: Diagram G Q, Q': Type f: Q <~> Q'
IsLimit D Q' -> IsLimit D Q
H: Funext G: Graph D: Diagram G Q, Q': Type f: Q <~> Q' HQ: IsLimit D Q'
IsLimit D Q
H: Funext G: Graph D: Diagram G Q, Q': Type f: Q <~> Q' HQ: IsLimit D Q'
apply cone_postcompose_identity.Defined.#[export] Instanceisequiv_functor_limit
: IsEquiv (functor_limit m HQ1 HQ2)
:= isequiv_adjointify _ _
functor_limit_eissect functor_limit_eisretr.Definitionequiv_functor_limit : Q1 <~> Q2
:= Build_Equiv _ _ _ isequiv_functor_limit.EndFunctorialityLimit.(** * Unicity of limits *)(** A particular case of the functoriality result is that all limits of a diagram are equivalent (and hence equal in presence of univalence). *)
H: Funext G: Graph D: Diagram G Q1, Q2: Type HQ1: IsLimit D Q1 HQ2: IsLimit D Q2
Q1 <~> Q2
H: Funext G: Graph D: Diagram G Q1, Q2: Type HQ1: IsLimit D Q1 HQ2: IsLimit D Q2
Q1 <~> Q2
H: Funext G: Graph D: Diagram G Q1, Q2: Type HQ1: IsLimit D Q1 HQ2: IsLimit D Q2
D ~d~ D
srapply (Build_diagram_equiv (diagram_idmap D)).Defined.(** * Limits are right adjoint to constant diagram *)
G: Graph D: Diagram G C: Type
(C -> Limit D) <~> DiagramMap (diagram_const C) D
G: Graph D: Diagram G C: Type
(C -> Limit D) <~> DiagramMap (diagram_const C) D
G: Graph D: Diagram G C: Type
(C -> Limit D) -> DiagramMap (diagram_const C) D
G: Graph D: Diagram G C: Type
DiagramMap (diagram_const C) D -> C -> Limit D
G: Graph D: Diagram G C: Type
?f o ?g == idmap
G: Graph D: Diagram G C: Type
?g o ?f == idmap
G: Graph D: Diagram G C: Type
(C -> Limit D) -> DiagramMap (diagram_const C) D
G: Graph D: Diagram G C: Type f: C -> Limit D
DiagramMap (diagram_const C) D
G: Graph D: Diagram G C: Type f: C -> Limit D
foralli : G, diagram_const C i -> D i
G: Graph D: Diagram G C: Type f: C -> Limit D
forall (ij : G) (g : G i j) (x : diagram_const C i),
(D _f g) (?DiagramMap_obj i x) =
?DiagramMap_obj j (((diagram_const C) _f g) x)
G: Graph D: Diagram G C: Type f: C -> Limit D
foralli : G, diagram_const C i -> D i
G: Graph D: Diagram G C: Type f: C -> Limit D i: G c: diagram_const C i
D i
apply lim, f, c.
G: Graph D: Diagram G C: Type f: C -> Limit D
forall (ij : G) (g : G i j) (x : diagram_const C i),
(D _f g) ((fun (i0 : G) (c : diagram_const C i0) => lim (f c) i0) i x) =
(fun (i0 : G) (c : diagram_const C i0) => lim (f c) i0) j
(((diagram_const C) _f g) x)
G: Graph D: Diagram G C: Type f: C -> Limit D i, j: G g: G i j x: diagram_const C i
(D _f g) ((fun (i0 : G) (c : diagram_const C i0) => lim (f c) i0) i x) =
(fun (i0 : G) (c : diagram_const C i0) => lim (f c) i0) j
(((diagram_const C) _f g) x)
apply limp.
G: Graph D: Diagram G C: Type
DiagramMap (diagram_const C) D -> C -> Limit D
G: Graph D: Diagram G C: Type
(funf : C -> Limit D =>
{|
DiagramMap_obj := fun (i : G) (c : diagram_const C i) => lim (f c) i;
DiagramMap_comm :=
fun (ij : G) (g : G i j) (x : diagram_const C i) =>
limp (f (((diagram_const C) _f g) x)) i j g
|})
o ?g == idmap
G: Graph D: Diagram G C: Type
?g
o (funf : C -> Limit D =>
{|
DiagramMap_obj := fun (i : G) (c : diagram_const C i) => lim (f c) i;
DiagramMap_comm :=
fun (ij : G) (g : G i j) (x : diagram_const C i) =>
limp (f (((diagram_const C) _f g) x)) i j g
|}) ==
idmap
G: Graph D: Diagram G C: Type
DiagramMap (diagram_const C) D -> C -> Limit D
G: Graph D: Diagram G C: Type f: foralli : G, diagram_const C i -> D i p: forall (ij : G) (g : G i j) (x : diagram_const C i),
(D _f g) (f i x) = f j (((diagram_const C) _f g) x) c: C
Limit D
G: Graph D: Diagram G C: Type f: foralli : G, diagram_const C i -> D i p: forall (ij : G) (g : G i j) (x : diagram_const C i),
(D _f g) (f i x) = f j (((diagram_const C) _f g) x) c: C
foralli : G, D i
G: Graph D: Diagram G C: Type f: foralli : G, diagram_const C i -> D i p: forall (ij : G) (g : G i j) (x : diagram_const C i),
(D _f g) (f i x) = f j (((diagram_const C) _f g) x) c: C
forall (ij : G) (g : G i j), (D _f g) (?lim i) = ?lim j
G: Graph D: Diagram G C: Type f: foralli : G, diagram_const C i -> D i p: forall (ij : G) (g : G i j) (x : diagram_const C i),
(D _f g) (f i x) = f j (((diagram_const C) _f g) x) c: C
foralli : G, D i
G: Graph D: Diagram G C: Type f: foralli0 : G, diagram_const C i0 -> D i0 p: forall (i0j : G) (g : G i0 j) (x : diagram_const C i0),
(D _f g) (f i0 x) = f j (((diagram_const C) _f g) x) c: C i: G
D i
apply f, c.
G: Graph D: Diagram G C: Type f: foralli : G, diagram_const C i -> D i p: forall (ij : G) (g : G i j) (x : diagram_const C i),
(D _f g) (f i x) = f j (((diagram_const C) _f g) x) c: C
forall (ij : G) (g : G i j),
(D _f g) ((funi0 : G => f i0 c) i) = (funi0 : G => f i0 c) j
G: Graph D: Diagram G C: Type f: foralli0 : G, diagram_const C i0 -> D i0 p: forall (i0j0 : G) (g0 : G i0 j0) (x : diagram_const C i0),
(D _f g0) (f i0 x) = f j0 (((diagram_const C) _f g0) x) c: C i, j: G g: G i j
(D _f g) ((funi0 : G => f i0 c) i) = (funi0 : G => f i0 c) j
apply p.
G: Graph D: Diagram G C: Type
(funf : C -> Limit D =>
{|
DiagramMap_obj := fun (i : G) (c : diagram_const C i) => lim (f c) i;
DiagramMap_comm :=
fun (ij : G) (g : G i j) (x : diagram_const C i) =>
limp (f (((diagram_const C) _f g) x)) i j g
|})
o (funX : DiagramMap (diagram_const C) D =>
(fun (f : foralli : G, diagram_const C i -> D i)
(p : forall (ij : G) (g : G i j) (x : diagram_const C i),
(D _f g) (f i x) = f j (((diagram_const C) _f g) x))
(c : C) =>
{|
lim := funi : G => f i c;
limp := fun (ij : G) (g : G i j) => p i j g c
|}) X (DiagramMap_comm X)) ==
idmap
G: Graph D: Diagram G C: Type
(funX : DiagramMap (diagram_const C) D =>
(fun (f : foralli : G, diagram_const C i -> D i)
(p : forall (ij : G) (g : G i j) (x : diagram_const C i),
(D _f g) (f i x) = f j (((diagram_const C) _f g) x))
(c : C) =>
{|
lim := funi : G => f i c; limp := fun (ij : G) (g : G i j) => p i j g c
|}) X (DiagramMap_comm X))
o (funf : C -> Limit D =>
{|
DiagramMap_obj := fun (i : G) (c : diagram_const C i) => lim (f c) i;
DiagramMap_comm :=
fun (ij : G) (g : G i j) (x : diagram_const C i) =>
limp (f (((diagram_const C) _f g) x)) i j g
|}) ==
idmap