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_cospans 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_cospans 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_spans 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_spans 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