Pullbacks #
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 left arrow of the walking span.
The right arrow of the walking span.
The identity arrows of the walking span.
The functor between two walking_cospan
s in different universes.
Equations
- category_theory.limits.walking_cospan_functor = {obj := λ (ᾰ : category_theory.limits.walking_cospan), option.cases_on ᾰ category_theory.limits.walking_cospan.one (λ (ᾰ : category_theory.limits.walking_pair), ᾰ.cases_on category_theory.limits.walking_cospan.left category_theory.limits.walking_cospan.right), map := λ (X Y : category_theory.limits.walking_cospan) (ᾰ : X ⟶ Y), category_theory.limits.wide_pullback_shape.hom.cases_on ᾰ (λ (ᾰ_1 : category_theory.limits.wide_pullback_shape category_theory.limits.walking_pair) (H_1 : X = ᾰ_1), eq.rec (λ (H_2 : Y = X), eq.rec (λ (ᾰ : X ⟶ X) (H_3 : ᾰ == category_theory.limits.wide_pullback_shape.hom.id X), eq.rec (category_theory.limits.walking_cospan.hom.id (option.cases_on X category_theory.limits.walking_cospan.one (λ (ᾰ : category_theory.limits.walking_pair), ᾰ.cases_on category_theory.limits.walking_cospan.left category_theory.limits.walking_cospan.right))) _) _ ᾰ) H_1) (λ (ᾰ_1 : category_theory.limits.walking_pair) (H_1 : X = some ᾰ_1), eq.rec (λ (ᾰ : some ᾰ_1 ⟶ Y) (H_2 : Y = none), eq.rec (λ (ᾰ : some ᾰ_1 ⟶ none) (H_3 : ᾰ == category_theory.limits.wide_pullback_shape.hom.term ᾰ_1), eq.rec (ᾰ_1.cases_on category_theory.limits.walking_cospan.hom.inl category_theory.limits.walking_cospan.hom.inr) _) _ ᾰ) _ ᾰ) _ _ _, map_id' := category_theory.limits.walking_cospan_functor._proof_6, map_comp' := category_theory.limits.walking_cospan_functor._proof_7}
The equivalence between two walking_cospan
s in different universes.
Equations
- category_theory.limits.walking_cospan_equiv = {functor := category_theory.limits.walking_cospan_functor, inverse := category_theory.limits.walking_cospan_functor, unit_iso := category_theory.nat_iso.of_components (λ (x : category_theory.limits.walking_cospan), category_theory.eq_to_iso _) category_theory.limits.walking_cospan_equiv._proof_2, counit_iso := category_theory.nat_iso.of_components (λ (x : category_theory.limits.walking_cospan), category_theory.eq_to_iso _) category_theory.limits.walking_cospan_equiv._proof_4, functor_unit_iso_comp' := category_theory.limits.walking_cospan_equiv._proof_5}
The functor between two walking_span
s in different universes.
Equations
- category_theory.limits.walking_span_functor = {obj := λ (ᾰ : category_theory.limits.walking_span), option.cases_on ᾰ category_theory.limits.walking_span.zero (λ (ᾰ : category_theory.limits.walking_pair), ᾰ.cases_on category_theory.limits.walking_span.left category_theory.limits.walking_span.right), map := λ (X Y : category_theory.limits.walking_span) (ᾰ : X ⟶ Y), category_theory.limits.wide_pushout_shape.hom.cases_on ᾰ (λ (ᾰ_1 : category_theory.limits.wide_pushout_shape category_theory.limits.walking_pair) (H_1 : X = ᾰ_1), eq.rec (λ (H_2 : Y = X), eq.rec (λ (ᾰ : X ⟶ X) (H_3 : ᾰ == category_theory.limits.wide_pushout_shape.hom.id X), eq.rec (category_theory.limits.walking_span.hom.id (option.cases_on X category_theory.limits.walking_span.zero (λ (ᾰ : category_theory.limits.walking_pair), ᾰ.cases_on category_theory.limits.walking_span.left category_theory.limits.walking_span.right))) _) _ ᾰ) H_1) (λ (ᾰ_1 : category_theory.limits.walking_pair) (H_1 : X = none), eq.rec (λ (ᾰ : none ⟶ Y) (H_2 : Y = some ᾰ_1), eq.rec (λ (ᾰ : none ⟶ some ᾰ_1) (H_3 : ᾰ == category_theory.limits.wide_pushout_shape.hom.init ᾰ_1), eq.rec (ᾰ_1.cases_on category_theory.limits.walking_span.hom.fst category_theory.limits.walking_span.hom.snd) _) _ ᾰ) _ ᾰ) _ _ _, map_id' := category_theory.limits.walking_span_functor._proof_6, map_comp' := category_theory.limits.walking_span_functor._proof_7}
The equivalence between two walking_span
s in different universes.
Equations
- category_theory.limits.walking_span_equiv = {functor := category_theory.limits.walking_span_functor, inverse := category_theory.limits.walking_span_functor, unit_iso := category_theory.nat_iso.of_components (λ (x : category_theory.limits.walking_span), category_theory.eq_to_iso _) category_theory.limits.walking_span_equiv._proof_2, counit_iso := category_theory.nat_iso.of_components (λ (x : category_theory.limits.walking_span), category_theory.eq_to_iso _) category_theory.limits.walking_span_equiv._proof_4, functor_unit_iso_comp' := category_theory.limits.walking_span_equiv._proof_5}
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 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
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), _⟩
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
Given such a diagram, then there is a natural morphism W ⨿ₛ X ⟶ Y ⨿ₜ Z
.
W ⟶ Y
↗ ↗
S ⟶ T
↘ ↘
X ⟶ Z
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
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
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