Skip to content

Commit 5027efb

Browse files
feat(AlgebraicGeometry): The pushforward of a quasi-coherent sheaf between affines is quasi-coherent (#37189)
To be more precise, we show that if `AlgebraicGeometry.Scheme.Modules.fromTildeΓ` is an isomorphism then the same holds for the pushforward. This will show that being quasicoherent is stable under pushforward for affine morphisms once it is shown that `AlgebraicGeometry.Scheme.Modules.fromTildeΓ` being an isomorphism is equivalent to being quasicoherent. Co-authored-by: Brian-Nugent <bnugent@uw.edu> Co-authored-by: pre-commit-ci-lite[bot] <117423508+pre-commit-ci-lite[bot]@users.noreply.github.com>
1 parent 919544d commit 5027efb

7 files changed

Lines changed: 218 additions & 6 deletions

File tree

Mathlib/Algebra/Category/ModuleCat/Localization.lean

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,4 +101,12 @@ instance [Small.{v} R] (S : Submonoid R) :
101101
have := ((Functor.exact_tfae _).out 1 3).mp (ModuleCat.localizedModuleFunctor_map_exact S)
102102
exact this.2
103103

104+
lemma isIso_of_isLocalizedModule_comp {S : Submonoid R} {M₁ M₂ M₃ : ModuleCat R} {f₁ : M₁ ⟶ M₂}
105+
{f₂ : M₂ ⟶ M₃} (h₁ : IsLocalizedModule S f₁.hom) (h₂ : IsLocalizedModule S (f₁ ≫ f₂).hom) :
106+
IsIso f₂ := by
107+
have : Function.Bijective f₂.hom := by
108+
rw [← IsLocalizedModule.linearEquiv_of_isLocalizedModule_comp S f₁.hom f₂.hom]
109+
exact (IsLocalizedModule.linearEquiv ..).bijective
110+
simpa [ConcreteCategory.isIso_iff_bijective]
111+
104112
end ModuleCat

Mathlib/Algebra/Category/ModuleCat/Sheaf.lean

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,20 @@ noncomputable def forgetToSheafModuleCat
103103
(forget₂ (ModuleCat.{w} (R.1.obj X)) AddCommGrpCat.{w}) M.isSheaf⟩
104104
map f := { hom := (PresheafOfModules.forgetToPresheafModuleCat X hX).map f.1 }
105105

106+
set_option backward.defeqAttrib.useBackward true in
107+
/-- Isomorphism on `forgetToSheafModuleCat` when given isomorphic initial objects. -/
108+
noncomputable def forgetToSheafModuleCatOfIso (X Y : Cᵒᵖ) (hX : Limits.IsInitial X)
109+
(hY : Limits.IsInitial Y) (φ : X ≅ Y) :
110+
forgetToSheafModuleCat R X hX ≅ forgetToSheafModuleCat R Y hY ⋙
111+
sheafCompose J (ModuleCat.restrictScalars (R.obj.map φ.hom).hom) := by
112+
refine NatIso.ofComponents (fun M ↦ ObjectProperty.isoMk _ ?_) ?_
113+
· refine NatIso.ofComponents (fun U ↦ ?_) ?_
114+
· dsimp [PresheafOfModules.forgetToPresheafModuleCatObjObj]
115+
refine ModuleCat.restrictScalarsComp'App _ _ _ ?_ _
116+
simpa using congr((R.obj.map $(hX.hom_ext (hX.to U) (φ.hom ≫ hY.to U))).hom)
117+
cat_disch
118+
cat_disch
119+
106120
/-- The canonical isomorphism between
107121
`SheafOfModules.toSheaf R ⋙ sheafToPresheaf J AddCommGrpCat.{v}`
108122
and `SheafOfModules.forget R ⋙ PresheafOfModules.toPresheaf R.val`. -/

Mathlib/Algebra/Category/ModuleCat/Sheaf/PushforwardContinuous.lean

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -330,4 +330,23 @@ lemma pushforwardPushforwardEquivalence_counit_app_val_app (M U x) :
330330

331331
end Equivalence
332332

333+
set_option backward.defeqAttrib.useBackward true in
334+
set_option backward.isDefEq.respectTransparency false in
335+
/-- Pushforward commutes with `SheafOfModules.forgetToSheafModuleCat` -/
336+
noncomputable def pushforwardCompForgetToSheafModuleCat
337+
(X : Cᵒᵖ) (hX : Limits.IsInitial X) (hX' : Limits.IsInitial (F.op.obj X)) :
338+
SheafOfModules.pushforward φ ⋙ SheafOfModules.forgetToSheafModuleCat _ X hX ≅
339+
SheafOfModules.forgetToSheafModuleCat _ _ hX' ⋙
340+
sheafCompose K (ModuleCat.restrictScalars <| (φ.hom.app _).hom) ⋙
341+
F.sheafPushforwardContinuous _ J K := by
342+
refine NatIso.ofComponents (fun M ↦ ObjectProperty.isoMk _ ?_) ?_
343+
· refine NatIso.ofComponents (fun U ↦ ?_) ?_
344+
· refine (ModuleCat.restrictScalarsComp'App _ _ _ ?_ _).symm ≪≫
345+
(ModuleCat.restrictScalarsComp _ _).app _
346+
rw [← RingCat.hom_comp, ← RingCat.hom_comp, φ.hom.naturality]
347+
dsimp
348+
rw [hX'.hom_ext (hX'.to (Opposite.op (F.obj (Opposite.unop U)))) _]
349+
· cat_disch
350+
· cat_disch
351+
333352
end SheafOfModules

Mathlib/Algebra/Module/LocalizedModule/Basic.lean

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -569,6 +569,22 @@ instance IsLocalizedModule.of_linearEquiv_right (e : M'' ≃ₗ[R] M) [hf : IsLo
569569
exact ⟨c, by simpa only [Submonoid.smul_def, map_smul, e.symm_apply_apply]
570570
using congr(e.symm $hc)⟩
571571

572+
lemma IsLocalizedModule.comp_iff_of_bijective_left {f : M →ₗ[R] M'} (e : M' →ₗ[R] M'')
573+
(he : Function.Bijective e) :
574+
IsLocalizedModule S (e ∘ₗ f) ↔ IsLocalizedModule S f := by
575+
refine ⟨fun h ↦ ?_, fun h ↦ .of_linearEquiv _ _ (.ofBijective _ he)⟩
576+
have : (LinearEquiv.ofBijective _ he).symm.toLinearMap ∘ₗ e ∘ₗ f = f := by ext; simp
577+
rw [← this]
578+
exact .of_linearEquiv _ _ _
579+
580+
lemma IsLocalizedModule.comp_iff_of_bijective_right (e : M →ₗ[R] M') {f : M' →ₗ[R] M''}
581+
(he : Function.Bijective e) :
582+
IsLocalizedModule S (f ∘ₗ e) ↔ IsLocalizedModule S f := by
583+
refine ⟨fun h ↦ ?_, fun h ↦ .of_linearEquiv_right _ _ (.ofBijective _ he)⟩
584+
have : (f ∘ₗ e) ∘ₗ (LinearEquiv.ofBijective _ he).symm.toLinearMap = f := by ext; simp
585+
rw [← this]
586+
exact .of_linearEquiv_right _ _ _
587+
572588
variable (M) in
573589
lemma isLocalizedModule_id (R') [CommSemiring R'] [Algebra R R'] [IsLocalization S R'] [Module R' M]
574590
[IsScalarTower R R' M] : IsLocalizedModule S (.id : M →ₗ[R] M) where
@@ -699,6 +715,30 @@ instance localizedModuleIsLocalizedModule :
699715
← Submonoid.smul_def, LocalizedModule.mk_cancel t]
700716
exists_of_eq eq1 := by simpa only [eq_comm, one_smul] using LocalizedModule.mk_eq.mp eq1
701717

718+
lemma IsLocalizedModule.restrictScalars (S : Submonoid R) [Module A M]
719+
{N : Type*} [AddCommMonoid N] [Module R N] [Module A N]
720+
[IsScalarTower R A M] [IsScalarTower R A N]
721+
(f : M →ₗ[A] N) [h : IsLocalizedModule (Algebra.algebraMapSubmonoid A S) f] :
722+
IsLocalizedModule S (f.restrictScalars R) where
723+
map_units s := by
724+
have := h.1 ⟨algebraMap R A s, Algebra.mem_algebraMapSubmonoid_of_mem s⟩
725+
simp only [← IsScalarTower.algebraMap_apply, Module.End.isUnit_iff] at this ⊢
726+
exact this
727+
surj y := by
728+
obtain ⟨⟨x, ⟨_, ⟨r, ⟨hr₁, rfl⟩⟩⟩⟩, hx⟩ := h.2 y
729+
exact ⟨⟨x, ⟨r, hr₁⟩⟩, by simpa [Submonoid.smul_def] using hx⟩
730+
exists_of_eq {x₁ x₂} e := by
731+
obtain ⟨⟨_, ⟨r, ⟨hr, rfl⟩⟩⟩, hc⟩ := h.3 e
732+
exact ⟨⟨r, hr⟩, by simpa [Submonoid.smul_def] using hc⟩
733+
734+
lemma IsLocalizedModule.restrictScalars_powers [Module A M]
735+
{N : Type*} [AddCommMonoid N] [Module R N] [Module A N]
736+
[IsScalarTower R A M] [IsScalarTower R A N]
737+
(r : R) (f : M →ₗ[A] N) [h : IsLocalizedModule (.powers (algebraMap R A r)) f] :
738+
IsLocalizedModule (.powers r) (f.restrictScalars R) := by
739+
rw [← Algebra.algebraMapSubmonoid_powers] at h
740+
exact IsLocalizedModule.restrictScalars _ f
741+
702742
lemma IsLocalizedModule.of_restrictScalars (S : Submonoid R)
703743
{N : Type*} [AddCommMonoid N] [Module R N] [Module A M] [Module A N]
704744
[IsScalarTower R A M] [IsScalarTower R A N]
@@ -716,6 +756,13 @@ lemma IsLocalizedModule.of_restrictScalars (S : Submonoid R)
716756
obtain ⟨c, hc⟩ := IsLocalizedModule.exists_of_eq (S := S) (f := f.restrictScalars R) e
717757
refine ⟨⟨_, c, c.2, rfl⟩, by simpa [Submonoid.smul_def]⟩
718758

759+
lemma IsLocalizedModule.restrictScalars_iff (S : Submonoid R)
760+
{N : Type*} [AddCommMonoid N] [Module R N] [Module A M] [Module A N]
761+
[IsScalarTower R A M] [IsScalarTower R A N] (f : M →ₗ[A] N) :
762+
IsLocalizedModule (Algebra.algebraMapSubmonoid A S) f ↔
763+
IsLocalizedModule S (f.restrictScalars R) :=
764+
fun _ => restrictScalars _ _, fun _ => of_restrictScalars _ _⟩
765+
719766
lemma IsLocalizedModule.of_exists_mul_mem {N : Type*} [AddCommMonoid N] [Module R N]
720767
(S T : Submonoid R) (h : S ≤ T) (h' : ∀ x : T, ∃ m : R, m * x ∈ S)
721768
(f : M →ₗ[R] N) [IsLocalizedModule S f] :
@@ -933,6 +980,12 @@ lemma linearEquiv_symm_apply [IsLocalizedModule S g] (x : M) :
933980
(linearEquiv S f g).symm (g x) = f x := by
934981
simp [linearEquiv]
935982

983+
lemma linearEquiv_of_isLocalizedModule_comp (g : M' →ₗ[R] M'') [IsLocalizedModule S (g ∘ₗ f)] :
984+
linearEquiv S f (g ∘ₗ f) = g := by
985+
refine ext S f (IsLocalizedModule.map_units (g ∘ₗ f)) ?_
986+
ext
987+
simp
988+
936989
variable {S}
937990

938991
include f in

Mathlib/AlgebraicGeometry/Modules/Sheaf.lean

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -456,4 +456,21 @@ lemma germ_restrictStalkNatIso_inv_app (x : X) (M : Y.Modules) (hxU : x ∈ U) :
456456

457457
end Restriction
458458

459+
/-- `sheafCompose` commutes with `pushforward` -/
460+
noncomputable def sheafComposePushforwardComp {R S : CommRingCat.{u}} (φ : R ⟶ S) :
461+
sheafCompose (Opens.grothendieckTopology (Spec S))
462+
(ModuleCat.restrictScalars (Spec.map φ).appTop.hom) ⋙
463+
TopCat.Sheaf.pushforward _ (Spec.map φ).base ⋙
464+
sheafCompose _ (ModuleCat.restrictScalars (Scheme.ΓSpecIso R).inv.hom) ≅
465+
sheafCompose _ (ModuleCat.restrictScalars (Scheme.ΓSpecIso S).inv.hom) ⋙
466+
TopCat.Sheaf.pushforward _ (Spec.map φ).base ⋙
467+
sheafCompose _ (ModuleCat.restrictScalars φ.hom) := by
468+
refine NatIso.ofComponents (fun M ↦ ObjectProperty.isoMk _ ?_) ?_
469+
· refine NatIso.ofComponents (fun U ↦ ?_) ?_
470+
· refine (ModuleCat.restrictScalarsComp'App _ _ _ ?_ _).symm ≪≫
471+
(ModuleCat.restrictScalarsComp φ.hom ((Scheme.ΓSpecIso S).inv).hom).app _
472+
rw [← CommRingCat.hom_comp, Scheme.ΓSpecIso_inv_naturality, CommRingCat.hom_comp]
473+
· cat_disch
474+
· cat_disch
475+
459476
end AlgebraicGeometry.Scheme.Modules

Mathlib/AlgebraicGeometry/Modules/Tilde.lean

Lines changed: 98 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,14 @@
22
Copyright (c) 2024 Weihong Xu. All rights reserved.
33
Released under Apache 2.0 license as described in the file LICENSE.
44
Authors: Kevin Buzzard, Johan Commelin, Amelia Livingston, Sophie Morel, Jujian Zhang, Weihong Xu,
5-
Andrew Yang
5+
Andrew Yang, Brian Nugent
66
-/
77
module
88

9-
public import Mathlib.Algebra.Module.LocalizedModule.Basic
9+
public import Mathlib.Algebra.Category.ModuleCat.Localization
10+
public import Mathlib.Algebra.Category.ModuleCat.Sheaf.Quasicoherent
1011
public import Mathlib.AlgebraicGeometry.AffineScheme
1112
public import Mathlib.AlgebraicGeometry.Modules.Sheaf
12-
public import Mathlib.Algebra.Category.ModuleCat.Sheaf.Quasicoherent
13-
public import Mathlib.Algebra.Category.ModuleCat.FilteredColimits
14-
public import Mathlib.CategoryTheory.Limits.ConcreteCategory.WithAlgebraicStructures
1513

1614
/-!
1715
@@ -43,7 +41,7 @@ def modulesSpecToSheaf :
4341
(Spec R).Modules ⥤ TopCat.Sheaf (ModuleCat R) (Spec R) :=
4442
SheafOfModules.forgetToSheafModuleCat (Spec R).ringCatSheaf (.op ⊤)
4543
(Limits.initialOpOfTerminal Limits.isTerminalTop) ⋙
46-
sheafCompose _ (ModuleCat.restrictScalars (StructureSheaf.globalSectionsIso R).hom.hom)
44+
sheafCompose _ (ModuleCat.restrictScalars (Scheme.ΓSpecIso R).inv.hom)
4745

4846
/-- The global section functor for `𝒪_{Spec R}` modules -/
4947
noncomputable
@@ -81,6 +79,10 @@ def SpecModulesToSheafFullyFaithful : (modulesSpecToSheaf (R := R)).FullyFaithfu
8179
map_preimage f := rfl
8280
preimage_map f := rfl
8381

82+
instance : (modulesSpecToSheaf (R := R)).Faithful := SpecModulesToSheafFullyFaithful.faithful
83+
84+
instance : (modulesSpecToSheaf (R := R)).Full := SpecModulesToSheafFullyFaithful.full
85+
8486
/--
8587
`M^~` as a sheaf of `𝒪_{Spec R}`-modules
8688
-/
@@ -410,6 +412,96 @@ lemma isIso_fromTildeΓ_of_presentation (M : (Spec R).Modules) (P : M.Presentati
410412
exact ⟨cokernel g, ⟨PreservesCokernel.iso (tilde.functor R) g ≪≫ iso ≪≫
411413
IsColimit.coconePointUniqueUpToIso (colimit.isColimit _) P.isColimit⟩⟩
412414

415+
section IsLocalizing
416+
417+
variable (M : (Spec R).Modules) (f : R) {S : CommRingCat.{u}} (φ : R ⟶ S)
418+
419+
open TopologicalSpace
420+
421+
/-- A sheaf `M` of `R-modules` is localizing if for all `f` in `R`, the restriction map
422+
from `M(⊤)` to `M(D(f))` is localization with respect to `f`. -/
423+
abbrev IsLocalizing (M : TopCat.Sheaf (ModuleCat R) (Spec R)) : Prop :=
424+
∀ f : R, IsLocalizedModule (.powers f) (M.obj.map (basicOpen f).leTop.op).hom
425+
426+
theorem isLocalizing_of_iso {M N : TopCat.Sheaf (ModuleCat R) (Spec R)} (φ : M ≅ N)
427+
(hM : IsLocalizing M) :
428+
IsLocalizing N := by
429+
intro f
430+
rw [← IsLocalizedModule.comp_iff_of_bijective_left _ _ <|
431+
ConcreteCategory.bijective_of_isIso (φ.inv.hom.app (op (basicOpen f))), ← ModuleCat.hom_comp,
432+
φ.inv.hom.naturality (basicOpen f).leTop.op, ModuleCat.hom_comp,
433+
IsLocalizedModule.comp_iff_of_bijective_right _ _ <| ConcreteCategory.bijective_of_isIso _]
434+
exact hM f
435+
436+
theorem isLocalizing_iff_of_iso {M N : TopCat.Sheaf (ModuleCat R) (Spec R)} (φ : M ≅ N) :
437+
IsLocalizing M ↔ IsLocalizing N :=
438+
fun h => isLocalizing_of_iso φ h, fun h => isLocalizing_of_iso φ.symm h⟩
439+
440+
theorem isLocalizing_of_isIso_app_top {M N : TopCat.Sheaf (ModuleCat.{u} R) (Spec R)} {φ : M ⟶ N}
441+
(h : IsIso (φ.hom.app (op ⊤))) (hM : IsLocalizing M) (hN : IsLocalizing N) :
442+
IsIso φ := by
443+
refine TopCat.Sheaf.isIso_iff_isIso_basis (φ := φ) isBasis_basic_opens (fun f => ?_)
444+
refine ModuleCat.isIso_of_isLocalizedModule_comp (hM f) ?_
445+
rw [φ.hom.naturality]
446+
exact IsLocalizedModule.of_linearEquiv_right _ _ (asIso (φ.hom.app (op ⊤))).toLinearEquiv
447+
448+
theorem isLocalizing_tilde (M : ModuleCat R) :
449+
IsLocalizing (modulesSpecToSheaf.obj (tilde M)) := by
450+
intro f
451+
-- We can't rewrite with `tilde.toOpen_res` below, because of def-eq abuse between
452+
-- `Spec R` and `PrimeSpectrum R`.
453+
have heq : tilde.toOpen M ⊤ ≫ (modulesSpecToSheaf.obj (tilde M)).obj.map (basicOpen f).leTop.op =
454+
tilde.toOpen M (basicOpen f) :=
455+
tilde.toOpen_res _ _ _ _
456+
rw [← IsLocalizedModule.comp_iff_of_bijective_right _ _ <|
457+
ConcreteCategory.bijective_of_isIso (tilde.toOpen M ⊤), ← ModuleCat.hom_comp, heq]
458+
infer_instance
459+
460+
/-- An `𝓞_Spec R` module `M` is isomorphic to `Γ(M)^~` if and only if it is localizing
461+
as a sheaf of `R` modules -/
462+
theorem isIso_fromTildeΓ_iff_isLocalizing (M : (Spec R).Modules) :
463+
IsIso M.fromTildeΓ ↔ IsLocalizing (modulesSpecToSheaf.obj M) := by
464+
refine ⟨fun h ↦ ?_, fun h ↦ ?_⟩
465+
· rw [← isLocalizing_iff_of_iso (modulesSpecToSheaf.mapIso (asIso M.fromTildeΓ))]
466+
exact isLocalizing_tilde _
467+
· rw [← isIso_iff_of_reflects_iso _ modulesSpecToSheaf]
468+
refine isLocalizing_of_isIso_app_top ?_ (isLocalizing_tilde _) h
469+
rw [← isIso_comp_left_iff (tilde.toOpen ((modulesSpecToSheaf.obj M).presheaf.obj (op ⊤)) ⊤),
470+
Scheme.Modules.toOpen_fromTildeΓ_app]
471+
simpa using IsIso.id _
472+
473+
/-- `Scheme.Modules.pushforward` and `modulesSpecToSheaf` commute -/
474+
def pushforwardCompModulesSpecToSheafIso :
475+
Scheme.Modules.pushforward (Spec.map φ) ⋙ modulesSpecToSheaf ≅
476+
modulesSpecToSheaf ⋙ TopCat.Sheaf.pushforward (ModuleCat S) (Spec.map φ).base ⋙
477+
sheafCompose _ (ModuleCat.restrictScalars φ.hom) :=
478+
(Functor.associator _ _ _).symm ≪≫
479+
Functor.isoWhiskerRight (SheafOfModules.pushforwardCompForgetToSheafModuleCat _ _ _
480+
(initialOpOfTerminal isTerminalTop)) _ ≪≫ Functor.associator _ _ _ ≪≫
481+
(Functor.isoWhiskerLeft _ (Functor.associator _ _ _)) ≪≫
482+
Functor.isoWhiskerLeft _ (Scheme.Modules.sheafComposePushforwardComp φ) ≪≫
483+
(Functor.associator _ _ _).symm
484+
485+
open scoped ModuleCat.Algebra in
486+
theorem isLocalizing_pushforward_of_isLocalizing {M : (Spec S).Modules}
487+
(h : IsLocalizing (modulesSpecToSheaf.obj M)) :
488+
IsLocalizing (modulesSpecToSheaf.obj ((Scheme.Modules.pushforward (Spec.map φ)).obj M)) := by
489+
rw [← Functor.comp_obj,
490+
isLocalizing_iff_of_iso ((pushforwardCompModulesSpecToSheafIso φ).app M)]
491+
have : CommRing ((Spec S).ringCatSheaf.obj.obj ((Opens.map (Spec.map φ).base).op.obj (op ⊤))) :=
492+
inferInstanceAs (CommRing Γ(Spec S, ⊤))
493+
algebraize [φ.hom]
494+
exact fun f => IsLocalizedModule.restrictScalars_powers f _ (h := h (φ f))
495+
496+
/- TODO: Once `IsIso M.fromTildeΓ` is shown to be equivalent to `M` being quasicoherent, use
497+
this to show that quasicoherent sheaves pushforward to quasicoherent sheaves for affine morphisms -/
498+
theorem isIso_fromTildeΓ_pushforward (M : (Spec S).Modules) [h : IsIso M.fromTildeΓ] :
499+
IsIso ((Scheme.Modules.pushforward (Spec.map φ)).obj M).fromTildeΓ := by
500+
simp_all only [isIso_fromTildeΓ_iff_isLocalizing]
501+
exact isLocalizing_pushforward_of_isLocalizing φ h
502+
503+
end IsLocalizing
504+
413505
end IsQuasicoherent
414506

415507
end AlgebraicGeometry

Mathlib/Topology/Sheaves/SheafCondition/Sites.lean

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -246,6 +246,15 @@ theorem hom_ext (h : Opens.IsBasis (Set.range B))
246246
ext i
247247
exact he i.unop
248248

249+
theorem isIso_iff_isIso_basis {F G : Sheaf C X} (h : Opens.IsBasis (Set.range B))
250+
{φ : F ⟶ G} (hi : ∀ i, IsIso (φ.hom.app (op (B i)))) :
251+
IsIso φ := by
252+
have : (inducedFunctor B).IsCoverDense (Opens.grothendieckTopology X) :=
253+
Opens.coverDense_inducedFunctor h
254+
refine Functor.IsCoverDense.iso_of_restrict_iso (G := inducedFunctor B) _ ?_
255+
rw [NatTrans.isIso_iff_isIso_app]
256+
exact fun _ ↦ hi _
257+
249258
end TopCat.Sheaf
250259

251260
namespace TopologicalSpace.Opens

0 commit comments

Comments
 (0)