-
Notifications
You must be signed in to change notification settings - Fork 298
/
limits.lean
148 lines (122 loc) · 5.16 KB
/
limits.lean
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
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
/-
Copyright (c) 2020 Scott Morrison. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Scott Morrison
-/
import algebra.category.Algebra.basic
import algebra.category.Module.limits
import algebra.category.CommRing.limits
/-!
# The category of R-algebras has all limits
Further, these limits are preserved by the forgetful functor --- that is,
the underlying types are just the limits in the category of types.
-/
open category_theory
open category_theory.limits
universes v u
noncomputable theory
namespace Algebra
variables {R : Type u} [comm_ring R]
variables {J : Type v} [small_category J]
instance semiring_obj (F : J ⥤ Algebra R) (j) :
semiring ((F ⋙ forget (Algebra R)).obj j) :=
by { change semiring (F.obj j), apply_instance }
instance algebra_obj (F : J ⥤ Algebra R) (j) :
algebra R ((F ⋙ forget (Algebra R)).obj j) :=
by { change algebra R (F.obj j), apply_instance }
/--
The flat sections of a functor into `Algebra R` form a submodule of all sections.
-/
def sections_subalgebra (F : J ⥤ Algebra R) :
subalgebra R (Π j, F.obj j) :=
{ algebra_map_mem' := λ r j j' f, (F.map f).commutes r,
..SemiRing.sections_subsemiring (F ⋙ forget₂ (Algebra R) Ring ⋙ forget₂ Ring SemiRing) }
instance limit_semiring (F : J ⥤ Algebra R) :
ring (types.limit_cone (F ⋙ forget (Algebra.{v} R))).X :=
begin
change ring (sections_subalgebra F),
apply_instance,
end
instance limit_algebra (F : J ⥤ Algebra R) :
algebra R (types.limit_cone (F ⋙ forget (Algebra.{v} R))).X :=
begin
change algebra R (sections_subalgebra F),
apply_instance,
end
/-- `limit.π (F ⋙ forget (Algebra R)) j` as a `alg_hom`. -/
def limit_π_alg_hom (F : J ⥤ Algebra.{v} R) (j) :
(types.limit_cone (F ⋙ forget (Algebra R))).X →ₐ[R] (F ⋙ forget (Algebra.{v} R)).obj j :=
{ commutes' := λ r, rfl,
..SemiRing.limit_π_ring_hom (F ⋙ forget₂ (Algebra R) Ring.{v} ⋙ forget₂ Ring SemiRing.{v}) j }
namespace has_limits
-- The next two definitions are used in the construction of `has_limits (Algebra R)`.
-- After that, the limits should be constructed using the generic limits API,
-- e.g. `limit F`, `limit.cone F`, and `limit.is_limit F`.
/--
Construction of a limit cone in `Algebra R`.
(Internal use only; use the limits API.)
-/
def limit_cone (F : J ⥤ Algebra R) : cone F :=
{ X := Algebra.of R (types.limit_cone (F ⋙ forget _)).X,
π :=
{ app := limit_π_alg_hom F,
naturality' := λ j j' f,
alg_hom.coe_fn_inj ((types.limit_cone (F ⋙ forget _)).π.naturality f) } }
/--
Witness that the limit cone in `Algebra R` is a limit cone.
(Internal use only; use the limits API.)
-/
def limit_cone_is_limit (F : J ⥤ Algebra R) : is_limit (limit_cone F) :=
begin
refine is_limit.of_faithful
(forget (Algebra R)) (types.limit_cone_is_limit _)
(λ s, { .. }) (λ s, rfl),
{ simp only [forget_map_eq_coe, alg_hom.map_one, functor.map_cone_π_app], refl, },
{ intros x y, simp only [forget_map_eq_coe, alg_hom.map_mul, functor.map_cone_π_app], refl, },
{ simp only [forget_map_eq_coe, alg_hom.map_zero, functor.map_cone_π_app], refl, },
{ intros x y, simp only [forget_map_eq_coe, alg_hom.map_add, functor.map_cone_π_app], refl, },
{ intros r, ext j, exact (s.π.app j).commutes r, },
end
end has_limits
open has_limits
/-- The category of R-algebras has all limits. -/
@[irreducible]
instance has_limits : has_limits (Algebra R) :=
{ has_limits_of_shape := λ J 𝒥, by exactI
{ has_limit := λ F, has_limit.mk
{ cone := limit_cone F,
is_limit := limit_cone_is_limit F } } }
/--
An auxiliary declaration to speed up typechecking.
-/
def forget₂_Ring_preserves_limits_aux (F : J ⥤ Algebra R) :
is_limit ((forget₂ (Algebra R) Ring).map_cone (limit_cone F)) :=
Ring.limit_cone_is_limit (F ⋙ forget₂ (Algebra R) Ring)
/--
The forgetful functor from R-algebras to rings preserves all limits.
-/
instance forget₂_Ring_preserves_limits : preserves_limits (forget₂ (Algebra R) Ring.{v}) :=
{ preserves_limits_of_shape := λ J 𝒥, by exactI
{ preserves_limit := λ F, preserves_limit_of_preserves_limit_cone
(limit_cone_is_limit F) (forget₂_Ring_preserves_limits_aux F) } }
/--
An auxiliary declaration to speed up typechecking.
-/
def forget₂_Module_preserves_limits_aux (F : J ⥤ Algebra R) :
is_limit ((forget₂ (Algebra R) (Module R)).map_cone (limit_cone F)) :=
Module.has_limits.limit_cone_is_limit (F ⋙ forget₂ (Algebra R) (Module R))
/--
The forgetful functor from R-algebras to R-modules preserves all limits.
-/
instance forget₂_Module_preserves_limits : preserves_limits (forget₂ (Algebra R) (Module.{v} R)) :=
{ preserves_limits_of_shape := λ J 𝒥, by exactI
{ preserves_limit := λ F, preserves_limit_of_preserves_limit_cone
(limit_cone_is_limit F) (forget₂_Module_preserves_limits_aux F) } }
/--
The forgetful functor from R-algebras to types preserves all limits.
-/
instance forget_preserves_limits : preserves_limits (forget (Algebra R)) :=
{ preserves_limits_of_shape := λ J 𝒥, by exactI
{ preserves_limit := λ F, preserves_limit_of_preserves_limit_cone
(limit_cone_is_limit F) (types.limit_cone_is_limit (F ⋙ forget _)) } }
end Algebra