Fibred products of schemes #
THIS FILE IS SYNCHRONIZED WITH MATHLIB4. Any changes to this file require a corresponding PR to mathlib4.
In this file we construct the fibred product of schemes via gluing. We roughly follow [Har77] Theorem 3.3.
In particular, the main construction is to show that for an open cover { Uᵢ }
of X
, if there
exist fibred products Uᵢ ×[Z] Y
for each i
, then there exists a fibred product X ×[Z] Y
.
Then, for constructing the fibred product for arbitrary schemes X, Y, Z
, we can use the
construction to reduce to the case where X, Y, Z
are all affine, where fibred products are
constructed via tensor products.
The intersection of Uᵢ ×[Z] Y
and Uⱼ ×[Z] Y
is given by (Uᵢ ×[Z] Y) ×[X] Uⱼ
Equations
- algebraic_geometry.Scheme.pullback.V 𝒰 f g i j = category_theory.limits.pullback (category_theory.limits.pullback.fst ≫ 𝒰.map i) (𝒰.map j)
The canonical transition map (Uᵢ ×[Z] Y) ×[X] Uⱼ ⟶ (Uⱼ ×[Z] Y) ×[X] Uᵢ
given by the fact
that pullbacks are associative and symmetric.
Equations
- algebraic_geometry.Scheme.pullback.t 𝒰 f g i j = (category_theory.limits.pullback_symmetry (category_theory.limits.pullback.fst ≫ 𝒰.map i) (𝒰.map j)).hom ≫ (category_theory.limits.pullback_assoc (𝒰.map j) (𝒰.map i) (𝒰.map i ≫ f) g).inv ≫ id ((category_theory.limits.pullback.map (category_theory.limits.pullback.snd ≫ 𝒰.map i ≫ f) g (category_theory.limits.pullback.snd ≫ 𝒰.map j ≫ f) g (category_theory.limits.pullback_symmetry (𝒰.map j) (𝒰.map i)).hom (𝟙 Y) (𝟙 Z) _ _ ≫ (category_theory.limits.pullback_assoc (𝒰.map i) (𝒰.map j) (𝒰.map j ≫ f) g).hom) ≫ (category_theory.limits.pullback_symmetry (𝒰.map i) (category_theory.limits.pullback.fst ≫ 𝒰.map j)).hom)
The inclusion map of V i j = (Uᵢ ×[Z] Y) ×[X] Uⱼ ⟶ Uᵢ ×[Z] Y
The map ((Xᵢ ×[Z] Y) ×[X] Xⱼ) ×[Xᵢ ×[Z] Y] ((Xᵢ ×[Z] Y) ×[X] Xₖ)
⟶
((Xⱼ ×[Z] Y) ×[X] Xₖ) ×[Xⱼ ×[Z] Y] ((Xⱼ ×[Z] Y) ×[X] Xᵢ)
needed for gluing
Equations
- algebraic_geometry.Scheme.pullback.t' 𝒰 f g i j k = (category_theory.limits.pullback_right_pullback_fst_iso (category_theory.limits.pullback.fst ≫ 𝒰.map i) (𝒰.map k) (algebraic_geometry.Scheme.pullback.fV 𝒰 f g i j)).hom ≫ (category_theory.limits.pullback.map (algebraic_geometry.Scheme.pullback.fV 𝒰 f g i j ≫ category_theory.limits.pullback.fst ≫ 𝒰.map i) (𝒰.map k) (algebraic_geometry.Scheme.pullback.fV 𝒰 f g j i ≫ category_theory.limits.pullback.fst ≫ 𝒰.map j) (𝒰.map k) (algebraic_geometry.Scheme.pullback.t 𝒰 f g i j) (𝟙 (𝒰.obj k)) (𝟙 X) _ _ ≫ (category_theory.limits.pullback_right_pullback_fst_iso (category_theory.limits.pullback.fst ≫ 𝒰.map j) (𝒰.map k) (algebraic_geometry.Scheme.pullback.fV 𝒰 f g j i)).inv) ≫ (category_theory.limits.pullback_symmetry (algebraic_geometry.Scheme.pullback.fV 𝒰 f g j i) (algebraic_geometry.Scheme.pullback.fV 𝒰 f g j k)).hom
Given Uᵢ ×[Z] Y
, this is the glued fibered product X ×[Z] Y
.
Equations
- algebraic_geometry.Scheme.pullback.gluing 𝒰 f g = {to_glue_data := {J := 𝒰.J, U := λ (i : 𝒰.J), category_theory.limits.pullback (𝒰.map i ≫ f) g, V := λ (_x : 𝒰.J × 𝒰.J), algebraic_geometry.Scheme.pullback.gluing._match_1 𝒰 f g _x, f := λ (i j : 𝒰.J), category_theory.limits.pullback.fst, f_mono := _, f_has_pullback := _, f_id := _, t := λ (i j : 𝒰.J), algebraic_geometry.Scheme.pullback.t 𝒰 f g i j, t_id := _, t' := λ (i j k : 𝒰.J), algebraic_geometry.Scheme.pullback.t' 𝒰 f g i j k, t_fac := _, cocycle := _}, f_open := _}
- algebraic_geometry.Scheme.pullback.gluing._match_1 𝒰 f g (i, j) = algebraic_geometry.Scheme.pullback.V 𝒰 f g i j
The first projection from the glued scheme into X
.
Equations
The second projection from the glued scheme into Y
.
(Implementation)
The canonical map (s.X ×[X] Uᵢ) ×[s.X] (s.X ×[X] Uⱼ) ⟶ (Uᵢ ×[Z] Y) ×[X] Uⱼ
This is used in glued_lift
.
Equations
- algebraic_geometry.Scheme.pullback.glued_lift_pullback_map 𝒰 f g s i j = id ((category_theory.limits.pullback_right_pullback_fst_iso s.fst (𝒰.map j) category_theory.limits.pullback.fst).hom ≫ category_theory.limits.pullback.map (category_theory.limits.pullback.fst ≫ s.fst) (𝒰.map j) (category_theory.limits.pullback.fst ≫ 𝒰.map i) (𝒰.map j) ((category_theory.limits.pullback_symmetry s.fst (𝒰.map i)).hom ≫ category_theory.limits.pullback.map (𝒰.map i) s.fst (𝒰.map i ≫ f) g (𝟙 (𝒰.obj i)) s.snd f _ _) (𝟙 (𝒰.obj j)) (𝟙 X) _ _)
The lifted map s.X ⟶ (gluing 𝒰 f g).glued
in order to show that (gluing 𝒰 f g).glued
is
indeed the pullback.
Given a pullback cone s
, we have the maps s.fst ⁻¹' Uᵢ ⟶ Uᵢ
and
s.fst ⁻¹' Uᵢ ⟶ s.X ⟶ Y
that we may lift to a map s.fst ⁻¹' Uᵢ ⟶ Uᵢ ×[Z] Y
.
to glue these into a map s.X ⟶ Uᵢ ×[Z] Y
, we need to show that the maps agree on
(s.fst ⁻¹' Uᵢ) ×[s.X] (s.fst ⁻¹' Uⱼ) ⟶ Uᵢ ×[Z] Y
. This is achieved by showing that both of these
maps factors through glued_lift_pullback_map
.
Equations
- algebraic_geometry.Scheme.pullback.glued_lift 𝒰 f g s = (𝒰.pullback_cover s.fst).glue_morphisms (λ (i : (𝒰.pullback_cover s.fst).J), (category_theory.limits.pullback_symmetry s.fst (𝒰.map i)).hom ≫ category_theory.limits.pullback.map (𝒰.map i) s.fst (𝒰.map i ≫ f) g (𝟙 (𝒰.obj i)) s.snd f _ _ ≫ (algebraic_geometry.Scheme.pullback.gluing 𝒰 f g).ι i) _
(Implementation)
The canonical map (W ×[X] Uᵢ) ×[W] (Uⱼ ×[Z] Y) ⟶ (Uⱼ ×[Z] Y) ×[X] Uᵢ = V j i
where W
is
the glued fibred product.
This is used in lift_comp_ι
.
Equations
- algebraic_geometry.Scheme.pullback.pullback_fst_ι_to_V 𝒰 f g i j = (category_theory.limits.pullback_symmetry category_theory.limits.pullback.fst ((algebraic_geometry.Scheme.pullback.gluing 𝒰 f g).ι j) ≪≫ category_theory.limits.pullback_right_pullback_fst_iso (algebraic_geometry.Scheme.pullback.p1 𝒰 f g) (𝒰.map i) ((algebraic_geometry.Scheme.pullback.gluing 𝒰 f g).ι j)).hom ≫ (category_theory.limits.pullback.congr_hom _ _).hom
We show that the map W ×[X] Uᵢ ⟶ Uᵢ ×[Z] Y ⟶ W
is the first projection, where the
first map is given by the lift of W ×[X] Uᵢ ⟶ Uᵢ
and W ×[X] Uᵢ ⟶ W ⟶ Y
.
It suffices to show that the two map agrees when restricted onto Uⱼ ×[Z] Y
. In this case,
both maps factor through V j i
via pullback_fst_ι_to_V
The canonical isomorphism between W ×[X] Uᵢ
and Uᵢ ×[X] Y
. That is, the preimage of Uᵢ
in
W
along p1
is indeed Uᵢ ×[X] Y
.
Equations
- algebraic_geometry.Scheme.pullback.pullback_p1_iso 𝒰 f g i = {hom := category_theory.limits.pullback.lift category_theory.limits.pullback.snd (category_theory.limits.pullback.fst ≫ algebraic_geometry.Scheme.pullback.p2 𝒰 f g) _, inv := category_theory.limits.pullback.lift ((algebraic_geometry.Scheme.pullback.gluing 𝒰 f g).ι i) category_theory.limits.pullback.fst _, hom_inv_id' := _, inv_hom_id' := _}
The glued scheme ((gluing 𝒰 f g).glued
) is indeed the pullback of f
and g
.
Equations
- algebraic_geometry.Scheme.pullback.glued_is_limit 𝒰 f g = (category_theory.limits.pullback_cone.mk (algebraic_geometry.Scheme.pullback.p1 𝒰 f g) (algebraic_geometry.Scheme.pullback.p2 𝒰 f g) _).is_limit_aux' (λ (s : category_theory.limits.pullback_cone f g), ⟨algebraic_geometry.Scheme.pullback.glued_lift 𝒰 f g s, _⟩)
Given an open cover { Xᵢ }
of X
, then X ×[Z] Y
is covered by Xᵢ ×[Z] Y
.
Equations
- algebraic_geometry.Scheme.pullback.open_cover_of_left 𝒰 f g = ((algebraic_geometry.Scheme.pullback.gluing 𝒰 f g).open_cover.pushforward_iso (category_theory.limits.limit.iso_limit_cone {cone := category_theory.limits.pullback_cone.mk (algebraic_geometry.Scheme.pullback.p1 𝒰 f g) (algebraic_geometry.Scheme.pullback.p2 𝒰 f g) _, is_limit := algebraic_geometry.Scheme.pullback.glued_is_limit 𝒰 f g _}).inv).copy 𝒰.J (λ (i : 𝒰.J), category_theory.limits.pullback (𝒰.map i ≫ f) g) (λ (i : 𝒰.J), category_theory.limits.pullback.map (𝒰.map i ≫ f) g f g (𝒰.map i) (𝟙 Y) (𝟙 Z) _ _) (equiv.refl 𝒰.J) (λ (_x : 𝒰.J), category_theory.iso.refl ((λ (i : 𝒰.J), category_theory.limits.pullback (𝒰.map i ≫ f) g) _x)) _
Given an open cover { Yᵢ }
of Y
, then X ×[Z] Y
is covered by X ×[Z] Yᵢ
.
Equations
- algebraic_geometry.Scheme.pullback.open_cover_of_right 𝒰 f g = ((algebraic_geometry.Scheme.pullback.open_cover_of_left 𝒰 g f).pushforward_iso (category_theory.limits.pullback_symmetry g f).hom).copy 𝒰.J (λ (i : 𝒰.J), category_theory.limits.pullback f (𝒰.map i ≫ g)) (λ (i : 𝒰.J), category_theory.limits.pullback.map f (𝒰.map i ≫ g) f g (𝟙 X) (𝒰.map i) (𝟙 Z) _ _) (equiv.refl 𝒰.J) (λ (i : 𝒰.J), category_theory.limits.pullback_symmetry f (𝒰.map i ≫ g)) _
Given an open cover { Xᵢ }
of X
and an open cover { Yⱼ }
of Y
, then
X ×[Z] Y
is covered by Xᵢ ×[Z] Yⱼ
.
Equations
- algebraic_geometry.Scheme.pullback.open_cover_of_left_right 𝒰X 𝒰Y f g = ((algebraic_geometry.Scheme.pullback.open_cover_of_left 𝒰X f g).bind (λ (x : (algebraic_geometry.Scheme.pullback.open_cover_of_left 𝒰X f g).J), algebraic_geometry.Scheme.pullback.open_cover_of_right 𝒰Y (𝒰X.map x ≫ f) g)).copy (𝒰X.J × 𝒰Y.J) (λ (ij : 𝒰X.J × 𝒰Y.J), category_theory.limits.pullback (𝒰X.map ij.fst ≫ f) (𝒰Y.map ij.snd ≫ g)) (λ (ij : 𝒰X.J × 𝒰Y.J), category_theory.limits.pullback.map (𝒰X.map ij.fst ≫ f) (𝒰Y.map ij.snd ≫ g) f g (𝒰X.map ij.fst) (𝒰Y.map ij.snd) (𝟙 Z) _ _) (equiv.sigma_equiv_prod 𝒰X.J 𝒰Y.J).symm (λ (_x : 𝒰X.J × 𝒰Y.J), category_theory.iso.refl ((λ (ij : 𝒰X.J × 𝒰Y.J), category_theory.limits.pullback (𝒰X.map ij.fst ≫ f) (𝒰Y.map ij.snd ≫ g)) _x)) _
(Implementation). Use open_cover_of_base
instead.
Equations
- algebraic_geometry.Scheme.pullback.open_cover_of_base' 𝒰 f g = (algebraic_geometry.Scheme.pullback.open_cover_of_left (𝒰.pullback_cover f) f g).bind (λ (i : (algebraic_geometry.Scheme.pullback.open_cover_of_left (𝒰.pullback_cover f) f g).J), let Xᵢ : algebraic_geometry.Scheme := category_theory.limits.pullback f (𝒰.map i), Yᵢ : algebraic_geometry.Scheme := category_theory.limits.pullback g (𝒰.map i), W : algebraic_geometry.Scheme := category_theory.limits.pullback category_theory.limits.pullback.snd category_theory.limits.pullback.snd in algebraic_geometry.Scheme.open_cover_of_is_iso ((category_theory.limits.pullback_symmetry category_theory.limits.pullback.snd category_theory.limits.pullback.snd).hom ≫ (category_theory.limits.limit.iso_limit_cone {cone := category_theory.limits.pullback_cone.mk category_theory.limits.pullback.snd (category_theory.limits.pullback.fst ≫ category_theory.limits.pullback.fst) _, is_limit := category_theory.limits.big_square_is_pullback category_theory.limits.pullback.fst category_theory.limits.pullback.fst category_theory.limits.pullback.snd (𝒰.map i) category_theory.limits.pullback.snd category_theory.limits.pullback.snd g _ _ (category_theory.limits.pullback_cone.flip_is_limit (category_theory.limits.pullback_is_pullback g (𝒰.map i))) (category_theory.limits.pullback_cone.flip_is_limit (category_theory.limits.pullback_is_pullback category_theory.limits.pullback.snd category_theory.limits.pullback.snd))}).inv ≫ category_theory.limits.pullback.map (category_theory.limits.pullback.snd ≫ 𝒰.map i) g ((𝒰.pullback_cover f).map i ≫ f) g (𝟙 (category_theory.limits.pullback f (𝒰.map i))) (𝟙 Y) (𝟙 Z) _ _))
Given an open cover { Zᵢ }
of Z
, then X ×[Z] Y
is covered by Xᵢ ×[Zᵢ] Yᵢ
, where
Xᵢ = X ×[Z] Zᵢ
and Yᵢ = Y ×[Z] Zᵢ
is the preimage of Zᵢ
in X
and Y
.
Equations
- algebraic_geometry.Scheme.pullback.open_cover_of_base 𝒰 f g = (algebraic_geometry.Scheme.pullback.open_cover_of_base' 𝒰 f g).copy 𝒰.J (λ (i : 𝒰.J), category_theory.limits.pullback category_theory.limits.pullback.snd category_theory.limits.pullback.snd) (λ (i : 𝒰.J), category_theory.limits.pullback.map category_theory.limits.pullback.snd category_theory.limits.pullback.snd f g category_theory.limits.pullback.fst category_theory.limits.pullback.fst (𝒰.map i) _ _) ((equiv.prod_punit 𝒰.J).symm.trans (equiv.sigma_equiv_prod 𝒰.J punit).symm) (λ (_x : 𝒰.J), category_theory.iso.refl ((λ (i : 𝒰.J), category_theory.limits.pullback category_theory.limits.pullback.snd category_theory.limits.pullback.snd) _x)) _