Skip to content
This repository was archived by the owner on Jul 24, 2024. It is now read-only.

Commit 8efef27

Browse files
committed
feat(category_theory/localization): localization of the opposite category (#17199)
If a functor `L : C ⥤ D` is a localization functor for `W : morphism_property C`, it is shown in this PR that `L.op : Cᵒᵖ ⥤ Dᵒᵖ` is also a localization functor.
1 parent c64b922 commit 8efef27

5 files changed

Lines changed: 149 additions & 1 deletion

File tree

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
/-
2+
Copyright (c) 2022 Joël Riou. All rights reserved.
3+
Released under Apache 2.0 license as described in the file LICENSE.
4+
Authors: Joël Riou
5+
-/
6+
7+
import category_theory.localization.predicate
8+
9+
/-!
10+
11+
# Localization of the opposite category
12+
13+
If a functor `L : C ⥤ D` is a localization functor for `W : morphism_property C`, it
14+
is shown in this file that `L.op : Cᵒᵖ ⥤ Dᵒᵖ` is also a localization functor.
15+
16+
-/
17+
18+
noncomputable theory
19+
20+
open category_theory category_theory.category
21+
22+
namespace category_theory
23+
24+
variables {C D : Type*} [category C] [category D] {L : C ⥤ D} {W : morphism_property C}
25+
26+
namespace localization
27+
28+
/-- If `L : C ⥤ D` satisfies the universal property of the localisation
29+
for `W : morphism_property C`, then `L.op` also does. -/
30+
def strict_universal_property_fixed_target.op {E : Type*} [category E]
31+
(h : strict_universal_property_fixed_target L W Eᵒᵖ):
32+
strict_universal_property_fixed_target L.op W.op E :=
33+
{ inverts := h.inverts.op,
34+
lift := λ F hF, (h.lift F.right_op hF.right_op).left_op,
35+
fac := λ F hF, begin
36+
convert congr_arg functor.left_op (h.fac F.right_op hF.right_op),
37+
exact F.right_op_left_op_eq.symm,
38+
end,
39+
uniq := λ F₁ F₂ eq, begin
40+
suffices : F₁.right_op = F₂.right_op,
41+
{ rw [← F₁.right_op_left_op_eq, ← F₂.right_op_left_op_eq, this], },
42+
have eq' := congr_arg functor.right_op eq,
43+
exact h.uniq _ _ eq',
44+
end, }
45+
46+
instance is_localization_op : W.Q.op.is_localization W.op :=
47+
functor.is_localization.mk' W.Q.op W.op
48+
(strict_universal_property_fixed_target_Q W _).op
49+
(strict_universal_property_fixed_target_Q W _).op
50+
51+
end localization
52+
53+
namespace functor
54+
55+
instance is_localization.op [h : L.is_localization W] : L.op.is_localization W.op :=
56+
is_localization.of_equivalence_target W.Q.op W.op L.op
57+
(localization.equivalence_from_model L W).op
58+
(nat_iso.op (localization.Q_comp_equivalence_from_model_functor_iso L W).symm)
59+
60+
end functor
61+
62+
end category_theory

src/category_theory/localization/predicate.lean

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -325,4 +325,42 @@ end lifting
325325

326326
end localization
327327

328+
namespace functor
329+
330+
namespace is_localization
331+
332+
open localization
333+
334+
lemma of_iso {L₁ L₂ : C ⥤ D} (e : L₁ ≅ L₂) [L₁.is_localization W] : L₂.is_localization W :=
335+
begin
336+
have h := localization.inverts L₁ W,
337+
rw morphism_property.is_inverted_by.iff_of_iso W e at h,
338+
let F₁ := localization.construction.lift L₁ (localization.inverts L₁ W),
339+
let F₂ := localization.construction.lift L₂ h,
340+
exact
341+
{ inverts := h,
342+
nonempty_is_equivalence := nonempty.intro
343+
(is_equivalence.of_iso (lift_nat_iso W.Q W L₁ L₂ F₁ F₂ e) infer_instance), },
344+
end
345+
346+
/-- If `L : C ⥤ D` is a localization for `W : morphism_property C`, then it is also
347+
the case of a functor obtained by post-composing `L` with an equivalence of categories. -/
348+
lemma of_equivalence_target {E : Type*} [category E] (L' : C ⥤ E) (eq : D ≌ E)
349+
[L.is_localization W] (e : L ⋙ eq.functor ≅ L') : L'.is_localization W :=
350+
begin
351+
have h : W.is_inverted_by L',
352+
{ rw ← morphism_property.is_inverted_by.iff_of_iso W e,
353+
exact morphism_property.is_inverted_by.of_comp W L (localization.inverts L W) eq.functor, },
354+
let F₁ := localization.construction.lift L (localization.inverts L W),
355+
let F₂ := localization.construction.lift L' h,
356+
let e' : F₁ ⋙ eq.functor ≅ F₂ := lift_nat_iso W.Q W (L ⋙ eq.functor) L' _ _ e,
357+
exact
358+
{ inverts := h,
359+
nonempty_is_equivalence := nonempty.intro (is_equivalence.of_iso e' infer_instance) },
360+
end
361+
362+
end is_localization
363+
364+
end functor
365+
328366
end category_theory

src/category_theory/morphism_property.lean

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -254,11 +254,31 @@ to isomorphisms in `D`. -/
254254
def is_inverted_by (P : morphism_property C) (F : C ⥤ D) : Prop :=
255255
∀ ⦃X Y : C⦄ (f : X ⟶ Y) (hf : P f), is_iso (F.map f)
256256

257-
lemma is_inverted_by.of_comp {C₁ C₂ C₃ : Type*} [category C₁] [category C₂] [category C₃]
257+
namespace is_inverted_by
258+
259+
lemma of_comp {C₁ C₂ C₃ : Type*} [category C₁] [category C₂] [category C₃]
258260
(W : morphism_property C₁) (F : C₁ ⥤ C₂) (hF : W.is_inverted_by F) (G : C₂ ⥤ C₃) :
259261
W.is_inverted_by (F ⋙ G) :=
260262
λ X Y f hf, by { haveI := hF f hf, dsimp, apply_instance, }
261263

264+
lemma op {W : morphism_property C} {L : C ⥤ D} (h : W.is_inverted_by L) :
265+
W.op.is_inverted_by L.op :=
266+
λ X Y f hf, by { haveI := h f.unop hf, dsimp, apply_instance, }
267+
268+
lemma right_op {W : morphism_property C} {L : Cᵒᵖ ⥤ D} (h : W.op.is_inverted_by L) :
269+
W.is_inverted_by L.right_op :=
270+
λ X Y f hf, by { haveI := h f.op hf, dsimp, apply_instance, }
271+
272+
lemma left_op {W : morphism_property C} {L : C ⥤ Dᵒᵖ} (h : W.is_inverted_by L) :
273+
W.op.is_inverted_by L.left_op :=
274+
λ X Y f hf, by { haveI := h f.unop hf, dsimp, apply_instance, }
275+
276+
lemma unop {W : morphism_property C} {L : Cᵒᵖ ⥤ Dᵒᵖ} (h : W.op.is_inverted_by L) :
277+
W.is_inverted_by L.unop :=
278+
λ X Y f hf, by { haveI := h f.op hf, dsimp, apply_instance, }
279+
280+
end is_inverted_by
281+
262282
/-- Given `app : Π X, F₁.obj X ⟶ F₂.obj X` where `F₁` and `F₂` are two functors,
263283
this is the `morphism_property C` satisfied by the morphisms in `C` with respect
264284
to whom `app` is natural. -/
@@ -373,6 +393,18 @@ full_subcategory (λ (F : C ⥤ D), W.is_inverted_by F)
373393
def functors_inverting.mk {W : morphism_property C} {D : Type*} [category D]
374394
(F : C ⥤ D) (hF : W.is_inverted_by F) : W.functors_inverting D := ⟨F, hF⟩
375395

396+
lemma is_inverted_by.iff_of_iso (W : morphism_property C) {F₁ F₂ : C ⥤ D} (e : F₁ ≅ F₂) :
397+
W.is_inverted_by F₁ ↔ W.is_inverted_by F₂ :=
398+
begin
399+
suffices : ∀ (X Y : C) (f : X ⟶ Y), is_iso (F₁.map f) ↔ is_iso (F₂.map f),
400+
{ split,
401+
exact λ h X Y f hf, by { rw ← this, exact h f hf, },
402+
exact λ h X Y f hf, by { rw this, exact h f hf, }, },
403+
intros X Y f,
404+
exact (respects_iso.isomorphisms D).arrow_mk_iso_iff
405+
(arrow.iso_mk (e.app X) (e.app Y) (by simp)),
406+
end
407+
376408
section diagonal
377409

378410
variables [has_pullbacks C] {P : morphism_property C}

src/category_theory/natural_isomorphism.lean

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -196,6 +196,18 @@ begin
196196
ext, rw [←nat_trans.exchange], simp, refl
197197
end
198198

199+
lemma is_iso_map_iff {F₁ F₂ : C ⥤ D} (e : F₁ ≅ F₂) {X Y : C} (f : X ⟶ Y) :
200+
is_iso (F₁.map f) ↔ is_iso (F₂.map f) :=
201+
begin
202+
revert F₁ F₂,
203+
suffices : ∀ {F₁ F₂ : C ⥤ D} (e : F₁ ≅ F₂) (hf : is_iso (F₁.map f)), is_iso (F₂.map f),
204+
{ exact λ F₁ F₂ e, ⟨this e, this e.symm⟩, },
205+
introsI F₁ F₂ e hf,
206+
refine is_iso.mk ⟨e.inv.app Y ≫ inv (F₁.map f) ≫ e.hom.app X, _, _⟩,
207+
{ simp only [nat_trans.naturality_assoc, is_iso.hom_inv_id_assoc, iso.inv_hom_id_app], },
208+
{ simp only [assoc, ← e.hom.naturality, is_iso.inv_hom_id_assoc, iso.inv_hom_id_app], },
209+
end
210+
199211
end nat_iso
200212

201213
end category_theory

src/category_theory/opposites.lean

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -222,6 +222,10 @@ nat_iso.of_components (λ X, iso.refl _) (by tidy)
222222
def right_op_left_op_iso (F : Cᵒᵖ ⥤ D) : F.right_op.left_op ≅ F :=
223223
nat_iso.of_components (λ X, iso.refl _) (by tidy)
224224

225+
/-- Whenever possible, it is advisable to use the isomorphism `right_op_left_op_iso`
226+
instead of this equality of functors. -/
227+
lemma right_op_left_op_eq (F : Cᵒᵖ ⥤ D) : F.right_op.left_op = F := by { cases F, refl, }
228+
225229
end
226230

227231
end functor

0 commit comments

Comments
 (0)