Pullbacks #
THIS FILE IS SYNCHRONIZED WITH MATHLIB4. Any changes to this file require a corresponding PR to mathlib4.
We define a category walking_cospan
(resp. walking_span
), which is the index category
for the given data for a pullback (resp. pushout) diagram. Convenience methods cospan f g
and span f g
construct functors from the walking (co)span, hitting the given morphisms.
We define pullback f g
and pushout f g
as limits and colimits of such functors.
References #
The type of objects for the diagram indexing a pullback, defined as a special case of
wide_pullback_shape
.
The left point of the walking cospan.
The right point of the walking cospan.
The central point of the walking cospan.
The type of objects for the diagram indexing a pushout, defined as a special case of
wide_pushout_shape
.
The left point of the walking span.
The right point of the walking span.
The central point of the walking span.
The type of arrows for the diagram indexing a pullback.
The left arrow of the walking cospan.
The right arrow of the walking cospan.
The identity arrows of the walking cospan.
The type of arrows for the diagram indexing a pushout.
The identity arrows of the walking span.
To construct an isomorphism of cones over the walking cospan,
it suffices to construct an isomorphism
of the cone points and check it commutes with the legs to left
and right
.
Equations
To construct an isomorphism of cocones over the walking span,
it suffices to construct an isomorphism
of the cocone points and check it commutes with the legs from left
and right
.
Equations
cospan f g
is the functor from the walking cospan hitting f
and g
.
Equations
- category_theory.limits.cospan f g = category_theory.limits.wide_pullback_shape.wide_cospan Z (λ (j : category_theory.limits.walking_pair), j.cases_on X Y) (λ (j : category_theory.limits.walking_pair), j.cases_on f g)
span f g
is the functor from the walking span hitting f
and g
.
Equations
- category_theory.limits.span f g = category_theory.limits.wide_pushout_shape.wide_span X (λ (j : category_theory.limits.walking_pair), j.cases_on Y Z) (λ (j : category_theory.limits.walking_pair), j.cases_on f g)
Every diagram indexing an pullback is naturally isomorphic (actually, equal) to a cospan
Every diagram indexing a pushout is naturally isomorphic (actually, equal) to a span
A functor applied to a cospan is a cospan.
Equations
- category_theory.limits.cospan_comp_iso F f g = category_theory.nat_iso.of_components (λ (X_1 : category_theory.limits.walking_cospan), option.cases_on X_1 (category_theory.iso.refl ((category_theory.limits.cospan f g ⋙ F).obj option.none)) (λ (X_1 : category_theory.limits.walking_pair), X_1.cases_on (category_theory.iso.refl ((category_theory.limits.cospan f g ⋙ F).obj (option.some category_theory.limits.walking_pair.left))) (category_theory.iso.refl ((category_theory.limits.cospan f g ⋙ F).obj (option.some category_theory.limits.walking_pair.right))))) _
A functor applied to a span is a span.
Equations
- category_theory.limits.span_comp_iso F f g = category_theory.nat_iso.of_components (λ (X_1 : category_theory.limits.walking_span), option.cases_on X_1 (category_theory.iso.refl ((category_theory.limits.span f g ⋙ F).obj option.none)) (λ (X_1 : category_theory.limits.walking_pair), X_1.cases_on (category_theory.iso.refl ((category_theory.limits.span f g ⋙ F).obj (option.some category_theory.limits.walking_pair.left))) (category_theory.iso.refl ((category_theory.limits.span f g ⋙ F).obj (option.some category_theory.limits.walking_pair.right))))) _
Construct an isomorphism of cospans from components.
Equations
- category_theory.limits.cospan_ext iX iY iZ wf wg = category_theory.nat_iso.of_components (λ (X_1 : category_theory.limits.walking_cospan), option.cases_on X_1 iZ (λ (X_1 : category_theory.limits.walking_pair), X_1.cases_on iX iY)) _
Construct an isomorphism of spans from components.
Equations
- category_theory.limits.span_ext iX iY iZ wf wg = category_theory.nat_iso.of_components (λ (X_1 : category_theory.limits.walking_span), option.cases_on X_1 iX (λ (X_1 : category_theory.limits.walking_pair), X_1.cases_on iY iZ)) _
A pullback cone is just a cone on the cospan formed by two morphisms f : X ⟶ Z
and
g : Y ⟶ Z
.
The first projection of a pullback cone.
The second projection of a pullback cone.
This is a slightly more convenient method to verify that a pullback cone is a limit cone. It only asks for a proof of facts that carry any mathematical content
This is another convenient method to verify that a pullback cone is a limit cone. It
only asks for a proof of facts that carry any mathematical content, and allows access to the
same s
for all parts.
Equations
- t.is_limit_aux' create = t.is_limit_aux (λ (s : category_theory.limits.pullback_cone f g), (create s).val) _ _ _
A pullback cone on f
and g
is determined by morphisms fst : W ⟶ X
and snd : W ⟶ Y
such that fst ≫ f = snd ≫ g
.
Equations
- category_theory.limits.pullback_cone.mk fst snd eq = {X := W, π := {app := λ (j : category_theory.limits.walking_cospan), option.cases_on j (fst ≫ f) (λ (j' : category_theory.limits.walking_pair), j'.cases_on fst snd), naturality' := _}}
To check whether a morphism is equalized by the maps of a pullback cone, it suffices to check
it for fst t
and snd t
To construct an isomorphism of pullback cones, it suffices to construct an isomorphism
of the cone points and check it commutes with fst
and snd
.
Equations
If t
is a limit pullback cone over f
and g
and h : W ⟶ X
and k : W ⟶ Y
are such that
h ≫ f = k ≫ g
, then we have l : W ⟶ t.X
satisfying l ≫ fst t = h
and l ≫ snd t = k
.
Equations
- category_theory.limits.pullback_cone.is_limit.lift' ht h k w = ⟨ht.lift (category_theory.limits.pullback_cone.mk h k w), _⟩
This is a more convenient formulation to show that a pullback_cone
constructed using
pullback_cone.mk
is a limit cone.
Equations
- category_theory.limits.pullback_cone.is_limit.mk eq lift fac_left fac_right uniq = (category_theory.limits.pullback_cone.mk fst snd eq).is_limit_aux lift fac_left fac_right _
The flip of a pullback square is a pullback square.
Equations
- category_theory.limits.pullback_cone.flip_is_limit t = (category_theory.limits.pullback_cone.mk h k comm).is_limit_aux' (λ (s : category_theory.limits.pullback_cone f g), ⟨(category_theory.limits.pullback_cone.is_limit.lift' t s.snd s.fst _).val, _⟩)
The pullback cone (𝟙 X, 𝟙 X)
for the pair (f, f)
is a limit if f
is a mono. The converse is
shown in mono_of_pullback_is_id
.
Equations
f
is a mono if the pullback cone (𝟙 X, 𝟙 X)
is a limit for the pair (f, f)
. The converse is
given in pullback_cone.is_id_of_mono
.
Suppose f
and g
are two morphisms with a common codomain and s
is a limit cone over the
diagram formed by f
and g
. Suppose f
and g
both factor through a monomorphism h
via
x
and y
, respectively. Then s
is also a limit cone over the diagram formed by x
and
y
.
Equations
- category_theory.limits.pullback_cone.is_limit_of_factors f g h x y hxh hyh s hs = (category_theory.limits.pullback_cone.mk s.fst s.snd _).is_limit_aux' (λ (t : category_theory.limits.pullback_cone x y), ⟨hs.lift (category_theory.limits.pullback_cone.mk t.fst t.snd _), _⟩)
If W
is the pullback of f, g
,
it is also the pullback of f ≫ i, g ≫ i
for any mono i
.
Equations
- category_theory.limits.pullback_cone.is_limit_of_comp_mono f g i s H = (category_theory.limits.pullback_cone.mk s.fst s.snd _).is_limit_aux' (λ (s_1 : category_theory.limits.pullback_cone (f ≫ i) (g ≫ i)), (category_theory.limits.pullback_cone.is_limit.lift' H s_1.fst s_1.snd _).cases_on (λ (l : s_1.X ⟶ s.X) (property : l ≫ s.fst = s_1.fst ∧ l ≫ s.snd = s_1.snd), property.dcases_on (λ (h₁ : l ≫ s.fst = s_1.fst) (h₂ : l ≫ s.snd = s_1.snd), ⟨l, _⟩)))
A pushout cocone is just a cocone on the span formed by two morphisms f : X ⟶ Y
and
g : X ⟶ Z
.
The first inclusion of a pushout cocone.
The second inclusion of a pushout cocone.
This is a slightly more convenient method to verify that a pushout cocone is a colimit cocone. It only asks for a proof of facts that carry any mathematical content
This is another convenient method to verify that a pushout cocone is a colimit cocone. It
only asks for a proof of facts that carry any mathematical content, and allows access to the
same s
for all parts.
Equations
- t.is_colimit_aux' create = t.is_colimit_aux (λ (s : category_theory.limits.pushout_cocone f g), (create s).val) _ _ _
A pushout cocone on f
and g
is determined by morphisms inl : Y ⟶ W
and inr : Z ⟶ W
such
that f ≫ inl = g ↠ inr
.
Equations
- category_theory.limits.pushout_cocone.mk inl inr eq = {X := W, ι := {app := λ (j : category_theory.limits.walking_span), option.cases_on j (f ≫ inl) (λ (j' : category_theory.limits.walking_pair), j'.cases_on inl inr), naturality' := _}}
To check whether a morphism is coequalized by the maps of a pushout cocone, it suffices to check
it for inl t
and inr t
If t
is a colimit pushout cocone over f
and g
and h : Y ⟶ W
and k : Z ⟶ W
are
morphisms satisfying f ≫ h = g ≫ k
, then we have a factorization l : t.X ⟶ W
such that
inl t ≫ l = h
and inr t ≫ l = k
.
Equations
- category_theory.limits.pushout_cocone.is_colimit.desc' ht h k w = ⟨ht.desc (category_theory.limits.pushout_cocone.mk h k w), _⟩
To construct an isomorphism of pushout cocones, it suffices to construct an isomorphism
of the cocone points and check it commutes with inl
and inr
.
Equations
This is a more convenient formulation to show that a pushout_cocone
constructed using
pushout_cocone.mk
is a colimit cocone.
Equations
- category_theory.limits.pushout_cocone.is_colimit.mk eq desc fac_left fac_right uniq = (category_theory.limits.pushout_cocone.mk inl inr eq).is_colimit_aux desc fac_left fac_right _
The flip of a pushout square is a pushout square.
Equations
The pushout cocone (𝟙 X, 𝟙 X)
for the pair (f, f)
is a colimit if f
is an epi. The converse is
shown in epi_of_is_colimit_mk_id_id
.
Equations
f
is an epi if the pushout cocone (𝟙 X, 𝟙 X)
is a colimit for the pair (f, f)
.
The converse is given in pushout_cocone.is_colimit_mk_id_id
.
Suppose f
and g
are two morphisms with a common domain and s
is a colimit cocone over the
diagram formed by f
and g
. Suppose f
and g
both factor through an epimorphism h
via
x
and y
, respectively. Then s
is also a colimit cocone over the diagram formed by x
and
y
.
Equations
- category_theory.limits.pushout_cocone.is_colimit_of_factors f g h x y hhx hhy s hs = (category_theory.limits.pushout_cocone.mk s.inl s.inr _).is_colimit_aux' (λ (t : category_theory.limits.pushout_cocone x y), ⟨hs.desc (category_theory.limits.pushout_cocone.mk t.inl t.inr _), _⟩)
If W
is the pushout of f, g
,
it is also the pushout of h ≫ f, h ≫ g
for any epi h
.
Equations
- category_theory.limits.pushout_cocone.is_colimit_of_epi_comp f g h s H = (category_theory.limits.pushout_cocone.mk s.inl s.inr _).is_colimit_aux' (λ (s_1 : category_theory.limits.pushout_cocone (h ≫ f) (h ≫ g)), (category_theory.limits.pushout_cocone.is_colimit.desc' H s_1.inl s_1.inr _).cases_on (λ (l : s.X ⟶ s_1.X) (property : s.inl ≫ l = s_1.inl ∧ s.inr ≫ l = s_1.inr), property.dcases_on (λ (h₁ : s.inl ≫ l = s_1.inl) (h₂ : s.inr ≫ l = s_1.inr), ⟨l, _⟩)))
This is a helper construction that can be useful when verifying that a category has all
pullbacks. Given F : walking_cospan ⥤ C
, which is really the same as
cospan (F.map inl) (F.map inr)
, and a pullback cone on F.map inl
and F.map inr
, we
get a cone on F
.
If you're thinking about using this, have a look at has_pullbacks_of_has_limit_cospan
,
which you may find to be an easier way of achieving your goal.
Equations
- category_theory.limits.cone.of_pullback_cone t = {X := t.X, π := t.π ≫ (category_theory.limits.diagram_iso_cospan F).inv}
This is a helper construction that can be useful when verifying that a category has all
pushout. Given F : walking_span ⥤ C
, which is really the same as
span (F.map fst) (F.mal snd)
, and a pushout cocone on F.map fst
and F.map snd
,
we get a cocone on F
.
If you're thinking about using this, have a look at has_pushouts_of_has_colimit_span
, which
you may find to be an easiery way of achieving your goal.
Equations
- category_theory.limits.cocone.of_pushout_cocone t = {X := t.X, ι := (category_theory.limits.diagram_iso_span F).hom ≫ t.ι}
Given F : walking_cospan ⥤ C
, which is really the same as cospan (F.map inl) (F.map inr)
,
and a cone on F
, we get a pullback cone on F.map inl
and F.map inr
.
Equations
- category_theory.limits.pullback_cone.of_cone t = {X := t.X, π := t.π ≫ (category_theory.limits.diagram_iso_cospan F).hom}
A diagram walking_cospan ⥤ C
is isomorphic to some pullback_cone.mk
after
composing with diagram_iso_cospan
.
Given F : walking_span ⥤ C
, which is really the same as span (F.map fst) (F.map snd)
,
and a cocone on F
, we get a pushout cocone on F.map fst
and F.map snd
.
Equations
- category_theory.limits.pushout_cocone.of_cocone t = {X := t.X, ι := (category_theory.limits.diagram_iso_span F).inv ≫ t.ι}
A diagram walking_span ⥤ C
is isomorphic to some pushout_cocone.mk
after composing with
diagram_iso_span
.
has_pullback f g
represents a particular choice of limiting cone
for the pair of morphisms f : X ⟶ Z
and g : Y ⟶ Z
.
has_pushout f g
represents a particular choice of colimiting cocone
for the pair of morphisms f : X ⟶ Y
and g : X ⟶ Z
.
pullback f g
computes the pullback of a pair of morphisms with the same target.
pushout f g
computes the pushout of a pair of morphisms with the same source.
The first projection of the pullback of f
and g
.
The second projection of the pullback of f
and g
.
The first inclusion into the pushout of f
and g
.
The second inclusion into the pushout of f
and g
.
A pair of morphisms h : W ⟶ X
and k : W ⟶ Y
satisfying h ≫ f = k ≫ g
induces a morphism
pullback.lift : W ⟶ pullback f g
.
A pair of morphisms h : Y ⟶ W
and k : Z ⟶ W
satisfying f ≫ h = g ≫ k
induces a morphism
pushout.desc : pushout f g ⟶ W
.
A pair of morphisms h : W ⟶ X
and k : W ⟶ Y
satisfying h ≫ f = k ≫ g
induces a morphism
l : W ⟶ pullback f g
such that l ≫ pullback.fst = h
and l ≫ pullback.snd = k
.
Equations
A pair of morphisms h : Y ⟶ W
and k : Z ⟶ W
satisfying f ≫ h = g ≫ k
induces a morphism
l : pushout f g ⟶ W
such that pushout.inl ≫ l = h
and pushout.inr ≫ l = k
.
Equations
Given such a diagram, then there is a natural morphism W ×ₛ X ⟶ Y ×ₜ Z
.
W ⟶ Y
↘ ↘
S ⟶ T
↗ ↗
X ⟶ Z
The canonical map X ×ₛ Y ⟶ X ×ₜ Y
given S ⟶ T
.
Given such a diagram, then there is a natural morphism W ⨿ₛ X ⟶ Y ⨿ₜ Z
.
W ⟶ Y
↗ ↗
S ⟶ T
↘ ↘
X ⟶ Z
The canonical map X ⨿ₛ Y ⟶ X ⨿ₜ Y
given S ⟶ T
.
Two morphisms into a pullback are equal if their compositions with the pullback morphisms are equal
The pullback cone built from the pullback projections is a pullback.
The pullback of a monomorphism is a monomorphism
The pullback of a monomorphism is a monomorphism
The map X ×[Z] Y ⟶ X × Y
is mono.
Two morphisms out of a pushout are equal if their compositions with the pushout morphisms are equal
The pushout cocone built from the pushout coprojections is a pushout.
The pushout of an epimorphism is an epimorphism
The pushout of an epimorphism is an epimorphism
The map X ⨿ Y ⟶ X ⨿[Z] Y
is epi.
If f₁ = f₂
and g₁ = g₂
, we may construct a canonical
isomorphism pullback f₁ g₁ ≅ pullback f₂ g₂
Equations
- category_theory.limits.pullback.congr_hom h₁ h₂ = category_theory.as_iso (category_theory.limits.pullback.map f₁ g₁ f₂ g₂ (𝟙 X) (𝟙 Y) (𝟙 Z) _ _)
If f₁ = f₂
and g₁ = g₂
, we may construct a canonical
isomorphism pushout f₁ g₁ ≅ pullback f₂ g₂
Equations
- category_theory.limits.pushout.congr_hom h₁ h₂ = category_theory.as_iso (category_theory.limits.pushout.map f₁ g₁ f₂ g₂ (𝟙 Y) (𝟙 Z) (𝟙 X) _ _)
The comparison morphism for the pullback of f,g
.
This is an isomorphism iff G
preserves the pullback of f,g
; see
category_theory/limits/preserves/shapes/pullbacks.lean
Equations
Instances for category_theory.limits.pullback_comparison
The comparison morphism for the pushout of f,g
.
This is an isomorphism iff G
preserves the pushout of f,g
; see
category_theory/limits/preserves/shapes/pullbacks.lean
Equations
Instances for category_theory.limits.pushout_comparison
Making this a global instance would make the typeclass seach go in an infinite loop.
The isomorphism X ×[Z] Y ≅ Y ×[Z] X
.
Making this a global instance would make the typeclass seach go in an infinite loop.
The isomorphism Y ⨿[X] Z ≅ Z ⨿[X] Y
.
The pullback of f, g
is also the pullback of f ≫ i, g ≫ i
for any mono i
.
If f : X ⟶ Z
is iso, then X ×[Z] Y ≅ Y
. This is the explicit limit cone.
Equations
Verify that the constructed limit cone is indeed a limit.
Equations
If g : Y ⟶ Z
is iso, then X ×[Z] Y ≅ X
. This is the explicit limit cone.
Equations
Verify that the constructed limit cone is indeed a limit.
Equations
The pushout of f, g
is also the pullback of h ≫ f, h ≫ g
for any epi h
.
If f : X ⟶ Y
is iso, then Y ⨿[X] Z ≅ Z
. This is the explicit colimit cocone.
Equations
Verify that the constructed cocone is indeed a colimit.
Equations
If f : X ⟶ Z
is iso, then Y ⨿[X] Z ≅ Y
. This is the explicit colimit cocone.
Equations
Verify that the constructed cocone is indeed a colimit.
Equations
Given
X₁ - f₁ -> X₂ - f₂ -> X₃ | | | i₁ i₂ i₃ ∨ ∨ ∨ Y₁ - g₁ -> Y₂ - g₂ -> Y₃
Then the big square is a pullback if both the small squares are.
Equations
- category_theory.limits.big_square_is_pullback f₁ f₂ g₁ g₂ i₁ i₂ i₃ h₁ h₂ H H' = (category_theory.limits.pullback_cone.mk i₁ (f₁ ≫ f₂) _).is_limit_aux' (λ (s : category_theory.limits.pullback_cone (g₁ ≫ g₂) i₃), (category_theory.limits.pullback_cone.is_limit.lift' H (s.fst ≫ g₁) s.snd _).cases_on (λ (l₁ : s.X ⟶ (category_theory.limits.pullback_cone.mk i₂ f₂ h₂).X) (property : l₁ ≫ (category_theory.limits.pullback_cone.mk i₂ f₂ h₂).fst = s.fst ≫ g₁ ∧ l₁ ≫ (category_theory.limits.pullback_cone.mk i₂ f₂ h₂).snd = s.snd), property.dcases_on (λ (hl₁ : l₁ ≫ (category_theory.limits.pullback_cone.mk i₂ f₂ h₂).fst = s.fst ≫ g₁) (hl₁' : l₁ ≫ (category_theory.limits.pullback_cone.mk i₂ f₂ h₂).snd = s.snd), (category_theory.limits.pullback_cone.is_limit.lift' H' s.fst l₁ _).cases_on (λ (l₂ : s.X ⟶ (category_theory.limits.pullback_cone.mk i₁ f₁ h₁).X) (property : l₂ ≫ (category_theory.limits.pullback_cone.mk i₁ f₁ h₁).fst = s.fst ∧ l₂ ≫ (category_theory.limits.pullback_cone.mk i₁ f₁ h₁).snd = l₁), property.dcases_on (λ (hl₂ : l₂ ≫ (category_theory.limits.pullback_cone.mk i₁ f₁ h₁).fst = s.fst) (hl₂' : l₂ ≫ (category_theory.limits.pullback_cone.mk i₁ f₁ h₁).snd = l₁), ⟨l₂, _⟩)))))
Given
X₁ - f₁ -> X₂ - f₂ -> X₃ | | | i₁ i₂ i₃ ∨ ∨ ∨ Y₁ - g₁ -> Y₂ - g₂ -> Y₃
Then the big square is a pushout if both the small squares are.
Equations
- category_theory.limits.big_square_is_pushout f₁ f₂ g₁ g₂ i₁ i₂ i₃ h₁ h₂ H H' = (category_theory.limits.pushout_cocone.mk (g₁ ≫ g₂) i₃ _).is_colimit_aux' (λ (s : category_theory.limits.pushout_cocone i₁ (f₁ ≫ f₂)), (category_theory.limits.pushout_cocone.is_colimit.desc' H' s.inl (f₂ ≫ s.inr) _).cases_on (λ (l₁ : (category_theory.limits.pushout_cocone.mk g₁ i₂ h₁).X ⟶ s.X) (property : (category_theory.limits.pushout_cocone.mk g₁ i₂ h₁).inl ≫ l₁ = s.inl ∧ (category_theory.limits.pushout_cocone.mk g₁ i₂ h₁).inr ≫ l₁ = f₂ ≫ s.inr), property.dcases_on (λ (hl₁ : (category_theory.limits.pushout_cocone.mk g₁ i₂ h₁).inl ≫ l₁ = s.inl) (hl₁' : (category_theory.limits.pushout_cocone.mk g₁ i₂ h₁).inr ≫ l₁ = f₂ ≫ s.inr), (category_theory.limits.pushout_cocone.is_colimit.desc' H l₁ s.inr hl₁').cases_on (λ (l₂ : (category_theory.limits.pushout_cocone.mk g₂ i₃ h₂).X ⟶ s.X) (property : (category_theory.limits.pushout_cocone.mk g₂ i₃ h₂).inl ≫ l₂ = l₁ ∧ (category_theory.limits.pushout_cocone.mk g₂ i₃ h₂).inr ≫ l₂ = s.inr), property.dcases_on (λ (hl₂ : (category_theory.limits.pushout_cocone.mk g₂ i₃ h₂).inl ≫ l₂ = l₁) (hl₂' : (category_theory.limits.pushout_cocone.mk g₂ i₃ h₂).inr ≫ l₂ = s.inr), ⟨l₂, _⟩)))))
Given
X₁ - f₁ -> X₂ - f₂ -> X₃ | | | i₁ i₂ i₃ ∨ ∨ ∨ Y₁ - g₁ -> Y₂ - g₂ -> Y₃
Then the left square is a pullback if the right square and the big square are.
Equations
- category_theory.limits.left_square_is_pullback f₁ f₂ g₁ g₂ i₁ i₂ i₃ h₁ h₂ H H' = (category_theory.limits.pullback_cone.mk i₁ f₁ h₁).is_limit_aux' (λ (s : category_theory.limits.pullback_cone g₁ i₂), (category_theory.limits.pullback_cone.is_limit.lift' H' s.fst (s.snd ≫ f₂) _).cases_on (λ (l₁ : s.X ⟶ (category_theory.limits.pullback_cone.mk i₁ (f₁ ≫ f₂) _).X) (property : l₁ ≫ (category_theory.limits.pullback_cone.mk i₁ (f₁ ≫ f₂) _).fst = s.fst ∧ l₁ ≫ (category_theory.limits.pullback_cone.mk i₁ (f₁ ≫ f₂) _).snd = s.snd ≫ f₂), property.dcases_on (λ (hl₁ : l₁ ≫ (category_theory.limits.pullback_cone.mk i₁ (f₁ ≫ f₂) _).fst = s.fst) (hl₁' : l₁ ≫ (category_theory.limits.pullback_cone.mk i₁ (f₁ ≫ f₂) _).snd = s.snd ≫ f₂), ⟨l₁, _⟩)))
Given
X₁ - f₁ -> X₂ - f₂ -> X₃ | | | i₁ i₂ i₃ ∨ ∨ ∨ Y₁ - g₁ -> Y₂ - g₂ -> Y₃
Then the right square is a pushout if the left square and the big square are.
Equations
- category_theory.limits.right_square_is_pushout f₁ f₂ g₁ g₂ i₁ i₂ i₃ h₁ h₂ H H' = (category_theory.limits.pushout_cocone.mk g₂ i₃ h₂).is_colimit_aux' (λ (s : category_theory.limits.pushout_cocone i₂ f₂), (category_theory.limits.pushout_cocone.is_colimit.desc' H' (g₁ ≫ s.inl) s.inr _).cases_on (λ (l₁ : (category_theory.limits.pushout_cocone.mk (g₁ ≫ g₂) i₃ _).X ⟶ s.X) (property : (category_theory.limits.pushout_cocone.mk (g₁ ≫ g₂) i₃ _).inl ≫ l₁ = g₁ ≫ s.inl ∧ (category_theory.limits.pushout_cocone.mk (g₁ ≫ g₂) i₃ _).inr ≫ l₁ = s.inr), property.dcases_on (λ (hl₁ : (category_theory.limits.pushout_cocone.mk (g₁ ≫ g₂) i₃ _).inl ≫ l₁ = g₁ ≫ s.inl) (hl₁' : (category_theory.limits.pushout_cocone.mk (g₁ ≫ g₂) i₃ _).inr ≫ l₁ = s.inr), id (λ {X₁ X₂ X₃ Y₁ Y₂ Y₃ : C} (f₁ : X₁ ⟶ X₂) (f₂ : X₂ ⟶ X₃) (g₁ : Y₁ ⟶ Y₂) (g₂ : Y₂ ⟶ Y₃) (i₁ : X₁ ⟶ Y₁) (i₂ : X₂ ⟶ Y₂) (i₃ : X₃ ⟶ Y₃) (h₁ : i₁ ≫ g₁ = f₁ ≫ i₂) (h₂ : i₂ ≫ g₂ = f₂ ≫ i₃) (H : category_theory.limits.is_colimit (category_theory.limits.pushout_cocone.mk g₁ i₂ h₁)) (H' : category_theory.limits.is_colimit (category_theory.limits.pushout_cocone.mk (g₁ ≫ g₂) i₃ _)) (s : category_theory.limits.pushout_cocone i₂ f₂) (this : i₁ ≫ g₁ ≫ s.inl = (f₁ ≫ f₂) ≫ s.inr) (l₁ : Y₃ ⟶ s.X) (hl₁ : (g₁ ≫ g₂) ≫ l₁ = g₁ ≫ s.inl) (hl₁' : i₃ ≫ l₁ = s.inr), ⟨l₁, _⟩) f₁ f₂ g₁ g₂ i₁ i₂ i₃ h₁ h₂ H H' s _ l₁ hl₁ hl₁')))
The canonical isomorphism W ×[X] (X ×[Z] Y) ≅ W ×[Z] Y
Equations
- category_theory.limits.pullback_right_pullback_fst_iso f g f' = let this : category_theory.limits.is_limit (category_theory.limits.pullback_cone.mk category_theory.limits.pullback.fst (category_theory.limits.pullback.snd ≫ category_theory.limits.pullback.snd) _) := category_theory.limits.big_square_is_pullback category_theory.limits.pullback.snd category_theory.limits.pullback.snd f' f category_theory.limits.pullback.fst category_theory.limits.pullback.fst g _ category_theory.limits.pullback.condition (category_theory.limits.pullback_is_pullback f g) (category_theory.limits.pullback_is_pullback f' category_theory.limits.pullback.fst) in this.cone_point_unique_up_to_iso (category_theory.limits.pullback_is_pullback (f' ≫ f) g)
The canonical isomorphism (Y ⨿[X] Z) ⨿[Z] W ≅ Y ×[X] W
Equations
- category_theory.limits.pushout_left_pushout_inr_iso f g g' = (category_theory.limits.big_square_is_pushout g g' category_theory.limits.pushout.inl category_theory.limits.pushout.inl f category_theory.limits.pushout.inr category_theory.limits.pushout.inr category_theory.limits.pushout.condition _ (category_theory.limits.pushout_is_pushout category_theory.limits.pushout.inr g') (category_theory.limits.pushout_is_pushout f g)).cocone_point_unique_up_to_iso (category_theory.limits.pushout_is_pushout f (g ≫ g'))
(X₁ ×[Y₁] X₂) ×[Y₂] X₃
is the pullback (X₁ ×[Y₁] X₂) ×[X₂] (X₂ ×[Y₂] X₃)
.
Equations
- category_theory.limits.pullback_pullback_left_is_pullback f₁ f₂ f₃ f₄ = category_theory.limits.left_square_is_pullback (category_theory.limits.pullback.lift (category_theory.limits.pullback.fst ≫ category_theory.limits.pullback.snd) category_theory.limits.pullback.snd _) category_theory.limits.pullback.snd category_theory.limits.pullback.snd f₃ category_theory.limits.pullback.fst category_theory.limits.pullback.fst f₄ _ category_theory.limits.pullback.condition (category_theory.limits.pullback_is_pullback f₃ f₄) (_.mpr (category_theory.limits.pullback_is_pullback (category_theory.limits.pullback.snd ≫ f₃) f₄))
(X₁ ×[Y₁] X₂) ×[Y₂] X₃
is the pullback X₁ ×[Y₁] (X₂ ×[Y₂] X₃)
.
Equations
- category_theory.limits.pullback_assoc_is_pullback f₁ f₂ f₃ f₄ = category_theory.limits.pullback_cone.flip_is_limit (category_theory.limits.big_square_is_pullback category_theory.limits.pullback.fst category_theory.limits.pullback.fst category_theory.limits.pullback.fst f₂ (category_theory.limits.pullback.lift (category_theory.limits.pullback.fst ≫ category_theory.limits.pullback.snd) category_theory.limits.pullback.snd _) category_theory.limits.pullback.snd f₁ _ _ (category_theory.limits.pullback_cone.flip_is_limit (category_theory.limits.pullback_is_pullback f₁ f₂)) (category_theory.limits.pullback_cone.flip_is_limit (category_theory.limits.pullback_pullback_left_is_pullback f₁ f₂ f₃ f₄)))
X₁ ×[Y₁] (X₂ ×[Y₂] X₃)
is the pullback (X₁ ×[Y₁] X₂) ×[X₂] (X₂ ×[Y₂] X₃)
.
Equations
- category_theory.limits.pullback_pullback_right_is_pullback f₁ f₂ f₃ f₄ = category_theory.limits.pullback_cone.flip_is_limit (category_theory.limits.left_square_is_pullback (category_theory.limits.pullback.lift category_theory.limits.pullback.fst (category_theory.limits.pullback.snd ≫ category_theory.limits.pullback.fst) _) category_theory.limits.pullback.fst category_theory.limits.pullback.fst f₂ category_theory.limits.pullback.snd category_theory.limits.pullback.snd f₁ _ _ (category_theory.limits.pullback_cone.flip_is_limit (category_theory.limits.pullback_is_pullback f₁ f₂)) (category_theory.limits.pullback_cone.flip_is_limit (_.mpr (category_theory.limits.pullback_is_pullback f₁ (category_theory.limits.pullback.fst ≫ f₂)))))
X₁ ×[Y₁] (X₂ ×[Y₂] X₃)
is the pullback (X₁ ×[Y₁] X₂) ×[Y₂] X₃
.
Equations
- category_theory.limits.pullback_assoc_symm_is_pullback f₁ f₂ f₃ f₄ = category_theory.limits.big_square_is_pullback category_theory.limits.pullback.snd category_theory.limits.pullback.snd category_theory.limits.pullback.snd f₃ (category_theory.limits.pullback.lift category_theory.limits.pullback.fst (category_theory.limits.pullback.snd ≫ category_theory.limits.pullback.fst) _) category_theory.limits.pullback.fst f₄ _ category_theory.limits.pullback.condition (category_theory.limits.pullback_is_pullback f₃ f₄) (category_theory.limits.pullback_pullback_right_is_pullback f₁ f₂ f₃ f₄)
The canonical isomorphism (X₁ ×[Y₁] X₂) ×[Y₂] X₃ ≅ X₁ ×[Y₁] (X₂ ×[Y₂] X₃)
.
Equations
(X₁ ⨿[Z₁] X₂) ⨿[Z₂] X₃
is the pushout (X₁ ⨿[Z₁] X₂) ×[X₂] (X₂ ⨿[Z₂] X₃)
.
Equations
- category_theory.limits.pushout_pushout_left_is_pushout g₁ g₂ g₃ g₄ = category_theory.limits.pushout_cocone.flip_is_colimit (category_theory.limits.right_square_is_pushout g₃ category_theory.limits.pushout.inr category_theory.limits.pushout.inr (category_theory.limits.pushout.desc (category_theory.limits.pushout.inr ≫ category_theory.limits.pushout.inl) category_theory.limits.pushout.inr _) g₄ category_theory.limits.pushout.inl category_theory.limits.pushout.inl _ _ (category_theory.limits.pushout_cocone.flip_is_colimit (category_theory.limits.pushout_is_pushout g₃ g₄)) (category_theory.limits.pushout_cocone.flip_is_colimit (_.mpr (category_theory.limits.pushout_is_pushout (g₃ ≫ category_theory.limits.pushout.inr) g₄))))
(X₁ ⨿[Z₁] X₂) ⨿[Z₂] X₃
is the pushout X₁ ⨿[Z₁] (X₂ ⨿[Z₂] X₃)
.
Equations
- category_theory.limits.pushout_assoc_is_pushout g₁ g₂ g₃ g₄ = category_theory.limits.big_square_is_pushout g₂ category_theory.limits.pushout.inl category_theory.limits.pushout.inl category_theory.limits.pushout.inl g₁ category_theory.limits.pushout.inr (category_theory.limits.pushout.desc (category_theory.limits.pushout.inr ≫ category_theory.limits.pushout.inl) category_theory.limits.pushout.inr _) category_theory.limits.pushout.condition _ (category_theory.limits.pushout_pushout_left_is_pushout g₁ g₂ g₃ g₄) (category_theory.limits.pushout_is_pushout g₁ g₂)
X₁ ⨿[Z₁] (X₂ ⨿[Z₂] X₃)
is the pushout (X₁ ⨿[Z₁] X₂) ×[X₂] (X₂ ⨿[Z₂] X₃)
.
Equations
- category_theory.limits.pushout_pushout_right_is_pushout g₁ g₂ g₃ g₄ = category_theory.limits.right_square_is_pushout g₂ category_theory.limits.pushout.inl category_theory.limits.pushout.inl (category_theory.limits.pushout.desc category_theory.limits.pushout.inl (category_theory.limits.pushout.inl ≫ category_theory.limits.pushout.inr) _) g₁ category_theory.limits.pushout.inr category_theory.limits.pushout.inr category_theory.limits.pushout.condition _ (category_theory.limits.pushout_is_pushout g₁ g₂) (_.mpr (category_theory.limits.pushout_is_pushout g₁ (g₂ ≫ category_theory.limits.pushout.inl)))
X₁ ⨿[Z₁] (X₂ ⨿[Z₂] X₃)
is the pushout (X₁ ⨿[Z₁] X₂) ⨿[Z₂] X₃
.
Equations
- category_theory.limits.pushout_assoc_symm_is_pushout g₁ g₂ g₃ g₄ = category_theory.limits.pushout_cocone.flip_is_colimit (category_theory.limits.big_square_is_pushout g₃ category_theory.limits.pushout.inr category_theory.limits.pushout.inr category_theory.limits.pushout.inr g₄ category_theory.limits.pushout.inl (category_theory.limits.pushout.desc category_theory.limits.pushout.inl (category_theory.limits.pushout.inl ≫ category_theory.limits.pushout.inr) _) _ _ (category_theory.limits.pushout_cocone.flip_is_colimit (category_theory.limits.pushout_pushout_right_is_pushout g₁ g₂ g₃ g₄)) (category_theory.limits.pushout_cocone.flip_is_colimit (category_theory.limits.pushout_is_pushout g₃ g₄)))
The canonical isomorphism (X₁ ⨿[Z₁] X₂) ⨿[Z₂] X₃ ≅ X₁ ⨿[Z₁] (X₂ ⨿[Z₂] X₃)
.
Equations
- category_theory.limits.pushout_assoc g₁ g₂ g₃ g₄ = (category_theory.limits.pushout_pushout_left_is_pushout g₁ g₂ g₃ g₄).cocone_point_unique_up_to_iso (category_theory.limits.pushout_pushout_right_is_pushout g₁ g₂ g₃ g₄)
has_pullbacks
represents a choice of pullback for every pair of morphisms
has_pushouts
represents a choice of pushout for every pair of morphisms
If C
has all limits of diagrams cospan f g
, then it has all pullbacks
If C
has all colimits of diagrams span f g
, then it has all pushouts
The duality equivalence walking_spanᵒᵖ ≌ walking_cospan
The duality equivalence walking_cospanᵒᵖ ≌ walking_span
Having wide pullback at any universe level implies having binary pullbacks.
Given a morphism f : X ⟶ Y
, we can take morphisms over Y
to morphisms over X
via
pullbacks. This is right adjoint to over.map
(TODO)
Equations
- category_theory.limits.base_change f = {obj := λ (g : category_theory.over Y), category_theory.over.mk category_theory.limits.pullback.snd, map := λ (g₁ g₂ : category_theory.over Y) (i : g₁ ⟶ g₂), category_theory.over.hom_mk (category_theory.limits.pullback.map g₁.hom f g₂.hom f i.left (𝟙 X) (𝟙 ((category_theory.functor.from_punit Y).obj g₁.right)) _ _) _, map_id' := _, map_comp' := _}