forked from leanprover-community/mathlib4
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathEpi.lean
More file actions
133 lines (101 loc) · 5.27 KB
/
Epi.lean
File metadata and controls
133 lines (101 loc) · 5.27 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
/-
Copyright (c) 2024 Dagur Asgeirsson. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Dagur Asgeirsson
-/
import Mathlib.CategoryTheory.Limits.Shapes.SequentialProduct
import Mathlib.CategoryTheory.Sites.Coherent.SequentialLimit
import Mathlib.Condensed.Light.Limits
/-!
# Epimorphisms of light condensed objects
This file characterises epimorphisms in light condensed sets and modules as the locally surjective
morphisms. Here, the condition of locally surjective is phrased in terms of continuous surjections
of light profinite sets.
Further, we prove that the functor `lim : Discrete ℕ ⥤ LightCondMod R` preserves epimorphisms.
-/
universe v u w u' v'
open CategoryTheory Sheaf Limits HasForget GrothendieckTopology
namespace LightCondensed
variable (A : Type u') [Category.{v'} A] {FA : A → A → Type*} {CA : A → Type w}
variable [∀ X Y, FunLike (FA X Y) (CA X) (CA Y)] [ConcreteCategory.{w} A FA]
[PreservesFiniteProducts (CategoryTheory.forget A)]
variable {X Y : LightCondensed.{u} A} (f : X ⟶ Y)
lemma isLocallySurjective_iff_locallySurjective_on_lightProfinite : IsLocallySurjective f ↔
∀ (S : LightProfinite) (y : ToType (Y.val.obj ⟨S⟩)),
(∃ (S' : LightProfinite) (φ : S' ⟶ S) (_ : Function.Surjective φ)
(x : ToType (X.val.obj ⟨S'⟩)),
f.val.app ⟨S'⟩ x = Y.val.map ⟨φ⟩ y) := by
rw [coherentTopology.isLocallySurjective_iff,
regularTopology.isLocallySurjective_iff]
simp_rw [LightProfinite.effectiveEpi_iff_surjective]
end LightCondensed
namespace LightCondSet
variable {X Y : LightCondSet.{u}} (f : X ⟶ Y)
attribute [local instance] Types.instFunLike Types.instConcreteCategory in
lemma epi_iff_locallySurjective_on_lightProfinite : Epi f ↔
∀ (S : LightProfinite) (y : Y.val.obj ⟨S⟩),
(∃ (S' : LightProfinite) (φ : S' ⟶ S) (_ : Function.Surjective φ) (x : X.val.obj ⟨S'⟩),
f.val.app ⟨S'⟩ x = Y.val.map ⟨φ⟩ y) := by
rw [← isLocallySurjective_iff_epi']
exact LightCondensed.isLocallySurjective_iff_locallySurjective_on_lightProfinite _ f
end LightCondSet
namespace LightCondMod
variable (R : Type u) [Ring R] {X Y : LightCondMod.{u} R} (f : X ⟶ Y)
attribute [local instance] Types.instFunLike Types.instConcreteCategory in
lemma epi_iff_locallySurjective_on_lightProfinite : Epi f ↔
∀ (S : LightProfinite) (y : Y.val.obj ⟨S⟩),
(∃ (S' : LightProfinite) (φ : S' ⟶ S) (_ : Function.Surjective φ) (x : X.val.obj ⟨S'⟩),
f.val.app ⟨S'⟩ x = Y.val.map ⟨φ⟩ y) := by
rw [← isLocallySurjective_iff_epi']
exact LightCondensed.isLocallySurjective_iff_locallySurjective_on_lightProfinite _ f
attribute [local instance] Types.instFunLike Types.instConcreteCategory in
instance : (LightCondensed.forget R).ReflectsEpimorphisms where
reflects f hf := by
rw [← Sheaf.isLocallySurjective_iff_epi'] at hf ⊢
exact (Presheaf.isLocallySurjective_iff_whisker_forget _ f.val).mpr hf
attribute [local instance] Types.instFunLike Types.instConcreteCategory in
instance : (LightCondensed.forget R).PreservesEpimorphisms where
preserves f hf := by
rw [← Sheaf.isLocallySurjective_iff_epi'] at hf ⊢
exact (Presheaf.isLocallySurjective_iff_whisker_forget _ f.val).mp hf
end LightCondMod
namespace LightCondensed
variable (R : Type*) [Ring R]
variable {F : ℕᵒᵖ ⥤ LightCondMod R} {c : Cone F} (hc : IsLimit c)
(hF : ∀ n, Epi (F.map (homOfLE (Nat.le_succ n)).op))
attribute [local instance] Types.instFunLike Types.instConcreteCategory in
include hc hF in
lemma epi_π_app_zero_of_epi : Epi (c.π.app ⟨0⟩) := by
apply Functor.epi_of_epi_map (forget R)
change Epi (((forget R).mapCone c).π.app ⟨0⟩)
apply coherentTopology.epi_π_app_zero_of_epi
· simp only [LightProfinite.effectiveEpi_iff_surjective]
exact fun x h ↦ Concrete.surjective_π_app_zero_of_surjective_map (limit.isLimit x) h
· have := (freeForgetAdjunction R).isRightAdjoint
exact isLimitOfPreserves _ hc
· exact fun _ ↦ (forget R).map_epi _
end LightCondensed
open CategoryTheory.Limits.SequentialProduct
namespace LightCondensed
variable (n : ℕ)
attribute [local instance] functorMap_epi Abelian.hasFiniteBiproducts
variable {R : Type u} [Ring R] {M N : ℕ → LightCondMod.{u} R} (f : ∀ n, M n ⟶ N n) [∀ n, Epi (f n)]
instance : Epi (Limits.Pi.map f) := by
have : Limits.Pi.map f = (cone f).π.app ⟨0⟩ := rfl
rw [this]
exact epi_π_app_zero_of_epi R (isLimit f) (fun n ↦ by simpa using by infer_instance)
instance : (lim (J := Discrete ℕ) (C := LightCondMod R)).PreservesEpimorphisms where
preserves f _ := by
have : lim.map f = (Pi.isoLimit _).inv ≫ Limits.Pi.map (f.app ⟨·⟩) ≫ (Pi.isoLimit _).hom := by
apply limit.hom_ext
intro ⟨n⟩
simp only [lim_obj, lim_map, limMap, IsLimit.map, limit.isLimit_lift, limit.lift_π,
Cones.postcompose_obj_pt, limit.cone_x, Cones.postcompose_obj_π, NatTrans.comp_app,
Functor.const_obj_obj, limit.cone_π, Pi.isoLimit, Limits.Pi.map, Category.assoc,
limit.conePointUniqueUpToIso_hom_comp, Pi.cone_pt, Pi.cone_π, Discrete.natTrans_app,
Discrete.functor_obj_eq_as]
erw [IsLimit.conePointUniqueUpToIso_inv_comp_assoc]
rfl
rw [this]
infer_instance
end LightCondensed