From f09fbf56415bf2e2cb42eb42f8ba81a9fa554273 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=ABl=20Riou?= Date: Wed, 5 Jun 2024 18:55:46 +0200 Subject: [PATCH 001/118] feat: the bicategory of adjunctions in a bicategory --- Mathlib.lean | 1 + Mathlib/CategoryTheory/Bicategory/Adj.lean | 181 +++++++++++++++++++++ 2 files changed, 182 insertions(+) create mode 100644 Mathlib/CategoryTheory/Bicategory/Adj.lean diff --git a/Mathlib.lean b/Mathlib.lean index b8c8dfe0115e8d..4c2b23c62e5e6b 100644 --- a/Mathlib.lean +++ b/Mathlib.lean @@ -1212,6 +1212,7 @@ import Mathlib.CategoryTheory.Adjunction.Restrict import Mathlib.CategoryTheory.Adjunction.Unique import Mathlib.CategoryTheory.Adjunction.Whiskering import Mathlib.CategoryTheory.Balanced +import Mathlib.CategoryTheory.Bicategory.Adj import Mathlib.CategoryTheory.Bicategory.Adjunction import Mathlib.CategoryTheory.Bicategory.Basic import Mathlib.CategoryTheory.Bicategory.Coherence diff --git a/Mathlib/CategoryTheory/Bicategory/Adj.lean b/Mathlib/CategoryTheory/Bicategory/Adj.lean new file mode 100644 index 00000000000000..d4a475eb8f1637 --- /dev/null +++ b/Mathlib/CategoryTheory/Bicategory/Adj.lean @@ -0,0 +1,181 @@ +/- +Copyright (c) 2024 Joël Riou. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Joël Riou +-/ + +import Mathlib.CategoryTheory.Bicategory.Adjunction + +/-! +# The bicategory of adjunctions in a bicategory + +Given a bicategory `B`, we construct a bicategory `Adj B` that has the same +objects but whose `1`-morphisms are adjunctions, and `2`-morphisms are tuples +of mate maps between the left and right adjoints (where the map between right +adjoints is in the opposite direction). + +Certain pseudofunctors to the bicategory `Adj Cat` are analogous to bifibered categories: +in various contexts, this may be used in order to formalize the properties of +both pushforward and pullback functors. + +## References + +* https://ncatlab.org/nlab/show/2-category+of+adjunctions +* https://ncatlab.org/nlab/show/transformation+of+adjoints +* https://ncatlab.org/nlab/show/mate + +-/ + +universe w v u + +namespace CategoryTheory + +namespace Bicategory + +variable (B : Type u) [Bicategory.{w, v} B] + +/-- +The bicategory that has the same objects as a bicategory `B`, in which `1`-morphisms +are adjunctions, and `2`-morphisms are tuples of mate maps between the left and right +adjoints (where the map between right adjoints is in the opposite direction). +-/ +def Adj : Type u := B + +namespace Adj + +variable {B} + +variable (a b c d : B) + +/-- +Given two objects `a` and `b` in a bicategory, +this is the type of adjunctions between `a` and `b`. +-/ +structure Hom where + /-- the left adjoint -/ + f : a ⟶ b + /-- the right adjoint -/ + g : b ⟶ a + /-- the adjunction -/ + adj : f ⊣ g + +instance : CategoryStruct (Adj B) where + Hom (a : B) b := Hom a b + id (a : B) := { adj := Adjunction.id a } + comp f g := { adj := f.adj.comp g.adj } + +@[simp] lemma id_f (a : Adj B) : Hom.f (𝟙 a) = 𝟙 _ := rfl +@[simp] lemma id_g (a : Adj B) : Hom.g (𝟙 a) = 𝟙 _ := rfl + +variable {a b c d : Adj B} + +@[simp] lemma comp_f (α : a ⟶ b) (β : b ⟶ c) : (α ≫ β).f = α.f ≫ β.f := rfl +@[simp] lemma comp_g (α : a ⟶ b) (β : b ⟶ c) : (α ≫ β).g = β.g ≫ α.g := rfl + +/-- +Given two adjunctions `α` and `β` between two objects in a bicategory, the data +of a morphism between the left adjoints is equivalent to the data of a morphism +in the other direction between the right adjoints. +-/ +@[simps] +def hom₂Equiv (α β : a ⟶ b) : (α.f ⟶ β.f) ≃ (β.g ⟶ α.g) where + toFun τ := 𝟙 _ ⊗≫ β.g ◁ α.adj.unit ≫ β.g ◁ (τ ▷ α.g) ⊗≫ (β.adj.counit ▷ α.g) ⊗≫ 𝟙 _ + invFun τ' := 𝟙 _ ⊗≫ β.adj.unit ▷ α.f ≫ (β.f ◁ τ') ▷ α.f ⊗≫ β.f ◁ α.adj.counit ⊗≫ 𝟙 _ + left_inv := sorry + right_inv := sorry + +/-- A morphism between two adjunctions consists of a tuple of mate maps. -/ +@[ext] +structure Hom₂ (α β : a ⟶ b) where + /-- the morphism between left adjoints -/ + τf : α.f ⟶ β.f + /-- the morphism in the opposite direction between right adjoints -/ + τg : β.g ⟶ α.g + hom₂Equiv_τf : hom₂Equiv α β τf = τg + +instance : CategoryStruct (a ⟶ b) where + Hom α β := Hom₂ α β + id α := + { τf := 𝟙 _ + τg := 𝟙 _ + hom₂Equiv_τf := sorry } + comp x y := + { τf := x.τf ≫ y.τf + τg := y.τg ≫ x.τg + hom₂Equiv_τf := sorry } + +@[ext] +lemma hom₂_ext {α β : a ⟶ b} {x y : α ⟶ β} (hf : x.τf = y.τf) : x = y := by + apply Hom₂.ext _ _ hf + rw [← x.hom₂Equiv_τf, ← y.hom₂Equiv_τf, hf] + +@[simp] lemma id_τf (α : a ⟶ b) : Hom₂.τf (𝟙 α) = 𝟙 α.f := rfl +@[simp] lemma id_τg (α : a ⟶ b) : Hom₂.τg (𝟙 α) = 𝟙 α.g := rfl + +section + +variable {α β γ : a ⟶ b} + +@[simp, reassoc] lemma comp_τf (x : α ⟶ β) (y : β ⟶ γ) : (x ≫ y).τf = x.τf ≫ y.τf := rfl +@[simp, reassoc] lemma comp_τg (x : α ⟶ β) (y : β ⟶ γ) : (x ≫ y).τf = x.τf ≫ y.τf := rfl + +end + +instance : Category (a ⟶ b) where + +/-- Constructor for isomorphisms between 1-morphisms in the bicategory `Adj B`. -/ +@[simps] +def iso₂Mk {α β : a ⟶ b} (ef : α.f ≅ β.f) (eg : β.g ≅ α.g) (h : hom₂Equiv α β ef.hom = eg.hom) : + α ≅ β where + hom := + { τf := ef.hom + τg := eg.hom + hom₂Equiv_τf := h } + inv := + { τf := ef.inv + τg := eg.inv + hom₂Equiv_τf := sorry } + +/-- The associator in the bicategory `Adj B`. -/ +@[simps!] +def associator (α : a ⟶ b) (β : b ⟶ c) (γ : c ⟶ d) : (α ≫ β) ≫ γ ≅ α ≫ β ≫ γ := + iso₂Mk (α_ _ _ _) (α_ _ _ _) sorry + +/-- The left unitor in the bicategory `Adj B`. -/ +@[simps!] +def leftUnitor (α : a ⟶ b) : 𝟙 a ≫ α ≅ α := + iso₂Mk (λ_ _) (ρ_ _).symm sorry + +/-- The right unitor in the bicategory `Adj B`. -/ +@[simps!] +def rightUnitor (α : a ⟶ b) : α ≫ 𝟙 b ≅ α := + iso₂Mk (ρ_ _) (λ_ _).symm sorry + +/-- The left whiskering in the bicategory `Adj B`. -/ +@[simps] +def whiskerLeft (α : a ⟶ b) {β β' : b ⟶ c} (y : β ⟶ β') : α ≫ β ⟶ α ≫ β' where + τf := _ ◁ y.τf + τg := y.τg ▷ _ + hom₂Equiv_τf := sorry + +/-- The right whiskering in the bicategory `Adj B`. -/ +@[simps] +def whiskerRight {α α' : a ⟶ b} (x : α ⟶ α') (β : b ⟶ c) : α ≫ β ⟶ α' ≫ β where + τf := x.τf ▷ _ + τg := _ ◁ x.τg + hom₂Equiv_τf := sorry + +attribute [local simp] whisker_exchange + +instance : Bicategory (Adj B) where + whiskerLeft := whiskerLeft + whiskerRight := whiskerRight + associator := associator + leftUnitor := leftUnitor + rightUnitor := rightUnitor + +end Adj + +end Bicategory + +end CategoryTheory From 5fdc86b0266004e768fefcc8f17471b426a15848 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=ABl=20Riou?= Date: Sun, 9 Mar 2025 00:01:51 +0100 Subject: [PATCH 002/118] wip --- Mathlib.lean | 1 + .../Sites/Descent/DescentData.lean | 79 +++++++++++++++++++ 2 files changed, 80 insertions(+) create mode 100644 Mathlib/CategoryTheory/Sites/Descent/DescentData.lean diff --git a/Mathlib.lean b/Mathlib.lean index 9210d918d9cded..d9cbc433a0482f 100644 --- a/Mathlib.lean +++ b/Mathlib.lean @@ -2352,6 +2352,7 @@ import Mathlib.CategoryTheory.Sites.CoversTop import Mathlib.CategoryTheory.Sites.DenseSubsite.Basic import Mathlib.CategoryTheory.Sites.DenseSubsite.InducedTopology import Mathlib.CategoryTheory.Sites.DenseSubsite.SheafEquiv +import Mathlib.CategoryTheory.Sites.Descent.DescentData import Mathlib.CategoryTheory.Sites.EffectiveEpimorphic import Mathlib.CategoryTheory.Sites.EpiMono import Mathlib.CategoryTheory.Sites.EqualizerSheafCondition diff --git a/Mathlib/CategoryTheory/Sites/Descent/DescentData.lean b/Mathlib/CategoryTheory/Sites/Descent/DescentData.lean new file mode 100644 index 00000000000000..83982065401f99 --- /dev/null +++ b/Mathlib/CategoryTheory/Sites/Descent/DescentData.lean @@ -0,0 +1,79 @@ +/- +Copyright (c) 2025 Joël Riou. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Joël Riou +-/ +import Mathlib.CategoryTheory.Sites.Grothendieck +import Mathlib.CategoryTheory.Bicategory.Functor.Pseudofunctor +import Mathlib.CategoryTheory.Bicategory.LocallyDiscrete + +/-! +# Descent data + +-/ + +universe w v' u' v u + +namespace CategoryTheory + +open Category Limits + +namespace Pseudofunctor + +variable {C : Type u} [Category.{v} C] + (F : Pseudofunctor (LocallyDiscrete Cᵒᵖ) Cat.{v', u'}) + {ι : Type w} (X : ι → C) + +structure DescentData where + obj (i : ι) : F.obj ⟨⟨X i⟩⟩ + iso ⦃Y : C⦄ ⦃i₁ i₂ : ι⦄ (f₁ : Y ⟶ X i₁) (f₂ : Y ⟶ X i₂) : + (F.map ⟨f₁.op⟩).obj (obj i₁) ≅ (F.map ⟨f₂.op⟩).obj (obj i₂) + iso_comp ⦃Y' Y : C⦄ (g : Y' ⟶ Y) ⦃i₁ i₂ : ι⦄ (f₁ : Y ⟶ X i₁) (f₂ : Y ⟶ X i₂) : + iso (g ≫ f₁) (g ≫ f₂) = + (F.mapComp ⟨f₁.op⟩ ⟨g.op⟩).app _ ≪≫ + Functor.mapIso (F.map ⟨g.op⟩) (iso f₁ f₂) ≪≫ + (F.mapComp ⟨f₂.op⟩ ⟨g.op⟩).symm.app _ + iso_trans ⦃Y : C⦄ ⦃i₁ i₂ i₃ : ι⦄ (f₁ : Y ⟶ X i₁) (f₂ : Y ⟶ X i₂) (f₃ : Y ⟶ X i₃) : + iso f₁ f₂ ≪≫ iso f₂ f₃ = iso f₁ f₃ := by aesop_cat + +namespace DescentData + +variable {F X} + +@[ext] +structure Hom (D₁ D₂ : F.DescentData X) where + hom (i : ι) : D₁.obj i ⟶ D₂.obj i + comm ⦃Y : C⦄ ⦃i₁ i₂ : ι⦄ (f₁ : Y ⟶ X i₁) (f₂ : Y ⟶ X i₂) : + (F.map ⟨f₁.op⟩).map (hom i₁) ≫ (D₂.iso f₁ f₂).hom = + (D₁.iso f₁ f₂).hom ≫ (F.map ⟨f₂.op⟩).map (hom i₂) := by aesop_cat + +attribute [reassoc (attr := simp)] Hom.comm + +instance : Category (F.DescentData X) where + Hom := Hom + id D := { hom i := 𝟙 _ } + comp {D₁ D₂ D₃} φ ψ := + { hom i := φ.hom i ≫ ψ.hom i + comm Y i₁ i₂ f₁ f₂ := by + dsimp + simp only [Functor.map_comp, assoc] + rw [ψ.comm, φ.comm_assoc] } + +end DescentData + +def toDescentDataOfIsTerminal (X₀ : C) (hX₀ : IsTerminal X₀) : + F.obj ⟨⟨X₀⟩⟩ ⥤ F.DescentData X where + obj A := + { obj i := (F.map ⟨(hX₀.from (X i)).op⟩).obj A + iso Y i₁ i₂ f₁ f₂ := by + trans (F.map ⟨(hX₀.from Y).op⟩).obj A + · sorry + · sorry + iso_comp := sorry } + map {A B} f := + { hom i := (F.map _).map f + comm := sorry } + +end Pseudofunctor + +end CategoryTheory From 6118c3ae29fd6a0e4aa68dab3c6d117837ee576a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=ABl=20Riou?= Date: Sun, 9 Mar 2025 00:22:50 +0100 Subject: [PATCH 003/118] wip --- .../Sites/Descent/DescentData.lean | 36 +++++++++++++++---- 1 file changed, 29 insertions(+), 7 deletions(-) diff --git a/Mathlib/CategoryTheory/Sites/Descent/DescentData.lean b/Mathlib/CategoryTheory/Sites/Descent/DescentData.lean index 83982065401f99..158a27972164e8 100644 --- a/Mathlib/CategoryTheory/Sites/Descent/DescentData.lean +++ b/Mathlib/CategoryTheory/Sites/Descent/DescentData.lean @@ -20,6 +20,21 @@ open Category Limits namespace Pseudofunctor +section + +variable {B C : Type*} [Bicategory B] [Bicategory C] + (F : Pseudofunctor B C) + {a b c : B} (f : a ⟶ b) (g : b ⟶ c) (fg : a ⟶ c) (hfg : f ≫ g = fg) + +def mapComp' : F.map fg ≅ F.map f ≫ F.map g := by + subst hfg + exact F.mapComp f g + +@[simp] +lemma mapComp_rfl : F.mapComp' f g _ rfl = F.mapComp f g := rfl + +end + variable {C : Type u} [Category.{v} C] (F : Pseudofunctor (LocallyDiscrete Cᵒᵖ) Cat.{v', u'}) {ι : Type w} (X : ι → C) @@ -64,15 +79,22 @@ end DescentData def toDescentDataOfIsTerminal (X₀ : C) (hX₀ : IsTerminal X₀) : F.obj ⟨⟨X₀⟩⟩ ⥤ F.DescentData X where obj A := - { obj i := (F.map ⟨(hX₀.from (X i)).op⟩).obj A - iso Y i₁ i₂ f₁ f₂ := by - trans (F.map ⟨(hX₀.from Y).op⟩).obj A - · sorry - · sorry - iso_comp := sorry } + { obj i := (F.map (hX₀.from (X i)).op.toLoc).obj A + iso Y i₁ i₂ f₁ f₂ := + (F.mapComp' (hX₀.from (X i₁)).op.toLoc f₁.op.toLoc (hX₀.from Y).op.toLoc + --(by rw [← Quiver.Hom.comp_toLoc, ← op_comp, IsTerminal.comp_from]) + sorry).symm.app A ≪≫ + (F.mapComp' (hX₀.from (X i₂)).op.toLoc f₂.op.toLoc (hX₀.from Y).op.toLoc + --(by rw [← Quiver.Hom.comp_toLoc, ← op_comp, IsTerminal.comp_from]) + sorry).app A + iso_comp Y' Y g i₁ i₂ f₁ f₂ := by + sorry } map {A B} f := { hom i := (F.map _).map f - comm := sorry } + comm Y i₁ i₂ f₁ f₂ := by + dsimp + simp + sorry } end Pseudofunctor From 697aab712d8bcf23cda2650020ca4c032aad39e7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=ABl=20Riou?= Date: Sun, 9 Mar 2025 00:25:07 +0100 Subject: [PATCH 004/118] wip --- .../CategoryTheory/Sites/Descent/DescentData.lean | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/Mathlib/CategoryTheory/Sites/Descent/DescentData.lean b/Mathlib/CategoryTheory/Sites/Descent/DescentData.lean index 158a27972164e8..7aac4a894c5145 100644 --- a/Mathlib/CategoryTheory/Sites/Descent/DescentData.lean +++ b/Mathlib/CategoryTheory/Sites/Descent/DescentData.lean @@ -42,12 +42,12 @@ variable {C : Type u} [Category.{v} C] structure DescentData where obj (i : ι) : F.obj ⟨⟨X i⟩⟩ iso ⦃Y : C⦄ ⦃i₁ i₂ : ι⦄ (f₁ : Y ⟶ X i₁) (f₂ : Y ⟶ X i₂) : - (F.map ⟨f₁.op⟩).obj (obj i₁) ≅ (F.map ⟨f₂.op⟩).obj (obj i₂) + (F.map f₁.op.toLoc).obj (obj i₁) ≅ (F.map f₂.op.toLoc).obj (obj i₂) iso_comp ⦃Y' Y : C⦄ (g : Y' ⟶ Y) ⦃i₁ i₂ : ι⦄ (f₁ : Y ⟶ X i₁) (f₂ : Y ⟶ X i₂) : iso (g ≫ f₁) (g ≫ f₂) = - (F.mapComp ⟨f₁.op⟩ ⟨g.op⟩).app _ ≪≫ - Functor.mapIso (F.map ⟨g.op⟩) (iso f₁ f₂) ≪≫ - (F.mapComp ⟨f₂.op⟩ ⟨g.op⟩).symm.app _ + (F.mapComp f₁.op.toLoc g.op.toLoc).app _ ≪≫ + Functor.mapIso (F.map g.op.toLoc) (iso f₁ f₂) ≪≫ + (F.mapComp f₂.op.toLoc g.op.toLoc).symm.app _ iso_trans ⦃Y : C⦄ ⦃i₁ i₂ i₃ : ι⦄ (f₁ : Y ⟶ X i₁) (f₂ : Y ⟶ X i₂) (f₃ : Y ⟶ X i₃) : iso f₁ f₂ ≪≫ iso f₂ f₃ = iso f₁ f₃ := by aesop_cat @@ -59,8 +59,8 @@ variable {F X} structure Hom (D₁ D₂ : F.DescentData X) where hom (i : ι) : D₁.obj i ⟶ D₂.obj i comm ⦃Y : C⦄ ⦃i₁ i₂ : ι⦄ (f₁ : Y ⟶ X i₁) (f₂ : Y ⟶ X i₂) : - (F.map ⟨f₁.op⟩).map (hom i₁) ≫ (D₂.iso f₁ f₂).hom = - (D₁.iso f₁ f₂).hom ≫ (F.map ⟨f₂.op⟩).map (hom i₂) := by aesop_cat + (F.map f₁.op.toLoc).map (hom i₁) ≫ (D₂.iso f₁ f₂).hom = + (D₁.iso f₁ f₂).hom ≫ (F.map f₂.op.toLoc).map (hom i₂) := by aesop_cat attribute [reassoc (attr := simp)] Hom.comm From aa005ca000bb0177b1a32410ed1312fa03c98c7c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=ABl=20Riou?= Date: Wed, 23 Apr 2025 19:00:14 +0200 Subject: [PATCH 005/118] wip --- Mathlib/CategoryTheory/Sites/Descent/DescentData.lean | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/Mathlib/CategoryTheory/Sites/Descent/DescentData.lean b/Mathlib/CategoryTheory/Sites/Descent/DescentData.lean index 7aac4a894c5145..39a27da1b449ae 100644 --- a/Mathlib/CategoryTheory/Sites/Descent/DescentData.lean +++ b/Mathlib/CategoryTheory/Sites/Descent/DescentData.lean @@ -70,7 +70,6 @@ instance : Category (F.DescentData X) where comp {D₁ D₂ D₃} φ ψ := { hom i := φ.hom i ≫ ψ.hom i comm Y i₁ i₂ f₁ f₂ := by - dsimp simp only [Functor.map_comp, assoc] rw [ψ.comm, φ.comm_assoc] } @@ -82,11 +81,9 @@ def toDescentDataOfIsTerminal (X₀ : C) (hX₀ : IsTerminal X₀) : { obj i := (F.map (hX₀.from (X i)).op.toLoc).obj A iso Y i₁ i₂ f₁ f₂ := (F.mapComp' (hX₀.from (X i₁)).op.toLoc f₁.op.toLoc (hX₀.from Y).op.toLoc - --(by rw [← Quiver.Hom.comp_toLoc, ← op_comp, IsTerminal.comp_from]) - sorry).symm.app A ≪≫ + (by rw [← Quiver.Hom.comp_toLoc, ← op_comp, IsTerminal.comp_from])).symm.app A ≪≫ (F.mapComp' (hX₀.from (X i₂)).op.toLoc f₂.op.toLoc (hX₀.from Y).op.toLoc - --(by rw [← Quiver.Hom.comp_toLoc, ← op_comp, IsTerminal.comp_from]) - sorry).app A + (by rw [← Quiver.Hom.comp_toLoc, ← op_comp, IsTerminal.comp_from])).app A iso_comp Y' Y g i₁ i₂ f₁ f₂ := by sorry } map {A B} f := From 4660a438dcad0e6ee7a45c60255e4bfa5089e4d1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=ABl=20Riou?= Date: Wed, 23 Apr 2025 21:03:10 +0200 Subject: [PATCH 006/118] added comment --- Mathlib/CategoryTheory/Sites/Descent/DescentData.lean | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Mathlib/CategoryTheory/Sites/Descent/DescentData.lean b/Mathlib/CategoryTheory/Sites/Descent/DescentData.lean index 39a27da1b449ae..f33e51491b0ba2 100644 --- a/Mathlib/CategoryTheory/Sites/Descent/DescentData.lean +++ b/Mathlib/CategoryTheory/Sites/Descent/DescentData.lean @@ -35,6 +35,8 @@ lemma mapComp_rfl : F.mapComp' f g _ rfl = F.mapComp f g := rfl end +-- TODO: this will look slightly better after `LocallyDiscrete Cᵒᵖ` +-- is replaced by any bicategory satisfying `IsLocallyDiscrete`. variable {C : Type u} [Category.{v} C] (F : Pseudofunctor (LocallyDiscrete Cᵒᵖ) Cat.{v', u'}) {ι : Type w} (X : ι → C) @@ -85,6 +87,9 @@ def toDescentDataOfIsTerminal (X₀ : C) (hX₀ : IsTerminal X₀) : (F.mapComp' (hX₀.from (X i₂)).op.toLoc f₂.op.toLoc (hX₀.from Y).op.toLoc (by rw [← Quiver.Hom.comp_toLoc, ← op_comp, IsTerminal.comp_from])).app A iso_comp Y' Y g i₁ i₂ f₁ f₂ := by + ext + dsimp + simp only [Functor.map_comp, assoc] sorry } map {A B} f := { hom i := (F.map _).map f From 8949060bc774d38fd8d9688c417fdb1e0a6ccbf4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=ABl=20Riou?= Date: Thu, 24 Apr 2025 08:49:03 +0200 Subject: [PATCH 007/118] wip --- .../Sites/Descent/DescentData.lean | 66 +++++++++++-------- 1 file changed, 37 insertions(+), 29 deletions(-) diff --git a/Mathlib/CategoryTheory/Sites/Descent/DescentData.lean b/Mathlib/CategoryTheory/Sites/Descent/DescentData.lean index f33e51491b0ba2..5bec9057a93eb3 100644 --- a/Mathlib/CategoryTheory/Sites/Descent/DescentData.lean +++ b/Mathlib/CategoryTheory/Sites/Descent/DescentData.lean @@ -12,11 +12,11 @@ import Mathlib.CategoryTheory.Bicategory.LocallyDiscrete -/ -universe w v' u' v u +universe t w v' u' v u namespace CategoryTheory -open Category Limits +open Category Limits Bicategory namespace Pseudofunctor @@ -35,34 +35,48 @@ lemma mapComp_rfl : F.mapComp' f g _ rfl = F.mapComp f g := rfl end --- TODO: this will look slightly better after `LocallyDiscrete Cᵒᵖ` --- is replaced by any bicategory satisfying `IsLocallyDiscrete`. -variable {C : Type u} [Category.{v} C] - (F : Pseudofunctor (LocallyDiscrete Cᵒᵖ) Cat.{v', u'}) +variable {C : Type u} [Bicategory.{w, v} C] [IsLocallyDiscrete C] + (F : Pseudofunctor C Cat.{v', u'}) {ι : Type w} (X : ι → C) structure DescentData where - obj (i : ι) : F.obj ⟨⟨X i⟩⟩ - iso ⦃Y : C⦄ ⦃i₁ i₂ : ι⦄ (f₁ : Y ⟶ X i₁) (f₂ : Y ⟶ X i₂) : - (F.map f₁.op.toLoc).obj (obj i₁) ≅ (F.map f₂.op.toLoc).obj (obj i₂) - iso_comp ⦃Y' Y : C⦄ (g : Y' ⟶ Y) ⦃i₁ i₂ : ι⦄ (f₁ : Y ⟶ X i₁) (f₂ : Y ⟶ X i₂) : - iso (g ≫ f₁) (g ≫ f₂) = - (F.mapComp f₁.op.toLoc g.op.toLoc).app _ ≪≫ - Functor.mapIso (F.map g.op.toLoc) (iso f₁ f₂) ≪≫ - (F.mapComp f₂.op.toLoc g.op.toLoc).symm.app _ - iso_trans ⦃Y : C⦄ ⦃i₁ i₂ i₃ : ι⦄ (f₁ : Y ⟶ X i₁) (f₂ : Y ⟶ X i₂) (f₃ : Y ⟶ X i₃) : + obj (i : ι) : F.obj (X i) + iso ⦃Y : C⦄ ⦃i₁ i₂ : ι⦄ (f₁ : X i₁ ⟶ Y) (f₂ : X i₂ ⟶ Y) : + (F.map f₁).obj (obj i₁) ≅ (F.map f₂).obj (obj i₂) + iso_comp ⦃Y' Y : C⦄ (g : Y ⟶ Y') ⦃i₁ i₂ : ι⦄ (f₁ : X i₁ ⟶ Y) (f₂ : X i₂ ⟶ Y) : + iso (f₁ ≫ g) (f₂ ≫ g) = + (F.mapComp f₁ g).app _ ≪≫ + Functor.mapIso (F.map g) (iso f₁ f₂) ≪≫ + (F.mapComp f₂ g).symm.app _ := by aesop_cat + iso_trans ⦃Y : C⦄ ⦃i₁ i₂ i₃ : ι⦄ (f₁ : X i₁ ⟶ Y) (f₂ : X i₂ ⟶ Y) (f₃ : X i₃ ⟶ Y) : iso f₁ f₂ ≪≫ iso f₂ f₃ = iso f₁ f₃ := by aesop_cat namespace DescentData variable {F X} +def mk' (obj : ∀ i, F.obj (X i)) + (hom : ∀ ⦃Y : C⦄ ⦃i₁ i₂ : ι⦄ (f₁ : X i₁ ⟶ Y) (f₂ : X i₂ ⟶ Y), + (F.map f₁).obj (obj i₁) ⟶ (F.map f₂).obj (obj i₂)) + (hom_comp : ∀ ⦃Y' Y : C⦄ (g : Y ⟶ Y') ⦃i₁ i₂ : ι⦄ (f₁ : X i₁ ⟶ Y) (f₂ : X i₂ ⟶ Y), + hom (f₁ ≫ g) (f₂ ≫ g) = + (F.mapComp f₁ g).hom.app _ ≫ + (F.map g).map (hom f₁ f₂) ≫ + (F.mapComp f₂ g).inv.app _ := by aesop_cat) + (hom_self : ∀ ⦃Y : C⦄ ⦃i : ι⦄ (f : X i ⟶ Y), hom f f = 𝟙 _ := by aesop_cat) + (comp_hom : ∀ ⦃Y : C⦄ ⦃i₁ i₂ i₃ : ι⦄ (f₁ : X i₁ ⟶ Y) (f₂ : X i₂ ⟶ Y) (f₃ : X i₃ ⟶ Y), + hom f₁ f₂ ≫ hom f₂ f₃ = hom f₁ f₃ := by aesop_cat) : F.DescentData X where + obj := obj + iso Y i₁ i₂ f₁ f₂ := + { hom := hom f₁ f₂ + inv := hom f₂ f₁ } + @[ext] structure Hom (D₁ D₂ : F.DescentData X) where hom (i : ι) : D₁.obj i ⟶ D₂.obj i - comm ⦃Y : C⦄ ⦃i₁ i₂ : ι⦄ (f₁ : Y ⟶ X i₁) (f₂ : Y ⟶ X i₂) : - (F.map f₁.op.toLoc).map (hom i₁) ≫ (D₂.iso f₁ f₂).hom = - (D₁.iso f₁ f₂).hom ≫ (F.map f₂.op.toLoc).map (hom i₂) := by aesop_cat + comm ⦃Y : C⦄ ⦃i₁ i₂ : ι⦄ (f₁ : X i₁ ⟶ Y) (f₂ : X i₂ ⟶ Y) : + (F.map f₁).map (hom i₁) ≫ (D₂.iso f₁ f₂).hom = + (D₁.iso f₁ f₂).hom ≫ (F.map f₂).map (hom i₂) := by aesop_cat attribute [reassoc (attr := simp)] Hom.comm @@ -77,25 +91,19 @@ instance : Category (F.DescentData X) where end DescentData -def toDescentDataOfIsTerminal (X₀ : C) (hX₀ : IsTerminal X₀) : - F.obj ⟨⟨X₀⟩⟩ ⥤ F.DescentData X where +def toDescentDataOfIsTerminal (X₀ : C) (hX₀ : IsInitial X₀) : + F.obj X₀ ⥤ F.DescentData X where obj A := - { obj i := (F.map (hX₀.from (X i)).op.toLoc).obj A + { obj i := (F.map (hX₀.to (X i))).obj A iso Y i₁ i₂ f₁ f₂ := - (F.mapComp' (hX₀.from (X i₁)).op.toLoc f₁.op.toLoc (hX₀.from Y).op.toLoc - (by rw [← Quiver.Hom.comp_toLoc, ← op_comp, IsTerminal.comp_from])).symm.app A ≪≫ - (F.mapComp' (hX₀.from (X i₂)).op.toLoc f₂.op.toLoc (hX₀.from Y).op.toLoc - (by rw [← Quiver.Hom.comp_toLoc, ← op_comp, IsTerminal.comp_from])).app A + (F.mapComp' (hX₀.to (X i₁)) f₁ (hX₀.to Y) (by simp)).symm.app A ≪≫ + (F.mapComp' (hX₀.to (X i₂)) f₂ (hX₀.to Y) (by simp)).app A iso_comp Y' Y g i₁ i₂ f₁ f₂ := by - ext - dsimp - simp only [Functor.map_comp, assoc] sorry } map {A B} f := { hom i := (F.map _).map f comm Y i₁ i₂ f₁ f₂ := by dsimp - simp sorry } end Pseudofunctor From b7ca3b15e72e639b787a52c117f2a086ac4fdbd3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=ABl=20Riou?= Date: Thu, 24 Apr 2025 09:54:22 +0200 Subject: [PATCH 008/118] fix --- Mathlib.lean | 2 +- .../Bicategory/{ => Adjunction}/Adj.lean | 14 ++++++++++---- 2 files changed, 11 insertions(+), 5 deletions(-) rename Mathlib/CategoryTheory/Bicategory/{ => Adjunction}/Adj.lean (95%) diff --git a/Mathlib.lean b/Mathlib.lean index 1da682c66ed6af..7268a4f7339e0d 100644 --- a/Mathlib.lean +++ b/Mathlib.lean @@ -1863,7 +1863,7 @@ import Mathlib.CategoryTheory.Adjunction.Triple import Mathlib.CategoryTheory.Adjunction.Unique import Mathlib.CategoryTheory.Adjunction.Whiskering import Mathlib.CategoryTheory.Balanced -import Mathlib.CategoryTheory.Bicategory.Adj +import Mathlib.CategoryTheory.Bicategory.Adjunction.Adj import Mathlib.CategoryTheory.Bicategory.Adjunction.Basic import Mathlib.CategoryTheory.Bicategory.Adjunction.Mate import Mathlib.CategoryTheory.Bicategory.Basic diff --git a/Mathlib/CategoryTheory/Bicategory/Adj.lean b/Mathlib/CategoryTheory/Bicategory/Adjunction/Adj.lean similarity index 95% rename from Mathlib/CategoryTheory/Bicategory/Adj.lean rename to Mathlib/CategoryTheory/Bicategory/Adjunction/Adj.lean index d4a475eb8f1637..25cfca6f764d7c 100644 --- a/Mathlib/CategoryTheory/Bicategory/Adj.lean +++ b/Mathlib/CategoryTheory/Bicategory/Adjunction/Adj.lean @@ -4,7 +4,7 @@ Released under Apache 2.0 license as described in the file LICENSE. Authors: Joël Riou -/ -import Mathlib.CategoryTheory.Bicategory.Adjunction +import Mathlib.CategoryTheory.Bicategory.Adjunction.Basic /-! # The bicategory of adjunctions in a bicategory @@ -59,10 +59,16 @@ structure Hom where /-- the adjunction -/ adj : f ⊣ g +variable {a b} in +def Hom.mk' {f : a ⟶ b} {g : b ⟶ a} (adj : f ⊣ g) : Hom a b where + f := f + g := g + adj := adj + instance : CategoryStruct (Adj B) where Hom (a : B) b := Hom a b - id (a : B) := { adj := Adjunction.id a } - comp f g := { adj := f.adj.comp g.adj } + id (a : B) := .mk' (Adjunction.id a) + comp f g := .mk' (f.adj.comp g.adj) @[simp] lemma id_f (a : Adj B) : Hom.f (𝟙 a) = 𝟙 _ := rfl @[simp] lemma id_g (a : Adj B) : Hom.g (𝟙 a) = 𝟙 _ := rfl @@ -106,7 +112,7 @@ instance : CategoryStruct (a ⟶ b) where @[ext] lemma hom₂_ext {α β : a ⟶ b} {x y : α ⟶ β} (hf : x.τf = y.τf) : x = y := by - apply Hom₂.ext _ _ hf + apply Hom₂.ext hf rw [← x.hom₂Equiv_τf, ← y.hom₂Equiv_τf, hf] @[simp] lemma id_τf (α : a ⟶ b) : Hom₂.τf (𝟙 α) = 𝟙 α.f := rfl From c6d463ea05990ad952ce582b9023661a2700e685 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=ABl=20Riou?= Date: Thu, 24 Apr 2025 10:17:17 +0200 Subject: [PATCH 009/118] wip --- .../Bicategory/Adjunction/Adj.lean | 54 +++++++++---------- 1 file changed, 27 insertions(+), 27 deletions(-) diff --git a/Mathlib/CategoryTheory/Bicategory/Adjunction/Adj.lean b/Mathlib/CategoryTheory/Bicategory/Adjunction/Adj.lean index 25cfca6f764d7c..569c1a82f7b876 100644 --- a/Mathlib/CategoryTheory/Bicategory/Adjunction/Adj.lean +++ b/Mathlib/CategoryTheory/Bicategory/Adjunction/Adj.lean @@ -3,8 +3,7 @@ Copyright (c) 2024 Joël Riou. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: Joël Riou -/ - -import Mathlib.CategoryTheory.Bicategory.Adjunction.Basic +import Mathlib.CategoryTheory.Bicategory.Adjunction.Mate /-! # The bicategory of adjunctions in a bicategory @@ -45,6 +44,8 @@ namespace Adj variable {B} +abbrev obj (a : Adj B) : B := a + variable (a b c d : B) /-- @@ -70,25 +71,15 @@ instance : CategoryStruct (Adj B) where id (a : B) := .mk' (Adjunction.id a) comp f g := .mk' (f.adj.comp g.adj) -@[simp] lemma id_f (a : Adj B) : Hom.f (𝟙 a) = 𝟙 _ := rfl -@[simp] lemma id_g (a : Adj B) : Hom.g (𝟙 a) = 𝟙 _ := rfl +@[simp] lemma id_f (a : Adj B) : Hom.f (𝟙 a) = 𝟙 a.obj := rfl +@[simp] lemma id_g (a : Adj B) : Hom.g (𝟙 a) = 𝟙 a.obj := rfl +@[simp] lemma id_adj (a : Adj B) : Hom.adj (𝟙 a) = Adjunction.id a.obj := rfl variable {a b c d : Adj B} @[simp] lemma comp_f (α : a ⟶ b) (β : b ⟶ c) : (α ≫ β).f = α.f ≫ β.f := rfl @[simp] lemma comp_g (α : a ⟶ b) (β : b ⟶ c) : (α ≫ β).g = β.g ≫ α.g := rfl - -/-- -Given two adjunctions `α` and `β` between two objects in a bicategory, the data -of a morphism between the left adjoints is equivalent to the data of a morphism -in the other direction between the right adjoints. --/ -@[simps] -def hom₂Equiv (α β : a ⟶ b) : (α.f ⟶ β.f) ≃ (β.g ⟶ α.g) where - toFun τ := 𝟙 _ ⊗≫ β.g ◁ α.adj.unit ≫ β.g ◁ (τ ▷ α.g) ⊗≫ (β.adj.counit ▷ α.g) ⊗≫ 𝟙 _ - invFun τ' := 𝟙 _ ⊗≫ β.adj.unit ▷ α.f ≫ (β.f ◁ τ') ▷ α.f ⊗≫ β.f ◁ α.adj.counit ⊗≫ 𝟙 _ - left_inv := sorry - right_inv := sorry +@[simp] lemma comp_adj (α : a ⟶ b) (β : b ⟶ c) : (α ≫ β).adj = α.adj.comp β.adj := rfl /-- A morphism between two adjunctions consists of a tuple of mate maps. -/ @[ext] @@ -97,23 +88,27 @@ structure Hom₂ (α β : a ⟶ b) where τf : α.f ⟶ β.f /-- the morphism in the opposite direction between right adjoints -/ τg : β.g ⟶ α.g - hom₂Equiv_τf : hom₂Equiv α β τf = τg + conjugateEquiv_τf : conjugateEquiv β.adj α.adj τf = τg := by aesop_cat + +lemma Hom₂.conjugateEquiv_symm_τg {α β : a ⟶ b} (p : Hom₂ α β) : + (conjugateEquiv β.adj α.adj).symm p.τg = p.τf := by + rw [← Hom₂.conjugateEquiv_τf, Equiv.symm_apply_apply] instance : CategoryStruct (a ⟶ b) where Hom α β := Hom₂ α β id α := { τf := 𝟙 _ - τg := 𝟙 _ - hom₂Equiv_τf := sorry } - comp x y := + τg := 𝟙 _ } + comp {a b c} x y := { τf := x.τf ≫ y.τf τg := y.τg ≫ x.τg - hom₂Equiv_τf := sorry } + conjugateEquiv_τf := by simp [← conjugateEquiv_comp c.adj b.adj a.adj y.τf x.τf, + Hom₂.conjugateEquiv_τf] } @[ext] lemma hom₂_ext {α β : a ⟶ b} {x y : α ⟶ β} (hf : x.τf = y.τf) : x = y := by apply Hom₂.ext hf - rw [← x.hom₂Equiv_τf, ← y.hom₂Equiv_τf, hf] + simp only [← Hom₂.conjugateEquiv_τf, hf] @[simp] lemma id_τf (α : a ⟶ b) : Hom₂.τf (𝟙 α) = 𝟙 α.f := rfl @[simp] lemma id_τg (α : a ⟶ b) : Hom₂.τg (𝟙 α) = 𝟙 α.g := rfl @@ -131,16 +126,17 @@ instance : Category (a ⟶ b) where /-- Constructor for isomorphisms between 1-morphisms in the bicategory `Adj B`. -/ @[simps] -def iso₂Mk {α β : a ⟶ b} (ef : α.f ≅ β.f) (eg : β.g ≅ α.g) (h : hom₂Equiv α β ef.hom = eg.hom) : +def iso₂Mk {α β : a ⟶ b} (ef : α.f ≅ β.f) (eg : β.g ≅ α.g) + (h : conjugateEquiv β.adj α.adj ef.hom = eg.hom) : α ≅ β where hom := { τf := ef.hom τg := eg.hom - hom₂Equiv_τf := h } + conjugateEquiv_τf := h } inv := { τf := ef.inv τg := eg.inv - hom₂Equiv_τf := sorry } + conjugateEquiv_τf := sorry } /-- The associator in the bicategory `Adj B`. -/ @[simps!] @@ -162,14 +158,18 @@ def rightUnitor (α : a ⟶ b) : α ≫ 𝟙 b ≅ α := def whiskerLeft (α : a ⟶ b) {β β' : b ⟶ c} (y : β ⟶ β') : α ≫ β ⟶ α ≫ β' where τf := _ ◁ y.τf τg := y.τg ▷ _ - hom₂Equiv_τf := sorry + conjugateEquiv_τf := by + dsimp + rw [← iterated_mateEquiv_conjugateEquiv] + rw [← Hom₂.conjugateEquiv_τf] + sorry /-- The right whiskering in the bicategory `Adj B`. -/ @[simps] def whiskerRight {α α' : a ⟶ b} (x : α ⟶ α') (β : b ⟶ c) : α ≫ β ⟶ α' ≫ β where τf := x.τf ▷ _ τg := _ ◁ x.τg - hom₂Equiv_τf := sorry + conjugateEquiv_τf := sorry attribute [local simp] whisker_exchange From e60f1f87ea6d5cc05c3670ce68e44a7b2f129b25 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=ABl=20Riou?= Date: Thu, 24 Apr 2025 10:28:11 +0200 Subject: [PATCH 010/118] forget --- Mathlib/CategoryTheory/Bicategory/Adjunction/Adj.lean | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/Mathlib/CategoryTheory/Bicategory/Adjunction/Adj.lean b/Mathlib/CategoryTheory/Bicategory/Adjunction/Adj.lean index 569c1a82f7b876..d12167fc17b212 100644 --- a/Mathlib/CategoryTheory/Bicategory/Adjunction/Adj.lean +++ b/Mathlib/CategoryTheory/Bicategory/Adjunction/Adj.lean @@ -4,6 +4,7 @@ Released under Apache 2.0 license as described in the file LICENSE. Authors: Joël Riou -/ import Mathlib.CategoryTheory.Bicategory.Adjunction.Mate +import Mathlib.CategoryTheory.Bicategory.Functor.Pseudofunctor /-! # The bicategory of adjunctions in a bicategory @@ -180,6 +181,14 @@ instance : Bicategory (Adj B) where leftUnitor := leftUnitor rightUnitor := rightUnitor +-- this forgets the right adjoints +def forget₁ : Pseudofunctor (Adj B) B where + obj a := a.obj + map x := x.f + map₂ α := α.τf + mapId _ := Iso.refl _ + mapComp _ _ := Iso.refl _ + end Adj end Bicategory From 7a563abec24c44b7bafd4fb8d3be50410c42e159 Mon Sep 17 00:00:00 2001 From: Christian Merten Date: Thu, 24 Apr 2025 17:50:19 +0200 Subject: [PATCH 011/118] mk'' constructor --- .../Sites/Descent/DescentData.lean | 165 +++++++++++++++++- 1 file changed, 164 insertions(+), 1 deletion(-) diff --git a/Mathlib/CategoryTheory/Sites/Descent/DescentData.lean b/Mathlib/CategoryTheory/Sites/Descent/DescentData.lean index 5bec9057a93eb3..f7f33bd11d0086 100644 --- a/Mathlib/CategoryTheory/Sites/Descent/DescentData.lean +++ b/Mathlib/CategoryTheory/Sites/Descent/DescentData.lean @@ -4,6 +4,7 @@ Released under Apache 2.0 license as described in the file LICENSE. Authors: Joël Riou -/ import Mathlib.CategoryTheory.Sites.Grothendieck +import Mathlib.CategoryTheory.Limits.Shapes.Pullback.CommSq import Mathlib.CategoryTheory.Bicategory.Functor.Pseudofunctor import Mathlib.CategoryTheory.Bicategory.LocallyDiscrete @@ -24,7 +25,7 @@ section variable {B C : Type*} [Bicategory B] [Bicategory C] (F : Pseudofunctor B C) - {a b c : B} (f : a ⟶ b) (g : b ⟶ c) (fg : a ⟶ c) (hfg : f ≫ g = fg) + {a b c : B} (f : a ⟶ b) (g : b ⟶ c) (fg : a ⟶ c) (hfg : f ≫ g = fg := by aesop_cat) def mapComp' : F.map fg ≅ F.map f ≫ F.map g := by subst hfg @@ -33,6 +34,80 @@ def mapComp' : F.map fg ≅ F.map f ≫ F.map g := by @[simp] lemma mapComp_rfl : F.mapComp' f g _ rfl = F.mapComp f g := rfl +lemma mapComp'_def (hfg : f ≫ g = fg) : F.mapComp' f g fg hfg = + eqToIso (by rw [hfg]) ≪≫ F.mapComp f g := by + subst hfg + simp + +lemma mapComp_comp_mapComp {a b c d : B} + (f : a ⟶ b) (g : b ⟶ c) (h : c ⟶ d) : + (F.mapComp (f ≫ g) h).hom ≫ (F.mapComp f g).hom ▷ F.map h = + F.map₂ (α_ _ _ _).hom ≫ (F.mapComp f (g ≫ h)).hom ≫ F.map f ◁ (F.mapComp g h).hom ≫ + (α_ _ _ _).inv := by + simp + +set_option linter.unusedTactic false + +section + +variable {a b c d : B} [IsLocallyDiscrete B] + (f : a ⟶ b) (g : b ⟶ c) (h : c ⟶ d) + (fg : a ⟶ c) (gh : b ⟶ d) (fgh : a ⟶ d) + (hfg : f ≫ g = fg) (hgh : g ≫ h = gh) (hfgh : f ≫ g ≫ h = fgh) + +@[reassoc] +lemma map₂_mapComp_hom_eq_mapComp'_hom + (f : a ⟶ b) (g : b ⟶ c) (h : c ⟶ d) : + F.map₂ (α_ f g h).hom ≫ (F.mapComp f (g ≫ h)).hom = + (F.mapComp' f (g ≫ h) ((f ≫ g) ≫ h)).hom := by + simp_rw [mapComp'_def] + simp [Subsingleton.elim ((α_ f g h).hom) (eqToHom (by simp))] + +@[reassoc] +lemma mapComp'_hom_comp_mapComp'_hom : + (F.mapComp' fg h fgh).hom ≫ (F.mapComp' f g fg hfg).hom ▷ F.map h = + (F.mapComp' f gh fgh).hom ≫ F.map f ◁ (F.mapComp' g h gh hgh).hom ≫ + (α_ _ _ _).inv := by + subst hfg hgh + obtain rfl : (f ≫ g) ≫ h = fgh := by aesop_cat + simp_rw [mapComp_rfl, mapComp_comp_mapComp] + simp [← map₂_mapComp_hom_eq_mapComp'_hom_assoc] + +@[reassoc] +lemma mapComp'_hom_of_comp_eq : + (F.mapComp' f gh fgh).hom = + (F.mapComp' fg h fgh).hom ≫ (F.mapComp' f g fg hfg).hom ▷ F.map h ≫ + (α_ _ _ _).hom ≫ F.map f ◁ (F.mapComp' g h gh hgh).inv := by + rw [F.mapComp'_hom_comp_mapComp'_hom_assoc f g h fg gh fgh hfg hgh hfgh] + simp + +@[reassoc] +lemma whiskerLeft_mapComp'_inv_comp_mapComp'_inv : + F.map f ◁ (F.mapComp' g h gh hgh).inv ≫ (F.mapComp' f gh fgh).inv = + (α_ _ _ _).inv ≫ (F.mapComp' f g fg hfg).inv ▷ F.map h ≫ + (F.mapComp' fg h fgh).inv := by + simp [← cancel_epi (F.map f ◁ (F.mapComp' g h gh hgh).hom), + ← cancel_epi (F.mapComp' f gh fgh).hom, + ← mapComp'_hom_comp_mapComp'_hom_assoc _ f g h fg gh fgh hfg hgh hfgh] + +@[reassoc] +lemma whiskerRight_mapComp'_inv_comp_mapComp'_inv : + (F.mapComp' f g fg hfg).inv ▷ F.map h ≫ (F.mapComp' fg h fgh).inv = + (α_ _ _ _).hom ≫ F.map f ◁ (F.mapComp' g h gh hgh).inv ≫ (F.mapComp' f gh fgh).inv + := by + sorry + +@[reassoc] +lemma mapComp'_inv_of_comp_eq : + (F.mapComp' f gh fgh).inv = + F.map f ◁ (F.mapComp' g h gh hgh).hom ≫ (α_ _ _ _).inv ≫ + (F.mapComp' f g fg hfg).inv ▷ F.map h ≫ + (F.mapComp' fg h fgh).inv := by + sorry + + +end + end variable {C : Type u} [Bicategory.{w, v} C] [IsLocallyDiscrete C] @@ -71,6 +146,94 @@ def mk' (obj : ∀ i, F.obj (X i)) { hom := hom f₁ f₂ inv := hom f₂ f₁ } +section Unique + +variable (X : C) + +set_option maxHeartbeats 0 in +def mk'' (obj : F.obj X) (c : BinaryCofan X X) + (hc : IsColimit c) (map : c.pt ⟶ X) + (heq : map = hc.desc (BinaryCofan.mk (𝟙 _) (𝟙 _))) + {Z : C} {ι₁₂ ι₂₃ : c.pt ⟶ Z} + (h : IsPushout c.inl c.inr ι₂₃ ι₁₂) + (p₁ p₂ p₃ : X ⟶ Z) + (hp₁ : c.inl ≫ ι₁₂ = p₁) + (hp₂ : c.inr ≫ ι₁₂ = p₂) + (hp₃ : c.inr ≫ ι₂₃ = p₃) + (hom : (F.map c.inl).obj obj ⟶ (F.map c.inr).obj obj) + (hom_self : (F.map map).map hom = + (F.mapComp' c.inl map (𝟙 _) (by aesop_cat)).inv.app obj ≫ + (F.mapComp' c.inr map (𝟙 _) (by aesop_cat)).hom.app obj) : + F.DescentData (fun _ : PUnit ↦ X) := by + refine mk' (fun _ ↦ obj) (fun Y _ _ f₁ f₂ ↦ ?_) ?_ ?_ ?_ + · let p : c.pt ⟶ Y := hc.desc <| BinaryCofan.mk f₁ f₂ + exact (F.mapComp' c.inl p f₁ (by aesop_cat)).hom.app obj ≫ (F.map p).map hom ≫ + (F.mapComp' c.inr p f₂ (by aesop_cat)).inv.app obj + · intro Y Y' g _ _ f₁ f₂ + simp only [pair_obj_left, Functor.const_obj_obj, Cat.comp_obj, + pair_obj_right, Functor.map_comp, assoc] + simp_rw [← mapComp_rfl] + have := F.mapComp'_hom_comp_mapComp'_hom + c.inl (hc.desc (BinaryCofan.mk f₁ f₂)) g f₁ + (hc.desc (BinaryCofan.mk (f₁ ≫ g) (f₂ ≫ g))) + (f₁ ≫ g) (by simp) (by apply BinaryCofan.IsColimit.hom_ext hc <;> simp) (by simp) + have := congr($(this).app obj) + dsimp + dsimp at this + rw [← mapComp_rfl] + erw [reassoc_of% this] + congr 1 + rw [← mapComp_rfl] + have := F.whiskerRight_mapComp'_inv_comp_mapComp'_inv + c.inr (hc.desc (BinaryCofan.mk f₁ f₂)) g f₂ + (hc.desc (BinaryCofan.mk (f₁ ≫ g) (f₂ ≫ g))) + (f₂ ≫ g) (by simp) (by apply BinaryCofan.IsColimit.hom_ext hc <;> simp) (by simp) + have := congr($(this).app obj) + dsimp at this + erw [this] + simp only [← Category.assoc] + congr 1 + simp only [Category.assoc] + have := NatIso.naturality_2 (F.mapComp' (hc.desc (BinaryCofan.mk f₁ f₂)) g + (hc.desc (BinaryCofan.mk (f₁ ≫ g) (f₂ ≫ g))) + (by apply BinaryCofan.IsColimit.hom_ext hc <;> simp)) hom + dsimp at this + rw [← this] + congr 1 + simp_rw [← Category.assoc] + congr 1 + simp [Cat.associator_hom_app, Cat.associator_inv_app] + · intro Y _ f + dsimp + have hfac : hc.desc (BinaryCofan.mk f f) = map ≫ f := by + rw [heq] + apply BinaryCofan.IsColimit.hom_ext hc <;> simp + have homself' := (F.map f).congr_map hom_self + dsimp at homself' + have := F.mapComp'_hom_of_comp_eq c.inl map f (𝟙 X) + (hc.desc (BinaryCofan.mk f f)) f (by aesop_cat) (by aesop_cat) (by aesop_cat) + have h1 := congr($(this).app obj) + clear this + dsimp at h1 + have := F.mapComp'_inv_of_comp_eq c.inr map f (𝟙 X) + (hc.desc (BinaryCofan.mk f f)) f (by aesop_cat) (by aesop_cat) (by aesop_cat) + have h2 := congr($(this).app obj) + clear this + dsimp at h2 + rw [h1, h2] + simp only [NatTrans.naturality_assoc, Cat.comp_obj, Cat.comp_map, assoc, + Iso.inv_hom_id_app_assoc] + rw [homself'] + simp only [Cat.associator_hom_app, Cat.comp_obj, eqToHom_refl, Functor.map_comp, + Cat.associator_inv_app, id_comp, assoc] + simp_rw [← Functor.map_comp_assoc] + simp + · intro Y _ _ _ f₁ f₂ f₃ + dsimp + sorry + +end Unique + @[ext] structure Hom (D₁ D₂ : F.DescentData X) where hom (i : ι) : D₁.obj i ⟶ D₂.obj i From 4913881178543b88146fe7927574b19abe89e2a9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=ABl=20Riou?= Date: Sat, 26 Apr 2025 10:18:43 +0200 Subject: [PATCH 012/118] feat(CategoryTheory): pseudofunctors from strict bicategories --- Mathlib.lean | 1 + .../Bicategory/Functor/Strict.lean | 178 ++++++++++++++++++ 2 files changed, 179 insertions(+) create mode 100644 Mathlib/CategoryTheory/Bicategory/Functor/Strict.lean diff --git a/Mathlib.lean b/Mathlib.lean index 061dff6af6a76e..bf8d5d252aba5f 100644 --- a/Mathlib.lean +++ b/Mathlib.lean @@ -1876,6 +1876,7 @@ import Mathlib.CategoryTheory.Bicategory.Functor.LocallyDiscrete import Mathlib.CategoryTheory.Bicategory.Functor.Oplax import Mathlib.CategoryTheory.Bicategory.Functor.Prelax import Mathlib.CategoryTheory.Bicategory.Functor.Pseudofunctor +import Mathlib.CategoryTheory.Bicategory.Functor.Strict import Mathlib.CategoryTheory.Bicategory.FunctorBicategory.Oplax import Mathlib.CategoryTheory.Bicategory.Grothendieck import Mathlib.CategoryTheory.Bicategory.Kan.Adjunction diff --git a/Mathlib/CategoryTheory/Bicategory/Functor/Strict.lean b/Mathlib/CategoryTheory/Bicategory/Functor/Strict.lean new file mode 100644 index 00000000000000..dcd9faafb5e856 --- /dev/null +++ b/Mathlib/CategoryTheory/Bicategory/Functor/Strict.lean @@ -0,0 +1,178 @@ +/- +Copyright (c) 2025 Joël Riou. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Joël Riou, Christian Merten +-/ +import Mathlib.CategoryTheory.Bicategory.Functor.Pseudofunctor +import Mathlib.CategoryTheory.CommSq + +/-! +# Pseudofunctors from strict bicategory + +This file provides an API for pseudofunctors `F` from a strict bicategory `B`. In +particular, this shall apply to pseudofunctors from locally discrete bicategories. + +We first introduce more flexible variants of `mapId` and `mapComp`: for example, +if `f` and `g` are composable morphisms and `fg` is such that `h : fg = f ≫ f`, +we provide an isomorphism `F.mapComp' f g fg h : F.map fg ≅ F.map f ≫ F.map g`. +We study the compatibilities of these isomorphisms with respect to composition +with identities and associativity. + +Secondly, given a commutative square `t ≫ r = l ≫ b` in `B`, we construct an +isomorphism `F.map t ≫ F.map r ≅ F.map l ≫ F.map b` +(see `Pseudofunctor.isoMapOfCommSq`). + +-/ + +namespace CategoryTheory + +open Bicategory + +namespace Pseudofunctor + +variable {B C : Type*} [Bicategory B] [Bicategory C] (F : Pseudofunctor B C) + +/-- More flexible variant of `mapId`. -/ +def mapId' {b : B} (f : b ⟶ b) (hf : f = 𝟙 b) : + F.map f ≅ 𝟙 _ := + F.map₂Iso (eqToIso (by rw [hf])) ≪≫ F.mapId _ + +lemma mapId'_eq_mapId (b : B) : + F.mapId' (𝟙 b) rfl = F.mapId b := by + simp [mapId'] + +/-- More flexible variant of `mapComp`. -/ +def mapComp' {b₀ b₁ b₂ : B} (f : b₀ ⟶ b₁) (g : b₁ ⟶ b₂) (fg : b₀ ⟶ b₂) (h : fg = f ≫ g) : + F.map fg ≅ F.map f ≫ F.map g := + F.map₂Iso (eqToIso (by rw [h])) ≪≫ F.mapComp f g + +lemma mapComp'_def {b₀ b₁ b₂ : B} (f : b₀ ⟶ b₁) (g : b₁ ⟶ b₂) (fg : b₀ ⟶ b₂) (h : fg = f ≫ g) : + F.mapComp' f g fg h = F.map₂Iso (eqToIso (by rw [h])) ≪≫ F.mapComp f g := rfl + +lemma mapComp'_eq_mapComp {b₀ b₁ b₂ : B} (f : b₀ ⟶ b₁) (g : b₁ ⟶ b₂) : + F.mapComp' f g _ rfl = F.mapComp f g := by + simp [mapComp'_def] + +variable [Strict B] + +lemma mapComp'_comp_id {b₀ b₁ : B} (f : b₀ ⟶ b₁) : + F.mapComp' f (𝟙 b₁) f (by nth_rw 1 [← Category.comp_id f]) = + (ρ_ _).symm ≪≫ whiskerLeftIso _ (F.mapId b₁).symm := by + ext + rw [mapComp'_def] + dsimp + rw [F.mapComp_id_right_hom f, Strict.rightUnitor_eqToIso, eqToIso.hom, + ← F.map₂_comp_assoc, eqToHom_trans, eqToHom_refl, PrelaxFunctor.map₂_id, + Category.id_comp] + +lemma mapComp'_id_comp {b₀ b₁ : B} (f : b₀ ⟶ b₁) : + F.mapComp' (𝟙 b₀) f f (by nth_rw 1 [← Category.id_comp f]) = + (λ_ _).symm ≪≫ whiskerRightIso (F.mapId b₀).symm _ := by + ext + rw [mapComp'_def] + dsimp + rw [F.mapComp_id_left_hom f, Strict.leftUnitor_eqToIso, eqToIso.hom, + ← F.map₂_comp_assoc, eqToHom_trans, eqToHom_refl, PrelaxFunctor.map₂_id, + Category.id_comp] + +section associativity + +variable {b₀ b₁ b₂ b₃ : B} (f₀₁ : b₀ ⟶ b₁) + (f₁₂ : b₁ ⟶ b₂) (f₂₃ : b₂ ⟶ b₃) (f₀₂ : b₀ ⟶ b₂) (f₁₃ : b₁ ⟶ b₃) (f : b₀ ⟶ b₃) + (h₀₂ : f₀₂ = f₀₁ ≫ f₁₂) (h₁₃ : f₁₃ = f₁₂ ≫ f₂₃) + (hf : f = f₀₁ ≫ f₁₃) + +@[reassoc] +lemma mapComp'_hom_comp_whiskerLeft_mapComp'_hom : + (F.mapComp' f₀₁ f₁₃ f hf).hom ≫ F.map f₀₁ ◁ (F.mapComp' f₁₂ f₂₃ f₁₃ h₁₃).hom = + (F.mapComp' f₀₂ f₂₃ f (by rw [hf, h₀₂, h₁₃, Category.assoc])).hom ≫ + (F.mapComp' f₀₁ f₁₂ f₀₂ h₀₂).hom ▷ F.map f₂₃ ≫ (α_ _ _ _).hom := by + subst h₀₂ h₁₃ hf + simp [mapComp_assoc_right_hom, Strict.associator_eqToIso, mapComp'] + +@[reassoc] +lemma mapComp'_inv_comp_mapComp'_hom : + (F.mapComp' f₀₁ f₁₃ f hf).inv ≫ + (F.mapComp' f₀₂ f₂₃ f (by rw [hf, h₀₂, h₁₃, Category.assoc])).hom = + F.map f₀₁ ◁ (F.mapComp' f₁₂ f₂₃ f₁₃ h₁₃).hom ≫ + (α_ _ _ _).inv ≫ (F.mapComp' f₀₁ f₁₂ f₀₂ h₀₂).inv ▷ F.map f₂₃ := by + rw [← cancel_epi (F.mapComp' f₀₁ f₁₃ f hf).hom, Iso.hom_inv_id_assoc, + F.mapComp'_hom_comp_whiskerLeft_mapComp'_hom_assoc _ _ _ _ _ _ h₀₂ h₁₃ hf] + simp + +@[reassoc] +lemma mapComp'_hom_comp_whiskerRight_mapComp'_hom : + (F.mapComp' f₀₂ f₂₃ f (by rw [hf, h₀₂, h₁₃, Category.assoc])).hom ≫ + (F.mapComp' f₀₁ f₁₂ f₀₂ h₀₂).hom ▷ F.map f₂₃ = + (F.mapComp' f₀₁ f₁₃ f hf).hom ≫ F.map f₀₁ ◁ (F.mapComp' f₁₂ f₂₃ f₁₃ h₁₃).hom ≫ + (α_ _ _ _).inv := by + rw [F.mapComp'_hom_comp_whiskerLeft_mapComp'_hom_assoc _ _ _ _ _ _ h₀₂ h₁₃ hf] + simp + +@[reassoc] +lemma whiskerLeft_mapComp'_inv_comp_mapComp'_inv : + F.map f₀₁ ◁ (F.mapComp' f₁₂ f₂₃ f₁₃ h₁₃).inv ≫ (F.mapComp' f₀₁ f₁₃ f hf).inv = + (α_ _ _ _).inv ≫ (F.mapComp' f₀₁ f₁₂ f₀₂ h₀₂).inv ▷ F.map f₂₃ ≫ + (F.mapComp' f₀₂ f₂₃ f (by rw [hf, h₀₂, h₁₃, Category.assoc])).inv := by + simp [← cancel_mono (F.mapComp' f₀₂ f₂₃ f (by rw [hf, h₀₂, h₁₃, Category.assoc])).hom, + F.mapComp'_inv_comp_mapComp'_hom _ _ _ _ _ _ h₀₂ h₁₃ hf] + +@[reassoc] +lemma whiskerRight_mapComp'_inv_comp_mapComp'_inv : + (F.mapComp' f₀₁ f₁₂ f₀₂ h₀₂).inv ▷ F.map f₂₃ ≫ + (F.mapComp' f₀₂ f₂₃ f (by rw [hf, h₀₂, h₁₃, Category.assoc])).inv = + (α_ _ _ _).hom ≫ F.map f₀₁ ◁ (F.mapComp' f₁₂ f₂₃ f₁₃ h₁₃).inv ≫ + (F.mapComp' f₀₁ f₁₃ f hf).inv := by + rw [whiskerLeft_mapComp'_inv_comp_mapComp'_inv _ _ _ _ _ _ _ h₀₂ h₁₃ hf, + Iso.hom_inv_id_assoc] + +end associativity + +section CommSq + +variable {X₁ X₂ Y₁ Y₂ Z₁ Z₂ : B} + +section + +variable {t : X₁ ⟶ Y₁} {l : X₁ ⟶ X₂} {r : Y₁ ⟶ Y₂} {b : X₂ ⟶ Y₂} (sq : CommSq t l r b) + +/-- Given a commutative square `CommSq t l r b` in a strict bicategory `B` and +a pseudofunctor from `B`, this is the natural isomorphism +`F.map t ≫ F.map r ≅ F.map l ≫ F.map b`. -/ +def isoMapOfCommSq : F.map t ≫ F.map r ≅ F.map l ≫ F.map b := + (F.mapComp t r).symm ≪≫ F.mapComp' _ _ _ (by rw [sq.w]) + +lemma isoMapOfCommSq_eq (φ : X₁ ⟶ Y₂) (hφ : t ≫ r = φ) : + F.isoMapOfCommSq sq = + (F.mapComp' t r φ (by rw [hφ])).symm ≪≫ + F.mapComp' l b φ (by rw [← hφ, sq.w]) := by + subst hφ + simp [isoMapOfCommSq, mapComp'_eq_mapComp] + +end + +/-- Equational lemma for `Pseudofunctor.isoMapOfCommSq` when +both vertical maps of the square are the same and horizontal maps are identities. -/ +lemma isoMapOfCommSq_horiz_id (f : X₁ ⟶ X₂) : + F.isoMapOfCommSq (t := 𝟙 _) (l := f) (r := f) (b := 𝟙 _) ⟨by simp⟩ = + whiskerRightIso (F.mapId X₁) (F.map f) ≪≫ λ_ _ ≪≫ (ρ_ _).symm ≪≫ + (whiskerLeftIso (F.map f) (F.mapId X₂)).symm := by + ext + rw [isoMapOfCommSq_eq _ _ f (by simp), mapComp'_comp_id, mapComp'_id_comp] + simp + +/-- Equational lemma for `Pseudofunctor.isoMapOfCommSq` when +both horizontal maps of the square are the same and vertical maps are identities. -/ +lemma isoMapOfCommSq_vert_id (f : X₁ ⟶ X₂) : + F.isoMapOfCommSq (t := f) (l := 𝟙 _) (r := 𝟙 _) (b := f) ⟨by simp⟩ = + whiskerLeftIso (F.map f) (F.mapId X₂) ≪≫ ρ_ _ ≪≫ (λ_ _).symm ≪≫ + (whiskerRightIso (F.mapId X₁) (F.map f)).symm := by + ext + rw [isoMapOfCommSq_eq _ _ f (by simp), mapComp'_comp_id, mapComp'_id_comp] + simp + +end CommSq + +end Pseudofunctor + +end CategoryTheory From 430466be68e8a84fdb73cb4a3b3558eb4ed40c59 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=ABl=20Riou?= Date: Sat, 26 Apr 2025 10:25:47 +0200 Subject: [PATCH 013/118] better names --- Mathlib/CategoryTheory/Bicategory/Functor/Strict.lean | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Mathlib/CategoryTheory/Bicategory/Functor/Strict.lean b/Mathlib/CategoryTheory/Bicategory/Functor/Strict.lean index dcd9faafb5e856..289a2025ae5f2d 100644 --- a/Mathlib/CategoryTheory/Bicategory/Functor/Strict.lean +++ b/Mathlib/CategoryTheory/Bicategory/Functor/Strict.lean @@ -101,7 +101,7 @@ lemma mapComp'_inv_comp_mapComp'_hom : simp @[reassoc] -lemma mapComp'_hom_comp_whiskerRight_mapComp'_hom : +lemma mapComp'_hom_comp_mapComp'_hom_whiskerRight : (F.mapComp' f₀₂ f₂₃ f (by rw [hf, h₀₂, h₁₃, Category.assoc])).hom ≫ (F.mapComp' f₀₁ f₁₂ f₀₂ h₀₂).hom ▷ F.map f₂₃ = (F.mapComp' f₀₁ f₁₃ f hf).hom ≫ F.map f₀₁ ◁ (F.mapComp' f₁₂ f₂₃ f₁₃ h₁₃).hom ≫ @@ -118,7 +118,7 @@ lemma whiskerLeft_mapComp'_inv_comp_mapComp'_inv : F.mapComp'_inv_comp_mapComp'_hom _ _ _ _ _ _ h₀₂ h₁₃ hf] @[reassoc] -lemma whiskerRight_mapComp'_inv_comp_mapComp'_inv : +lemma mapComp'_inv_whiskerRight_comp_mapComp'_inv : (F.mapComp' f₀₁ f₁₂ f₀₂ h₀₂).inv ▷ F.map f₂₃ ≫ (F.mapComp' f₀₂ f₂₃ f (by rw [hf, h₀₂, h₁₃, Category.assoc])).inv = (α_ _ _ _).hom ≫ F.map f₀₁ ◁ (F.mapComp' f₁₂ f₂₃ f₁₃ h₁₃).inv ≫ From 6d3eca65c20233040fe4d76a12bf3c3c291ecb93 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=ABl=20Riou?= Date: Sat, 26 Apr 2025 10:26:47 +0200 Subject: [PATCH 014/118] cleaning up --- Mathlib/CategoryTheory/Bicategory/Functor/Strict.lean | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Mathlib/CategoryTheory/Bicategory/Functor/Strict.lean b/Mathlib/CategoryTheory/Bicategory/Functor/Strict.lean index 289a2025ae5f2d..b8006f57cdac4f 100644 --- a/Mathlib/CategoryTheory/Bicategory/Functor/Strict.lean +++ b/Mathlib/CategoryTheory/Bicategory/Functor/Strict.lean @@ -56,7 +56,7 @@ lemma mapComp'_eq_mapComp {b₀ b₁ b₂ : B} (f : b₀ ⟶ b₁) (g : b₁ ⟶ variable [Strict B] lemma mapComp'_comp_id {b₀ b₁ : B} (f : b₀ ⟶ b₁) : - F.mapComp' f (𝟙 b₁) f (by nth_rw 1 [← Category.comp_id f]) = + F.mapComp' f (𝟙 b₁) f (by simp) = (ρ_ _).symm ≪≫ whiskerLeftIso _ (F.mapId b₁).symm := by ext rw [mapComp'_def] @@ -66,7 +66,7 @@ lemma mapComp'_comp_id {b₀ b₁ : B} (f : b₀ ⟶ b₁) : Category.id_comp] lemma mapComp'_id_comp {b₀ b₁ : B} (f : b₀ ⟶ b₁) : - F.mapComp' (𝟙 b₀) f f (by nth_rw 1 [← Category.id_comp f]) = + F.mapComp' (𝟙 b₀) f f (by simp) = (λ_ _).symm ≪≫ whiskerRightIso (F.mapId b₀).symm _ := by ext rw [mapComp'_def] From 74dc8c55eacd422709c070c4d5daeb2767eda698 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=ABl=20Riou?= Date: Sat, 26 Apr 2025 10:27:30 +0200 Subject: [PATCH 015/118] whitespace --- Mathlib/CategoryTheory/Bicategory/Functor/Strict.lean | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Mathlib/CategoryTheory/Bicategory/Functor/Strict.lean b/Mathlib/CategoryTheory/Bicategory/Functor/Strict.lean index b8006f57cdac4f..7e54d01bad902d 100644 --- a/Mathlib/CategoryTheory/Bicategory/Functor/Strict.lean +++ b/Mathlib/CategoryTheory/Bicategory/Functor/Strict.lean @@ -57,7 +57,7 @@ variable [Strict B] lemma mapComp'_comp_id {b₀ b₁ : B} (f : b₀ ⟶ b₁) : F.mapComp' f (𝟙 b₁) f (by simp) = - (ρ_ _).symm ≪≫ whiskerLeftIso _ (F.mapId b₁).symm := by + (ρ_ _).symm ≪≫ whiskerLeftIso _ (F.mapId b₁).symm := by ext rw [mapComp'_def] dsimp From 6529163b854b45fdfd4d7daccf70eb97601fd53a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=ABl=20Riou?= Date: Sat, 26 Apr 2025 10:35:29 +0200 Subject: [PATCH 016/118] cleaning up --- .../Bicategory/Functor/Strict.lean | 30 +++++++++---------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/Mathlib/CategoryTheory/Bicategory/Functor/Strict.lean b/Mathlib/CategoryTheory/Bicategory/Functor/Strict.lean index 7e54d01bad902d..be2e5eb6b10c77 100644 --- a/Mathlib/CategoryTheory/Bicategory/Functor/Strict.lean +++ b/Mathlib/CategoryTheory/Bicategory/Functor/Strict.lean @@ -33,16 +33,20 @@ namespace Pseudofunctor variable {B C : Type*} [Bicategory B] [Bicategory C] (F : Pseudofunctor B C) /-- More flexible variant of `mapId`. -/ -def mapId' {b : B} (f : b ⟶ b) (hf : f = 𝟙 b) : +def mapId' {b : B} (f : b ⟶ b) (hf : f = 𝟙 b := by aesop_cat) : F.map f ≅ 𝟙 _ := F.map₂Iso (eqToIso (by rw [hf])) ≪≫ F.mapId _ +lemma mapId'_def {b : B} (f : b ⟶ b) (hf : f = 𝟙 b) : + F.mapId' f hf = F.map₂Iso (eqToIso (by rw [hf])) ≪≫ F.mapId _ := rfl + lemma mapId'_eq_mapId (b : B) : F.mapId' (𝟙 b) rfl = F.mapId b := by - simp [mapId'] + simp [mapId'_def] /-- More flexible variant of `mapComp`. -/ -def mapComp' {b₀ b₁ b₂ : B} (f : b₀ ⟶ b₁) (g : b₁ ⟶ b₂) (fg : b₀ ⟶ b₂) (h : fg = f ≫ g) : +def mapComp' {b₀ b₁ b₂ : B} (f : b₀ ⟶ b₁) (g : b₁ ⟶ b₂) (fg : b₀ ⟶ b₂) + (h : fg = f ≫ g := by aesop_cat) : F.map fg ≅ F.map f ≫ F.map g := F.map₂Iso (eqToIso (by rw [h])) ≪≫ F.mapComp f g @@ -56,8 +60,7 @@ lemma mapComp'_eq_mapComp {b₀ b₁ b₂ : B} (f : b₀ ⟶ b₁) (g : b₁ ⟶ variable [Strict B] lemma mapComp'_comp_id {b₀ b₁ : B} (f : b₀ ⟶ b₁) : - F.mapComp' f (𝟙 b₁) f (by simp) = - (ρ_ _).symm ≪≫ whiskerLeftIso _ (F.mapId b₁).symm := by + F.mapComp' f (𝟙 b₁) f = (ρ_ _).symm ≪≫ whiskerLeftIso _ (F.mapId b₁).symm := by ext rw [mapComp'_def] dsimp @@ -66,8 +69,7 @@ lemma mapComp'_comp_id {b₀ b₁ : B} (f : b₀ ⟶ b₁) : Category.id_comp] lemma mapComp'_id_comp {b₀ b₁ : B} (f : b₀ ⟶ b₁) : - F.mapComp' (𝟙 b₀) f f (by simp) = - (λ_ _).symm ≪≫ whiskerRightIso (F.mapId b₀).symm _ := by + F.mapComp' (𝟙 b₀) f f = (λ_ _).symm ≪≫ whiskerRightIso (F.mapId b₀).symm _ := by ext rw [mapComp'_def] dsimp @@ -85,7 +87,7 @@ variable {b₀ b₁ b₂ b₃ : B} (f₀₁ : b₀ ⟶ b₁) @[reassoc] lemma mapComp'_hom_comp_whiskerLeft_mapComp'_hom : (F.mapComp' f₀₁ f₁₃ f hf).hom ≫ F.map f₀₁ ◁ (F.mapComp' f₁₂ f₂₃ f₁₃ h₁₃).hom = - (F.mapComp' f₀₂ f₂₃ f (by rw [hf, h₀₂, h₁₃, Category.assoc])).hom ≫ + (F.mapComp' f₀₂ f₂₃ f).hom ≫ (F.mapComp' f₀₁ f₁₂ f₀₂ h₀₂).hom ▷ F.map f₂₃ ≫ (α_ _ _ _).hom := by subst h₀₂ h₁₃ hf simp [mapComp_assoc_right_hom, Strict.associator_eqToIso, mapComp'] @@ -93,7 +95,7 @@ lemma mapComp'_hom_comp_whiskerLeft_mapComp'_hom : @[reassoc] lemma mapComp'_inv_comp_mapComp'_hom : (F.mapComp' f₀₁ f₁₃ f hf).inv ≫ - (F.mapComp' f₀₂ f₂₃ f (by rw [hf, h₀₂, h₁₃, Category.assoc])).hom = + (F.mapComp' f₀₂ f₂₃ f).hom = F.map f₀₁ ◁ (F.mapComp' f₁₂ f₂₃ f₁₃ h₁₃).hom ≫ (α_ _ _ _).inv ≫ (F.mapComp' f₀₁ f₁₂ f₀₂ h₀₂).inv ▷ F.map f₂₃ := by rw [← cancel_epi (F.mapComp' f₀₁ f₁₃ f hf).hom, Iso.hom_inv_id_assoc, @@ -102,8 +104,7 @@ lemma mapComp'_inv_comp_mapComp'_hom : @[reassoc] lemma mapComp'_hom_comp_mapComp'_hom_whiskerRight : - (F.mapComp' f₀₂ f₂₃ f (by rw [hf, h₀₂, h₁₃, Category.assoc])).hom ≫ - (F.mapComp' f₀₁ f₁₂ f₀₂ h₀₂).hom ▷ F.map f₂₃ = + (F.mapComp' f₀₂ f₂₃ f).hom ≫ (F.mapComp' f₀₁ f₁₂ f₀₂ h₀₂).hom ▷ F.map f₂₃ = (F.mapComp' f₀₁ f₁₃ f hf).hom ≫ F.map f₀₁ ◁ (F.mapComp' f₁₂ f₂₃ f₁₃ h₁₃).hom ≫ (α_ _ _ _).inv := by rw [F.mapComp'_hom_comp_whiskerLeft_mapComp'_hom_assoc _ _ _ _ _ _ h₀₂ h₁₃ hf] @@ -113,14 +114,13 @@ lemma mapComp'_hom_comp_mapComp'_hom_whiskerRight : lemma whiskerLeft_mapComp'_inv_comp_mapComp'_inv : F.map f₀₁ ◁ (F.mapComp' f₁₂ f₂₃ f₁₃ h₁₃).inv ≫ (F.mapComp' f₀₁ f₁₃ f hf).inv = (α_ _ _ _).inv ≫ (F.mapComp' f₀₁ f₁₂ f₀₂ h₀₂).inv ▷ F.map f₂₃ ≫ - (F.mapComp' f₀₂ f₂₃ f (by rw [hf, h₀₂, h₁₃, Category.assoc])).inv := by - simp [← cancel_mono (F.mapComp' f₀₂ f₂₃ f (by rw [hf, h₀₂, h₁₃, Category.assoc])).hom, + (F.mapComp' f₀₂ f₂₃ f).inv := by + simp [← cancel_mono (F.mapComp' f₀₂ f₂₃ f).hom, F.mapComp'_inv_comp_mapComp'_hom _ _ _ _ _ _ h₀₂ h₁₃ hf] @[reassoc] lemma mapComp'_inv_whiskerRight_comp_mapComp'_inv : - (F.mapComp' f₀₁ f₁₂ f₀₂ h₀₂).inv ▷ F.map f₂₃ ≫ - (F.mapComp' f₀₂ f₂₃ f (by rw [hf, h₀₂, h₁₃, Category.assoc])).inv = + (F.mapComp' f₀₁ f₁₂ f₀₂ h₀₂).inv ▷ F.map f₂₃ ≫ (F.mapComp' f₀₂ f₂₃ f).inv = (α_ _ _ _).hom ≫ F.map f₀₁ ◁ (F.mapComp' f₁₂ f₂₃ f₁₃ h₁₃).inv ≫ (F.mapComp' f₀₁ f₁₃ f hf).inv := by rw [whiskerLeft_mapComp'_inv_comp_mapComp'_inv _ _ _ _ _ _ _ h₀₂ h₁₃ hf, From 45d453287bb969d1e4486bd61fee465cea91e2b8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=ABl=20Riou?= Date: Sat, 26 Apr 2025 11:25:36 +0200 Subject: [PATCH 017/118] better lemmas --- .../Bicategory/Functor/Strict.lean | 40 +++++++++---------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/Mathlib/CategoryTheory/Bicategory/Functor/Strict.lean b/Mathlib/CategoryTheory/Bicategory/Functor/Strict.lean index be2e5eb6b10c77..955207213ca169 100644 --- a/Mathlib/CategoryTheory/Bicategory/Functor/Strict.lean +++ b/Mathlib/CategoryTheory/Bicategory/Functor/Strict.lean @@ -46,11 +46,12 @@ lemma mapId'_eq_mapId (b : B) : /-- More flexible variant of `mapComp`. -/ def mapComp' {b₀ b₁ b₂ : B} (f : b₀ ⟶ b₁) (g : b₁ ⟶ b₂) (fg : b₀ ⟶ b₂) - (h : fg = f ≫ g := by aesop_cat) : + (h : f ≫ g = fg := by aesop_cat) : F.map fg ≅ F.map f ≫ F.map g := F.map₂Iso (eqToIso (by rw [h])) ≪≫ F.mapComp f g -lemma mapComp'_def {b₀ b₁ b₂ : B} (f : b₀ ⟶ b₁) (g : b₁ ⟶ b₂) (fg : b₀ ⟶ b₂) (h : fg = f ≫ g) : +lemma mapComp'_def {b₀ b₁ b₂ : B} (f : b₀ ⟶ b₁) (g : b₁ ⟶ b₂) (fg : b₀ ⟶ b₂) + (h : f ≫ g = fg) : F.mapComp' f g fg h = F.map₂Iso (eqToIso (by rw [h])) ≪≫ F.mapComp f g := rfl lemma mapComp'_eq_mapComp {b₀ b₁ b₂ : B} (f : b₀ ⟶ b₁) (g : b₁ ⟶ b₂) : @@ -81,20 +82,19 @@ section associativity variable {b₀ b₁ b₂ b₃ : B} (f₀₁ : b₀ ⟶ b₁) (f₁₂ : b₁ ⟶ b₂) (f₂₃ : b₂ ⟶ b₃) (f₀₂ : b₀ ⟶ b₂) (f₁₃ : b₁ ⟶ b₃) (f : b₀ ⟶ b₃) - (h₀₂ : f₀₂ = f₀₁ ≫ f₁₂) (h₁₃ : f₁₃ = f₁₂ ≫ f₂₃) - (hf : f = f₀₁ ≫ f₁₃) + (h₀₂ : f₀₁ ≫ f₁₂ = f₀₂) (h₁₃ : f₁₂ ≫ f₂₃ = f₁₃) @[reassoc] -lemma mapComp'_hom_comp_whiskerLeft_mapComp'_hom : - (F.mapComp' f₀₁ f₁₃ f hf).hom ≫ F.map f₀₁ ◁ (F.mapComp' f₁₂ f₂₃ f₁₃ h₁₃).hom = +lemma mapComp'_hom_comp_whiskerLeft_mapComp'_hom (hf : f₀₁ ≫ f₁₃ = f) : + (F.mapComp' f₀₁ f₁₃ f).hom ≫ F.map f₀₁ ◁ (F.mapComp' f₁₂ f₂₃ f₁₃ h₁₃).hom = (F.mapComp' f₀₂ f₂₃ f).hom ≫ (F.mapComp' f₀₁ f₁₂ f₀₂ h₀₂).hom ▷ F.map f₂₃ ≫ (α_ _ _ _).hom := by subst h₀₂ h₁₃ hf simp [mapComp_assoc_right_hom, Strict.associator_eqToIso, mapComp'] @[reassoc] -lemma mapComp'_inv_comp_mapComp'_hom : - (F.mapComp' f₀₁ f₁₃ f hf).inv ≫ +lemma mapComp'_inv_comp_mapComp'_hom (hf : f₀₁ ≫ f₁₃ = f) : + (F.mapComp' f₀₁ f₁₃ f).inv ≫ (F.mapComp' f₀₂ f₂₃ f).hom = F.map f₀₁ ◁ (F.mapComp' f₁₂ f₂₃ f₁₃ h₁₃).hom ≫ (α_ _ _ _).inv ≫ (F.mapComp' f₀₁ f₁₂ f₀₂ h₀₂).inv ▷ F.map f₂₃ := by @@ -103,15 +103,7 @@ lemma mapComp'_inv_comp_mapComp'_hom : simp @[reassoc] -lemma mapComp'_hom_comp_mapComp'_hom_whiskerRight : - (F.mapComp' f₀₂ f₂₃ f).hom ≫ (F.mapComp' f₀₁ f₁₂ f₀₂ h₀₂).hom ▷ F.map f₂₃ = - (F.mapComp' f₀₁ f₁₃ f hf).hom ≫ F.map f₀₁ ◁ (F.mapComp' f₁₂ f₂₃ f₁₃ h₁₃).hom ≫ - (α_ _ _ _).inv := by - rw [F.mapComp'_hom_comp_whiskerLeft_mapComp'_hom_assoc _ _ _ _ _ _ h₀₂ h₁₃ hf] - simp - -@[reassoc] -lemma whiskerLeft_mapComp'_inv_comp_mapComp'_inv : +lemma whiskerLeft_mapComp'_inv_comp_mapComp'_inv (hf : f₀₁ ≫ f₁₃ = f) : F.map f₀₁ ◁ (F.mapComp' f₁₂ f₂₃ f₁₃ h₁₃).inv ≫ (F.mapComp' f₀₁ f₁₃ f hf).inv = (α_ _ _ _).inv ≫ (F.mapComp' f₀₁ f₁₂ f₀₂ h₀₂).inv ▷ F.map f₂₃ ≫ (F.mapComp' f₀₂ f₂₃ f).inv := by @@ -119,11 +111,19 @@ lemma whiskerLeft_mapComp'_inv_comp_mapComp'_inv : F.mapComp'_inv_comp_mapComp'_hom _ _ _ _ _ _ h₀₂ h₁₃ hf] @[reassoc] -lemma mapComp'_inv_whiskerRight_comp_mapComp'_inv : +lemma mapComp'_hom_comp_mapComp'_hom_whiskerRight (hf : f₀₂ ≫ f₂₃ = f) : + (F.mapComp' f₀₂ f₂₃ f).hom ≫ (F.mapComp' f₀₁ f₁₂ f₀₂ h₀₂).hom ▷ F.map f₂₃ = + (F.mapComp' f₀₁ f₁₃ f).hom ≫ F.map f₀₁ ◁ (F.mapComp' f₁₂ f₂₃ f₁₃ h₁₃).hom ≫ + (α_ _ _ _).inv := by + rw [F.mapComp'_hom_comp_whiskerLeft_mapComp'_hom_assoc _ _ _ _ _ f h₀₂ h₁₃ (by aesop_cat)] + simp + +@[reassoc] +lemma mapComp'_inv_whiskerRight_comp_mapComp'_inv (hf : f₀₂ ≫ f₂₃ = f) : (F.mapComp' f₀₁ f₁₂ f₀₂ h₀₂).inv ▷ F.map f₂₃ ≫ (F.mapComp' f₀₂ f₂₃ f).inv = (α_ _ _ _).hom ≫ F.map f₀₁ ◁ (F.mapComp' f₁₂ f₂₃ f₁₃ h₁₃).inv ≫ - (F.mapComp' f₀₁ f₁₃ f hf).inv := by - rw [whiskerLeft_mapComp'_inv_comp_mapComp'_inv _ _ _ _ _ _ _ h₀₂ h₁₃ hf, + (F.mapComp' f₀₁ f₁₃ f).inv := by + rw [whiskerLeft_mapComp'_inv_comp_mapComp'_inv _ _ _ _ _ _ f h₀₂ h₁₃, Iso.hom_inv_id_assoc] end associativity From e725183be53f2baacbb48dcb442f36a1a06dca03 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=ABl=20Riou?= Date: Sat, 26 Apr 2025 11:47:19 +0200 Subject: [PATCH 018/118] wip --- .../Sites/Descent/DescentData.lean | 143 ++++++++---------- 1 file changed, 66 insertions(+), 77 deletions(-) diff --git a/Mathlib/CategoryTheory/Sites/Descent/DescentData.lean b/Mathlib/CategoryTheory/Sites/Descent/DescentData.lean index f7f33bd11d0086..dfb4db93e60154 100644 --- a/Mathlib/CategoryTheory/Sites/Descent/DescentData.lean +++ b/Mathlib/CategoryTheory/Sites/Descent/DescentData.lean @@ -5,7 +5,7 @@ Authors: Joël Riou -/ import Mathlib.CategoryTheory.Sites.Grothendieck import Mathlib.CategoryTheory.Limits.Shapes.Pullback.CommSq -import Mathlib.CategoryTheory.Bicategory.Functor.Pseudofunctor +import Mathlib.CategoryTheory.Bicategory.Functor.Strict import Mathlib.CategoryTheory.Bicategory.LocallyDiscrete /-! @@ -13,7 +13,7 @@ import Mathlib.CategoryTheory.Bicategory.LocallyDiscrete -/ -universe t w v' u' v u +universe t w v v' u u' namespace CategoryTheory @@ -21,32 +21,10 @@ open Category Limits Bicategory namespace Pseudofunctor -section - -variable {B C : Type*} [Bicategory B] [Bicategory C] - (F : Pseudofunctor B C) - {a b c : B} (f : a ⟶ b) (g : b ⟶ c) (fg : a ⟶ c) (hfg : f ≫ g = fg := by aesop_cat) - -def mapComp' : F.map fg ≅ F.map f ≫ F.map g := by - subst hfg - exact F.mapComp f g +/-set_option linter.unusedTactic false -@[simp] -lemma mapComp_rfl : F.mapComp' f g _ rfl = F.mapComp f g := rfl - -lemma mapComp'_def (hfg : f ≫ g = fg) : F.mapComp' f g fg hfg = - eqToIso (by rw [hfg]) ≪≫ F.mapComp f g := by - subst hfg - simp - -lemma mapComp_comp_mapComp {a b c d : B} - (f : a ⟶ b) (g : b ⟶ c) (h : c ⟶ d) : - (F.mapComp (f ≫ g) h).hom ≫ (F.mapComp f g).hom ▷ F.map h = - F.map₂ (α_ _ _ _).hom ≫ (F.mapComp f (g ≫ h)).hom ≫ F.map f ◁ (F.mapComp g h).hom ≫ - (α_ _ _ _).inv := by - simp - -set_option linter.unusedTactic false +--variable {B C : Type*} [Bicategory B] [Bicategory C] (F : Pseudofunctor B C) +-- {a b c : B} (f : a ⟶ b) (g : b ⟶ c) (fg : a ⟶ c) (hfg : f ≫ g = fg := by aesop_cat) section @@ -108,21 +86,20 @@ lemma mapComp'_inv_of_comp_eq : end -end +end-/ variable {C : Type u} [Bicategory.{w, v} C] [IsLocallyDiscrete C] - (F : Pseudofunctor C Cat.{v', u'}) - {ι : Type w} (X : ι → C) + (F : Pseudofunctor C Cat.{v', u'}) {ι : Type t} (X : ι → C) structure DescentData where obj (i : ι) : F.obj (X i) iso ⦃Y : C⦄ ⦃i₁ i₂ : ι⦄ (f₁ : X i₁ ⟶ Y) (f₂ : X i₂ ⟶ Y) : (F.map f₁).obj (obj i₁) ≅ (F.map f₂).obj (obj i₂) - iso_comp ⦃Y' Y : C⦄ (g : Y ⟶ Y') ⦃i₁ i₂ : ι⦄ (f₁ : X i₁ ⟶ Y) (f₂ : X i₂ ⟶ Y) : - iso (f₁ ≫ g) (f₂ ≫ g) = - (F.mapComp f₁ g).app _ ≪≫ - Functor.mapIso (F.map g) (iso f₁ f₂) ≪≫ - (F.mapComp f₂ g).symm.app _ := by aesop_cat + iso_comp' ⦃Y' Y : C⦄ (g : Y ⟶ Y') ⦃i₁ i₂ : ι⦄ (f₁ : X i₁ ⟶ Y) (f₂ : X i₂ ⟶ Y) + (f₁g : X i₁ ⟶ Y') (f₂g : X i₂ ⟶ Y') (hf₁g : f₁ ≫ g = f₁g) (hf₂g : f₂ ≫ g = f₂g) : + iso f₁g f₂g = + (F.mapComp' f₁ g f₁g).app (obj i₁) ≪≫ Functor.mapIso (F.map g) (iso f₁ f₂) ≪≫ + (F.mapComp' f₂ g f₂g).symm.app (obj i₂) iso_trans ⦃Y : C⦄ ⦃i₁ i₂ i₃ : ι⦄ (f₁ : X i₁ ⟶ Y) (f₂ : X i₂ ⟶ Y) (f₃ : X i₃ ⟶ Y) : iso f₁ f₂ ≪≫ iso f₂ f₃ = iso f₁ f₃ := by aesop_cat @@ -130,14 +107,16 @@ namespace DescentData variable {F X} +@[simps] def mk' (obj : ∀ i, F.obj (X i)) (hom : ∀ ⦃Y : C⦄ ⦃i₁ i₂ : ι⦄ (f₁ : X i₁ ⟶ Y) (f₂ : X i₂ ⟶ Y), (F.map f₁).obj (obj i₁) ⟶ (F.map f₂).obj (obj i₂)) - (hom_comp : ∀ ⦃Y' Y : C⦄ (g : Y ⟶ Y') ⦃i₁ i₂ : ι⦄ (f₁ : X i₁ ⟶ Y) (f₂ : X i₂ ⟶ Y), - hom (f₁ ≫ g) (f₂ ≫ g) = - (F.mapComp f₁ g).hom.app _ ≫ + (hom_comp' : ∀ ⦃Y' Y : C⦄ (g : Y ⟶ Y') ⦃i₁ i₂ : ι⦄ (f₁ : X i₁ ⟶ Y) (f₂ : X i₂ ⟶ Y) + (f₁g : X i₁ ⟶ Y') (f₂g : X i₂ ⟶ Y') (hf₁g : f₁ ≫ g = f₁g) (hf₂g : f₂ ≫ g = f₂g), + hom f₁g f₂g = + (F.mapComp' f₁ g f₁g).hom.app _ ≫ (F.map g).map (hom f₁ f₂) ≫ - (F.mapComp f₂ g).inv.app _ := by aesop_cat) + (F.mapComp' f₂ g f₂g).inv.app _ := by aesop_cat) (hom_self : ∀ ⦃Y : C⦄ ⦃i : ι⦄ (f : X i ⟶ Y), hom f f = 𝟙 _ := by aesop_cat) (comp_hom : ∀ ⦃Y : C⦄ ⦃i₁ i₂ i₃ : ι⦄ (f₁ : X i₁ ⟶ Y) (f₂ : X i₂ ⟶ Y) (f₃ : X i₃ ⟶ Y), hom f₁ f₂ ≫ hom f₂ f₃ = hom f₁ f₃ := by aesop_cat) : F.DescentData X where @@ -145,21 +124,63 @@ def mk' (obj : ∀ i, F.obj (X i)) iso Y i₁ i₂ f₁ f₂ := { hom := hom f₁ f₂ inv := hom f₂ f₁ } + iso_comp' Y' Y g i₁ i₂ f₁ f₂ f₁g f₂g hf₁g hf₂g := by + ext + exact hom_comp' g f₁ f₂ f₁g f₂g hf₁g hf₂g + + +@[ext] +structure Hom (D₁ D₂ : F.DescentData X) where + hom (i : ι) : D₁.obj i ⟶ D₂.obj i + comm ⦃Y : C⦄ ⦃i₁ i₂ : ι⦄ (f₁ : X i₁ ⟶ Y) (f₂ : X i₂ ⟶ Y) : + (F.map f₁).map (hom i₁) ≫ (D₂.iso f₁ f₂).hom = + (D₁.iso f₁ f₂).hom ≫ (F.map f₂).map (hom i₂) := by aesop_cat + +attribute [reassoc (attr := simp)] Hom.comm + +instance : Category (F.DescentData X) where + Hom := Hom + id D := { hom i := 𝟙 _ } + comp {D₁ D₂ D₃} φ ψ := + { hom i := φ.hom i ≫ ψ.hom i + comm Y i₁ i₂ f₁ f₂ := by + simp only [Functor.map_comp, assoc] + rw [ψ.comm, φ.comm_assoc] } + +end DescentData + +def toDescentDataOfIsTerminal (X₀ : C) (hX₀ : IsInitial X₀) : + F.obj X₀ ⥤ F.DescentData X where + obj A := + { obj i := (F.map (hX₀.to (X i))).obj A + iso Y i₁ i₂ f₁ f₂ := + (F.mapComp' (hX₀.to (X i₁)) f₁ (hX₀.to Y) (by simp)).symm.app A ≪≫ + (F.mapComp' (hX₀.to (X i₂)) f₂ (hX₀.to Y) (by simp)).app A + iso_comp' Y' Y g i₁ i₂ f₁ f₂ f₁g f₂g hf₁g hf₂g := by + dsimp + sorry + iso_trans := by sorry } -- `aesop_cat` works + map {A B} f := + { hom i := (F.map _).map f + comm Y i₁ i₂ f₁ f₂ := by + dsimp + simp only [assoc] + sorry } + +namespace DescentData section Unique variable (X : C) -set_option maxHeartbeats 0 in +/-set_option maxHeartbeats 0 in def mk'' (obj : F.obj X) (c : BinaryCofan X X) (hc : IsColimit c) (map : c.pt ⟶ X) (heq : map = hc.desc (BinaryCofan.mk (𝟙 _) (𝟙 _))) {Z : C} {ι₁₂ ι₂₃ : c.pt ⟶ Z} (h : IsPushout c.inl c.inr ι₂₃ ι₁₂) (p₁ p₂ p₃ : X ⟶ Z) - (hp₁ : c.inl ≫ ι₁₂ = p₁) - (hp₂ : c.inr ≫ ι₁₂ = p₂) - (hp₃ : c.inr ≫ ι₂₃ = p₃) + (hp₁ : c.inl ≫ ι₁₂ = p₁) (hp₂ : c.inr ≫ ι₁₂ = p₂) (hp₃ : c.inr ≫ ι₂₃ = p₃) (hom : (F.map c.inl).obj obj ⟶ (F.map c.inr).obj obj) (hom_self : (F.map map).map hom = (F.mapComp' c.inl map (𝟙 _) (by aesop_cat)).inv.app obj ≫ @@ -230,45 +251,13 @@ def mk'' (obj : F.obj X) (c : BinaryCofan X X) simp · intro Y _ _ _ f₁ f₂ f₃ dsimp - sorry - -end Unique - -@[ext] -structure Hom (D₁ D₂ : F.DescentData X) where - hom (i : ι) : D₁.obj i ⟶ D₂.obj i - comm ⦃Y : C⦄ ⦃i₁ i₂ : ι⦄ (f₁ : X i₁ ⟶ Y) (f₂ : X i₂ ⟶ Y) : - (F.map f₁).map (hom i₁) ≫ (D₂.iso f₁ f₂).hom = - (D₁.iso f₁ f₂).hom ≫ (F.map f₂).map (hom i₂) := by aesop_cat + sorry-/ -attribute [reassoc (attr := simp)] Hom.comm -instance : Category (F.DescentData X) where - Hom := Hom - id D := { hom i := 𝟙 _ } - comp {D₁ D₂ D₃} φ ψ := - { hom i := φ.hom i ≫ ψ.hom i - comm Y i₁ i₂ f₁ f₂ := by - simp only [Functor.map_comp, assoc] - rw [ψ.comm, φ.comm_assoc] } +end Unique end DescentData -def toDescentDataOfIsTerminal (X₀ : C) (hX₀ : IsInitial X₀) : - F.obj X₀ ⥤ F.DescentData X where - obj A := - { obj i := (F.map (hX₀.to (X i))).obj A - iso Y i₁ i₂ f₁ f₂ := - (F.mapComp' (hX₀.to (X i₁)) f₁ (hX₀.to Y) (by simp)).symm.app A ≪≫ - (F.mapComp' (hX₀.to (X i₂)) f₂ (hX₀.to Y) (by simp)).app A - iso_comp Y' Y g i₁ i₂ f₁ f₂ := by - sorry } - map {A B} f := - { hom i := (F.map _).map f - comm Y i₁ i₂ f₁ f₂ := by - dsimp - sorry } - end Pseudofunctor end CategoryTheory From 050a27a82dbcaac469c66063257f09d2cd39d316 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=ABl=20Riou?= Date: Sat, 26 Apr 2025 12:19:03 +0200 Subject: [PATCH 019/118] feat(CategoryTheory): pseudofunctors to Cat --- Mathlib.lean | 1 + .../Bicategory/Functor/Cat.lean | 104 ++++++++++++++++++ 2 files changed, 105 insertions(+) create mode 100644 Mathlib/CategoryTheory/Bicategory/Functor/Cat.lean diff --git a/Mathlib.lean b/Mathlib.lean index bf8d5d252aba5f..231734e3437aaf 100644 --- a/Mathlib.lean +++ b/Mathlib.lean @@ -1871,6 +1871,7 @@ import Mathlib.CategoryTheory.Bicategory.Coherence import Mathlib.CategoryTheory.Bicategory.End import Mathlib.CategoryTheory.Bicategory.Extension import Mathlib.CategoryTheory.Bicategory.Free +import Mathlib.CategoryTheory.Bicategory.Functor.Cat import Mathlib.CategoryTheory.Bicategory.Functor.Lax import Mathlib.CategoryTheory.Bicategory.Functor.LocallyDiscrete import Mathlib.CategoryTheory.Bicategory.Functor.Oplax diff --git a/Mathlib/CategoryTheory/Bicategory/Functor/Cat.lean b/Mathlib/CategoryTheory/Bicategory/Functor/Cat.lean new file mode 100644 index 00000000000000..a01d33e61fe5ae --- /dev/null +++ b/Mathlib/CategoryTheory/Bicategory/Functor/Cat.lean @@ -0,0 +1,104 @@ +/- +Copyright (c) 2025 Joël Riou. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Joël Riou, Christian Merten +-/ +import Mathlib.CategoryTheory.Bicategory.Functor.Strict + +/-! +# Pseudofunctors to Cat + +In this file, the equalities stated in `CategoryTheory.Bicategory.Functor.Strict` +for pseudofunctors (from a strict bicategory) are rephrased in the particular +case the target bicategory is `Cat`. Indeed, in that case, the general lemmas +for pseudofunctors involve equalities between natural transformations: +we rephrase them after the application of `NatTrans.app`. + +-/ + +namespace CategoryTheory + +open Bicategory + +namespace Pseudofunctor + +variable {B : Type*} [Bicategory B] [Strict B] (F : Pseudofunctor B Cat) + +attribute [local simp] Cat.leftUnitor_hom_app Cat.rightUnitor_hom_app + Cat.leftUnitor_inv_app Cat.rightUnitor_inv_app + Cat.associator_hom_app Cat.associator_inv_app + +section unitality + +variable {b₀ b₁ : B} (f : b₀ ⟶ b₁) (X : F.obj b₀) + +lemma mapComp'_comp_id_hom_app : + (F.mapComp' f (𝟙 b₁) f).hom.app X = (F.mapId b₁).inv.app ((F.map f).obj X) := by + simp [mapComp'_comp_id] + +lemma mapComp'_comp_id_inv_app : + (F.mapComp' f (𝟙 b₁) f).inv.app X = (F.mapId b₁).hom.app ((F.map f).obj X) := by + simp [mapComp'_comp_id] + +lemma mapComp'_id_comp_hom_app : + (F.mapComp' (𝟙 b₀) f f).hom.app X = (F.map f).map ((F.mapId b₀).inv.app X) := by + simp [mapComp'_id_comp] + +lemma mapComp'_id_comp_inv_app : + (F.mapComp' (𝟙 b₀) f f).inv.app X = (F.map f).map ((F.mapId b₀).hom.app X) := by + simp [mapComp'_id_comp] + +end unitality + +section associativity + +variable {b₀ b₁ b₂ b₃ : B} (f₀₁ : b₀ ⟶ b₁) + (f₁₂ : b₁ ⟶ b₂) (f₂₃ : b₂ ⟶ b₃) (f₀₂ : b₀ ⟶ b₂) (f₁₃ : b₁ ⟶ b₃) (f : b₀ ⟶ b₃) + (h₀₂ : f₀₁ ≫ f₁₂ = f₀₂) (h₁₃ : f₁₂ ≫ f₂₃ = f₁₃) + +@[reassoc] +lemma mapComp'_hom_app_comp_mapComp'_hom_app_map_obj (hf : f₀₁ ≫ f₁₃ = f) (X : F.obj b₀) : + (F.mapComp' f₀₁ f₁₃ f).hom.app X ≫ + (F.mapComp' f₁₂ f₂₃ f₁₃ h₁₃).hom.app ((F.map f₀₁).obj X) = + (F.mapComp' f₀₂ f₂₃ f).hom.app X ≫ + (F.map f₂₃).map ((F.mapComp' f₀₁ f₁₂ f₀₂ h₀₂).hom.app X) := by + simpa using NatTrans.congr_app (F.mapComp'_hom_comp_whiskerLeft_mapComp'_hom + f₀₁ f₁₂ f₂₃ f₀₂ f₁₃ f h₀₂ h₁₃ hf) X + +@[reassoc] +lemma mapComp'_inv_app_comp_mapComp'_hom_app (hf : f₀₁ ≫ f₁₃ = f) (X : F.obj b₀) : + (F.mapComp' f₀₁ f₁₃ f).inv.app X ≫ (F.mapComp' f₀₂ f₂₃ f).hom.app X = + (F.mapComp' f₁₂ f₂₃ f₁₃ h₁₃).hom.app ((F.map f₀₁).obj X) ≫ + (F.map f₂₃).map ((F.mapComp' f₀₁ f₁₂ f₀₂ h₀₂).inv.app X) := by + simpa using NatTrans.congr_app (F.mapComp'_inv_comp_mapComp'_hom + f₀₁ f₁₂ f₂₃ f₀₂ f₁₃ f h₀₂ h₁₃ hf) X + +@[reassoc] +lemma mapComp'_inv_app_map_obj_comp_mapComp'_inv_app (hf : f₀₁ ≫ f₁₃ = f) (X : F.obj b₀) : + (F.mapComp' f₁₂ f₂₃ f₁₃ h₁₃).inv.app ((F.map f₀₁).obj X) ≫ (F.mapComp' f₀₁ f₁₃ f).inv.app X = + (F.map f₂₃).map ((F.mapComp' f₀₁ f₁₂ f₀₂ h₀₂).inv.app X) ≫ + (F.mapComp' f₀₂ f₂₃ f).inv.app X := by + simpa using NatTrans.congr_app (F.whiskerLeft_mapComp'_inv_comp_mapComp'_inv + f₀₁ f₁₂ f₂₃ f₀₂ f₁₃ f h₀₂ h₁₃ hf) X + +@[reassoc] +lemma mapComp'_hom_app_comp_map_map_mapComp'_hom_app (hf : f₀₂ ≫ f₂₃ = f) (X : F.obj b₀) : + (F.mapComp' f₀₂ f₂₃ f).hom.app X ≫ (F.map f₂₃).map ((F.mapComp' f₀₁ f₁₂ f₀₂ h₀₂).hom.app X) = + (F.mapComp' f₀₁ f₁₃ f).hom.app X ≫ + (F.mapComp' f₁₂ f₂₃ f₁₃ h₁₃).hom.app ((F.map f₀₁).obj X) := by + simpa using NatTrans.congr_app (F.mapComp'_hom_comp_mapComp'_hom_whiskerRight + f₀₁ f₁₂ f₂₃ f₀₂ f₁₃ f h₀₂ h₁₃ hf) X + +@[reassoc] +lemma map_map_mapComp'_inv_app_comp_mapComp'_inv_app (hf : f₀₂ ≫ f₂₃ = f) (X : F.obj b₀) : + (F.map f₂₃).map ((F.mapComp' f₀₁ f₁₂ f₀₂ h₀₂).inv.app X) ≫ (F.mapComp' f₀₂ f₂₃ f).inv.app X = + (F.mapComp' f₁₂ f₂₃ f₁₃ h₁₃).inv.app ((F.map f₀₁).obj X) ≫ + (F.mapComp' f₀₁ f₁₃ f).inv.app X := by + simpa using NatTrans.congr_app (F.mapComp'_inv_whiskerRight_comp_mapComp'_inv + f₀₁ f₁₂ f₂₃ f₀₂ f₁₃ f h₀₂ h₁₃ hf) X + +end associativity + +end Pseudofunctor + +end CategoryTheory From dc6ad870f81351b82311406da247f9575bb01e77 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=ABl=20Riou?= Date: Sat, 26 Apr 2025 13:13:34 +0200 Subject: [PATCH 020/118] wip --- .../Bicategory/Functor/Cat.lean | 63 ++++++++++++- .../Sites/Descent/DescentData.lean | 90 +++++++++++++++++-- 2 files changed, 144 insertions(+), 9 deletions(-) diff --git a/Mathlib/CategoryTheory/Bicategory/Functor/Cat.lean b/Mathlib/CategoryTheory/Bicategory/Functor/Cat.lean index a01d33e61fe5ae..8073bb5e6fe470 100644 --- a/Mathlib/CategoryTheory/Bicategory/Functor/Cat.lean +++ b/Mathlib/CategoryTheory/Bicategory/Functor/Cat.lean @@ -22,12 +22,55 @@ open Bicategory namespace Pseudofunctor -variable {B : Type*} [Bicategory B] [Strict B] (F : Pseudofunctor B Cat) +variable {B : Type*} [Bicategory B] (F : Pseudofunctor B Cat) attribute [local simp] Cat.leftUnitor_hom_app Cat.rightUnitor_hom_app Cat.leftUnitor_inv_app Cat.rightUnitor_inv_app Cat.associator_hom_app Cat.associator_inv_app +section naturality + +variable {b₀ b₁ b₂ : B} {X Y : F.obj b₀} + +section + +variable (f : b₀ ⟶ b₀) (hf : f = 𝟙 b₀) (a : X ⟶ Y) + +@[reassoc (attr := simp)] +lemma mapId'_hom_naturality : + (F.map f).map a ≫ (F.mapId' f hf).hom.app Y = (F.mapId' f hf).hom.app X ≫ a := + (F.mapId' f hf).hom.naturality a + +@[reassoc] +lemma mapId'_inv_naturality : + (F.mapId' f hf).inv.app X ≫ (F.map f).map a = a ≫ (F.mapId' f hf).inv.app Y := + ((F.mapId' f hf).inv.naturality a).symm + +end + +section + +variable (f : b₀ ⟶ b₁) (g : b₁ ⟶ b₂) (fg : b₀ ⟶ b₂) + (hfg : f ≫ g = fg) (a : X ⟶ Y) + +@[reassoc (attr := simp)] +lemma mapComp'_hom_naturality : + (F.map fg).map a ≫ (F.mapComp' f g fg hfg).hom.app Y = + (F.mapComp' f g fg hfg).hom.app X ≫ (F.map g).map ((F.map f).map a) := + (F.mapComp' f g fg hfg).hom.naturality a + +@[reassoc (attr := simp)] +lemma mapComp'_inv_naturality : + (F.map g).map ((F.map f).map a) ≫ (F.mapComp' f g fg hfg).inv.app Y = + (F.mapComp' f g fg hfg).inv.app X ≫ (F.map fg).map a := + (F.mapComp' f g fg hfg).inv.naturality a + +end + +end naturality + +variable [Strict B] + section unitality variable {b₀ b₁ : B} (f : b₀ ⟶ b₁) (X : F.obj b₀) @@ -97,6 +140,24 @@ lemma map_map_mapComp'_inv_app_comp_mapComp'_inv_app (hf : f₀₂ ≫ f₂₃ = simpa using NatTrans.congr_app (F.mapComp'_inv_whiskerRight_comp_mapComp'_inv f₀₁ f₁₂ f₂₃ f₀₂ f₁₃ f h₀₂ h₁₃ hf) X +@[reassoc] +lemma mapComp'₀₁₃_inv_app (hf : f₀₁ ≫ f₁₃ = f) (X : F.obj b₀) : + (F.mapComp' f₀₁ f₁₃ f hf).inv.app X = + (F.mapComp' f₁₂ f₂₃ f₁₃ h₁₃).hom.app ((F.map f₀₁).obj X) ≫ + (F.map f₂₃).map ((F.mapComp' f₀₁ f₁₂ f₀₂ h₀₂).inv.app X) ≫ + (F.mapComp' f₀₂ f₂₃ f).inv.app X := by + rw [← F.mapComp'_inv_app_comp_mapComp'_hom_app_assoc _ _ _ _ _ _ _ _ hf X, + Iso.hom_inv_id_app, Category.comp_id] + +@[reassoc] +lemma mapComp'₀₁₃_hom_app (hf : f₀₁ ≫ f₁₃ = f) (X : F.obj b₀) : + (F.mapComp' f₀₁ f₁₃ f hf).hom.app X = + (F.mapComp' f₀₂ f₂₃ f).hom.app X ≫ + (F.map f₂₃).map ((F.mapComp' f₀₁ f₁₂ f₀₂ h₀₂).hom.app X) ≫ + (F.mapComp' f₁₂ f₂₃ f₁₃ h₁₃).inv.app ((F.map f₀₁).obj X) := by + rw [← F.mapComp'_hom_app_comp_mapComp'_hom_app_map_obj_assoc _ _ _ _ _ _ h₀₂ h₁₃ hf X] + simp + end associativity end Pseudofunctor diff --git a/Mathlib/CategoryTheory/Sites/Descent/DescentData.lean b/Mathlib/CategoryTheory/Sites/Descent/DescentData.lean index dfb4db93e60154..3a975711594421 100644 --- a/Mathlib/CategoryTheory/Sites/Descent/DescentData.lean +++ b/Mathlib/CategoryTheory/Sites/Descent/DescentData.lean @@ -5,7 +5,7 @@ Authors: Joël Riou -/ import Mathlib.CategoryTheory.Sites.Grothendieck import Mathlib.CategoryTheory.Limits.Shapes.Pullback.CommSq -import Mathlib.CategoryTheory.Bicategory.Functor.Strict +import Mathlib.CategoryTheory.Bicategory.Functor.Cat import Mathlib.CategoryTheory.Bicategory.LocallyDiscrete /-! @@ -88,7 +88,7 @@ end end-/ -variable {C : Type u} [Bicategory.{w, v} C] [IsLocallyDiscrete C] +variable {C : Type u} [Bicategory.{w, v} C] (F : Pseudofunctor C Cat.{v', u'}) {ι : Type t} (X : ι → C) structure DescentData where @@ -128,6 +128,35 @@ def mk' (obj : ∀ i, F.obj (X i)) ext exact hom_comp' g f₁ f₂ f₁g f₂g hf₁g hf₂g +section + +variable (D : F.DescentData X) + +@[simp] +lemma iso_hom_iso_hom ⦃Y : C⦄ ⦃i₁ i₂ i₃ : ι⦄ + (f₁ : X i₁ ⟶ Y) (f₂ : X i₂ ⟶ Y) (f₃ : X i₃ ⟶ Y) : + (D.iso f₁ f₂).hom ≫ (D.iso f₂ f₃).hom = (D.iso f₁ f₃).hom := by + simp [← D.iso_trans f₁ f₂ f₃] + +@[simp] +lemma iso_self ⦃Y : C⦄ ⦃i : ι⦄ (f : X i ⟶ Y) : + D.iso f f = Iso.refl _ := by + ext + simp [← cancel_epi (D.iso f f).hom] + +@[simp] +lemma iso_symm ⦃Y : C⦄ ⦃i₁ i₂ : ι⦄ + (f₁ : X i₁ ⟶ Y) (f₂ : X i₂ ⟶ Y) : + (D.iso f₁ f₂).symm = D.iso f₂ f₁ := by + ext + simp [← cancel_epi (D.iso f₁ f₂).hom] + +lemma iso_inv ⦃Y : C⦄ ⦃i₁ i₂ : ι⦄ + (f₁ : X i₁ ⟶ Y) (f₂ : X i₂ ⟶ Y) : + (D.iso f₁ f₂).inv = (D.iso f₂ f₁).hom := + congr_arg Iso.hom (D.iso_symm f₁ f₂) + +end @[ext] structure Hom (D₁ D₂ : F.DescentData X) where @@ -147,9 +176,42 @@ instance : Category (F.DescentData X) where simp only [Functor.map_comp, assoc] rw [ψ.comm, φ.comm_assoc] } +@[ext] +lemma hom_ext {D₁ D₂ : F.DescentData X} {f g : D₁ ⟶ D₂} + (h : ∀ i, f.hom i = g.hom i) : f = g := + Hom.ext (funext h) + +@[simp] +lemma id_hom (D : F.DescentData X) (i : ι) : Hom.hom (𝟙 D) i = 𝟙 _ := rfl + +@[simp, reassoc] +lemma comp_hom {D₁ D₂ D₃ : F.DescentData X} (f : D₁ ⟶ D₂) (g : D₂ ⟶ D₃) (i : ι) : + (f ≫ g).hom i = f.hom i ≫ g.hom i := rfl + + +namespace Hom + +variable {D₁ D₂ : F.DescentData X} (f : D₁ ⟶ D₂) + +@[reassoc] +lemma map_map ⦃Y : C⦄ ⦃i₁ i₂ : ι⦄ (f₁ : X i₁ ⟶ Y) (f₂ : X i₂ ⟶ Y) : + (F.map f₁).map (f.hom i₁) = + (D₁.iso f₁ f₂).hom ≫ (F.map f₂).map (f.hom i₂) ≫ (D₂.iso f₁ f₂).inv := by + rw [← comm_assoc, Iso.hom_inv_id, comp_id] + +@[reassoc] +lemma map_map' ⦃Y : C⦄ ⦃i₁ i₂ : ι⦄ (f₁ : X i₁ ⟶ Y) (f₂ : X i₂ ⟶ Y) : + (F.map f₂).map (f.hom i₂) = + (D₁.iso f₁ f₂).inv ≫ (F.map f₁).map (f.hom i₁) ≫ (D₂.iso f₁ f₂).hom := by + simp + +end Hom + end DescentData -def toDescentDataOfIsTerminal (X₀ : C) (hX₀ : IsInitial X₀) : +variable [Strict C] + +def toDescentDataOfIsInitial (X₀ : C) (hX₀ : IsInitial X₀) : F.obj X₀ ⥤ F.DescentData X where obj A := { obj i := (F.map (hX₀.to (X i))).obj A @@ -157,15 +219,27 @@ def toDescentDataOfIsTerminal (X₀ : C) (hX₀ : IsInitial X₀) : (F.mapComp' (hX₀.to (X i₁)) f₁ (hX₀.to Y) (by simp)).symm.app A ≪≫ (F.mapComp' (hX₀.to (X i₂)) f₂ (hX₀.to Y) (by simp)).app A iso_comp' Y' Y g i₁ i₂ f₁ f₂ f₁g f₂g hf₁g hf₂g := by + ext dsimp - sorry - iso_trans := by sorry } -- `aesop_cat` works + simp only [Functor.map_comp, assoc] + rw [F.mapComp'₀₁₃_inv_app_assoc (hX₀.to (X i₁)) + f₁ g (hX₀.to Y) f₁g (hX₀.to Y') (by simp) hf₁g (by simp) A, + F.mapComp'₀₁₃_hom_app (hX₀.to (X i₂)) + f₂ g (hX₀.to Y) f₂g (hX₀.to Y') (by simp) hf₂g (by simp) A, + Iso.inv_hom_id_app_assoc] + iso_trans := by + intros + ext + dsimp + rw [assoc, Iso.hom_inv_id_app_assoc] } map {A B} f := { hom i := (F.map _).map f - comm Y i₁ i₂ f₁ f₂ := by + comm := by + intros dsimp - simp only [assoc] - sorry } + rw [mapComp'_inv_naturality_assoc, NatTrans.naturality, assoc, Cat.comp_map] } + map_id := by intros; ext; dsimp; simp only [Functor.map_id] + map_comp := by intros; ext; dsimp; simp only [Functor.map_comp] namespace DescentData From dd7689ef36218a641094fd86919bf646cc911d72 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=ABl=20Riou?= Date: Sat, 26 Apr 2025 13:36:58 +0200 Subject: [PATCH 021/118] wip --- .../Sites/Descent/DescentData.lean | 41 +++++++++++++++++-- 1 file changed, 38 insertions(+), 3 deletions(-) diff --git a/Mathlib/CategoryTheory/Sites/Descent/DescentData.lean b/Mathlib/CategoryTheory/Sites/Descent/DescentData.lean index 3a975711594421..6fc68ff344613c 100644 --- a/Mathlib/CategoryTheory/Sites/Descent/DescentData.lean +++ b/Mathlib/CategoryTheory/Sites/Descent/DescentData.lean @@ -221,8 +221,7 @@ def toDescentDataOfIsInitial (X₀ : C) (hX₀ : IsInitial X₀) : iso_comp' Y' Y g i₁ i₂ f₁ f₂ f₁g f₂g hf₁g hf₂g := by ext dsimp - simp only [Functor.map_comp, assoc] - rw [F.mapComp'₀₁₃_inv_app_assoc (hX₀.to (X i₁)) + rw [Functor.map_comp, assoc, F.mapComp'₀₁₃_inv_app_assoc (hX₀.to (X i₁)) f₁ g (hX₀.to Y) f₁g (hX₀.to Y') (by simp) hf₁g (by simp) A, F.mapComp'₀₁₃_hom_app (hX₀.to (X i₂)) f₂ g (hX₀.to Y) f₂g (hX₀.to Y') (by simp) hf₂g (by simp) A, @@ -245,7 +244,43 @@ namespace DescentData section Unique -variable (X : C) +variable {X : C} (obj : F.obj X) (c : BinaryCofan X X) + (hc : IsColimit c) (map : c.pt ⟶ X) + (heq : map = hc.desc (BinaryCofan.mk (𝟙 _) (𝟙 _))) + {Z : C} {ι₁₂ ι₂₃ : c.pt ⟶ Z} + (h : IsPushout c.inl c.inr ι₂₃ ι₁₂) + (p₁ p₂ p₃ : X ⟶ Z) + (hp₁ : c.inl ≫ ι₁₂ = p₁) (hp₂ : c.inr ≫ ι₁₂ = p₂) (hp₃ : c.inr ≫ ι₂₃ = p₃) + (hom : (F.map c.inl).obj obj ⟶ (F.map c.inr).obj obj) + (hom_self : (F.map map).map hom = + (F.mapComp' c.inl map (𝟙 _)).inv.app obj ≫ + (F.mapComp' c.inr map (𝟙 _)).hom.app obj) + +section + +def mk''Hom {Y : C} (f₁ f₂ : X ⟶ Y) : + (F.map f₁).obj obj ⟶ (F.map f₂).obj obj := by + let p : c.pt ⟶ Y := hc.desc <| BinaryCofan.mk f₁ f₂ + exact (F.mapComp' c.inl p f₁ (by simp [p])).hom.app obj ≫ (F.map p).map hom ≫ + (F.mapComp' c.inr p f₂ (by simp [p])).inv.app obj + +lemma mk''Hom_eq {Y : C} (f₁ f₂ : X ⟶ Y) (p : c.pt ⟶ Y) (hp₁ : c.inl ≫ p = f₁) + (hp₂ : c.inr ≫ p = f₂) : + mk''Hom F obj c hc hom f₁ f₂ = + (F.mapComp' c.inl p f₁ hp₁).hom.app obj ≫ (F.map p).map hom ≫ + (F.mapComp' c.inr p f₂ hp₂).inv.app obj := by + obtain rfl : p = (hc.desc <| BinaryCofan.mk f₁ f₂) := by + apply BinaryCofan.IsColimit.hom_ext hc <;> simp [hp₁, hp₂] + rfl + +def mk'' : F.DescentData (fun _ : PUnit.{t + 1} ↦ X) := + mk' (fun _ ↦ obj) (fun Y _ _ f₁ f₂ ↦ mk''Hom F obj c hc hom f₁ f₂) + (by + rintro Y' Y g ⟨_⟩ ⟨_⟩ f₁ f₂ f₁g f₂g hf₁g hf₂g + dsimp + sorry) sorry sorry + +end /-set_option maxHeartbeats 0 in def mk'' (obj : F.obj X) (c : BinaryCofan X X) From 79dc213e3729427455b6655816a1a491ffb5b633 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=ABl=20Riou?= Date: Sat, 26 Apr 2025 15:46:03 +0200 Subject: [PATCH 022/118] wip --- .../Bicategory/Functor/Cat.lean | 14 +++++ .../Sites/Descent/DescentData.lean | 56 +++++++++++++++---- 2 files changed, 60 insertions(+), 10 deletions(-) diff --git a/Mathlib/CategoryTheory/Bicategory/Functor/Cat.lean b/Mathlib/CategoryTheory/Bicategory/Functor/Cat.lean index 8073bb5e6fe470..8e7c06eb417db4 100644 --- a/Mathlib/CategoryTheory/Bicategory/Functor/Cat.lean +++ b/Mathlib/CategoryTheory/Bicategory/Functor/Cat.lean @@ -65,6 +65,20 @@ lemma mapComp'_inv_naturality : (F.mapComp' f g fg hfg).inv.app X ≫ (F.map fg).map a := (F.mapComp' f g fg hfg).inv.naturality a +@[reassoc (attr := simp)] +lemma mapComp'_naturality_1 : + (F.mapComp' f g fg hfg).inv.app X ≫ + (F.map fg).map a ≫ (F.mapComp' f g fg hfg).hom.app Y = + (F.map g).map ((F.map f).map a) := + NatIso.naturality_1 (F.mapComp' f g fg hfg) a + +@[reassoc (attr := simp)] +lemma mapComp'_naturality_2 : + (F.mapComp' f g fg hfg).hom.app X ≫ (F.map g).map ((F.map f).map a) ≫ + (F.mapComp' f g fg hfg).inv.app Y = + (F.map fg).map a := + NatIso.naturality_2 (F.mapComp' f g fg hfg) a + end end naturality diff --git a/Mathlib/CategoryTheory/Sites/Descent/DescentData.lean b/Mathlib/CategoryTheory/Sites/Descent/DescentData.lean index 6fc68ff344613c..a8ba5786043f05 100644 --- a/Mathlib/CategoryTheory/Sites/Descent/DescentData.lean +++ b/Mathlib/CategoryTheory/Sites/Descent/DescentData.lean @@ -253,16 +253,16 @@ variable {X : C} (obj : F.obj X) (c : BinaryCofan X X) (hp₁ : c.inl ≫ ι₁₂ = p₁) (hp₂ : c.inr ≫ ι₁₂ = p₂) (hp₃ : c.inr ≫ ι₂₃ = p₃) (hom : (F.map c.inl).obj obj ⟶ (F.map c.inr).obj obj) (hom_self : (F.map map).map hom = - (F.mapComp' c.inl map (𝟙 _)).inv.app obj ≫ - (F.mapComp' c.inr map (𝟙 _)).hom.app obj) + (F.mapComp' c.inl map (𝟙 X)).inv.app obj ≫ + (F.mapComp' c.inr map (𝟙 X)).hom.app obj) section def mk''Hom {Y : C} (f₁ f₂ : X ⟶ Y) : - (F.map f₁).obj obj ⟶ (F.map f₂).obj obj := by - let p : c.pt ⟶ Y := hc.desc <| BinaryCofan.mk f₁ f₂ - exact (F.mapComp' c.inl p f₁ (by simp [p])).hom.app obj ≫ (F.map p).map hom ≫ - (F.mapComp' c.inr p f₂ (by simp [p])).inv.app obj + (F.map f₁).obj obj ⟶ (F.map f₂).obj obj := + (F.mapComp' c.inl _ f₁ (by simp)).hom.app obj ≫ + (F.map (hc.desc (BinaryCofan.mk f₁ f₂))).map hom ≫ + (F.mapComp' c.inr _ f₂ (by simp)).inv.app obj lemma mk''Hom_eq {Y : C} (f₁ f₂ : X ⟶ Y) (p : c.pt ⟶ Y) (hp₁ : c.inl ≫ p = f₁) (hp₂ : c.inr ≫ p = f₂) : @@ -273,12 +273,48 @@ lemma mk''Hom_eq {Y : C} (f₁ f₂ : X ⟶ Y) (p : c.pt ⟶ Y) (hp₁ : c.inl apply BinaryCofan.IsColimit.hom_ext hc <;> simp [hp₁, hp₂] rfl +@[simp] +lemma mk''Hom_inl_inr : + mk''Hom F obj c hc hom c.inl c.inr = hom := by + simp [mk''Hom_eq F obj c hc hom c.inl c.inr (𝟙 _) (by simp) (by simp), + mapComp'_comp_id_hom_app, mapComp'_comp_id_inv_app] + +lemma mk''Hom_comp' {Y' Y : C} (g : Y ⟶ Y') (f₁ f₂ : X ⟶ Y) + (f₁g : X ⟶ Y') (f₂g : X ⟶ Y') (hf₁g : f₁ ≫ g = f₁g) (hf₂g : f₂ ≫ g = f₂g) : + mk''Hom F obj c hc hom f₁g f₂g = + (F.mapComp' f₁ g f₁g hf₁g).hom.app obj ≫ + (F.map g).map (mk''Hom F obj c hc hom f₁ f₂) ≫ + (F.mapComp' f₂ g f₂g hf₂g).inv.app obj := by + let p : c.pt ⟶ Y := hc.desc (BinaryCofan.mk f₁ f₂) + dsimp + rw [mk''Hom_eq _ _ _ _ _ _ _ p (by simp [p]) (by simp [p]), + mk''Hom_eq _ _ _ _ _ _ _ (p ≫ g) (by aesop_cat) (by aesop_cat)] + dsimp + simp only [Functor.map_comp, assoc] + rw [← F.mapComp'_hom_app_comp_mapComp'_hom_app_map_obj_assoc + _ _ _ _ (p ≫ g) _ (by aesop_cat) (by aesop_cat) (by aesop_cat), + F.map_map_mapComp'_inv_app_comp_mapComp'_inv_app + _ _ _ _ (p ≫ g) _ (by aesop_cat) (by aesop_cat) (by aesop_cat), + ← F.mapComp'_hom_naturality_assoc, Iso.hom_inv_id_app_assoc] + def mk'' : F.DescentData (fun _ : PUnit.{t + 1} ↦ X) := - mk' (fun _ ↦ obj) (fun Y _ _ f₁ f₂ ↦ mk''Hom F obj c hc hom f₁ f₂) - (by - rintro Y' Y g ⟨_⟩ ⟨_⟩ f₁ f₂ f₁g f₂g hf₁g hf₂g + mk' (fun _ ↦ obj) (fun _ _ _ ↦ mk''Hom F obj c hc hom) + (fun _ _ _ _ _ ↦ mk''Hom_comp' _ _ _ _ _ _) (by + rintro Y ⟨_⟩ f dsimp - sorry) sorry sorry + rw [mk''Hom_comp' F obj c hc hom (map ≫ f) c.inl c.inr f f + (by aesop_cat) (by aesop_cat), mk''Hom_inl_inr, + ← F.mapComp'_naturality_2_assoc map f (map ≫ f) rfl hom, + hom_self, Functor.map_comp_assoc, + F.mapComp'_inv_app_map_obj_comp_mapComp'_inv_app _ _ _ + (𝟙 X) _ _ (by aesop_cat) (by aesop_cat) (by aesop_cat), + ← Functor.map_comp_assoc, ← Functor.map_comp_assoc, assoc, + Iso.hom_inv_id_app, comp_id, + F.mapComp'_hom_app_comp_mapComp'_hom_app_map_obj_assoc + _ _ _ (𝟙 X) _ _ (by aesop_cat) (by aesop_cat) (by aesop_cat), + ← Functor.map_comp_assoc, Iso.hom_inv_id_app, + Functor.map_id, id_comp, Iso.hom_inv_id_app]) + sorry end From 9a5edfb0fc27549eded1c72e33487765062683fd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=ABl=20Riou?= Date: Sat, 26 Apr 2025 15:48:24 +0200 Subject: [PATCH 023/118] wip --- Mathlib/CategoryTheory/Sites/Descent/DescentData.lean | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/Mathlib/CategoryTheory/Sites/Descent/DescentData.lean b/Mathlib/CategoryTheory/Sites/Descent/DescentData.lean index a8ba5786043f05..5953979acd5bfe 100644 --- a/Mathlib/CategoryTheory/Sites/Descent/DescentData.lean +++ b/Mathlib/CategoryTheory/Sites/Descent/DescentData.lean @@ -300,7 +300,7 @@ lemma mk''Hom_comp' {Y' Y : C} (g : Y ⟶ Y') (f₁ f₂ : X ⟶ Y) def mk'' : F.DescentData (fun _ : PUnit.{t + 1} ↦ X) := mk' (fun _ ↦ obj) (fun _ _ _ ↦ mk''Hom F obj c hc hom) (fun _ _ _ _ _ ↦ mk''Hom_comp' _ _ _ _ _ _) (by - rintro Y ⟨_⟩ f + rintro Y ⟨⟩ f dsimp rw [mk''Hom_comp' F obj c hc hom (map ≫ f) c.inl c.inr f f (by aesop_cat) (by aesop_cat), mk''Hom_inl_inr, @@ -313,8 +313,10 @@ def mk'' : F.DescentData (fun _ : PUnit.{t + 1} ↦ X) := F.mapComp'_hom_app_comp_mapComp'_hom_app_map_obj_assoc _ _ _ (𝟙 X) _ _ (by aesop_cat) (by aesop_cat) (by aesop_cat), ← Functor.map_comp_assoc, Iso.hom_inv_id_app, - Functor.map_id, id_comp, Iso.hom_inv_id_app]) - sorry + Functor.map_id, id_comp, Iso.hom_inv_id_app]) (by + rintro Y ⟨⟩ ⟨⟩ ⟨⟩ f₁ f₂ f₃ + dsimp + sorry) end From b721e7ab31035cb492c62a65170671671b09b645 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=ABl=20Riou?= Date: Sat, 26 Apr 2025 21:37:31 +0200 Subject: [PATCH 024/118] removed sorry --- .../Sites/Descent/DescentData.lean | 199 +++--------------- 1 file changed, 31 insertions(+), 168 deletions(-) diff --git a/Mathlib/CategoryTheory/Sites/Descent/DescentData.lean b/Mathlib/CategoryTheory/Sites/Descent/DescentData.lean index 5953979acd5bfe..87c7e9554ff617 100644 --- a/Mathlib/CategoryTheory/Sites/Descent/DescentData.lean +++ b/Mathlib/CategoryTheory/Sites/Descent/DescentData.lean @@ -21,73 +21,6 @@ open Category Limits Bicategory namespace Pseudofunctor -/-set_option linter.unusedTactic false - ---variable {B C : Type*} [Bicategory B] [Bicategory C] (F : Pseudofunctor B C) --- {a b c : B} (f : a ⟶ b) (g : b ⟶ c) (fg : a ⟶ c) (hfg : f ≫ g = fg := by aesop_cat) - -section - -variable {a b c d : B} [IsLocallyDiscrete B] - (f : a ⟶ b) (g : b ⟶ c) (h : c ⟶ d) - (fg : a ⟶ c) (gh : b ⟶ d) (fgh : a ⟶ d) - (hfg : f ≫ g = fg) (hgh : g ≫ h = gh) (hfgh : f ≫ g ≫ h = fgh) - -@[reassoc] -lemma map₂_mapComp_hom_eq_mapComp'_hom - (f : a ⟶ b) (g : b ⟶ c) (h : c ⟶ d) : - F.map₂ (α_ f g h).hom ≫ (F.mapComp f (g ≫ h)).hom = - (F.mapComp' f (g ≫ h) ((f ≫ g) ≫ h)).hom := by - simp_rw [mapComp'_def] - simp [Subsingleton.elim ((α_ f g h).hom) (eqToHom (by simp))] - -@[reassoc] -lemma mapComp'_hom_comp_mapComp'_hom : - (F.mapComp' fg h fgh).hom ≫ (F.mapComp' f g fg hfg).hom ▷ F.map h = - (F.mapComp' f gh fgh).hom ≫ F.map f ◁ (F.mapComp' g h gh hgh).hom ≫ - (α_ _ _ _).inv := by - subst hfg hgh - obtain rfl : (f ≫ g) ≫ h = fgh := by aesop_cat - simp_rw [mapComp_rfl, mapComp_comp_mapComp] - simp [← map₂_mapComp_hom_eq_mapComp'_hom_assoc] - -@[reassoc] -lemma mapComp'_hom_of_comp_eq : - (F.mapComp' f gh fgh).hom = - (F.mapComp' fg h fgh).hom ≫ (F.mapComp' f g fg hfg).hom ▷ F.map h ≫ - (α_ _ _ _).hom ≫ F.map f ◁ (F.mapComp' g h gh hgh).inv := by - rw [F.mapComp'_hom_comp_mapComp'_hom_assoc f g h fg gh fgh hfg hgh hfgh] - simp - -@[reassoc] -lemma whiskerLeft_mapComp'_inv_comp_mapComp'_inv : - F.map f ◁ (F.mapComp' g h gh hgh).inv ≫ (F.mapComp' f gh fgh).inv = - (α_ _ _ _).inv ≫ (F.mapComp' f g fg hfg).inv ▷ F.map h ≫ - (F.mapComp' fg h fgh).inv := by - simp [← cancel_epi (F.map f ◁ (F.mapComp' g h gh hgh).hom), - ← cancel_epi (F.mapComp' f gh fgh).hom, - ← mapComp'_hom_comp_mapComp'_hom_assoc _ f g h fg gh fgh hfg hgh hfgh] - -@[reassoc] -lemma whiskerRight_mapComp'_inv_comp_mapComp'_inv : - (F.mapComp' f g fg hfg).inv ▷ F.map h ≫ (F.mapComp' fg h fgh).inv = - (α_ _ _ _).hom ≫ F.map f ◁ (F.mapComp' g h gh hgh).inv ≫ (F.mapComp' f gh fgh).inv - := by - sorry - -@[reassoc] -lemma mapComp'_inv_of_comp_eq : - (F.mapComp' f gh fgh).inv = - F.map f ◁ (F.mapComp' g h gh hgh).hom ≫ (α_ _ _ _).inv ≫ - (F.mapComp' f g fg hfg).inv ▷ F.map h ≫ - (F.mapComp' fg h fgh).inv := by - sorry - - -end - -end-/ - variable {C : Type u} [Bicategory.{w, v} C] (F : Pseudofunctor C Cat.{v', u'}) {ι : Type t} (X : ι → C) @@ -256,8 +189,6 @@ variable {X : C} (obj : F.obj X) (c : BinaryCofan X X) (F.mapComp' c.inl map (𝟙 X)).inv.app obj ≫ (F.mapComp' c.inr map (𝟙 X)).hom.app obj) -section - def mk''Hom {Y : C} (f₁ f₂ : X ⟶ Y) : (F.map f₁).obj obj ⟶ (F.map f₂).obj obj := (F.mapComp' c.inl _ f₁ (by simp)).hom.app obj ≫ @@ -297,109 +228,41 @@ lemma mk''Hom_comp' {Y' Y : C} (g : Y ⟶ Y') (f₁ f₂ : X ⟶ Y) _ _ _ _ (p ≫ g) _ (by aesop_cat) (by aesop_cat) (by aesop_cat), ← F.mapComp'_hom_naturality_assoc, Iso.hom_inv_id_app_assoc] -def mk'' : F.DescentData (fun _ : PUnit.{t + 1} ↦ X) := +include hom_self in +lemma mk''Hom_self {Y : C} (f : X ⟶ Y) : + mk''Hom F obj c hc hom f f = 𝟙 _ := by + rw [mk''Hom_comp' F obj c hc hom (map ≫ f) c.inl c.inr f f + (by aesop_cat) (by aesop_cat), mk''Hom_inl_inr, + ← F.mapComp'_naturality_2_assoc map f (map ≫ f) rfl hom, + hom_self, Functor.map_comp_assoc, + F.mapComp'_inv_app_map_obj_comp_mapComp'_inv_app _ _ _ + (𝟙 X) _ _ (by aesop_cat) (by aesop_cat) (by aesop_cat), + ← Functor.map_comp_assoc, ← Functor.map_comp_assoc, assoc, + Iso.hom_inv_id_app, comp_id, + F.mapComp'_hom_app_comp_mapComp'_hom_app_map_obj_assoc + _ _ _ (𝟙 X) _ _ (by aesop_cat) (by aesop_cat) (by aesop_cat), + ← Functor.map_comp_assoc, Iso.hom_inv_id_app, + Functor.map_id, id_comp, Iso.hom_inv_id_app] + +/-- Constructor for `Pseudofunctor.DescentData` for a family consisting +of only one object `X` equipped with a chosen binary and ternary coproduct. -/ +def mk'' + (hom_comp : mk''Hom F obj c hc hom p₁ p₂ ≫ mk''Hom F obj c hc hom p₂ p₃ = + mk''Hom F obj c hc hom p₁ p₃) : F.DescentData (fun _ : PUnit.{t + 1} ↦ X) := mk' (fun _ ↦ obj) (fun _ _ _ ↦ mk''Hom F obj c hc hom) (fun _ _ _ _ _ ↦ mk''Hom_comp' _ _ _ _ _ _) (by rintro Y ⟨⟩ f - dsimp - rw [mk''Hom_comp' F obj c hc hom (map ≫ f) c.inl c.inr f f - (by aesop_cat) (by aesop_cat), mk''Hom_inl_inr, - ← F.mapComp'_naturality_2_assoc map f (map ≫ f) rfl hom, - hom_self, Functor.map_comp_assoc, - F.mapComp'_inv_app_map_obj_comp_mapComp'_inv_app _ _ _ - (𝟙 X) _ _ (by aesop_cat) (by aesop_cat) (by aesop_cat), - ← Functor.map_comp_assoc, ← Functor.map_comp_assoc, assoc, - Iso.hom_inv_id_app, comp_id, - F.mapComp'_hom_app_comp_mapComp'_hom_app_map_obj_assoc - _ _ _ (𝟙 X) _ _ (by aesop_cat) (by aesop_cat) (by aesop_cat), - ← Functor.map_comp_assoc, Iso.hom_inv_id_app, - Functor.map_id, id_comp, Iso.hom_inv_id_app]) (by + exact mk''Hom_self F obj c hc map heq hom hom_self f) (by rintro Y ⟨⟩ ⟨⟩ ⟨⟩ f₁ f₂ f₃ - dsimp - sorry) - -end - -/-set_option maxHeartbeats 0 in -def mk'' (obj : F.obj X) (c : BinaryCofan X X) - (hc : IsColimit c) (map : c.pt ⟶ X) - (heq : map = hc.desc (BinaryCofan.mk (𝟙 _) (𝟙 _))) - {Z : C} {ι₁₂ ι₂₃ : c.pt ⟶ Z} - (h : IsPushout c.inl c.inr ι₂₃ ι₁₂) - (p₁ p₂ p₃ : X ⟶ Z) - (hp₁ : c.inl ≫ ι₁₂ = p₁) (hp₂ : c.inr ≫ ι₁₂ = p₂) (hp₃ : c.inr ≫ ι₂₃ = p₃) - (hom : (F.map c.inl).obj obj ⟶ (F.map c.inr).obj obj) - (hom_self : (F.map map).map hom = - (F.mapComp' c.inl map (𝟙 _) (by aesop_cat)).inv.app obj ≫ - (F.mapComp' c.inr map (𝟙 _) (by aesop_cat)).hom.app obj) : - F.DescentData (fun _ : PUnit ↦ X) := by - refine mk' (fun _ ↦ obj) (fun Y _ _ f₁ f₂ ↦ ?_) ?_ ?_ ?_ - · let p : c.pt ⟶ Y := hc.desc <| BinaryCofan.mk f₁ f₂ - exact (F.mapComp' c.inl p f₁ (by aesop_cat)).hom.app obj ≫ (F.map p).map hom ≫ - (F.mapComp' c.inr p f₂ (by aesop_cat)).inv.app obj - · intro Y Y' g _ _ f₁ f₂ - simp only [pair_obj_left, Functor.const_obj_obj, Cat.comp_obj, - pair_obj_right, Functor.map_comp, assoc] - simp_rw [← mapComp_rfl] - have := F.mapComp'_hom_comp_mapComp'_hom - c.inl (hc.desc (BinaryCofan.mk f₁ f₂)) g f₁ - (hc.desc (BinaryCofan.mk (f₁ ≫ g) (f₂ ≫ g))) - (f₁ ≫ g) (by simp) (by apply BinaryCofan.IsColimit.hom_ext hc <;> simp) (by simp) - have := congr($(this).app obj) - dsimp - dsimp at this - rw [← mapComp_rfl] - erw [reassoc_of% this] - congr 1 - rw [← mapComp_rfl] - have := F.whiskerRight_mapComp'_inv_comp_mapComp'_inv - c.inr (hc.desc (BinaryCofan.mk f₁ f₂)) g f₂ - (hc.desc (BinaryCofan.mk (f₁ ≫ g) (f₂ ≫ g))) - (f₂ ≫ g) (by simp) (by apply BinaryCofan.IsColimit.hom_ext hc <;> simp) (by simp) - have := congr($(this).app obj) - dsimp at this - erw [this] - simp only [← Category.assoc] - congr 1 - simp only [Category.assoc] - have := NatIso.naturality_2 (F.mapComp' (hc.desc (BinaryCofan.mk f₁ f₂)) g - (hc.desc (BinaryCofan.mk (f₁ ≫ g) (f₂ ≫ g))) - (by apply BinaryCofan.IsColimit.hom_ext hc <;> simp)) hom - dsimp at this - rw [← this] - congr 1 - simp_rw [← Category.assoc] - congr 1 - simp [Cat.associator_hom_app, Cat.associator_inv_app] - · intro Y _ f - dsimp - have hfac : hc.desc (BinaryCofan.mk f f) = map ≫ f := by - rw [heq] - apply BinaryCofan.IsColimit.hom_ext hc <;> simp - have homself' := (F.map f).congr_map hom_self - dsimp at homself' - have := F.mapComp'_hom_of_comp_eq c.inl map f (𝟙 X) - (hc.desc (BinaryCofan.mk f f)) f (by aesop_cat) (by aesop_cat) (by aesop_cat) - have h1 := congr($(this).app obj) - clear this - dsimp at h1 - have := F.mapComp'_inv_of_comp_eq c.inr map f (𝟙 X) - (hc.desc (BinaryCofan.mk f f)) f (by aesop_cat) (by aesop_cat) (by aesop_cat) - have h2 := congr($(this).app obj) - clear this - dsimp at h2 - rw [h1, h2] - simp only [NatTrans.naturality_assoc, Cat.comp_obj, Cat.comp_map, assoc, - Iso.inv_hom_id_app_assoc] - rw [homself'] - simp only [Cat.associator_hom_app, Cat.comp_obj, eqToHom_refl, Functor.map_comp, - Cat.associator_inv_app, id_comp, assoc] - simp_rw [← Functor.map_comp_assoc] - simp - · intro Y _ _ _ f₁ f₂ f₃ - dsimp - sorry-/ - + obtain ⟨φ, hφ₁, hφ₂, hφ₃⟩ : + ∃ (φ : Z ⟶ Y), c.inl ≫ ι₁₂ ≫ φ = f₁ ∧ + c.inr ≫ ι₁₂ ≫ φ = f₂ ∧ c.inr ≫ ι₂₃ ≫ φ = f₃ := + ⟨h.desc (hc.desc (BinaryCofan.mk f₂ f₃)) + (hc.desc (BinaryCofan.mk f₁ f₂)) (by simp), by simp, by simp, by simp⟩ + simp only [mk''Hom_comp' F obj c hc hom φ p₁ p₂ f₁ f₂ (by aesop_cat) (by aesop_cat), + mk''Hom_comp' F obj c hc hom φ p₂ p₃ f₂ f₃ (by aesop_cat) (by aesop_cat), + mk''Hom_comp' F obj c hc hom φ p₁ p₃ f₁ f₃ (by aesop_cat) (by aesop_cat), + assoc, Iso.inv_hom_id_app_assoc, ← Functor.map_comp_assoc, hom_comp]) end Unique From 4ca75382f5e25ea7194089999b7f5d8cbd28bc8e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=ABl=20Riou?= Date: Sat, 26 Apr 2025 23:05:44 +0200 Subject: [PATCH 025/118] more lemmas --- .../Bicategory/Functor/Cat.lean | 77 ++++++++++++++++++- 1 file changed, 76 insertions(+), 1 deletion(-) diff --git a/Mathlib/CategoryTheory/Bicategory/Functor/Cat.lean b/Mathlib/CategoryTheory/Bicategory/Functor/Cat.lean index a01d33e61fe5ae..8e7c06eb417db4 100644 --- a/Mathlib/CategoryTheory/Bicategory/Functor/Cat.lean +++ b/Mathlib/CategoryTheory/Bicategory/Functor/Cat.lean @@ -22,12 +22,69 @@ open Bicategory namespace Pseudofunctor -variable {B : Type*} [Bicategory B] [Strict B] (F : Pseudofunctor B Cat) +variable {B : Type*} [Bicategory B] (F : Pseudofunctor B Cat) attribute [local simp] Cat.leftUnitor_hom_app Cat.rightUnitor_hom_app Cat.leftUnitor_inv_app Cat.rightUnitor_inv_app Cat.associator_hom_app Cat.associator_inv_app +section naturality + +variable {b₀ b₁ b₂ : B} {X Y : F.obj b₀} + +section + +variable (f : b₀ ⟶ b₀) (hf : f = 𝟙 b₀) (a : X ⟶ Y) + +@[reassoc (attr := simp)] +lemma mapId'_hom_naturality : + (F.map f).map a ≫ (F.mapId' f hf).hom.app Y = (F.mapId' f hf).hom.app X ≫ a := + (F.mapId' f hf).hom.naturality a + +@[reassoc] +lemma mapId'_inv_naturality : + (F.mapId' f hf).inv.app X ≫ (F.map f).map a = a ≫ (F.mapId' f hf).inv.app Y := + ((F.mapId' f hf).inv.naturality a).symm + +end + +section + +variable (f : b₀ ⟶ b₁) (g : b₁ ⟶ b₂) (fg : b₀ ⟶ b₂) + (hfg : f ≫ g = fg) (a : X ⟶ Y) + +@[reassoc (attr := simp)] +lemma mapComp'_hom_naturality : + (F.map fg).map a ≫ (F.mapComp' f g fg hfg).hom.app Y = + (F.mapComp' f g fg hfg).hom.app X ≫ (F.map g).map ((F.map f).map a) := + (F.mapComp' f g fg hfg).hom.naturality a + +@[reassoc (attr := simp)] +lemma mapComp'_inv_naturality : + (F.map g).map ((F.map f).map a) ≫ (F.mapComp' f g fg hfg).inv.app Y = + (F.mapComp' f g fg hfg).inv.app X ≫ (F.map fg).map a := + (F.mapComp' f g fg hfg).inv.naturality a + +@[reassoc (attr := simp)] +lemma mapComp'_naturality_1 : + (F.mapComp' f g fg hfg).inv.app X ≫ + (F.map fg).map a ≫ (F.mapComp' f g fg hfg).hom.app Y = + (F.map g).map ((F.map f).map a) := + NatIso.naturality_1 (F.mapComp' f g fg hfg) a + +@[reassoc (attr := simp)] +lemma mapComp'_naturality_2 : + (F.mapComp' f g fg hfg).hom.app X ≫ (F.map g).map ((F.map f).map a) ≫ + (F.mapComp' f g fg hfg).inv.app Y = + (F.map fg).map a := + NatIso.naturality_2 (F.mapComp' f g fg hfg) a + +end + +end naturality + +variable [Strict B] + section unitality variable {b₀ b₁ : B} (f : b₀ ⟶ b₁) (X : F.obj b₀) @@ -97,6 +154,24 @@ lemma map_map_mapComp'_inv_app_comp_mapComp'_inv_app (hf : f₀₂ ≫ f₂₃ = simpa using NatTrans.congr_app (F.mapComp'_inv_whiskerRight_comp_mapComp'_inv f₀₁ f₁₂ f₂₃ f₀₂ f₁₃ f h₀₂ h₁₃ hf) X +@[reassoc] +lemma mapComp'₀₁₃_inv_app (hf : f₀₁ ≫ f₁₃ = f) (X : F.obj b₀) : + (F.mapComp' f₀₁ f₁₃ f hf).inv.app X = + (F.mapComp' f₁₂ f₂₃ f₁₃ h₁₃).hom.app ((F.map f₀₁).obj X) ≫ + (F.map f₂₃).map ((F.mapComp' f₀₁ f₁₂ f₀₂ h₀₂).inv.app X) ≫ + (F.mapComp' f₀₂ f₂₃ f).inv.app X := by + rw [← F.mapComp'_inv_app_comp_mapComp'_hom_app_assoc _ _ _ _ _ _ _ _ hf X, + Iso.hom_inv_id_app, Category.comp_id] + +@[reassoc] +lemma mapComp'₀₁₃_hom_app (hf : f₀₁ ≫ f₁₃ = f) (X : F.obj b₀) : + (F.mapComp' f₀₁ f₁₃ f hf).hom.app X = + (F.mapComp' f₀₂ f₂₃ f).hom.app X ≫ + (F.map f₂₃).map ((F.mapComp' f₀₁ f₁₂ f₀₂ h₀₂).hom.app X) ≫ + (F.mapComp' f₁₂ f₂₃ f₁₃ h₁₃).inv.app ((F.map f₀₁).obj X) := by + rw [← F.mapComp'_hom_app_comp_mapComp'_hom_app_map_obj_assoc _ _ _ _ _ _ h₀₂ h₁₃ hf X] + simp + end associativity end Pseudofunctor From 1409282f7d4f55312f3bf3e2a7463d283a7ca35f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=ABl=20Riou?= Date: Sun, 27 Apr 2025 14:40:33 +0200 Subject: [PATCH 026/118] fix --- Mathlib/CategoryTheory/Bicategory/Functor/Cat.lean | 8 ++++---- Mathlib/CategoryTheory/Sites/Descent/DescentData.lean | 3 ++- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/Mathlib/CategoryTheory/Bicategory/Functor/Cat.lean b/Mathlib/CategoryTheory/Bicategory/Functor/Cat.lean index 8e7c06eb417db4..36601762449771 100644 --- a/Mathlib/CategoryTheory/Bicategory/Functor/Cat.lean +++ b/Mathlib/CategoryTheory/Bicategory/Functor/Cat.lean @@ -36,7 +36,7 @@ section variable (f : b₀ ⟶ b₀) (hf : f = 𝟙 b₀) (a : X ⟶ Y) -@[reassoc (attr := simp)] +@[reassoc] lemma mapId'_hom_naturality : (F.map f).map a ≫ (F.mapId' f hf).hom.app Y = (F.mapId' f hf).hom.app X ≫ a := (F.mapId' f hf).hom.naturality a @@ -53,7 +53,7 @@ section variable (f : b₀ ⟶ b₁) (g : b₁ ⟶ b₂) (fg : b₀ ⟶ b₂) (hfg : f ≫ g = fg) (a : X ⟶ Y) -@[reassoc (attr := simp)] +@[reassoc] lemma mapComp'_hom_naturality : (F.map fg).map a ≫ (F.mapComp' f g fg hfg).hom.app Y = (F.mapComp' f g fg hfg).hom.app X ≫ (F.map g).map ((F.map f).map a) := @@ -65,14 +65,14 @@ lemma mapComp'_inv_naturality : (F.mapComp' f g fg hfg).inv.app X ≫ (F.map fg).map a := (F.mapComp' f g fg hfg).inv.naturality a -@[reassoc (attr := simp)] +@[reassoc] lemma mapComp'_naturality_1 : (F.mapComp' f g fg hfg).inv.app X ≫ (F.map fg).map a ≫ (F.mapComp' f g fg hfg).hom.app Y = (F.map g).map ((F.map f).map a) := NatIso.naturality_1 (F.mapComp' f g fg hfg) a -@[reassoc (attr := simp)] +@[reassoc] lemma mapComp'_naturality_2 : (F.mapComp' f g fg hfg).hom.app X ≫ (F.map g).map ((F.map f).map a) ≫ (F.mapComp' f g fg hfg).inv.app Y = diff --git a/Mathlib/CategoryTheory/Sites/Descent/DescentData.lean b/Mathlib/CategoryTheory/Sites/Descent/DescentData.lean index 87c7e9554ff617..5a7e6ad5902d27 100644 --- a/Mathlib/CategoryTheory/Sites/Descent/DescentData.lean +++ b/Mathlib/CategoryTheory/Sites/Descent/DescentData.lean @@ -242,7 +242,8 @@ lemma mk''Hom_self {Y : C} (f : X ⟶ Y) : F.mapComp'_hom_app_comp_mapComp'_hom_app_map_obj_assoc _ _ _ (𝟙 X) _ _ (by aesop_cat) (by aesop_cat) (by aesop_cat), ← Functor.map_comp_assoc, Iso.hom_inv_id_app, - Functor.map_id, id_comp, Iso.hom_inv_id_app] + Functor.map_id] + simp only [id_comp, Iso.hom_inv_id_app] /-- Constructor for `Pseudofunctor.DescentData` for a family consisting of only one object `X` equipped with a chosen binary and ternary coproduct. -/ From fdfad5b9e3d69001e26c494259ba348c840438aa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=ABl=20Riou?= Date: Sun, 27 Apr 2025 14:41:55 +0200 Subject: [PATCH 027/118] fix --- Mathlib/CategoryTheory/Bicategory/Functor/Cat.lean | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Mathlib/CategoryTheory/Bicategory/Functor/Cat.lean b/Mathlib/CategoryTheory/Bicategory/Functor/Cat.lean index 8e7c06eb417db4..09815897abce45 100644 --- a/Mathlib/CategoryTheory/Bicategory/Functor/Cat.lean +++ b/Mathlib/CategoryTheory/Bicategory/Functor/Cat.lean @@ -36,7 +36,7 @@ section variable (f : b₀ ⟶ b₀) (hf : f = 𝟙 b₀) (a : X ⟶ Y) -@[reassoc (attr := simp)] +@[reassoc] lemma mapId'_hom_naturality : (F.map f).map a ≫ (F.mapId' f hf).hom.app Y = (F.mapId' f hf).hom.app X ≫ a := (F.mapId' f hf).hom.naturality a @@ -53,26 +53,26 @@ section variable (f : b₀ ⟶ b₁) (g : b₁ ⟶ b₂) (fg : b₀ ⟶ b₂) (hfg : f ≫ g = fg) (a : X ⟶ Y) -@[reassoc (attr := simp)] +@[reassoc] lemma mapComp'_hom_naturality : (F.map fg).map a ≫ (F.mapComp' f g fg hfg).hom.app Y = (F.mapComp' f g fg hfg).hom.app X ≫ (F.map g).map ((F.map f).map a) := (F.mapComp' f g fg hfg).hom.naturality a -@[reassoc (attr := simp)] +@[reassoc] lemma mapComp'_inv_naturality : (F.map g).map ((F.map f).map a) ≫ (F.mapComp' f g fg hfg).inv.app Y = (F.mapComp' f g fg hfg).inv.app X ≫ (F.map fg).map a := (F.mapComp' f g fg hfg).inv.naturality a -@[reassoc (attr := simp)] +@[reassoc] lemma mapComp'_naturality_1 : (F.mapComp' f g fg hfg).inv.app X ≫ (F.map fg).map a ≫ (F.mapComp' f g fg hfg).hom.app Y = (F.map g).map ((F.map f).map a) := NatIso.naturality_1 (F.mapComp' f g fg hfg) a -@[reassoc (attr := simp)] +@[reassoc] lemma mapComp'_naturality_2 : (F.mapComp' f g fg hfg).hom.app X ≫ (F.map g).map ((F.map f).map a) ≫ (F.mapComp' f g fg hfg).inv.app Y = From 1321f70f5ef5f221fb947de33dd78cbd88b5e0ce Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=ABl=20Riou?= Date: Sun, 27 Apr 2025 14:50:58 +0200 Subject: [PATCH 028/118] wip --- Mathlib.lean | 2 +- .../{DescentData.lean => CodescentData.lean} | 51 ++++++++++++------- 2 files changed, 34 insertions(+), 19 deletions(-) rename Mathlib/CategoryTheory/Sites/Descent/{DescentData.lean => CodescentData.lean} (87%) diff --git a/Mathlib.lean b/Mathlib.lean index 5ffc60256ec3ec..2a814965a42e5b 100644 --- a/Mathlib.lean +++ b/Mathlib.lean @@ -2451,7 +2451,7 @@ import Mathlib.CategoryTheory.Sites.CoversTop import Mathlib.CategoryTheory.Sites.DenseSubsite.Basic import Mathlib.CategoryTheory.Sites.DenseSubsite.InducedTopology import Mathlib.CategoryTheory.Sites.DenseSubsite.SheafEquiv -import Mathlib.CategoryTheory.Sites.Descent.DescentData +import Mathlib.CategoryTheory.Sites.Descent.CodescentData import Mathlib.CategoryTheory.Sites.EffectiveEpimorphic import Mathlib.CategoryTheory.Sites.EpiMono import Mathlib.CategoryTheory.Sites.EqualizerSheafCondition diff --git a/Mathlib/CategoryTheory/Sites/Descent/DescentData.lean b/Mathlib/CategoryTheory/Sites/Descent/CodescentData.lean similarity index 87% rename from Mathlib/CategoryTheory/Sites/Descent/DescentData.lean rename to Mathlib/CategoryTheory/Sites/Descent/CodescentData.lean index 5a7e6ad5902d27..fa7889e58988e2 100644 --- a/Mathlib/CategoryTheory/Sites/Descent/DescentData.lean +++ b/Mathlib/CategoryTheory/Sites/Descent/CodescentData.lean @@ -9,7 +9,7 @@ import Mathlib.CategoryTheory.Bicategory.Functor.Cat import Mathlib.CategoryTheory.Bicategory.LocallyDiscrete /-! -# Descent data +# Codescent data -/ @@ -24,7 +24,22 @@ namespace Pseudofunctor variable {C : Type u} [Bicategory.{w, v} C] (F : Pseudofunctor C Cat.{v', u'}) {ι : Type t} (X : ι → C) -structure DescentData where +/- +Let us use `CodescentData` for a "covariant" pseudofunctor `F` to `Cat`. +The "codescent" property for `F`, a family of objects `X : ι → C` and +an initial object `X₀`, there is an equivalence of categories +(induced by `toCodescentDataOfIsInitial`) from `F.obj X₀` to +`F.CodescentData X`. + +We shall use the name `DescentData` for the case of a pseudofunctor +from the locally discrete bicategory associated to the opposite category +of `C`, especially when `C` is endowed with a Grothendieck topology, and +for this we shall apply `CodescentData` to the restriction of the +pseudofunctor to `LocallyDiscrete (Over X)ᵒᵖ` for `X : C`. + +-/ + +structure CodescentData where obj (i : ι) : F.obj (X i) iso ⦃Y : C⦄ ⦃i₁ i₂ : ι⦄ (f₁ : X i₁ ⟶ Y) (f₂ : X i₂ ⟶ Y) : (F.map f₁).obj (obj i₁) ≅ (F.map f₂).obj (obj i₂) @@ -36,7 +51,7 @@ structure DescentData where iso_trans ⦃Y : C⦄ ⦃i₁ i₂ i₃ : ι⦄ (f₁ : X i₁ ⟶ Y) (f₂ : X i₂ ⟶ Y) (f₃ : X i₃ ⟶ Y) : iso f₁ f₂ ≪≫ iso f₂ f₃ = iso f₁ f₃ := by aesop_cat -namespace DescentData +namespace CodescentData variable {F X} @@ -52,7 +67,7 @@ def mk' (obj : ∀ i, F.obj (X i)) (F.mapComp' f₂ g f₂g).inv.app _ := by aesop_cat) (hom_self : ∀ ⦃Y : C⦄ ⦃i : ι⦄ (f : X i ⟶ Y), hom f f = 𝟙 _ := by aesop_cat) (comp_hom : ∀ ⦃Y : C⦄ ⦃i₁ i₂ i₃ : ι⦄ (f₁ : X i₁ ⟶ Y) (f₂ : X i₂ ⟶ Y) (f₃ : X i₃ ⟶ Y), - hom f₁ f₂ ≫ hom f₂ f₃ = hom f₁ f₃ := by aesop_cat) : F.DescentData X where + hom f₁ f₂ ≫ hom f₂ f₃ = hom f₁ f₃ := by aesop_cat) : F.CodescentData X where obj := obj iso Y i₁ i₂ f₁ f₂ := { hom := hom f₁ f₂ @@ -63,7 +78,7 @@ def mk' (obj : ∀ i, F.obj (X i)) section -variable (D : F.DescentData X) +variable (D : F.CodescentData X) @[simp] lemma iso_hom_iso_hom ⦃Y : C⦄ ⦃i₁ i₂ i₃ : ι⦄ @@ -92,7 +107,7 @@ lemma iso_inv ⦃Y : C⦄ ⦃i₁ i₂ : ι⦄ end @[ext] -structure Hom (D₁ D₂ : F.DescentData X) where +structure Hom (D₁ D₂ : F.CodescentData X) where hom (i : ι) : D₁.obj i ⟶ D₂.obj i comm ⦃Y : C⦄ ⦃i₁ i₂ : ι⦄ (f₁ : X i₁ ⟶ Y) (f₂ : X i₂ ⟶ Y) : (F.map f₁).map (hom i₁) ≫ (D₂.iso f₁ f₂).hom = @@ -100,7 +115,7 @@ structure Hom (D₁ D₂ : F.DescentData X) where attribute [reassoc (attr := simp)] Hom.comm -instance : Category (F.DescentData X) where +instance : Category (F.CodescentData X) where Hom := Hom id D := { hom i := 𝟙 _ } comp {D₁ D₂ D₃} φ ψ := @@ -110,21 +125,21 @@ instance : Category (F.DescentData X) where rw [ψ.comm, φ.comm_assoc] } @[ext] -lemma hom_ext {D₁ D₂ : F.DescentData X} {f g : D₁ ⟶ D₂} +lemma hom_ext {D₁ D₂ : F.CodescentData X} {f g : D₁ ⟶ D₂} (h : ∀ i, f.hom i = g.hom i) : f = g := Hom.ext (funext h) @[simp] -lemma id_hom (D : F.DescentData X) (i : ι) : Hom.hom (𝟙 D) i = 𝟙 _ := rfl +lemma id_hom (D : F.CodescentData X) (i : ι) : Hom.hom (𝟙 D) i = 𝟙 _ := rfl @[simp, reassoc] -lemma comp_hom {D₁ D₂ D₃ : F.DescentData X} (f : D₁ ⟶ D₂) (g : D₂ ⟶ D₃) (i : ι) : +lemma comp_hom {D₁ D₂ D₃ : F.CodescentData X} (f : D₁ ⟶ D₂) (g : D₂ ⟶ D₃) (i : ι) : (f ≫ g).hom i = f.hom i ≫ g.hom i := rfl namespace Hom -variable {D₁ D₂ : F.DescentData X} (f : D₁ ⟶ D₂) +variable {D₁ D₂ : F.CodescentData X} (f : D₁ ⟶ D₂) @[reassoc] lemma map_map ⦃Y : C⦄ ⦃i₁ i₂ : ι⦄ (f₁ : X i₁ ⟶ Y) (f₂ : X i₂ ⟶ Y) : @@ -140,12 +155,12 @@ lemma map_map' ⦃Y : C⦄ ⦃i₁ i₂ : ι⦄ (f₁ : X i₁ ⟶ Y) (f₂ : X end Hom -end DescentData +end CodescentData variable [Strict C] -def toDescentDataOfIsInitial (X₀ : C) (hX₀ : IsInitial X₀) : - F.obj X₀ ⥤ F.DescentData X where +def toCodescentDataOfIsInitial (X₀ : C) (hX₀ : IsInitial X₀) : + F.obj X₀ ⥤ F.CodescentData X where obj A := { obj i := (F.map (hX₀.to (X i))).obj A iso Y i₁ i₂ f₁ f₂ := @@ -173,7 +188,7 @@ def toDescentDataOfIsInitial (X₀ : C) (hX₀ : IsInitial X₀) : map_id := by intros; ext; dsimp; simp only [Functor.map_id] map_comp := by intros; ext; dsimp; simp only [Functor.map_comp] -namespace DescentData +namespace CodescentData section Unique @@ -245,11 +260,11 @@ lemma mk''Hom_self {Y : C} (f : X ⟶ Y) : Functor.map_id] simp only [id_comp, Iso.hom_inv_id_app] -/-- Constructor for `Pseudofunctor.DescentData` for a family consisting +/-- Constructor for `Pseudofunctor.CodescentData` for a family consisting of only one object `X` equipped with a chosen binary and ternary coproduct. -/ def mk'' (hom_comp : mk''Hom F obj c hc hom p₁ p₂ ≫ mk''Hom F obj c hc hom p₂ p₃ = - mk''Hom F obj c hc hom p₁ p₃) : F.DescentData (fun _ : PUnit.{t + 1} ↦ X) := + mk''Hom F obj c hc hom p₁ p₃) : F.CodescentData (fun _ : PUnit.{t + 1} ↦ X) := mk' (fun _ ↦ obj) (fun _ _ _ ↦ mk''Hom F obj c hc hom) (fun _ _ _ _ _ ↦ mk''Hom_comp' _ _ _ _ _ _) (by rintro Y ⟨⟩ f @@ -267,7 +282,7 @@ def mk'' end Unique -end DescentData +end CodescentData end Pseudofunctor From 7f25b3061fd43a9c3a0d4b16aa6301476ef51907 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=ABl=20Riou?= Date: Sun, 27 Apr 2025 14:51:35 +0200 Subject: [PATCH 029/118] typo --- Mathlib/CategoryTheory/Sites/Descent/CodescentData.lean | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Mathlib/CategoryTheory/Sites/Descent/CodescentData.lean b/Mathlib/CategoryTheory/Sites/Descent/CodescentData.lean index fa7889e58988e2..e6b876bdddb09e 100644 --- a/Mathlib/CategoryTheory/Sites/Descent/CodescentData.lean +++ b/Mathlib/CategoryTheory/Sites/Descent/CodescentData.lean @@ -25,7 +25,7 @@ variable {C : Type u} [Bicategory.{w, v} C] (F : Pseudofunctor C Cat.{v', u'}) {ι : Type t} (X : ι → C) /- -Let us use `CodescentData` for a "covariant" pseudofunctor `F` to `Cat`. +Let us use `CodescentData` for a "covariant" pseudofunctor from `F` to `Cat`. The "codescent" property for `F`, a family of objects `X : ι → C` and an initial object `X₀`, there is an equivalence of categories (induced by `toCodescentDataOfIsInitial`) from `F.obj X₀` to From af25fe704b2a5417d83e485502f3d746896a51e7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=ABl=20Riou?= Date: Sun, 27 Apr 2025 17:09:17 +0200 Subject: [PATCH 030/118] feat(CategoryTheory): descent of morphisms for a pseudofunctor --- Mathlib.lean | 1 + .../Bicategory/Functor/Cat.lean | 7 ++ .../Sites/Descent/Morphisms.lean | 107 ++++++++++++++++++ 3 files changed, 115 insertions(+) create mode 100644 Mathlib/CategoryTheory/Sites/Descent/Morphisms.lean diff --git a/Mathlib.lean b/Mathlib.lean index 231734e3437aaf..150733a3836c7e 100644 --- a/Mathlib.lean +++ b/Mathlib.lean @@ -2451,6 +2451,7 @@ import Mathlib.CategoryTheory.Sites.CoversTop import Mathlib.CategoryTheory.Sites.DenseSubsite.Basic import Mathlib.CategoryTheory.Sites.DenseSubsite.InducedTopology import Mathlib.CategoryTheory.Sites.DenseSubsite.SheafEquiv +import Mathlib.CategoryTheory.Sites.Descent.Morphisms import Mathlib.CategoryTheory.Sites.EffectiveEpimorphic import Mathlib.CategoryTheory.Sites.EpiMono import Mathlib.CategoryTheory.Sites.EqualizerSheafCondition diff --git a/Mathlib/CategoryTheory/Bicategory/Functor/Cat.lean b/Mathlib/CategoryTheory/Bicategory/Functor/Cat.lean index 09815897abce45..77241d4490cb4b 100644 --- a/Mathlib/CategoryTheory/Bicategory/Functor/Cat.lean +++ b/Mathlib/CategoryTheory/Bicategory/Functor/Cat.lean @@ -172,6 +172,13 @@ lemma mapComp'₀₁₃_hom_app (hf : f₀₁ ≫ f₁₃ = f) (X : F.obj b₀) rw [← F.mapComp'_hom_app_comp_mapComp'_hom_app_map_obj_assoc _ _ _ _ _ _ h₀₂ h₁₃ hf X] simp +@[reassoc] +lemma mapComp'_inv_app_comp_mapComp'_hom_app' (hf : f₀₁ ≫ f₁₃ = f) (X : F.obj b₀) : + (F.mapComp' f₀₂ f₂₃ f).inv.app X ≫ (F.mapComp' f₀₁ f₁₃ f).hom.app X = + (F.map f₂₃).map ((F.mapComp' f₀₁ f₁₂ f₀₂ h₀₂).hom.app X) ≫ + (F.mapComp' f₁₂ f₂₃ f₁₃ h₁₃).inv.app ((F.map f₀₁).obj X) := by + simp [F.mapComp'₀₁₃_hom_app f₀₁ f₁₂ f₂₃ f₀₂ f₁₃ f h₀₂ h₁₃ hf] + end associativity end Pseudofunctor diff --git a/Mathlib/CategoryTheory/Sites/Descent/Morphisms.lean b/Mathlib/CategoryTheory/Sites/Descent/Morphisms.lean new file mode 100644 index 00000000000000..1fad68911786a3 --- /dev/null +++ b/Mathlib/CategoryTheory/Sites/Descent/Morphisms.lean @@ -0,0 +1,107 @@ +/- +Copyright (c) 2025 Joël Riou. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Joël Riou +-/ +import Mathlib.CategoryTheory.Bicategory.Functor.Cat +import Mathlib.CategoryTheory.Bicategory.LocallyDiscrete +import Mathlib.CategoryTheory.Sites.Sheaf +import Mathlib.CategoryTheory.Sites.Over + +/-! +# Descent of morphisms + +Let `C` be a category and `F : Pseudofunctor (LocallyDiscrete Cᵒᵖ) Cat`. +Given `S : C`, and objects `M` and `N` in `F.obj (.mk (op S))`, +we define a presheaf of types `F.presheafHom M N` on the category `Over S`: +its sections on a object `T : Over S` corresponding to a morphism `p : X ⟶ S` +are the type of morphisms `p^* M ⟶ p^* N`. We shall say that +`F` satisfies the descent of morphisms for a Grothendieck topology `J` +if these presheaves are all sheaves (typeclass `F.HasDescentForMorphisms J`). + +## TODO + +* Relate this notion to the property that for any covering family `f i : X i ⟶ S` +for `J`, the functor `F.obj S` to the category of objects in `F.obj (X i)` for all `i` +equipped with a descent datum is fully faithful. +* Define a typeclass `HasEffectiveDescent` extending `HasDescentForMorphisms` +by saying that the functors mentionned above are essentially surjective. + +-/ + +universe v' v u' u + +namespace CategoryTheory + +open Opposite Bicategory + +namespace Pseudofunctor + +variable {C : Type u} [Category.{v} C] (F : Pseudofunctor (LocallyDiscrete Cᵒᵖ) Cat.{v', u'}) + {S : C} (M N : F.obj (.mk (op S))) + +/-- If `F` is a pseudofunctor from `Cᵒᵖ` to `Cat`, and `M` and `N` are objects in +`F.obj (.mk (op S))`, this is the presheaf of morphisms from `M` to `N`: it sends +an object `T : Over S` corresponding to a morphism `p : X ⟶ S` to the type +of morphisms $$p^* M ⟶ p^* N$$. -/ +@[simps -isSimp obj map] +def presheafHom : (Over S)ᵒᵖ ⥤ Type v' where + obj T := (F.map (.toLoc T.unop.hom.op)).obj M ⟶ (F.map (.toLoc T.unop.hom.op)).obj N + map {T₁ T₂} p f := by + letI e := F.mapComp' (.toLoc T₁.unop.hom.op) (.toLoc p.unop.left.op) + (.toLoc T₂.unop.hom.op) (by rw [← Quiver.Hom.comp_toLoc, ← op_comp, Over.w p.unop]) + exact e.hom.app M ≫ (F.map (.toLoc p.unop.left.op)).map f ≫ e.inv.app N + map_id T := by + ext + simp [mapComp'_comp_id_hom_app, mapComp'_comp_id_inv_app] + map_comp {T₁ T₂ T₃} p q := by + ext f + dsimp + rw [Functor.map_comp_assoc, Functor.map_comp_assoc, + F.map_map_mapComp'_inv_app_comp_mapComp'_inv_app _ _ _ _ _ _ + (by rw [← Quiver.Hom.comp_toLoc, ← op_comp, Over.w p.unop]) rfl + (by rw [← Quiver.Hom.comp_toLoc, ← op_comp, Over.w q.unop]), + F.mapComp'_hom_app_comp_map_map_mapComp'_hom_app_assoc _ _ _ _ _ _ + (by rw [← Quiver.Hom.comp_toLoc, ← op_comp, Over.w p.unop]) rfl + (by rw [← Quiver.Hom.comp_toLoc, ← op_comp, Over.w q.unop]), + ← mapComp'_hom_naturality_assoc, Iso.hom_inv_id_app_assoc] + +/-- Compatiblity isomorphism of `Pseudofunctor.presheafHom` with the "restrictions". -/ +def overMapCompPresheafHomIso {S' : C} (q : S' ⟶ S) : + (Over.map q).op ⋙ F.presheafHom M N ≅ + F.presheafHom ((F.map (.toLoc q.op)).obj M) ((F.map (.toLoc q.op)).obj N) := + NatIso.ofComponents (fun T ↦ Equiv.toIso (by + letI e := F.mapComp' (.toLoc q.op) (.toLoc T.unop.hom.op) + (.toLoc ((Over.map q).obj T.unop).hom.op) + exact (Iso.homFromEquiv (e.app M)).trans (Iso.homToEquiv (e.app N)))) (by + rintro ⟨T₁⟩ ⟨T₂⟩ ⟨f⟩ + ext g + dsimp + erw [Iso.homToEquiv_apply, Iso.homToEquiv_apply, + Iso.homFromEquiv_apply, Iso.homFromEquiv_apply] + dsimp [presheafHom_obj, presheafHom_map] + simp only [Functor.map_comp, Category.assoc] + rw [F.mapComp'_inv_app_comp_mapComp'_hom_app_assoc _ _ _ _ _ _ rfl _ rfl, + F.mapComp'_inv_app_comp_mapComp'_hom_app' _ _ _ _ _ _ _ _ rfl]) + +/-- The property that a pseudofunctor `F : Pseudofunctor (LocallyDiscrete Cᵒᵖ) Cat` +satisfies the descent property for morphisms. -/ +class HasDescentForMorphisms (J : GrothendieckTopology C) : Prop where + isSheaf {S : C} (M N : F.obj (.mk (op S))) : + Presheaf.IsSheaf (J.over S) (F.presheafHom M N) + +variable (J : GrothendieckTopology C) [F.HasDescentForMorphisms J] + +/-- If `F` is a pseudofunctor from `Cᵒᵖ` to `Cat` which satisfies the descent +of morphisms for a Grothendieck topology `J`, and `M` and `N` are to objects in +`F.obj (.mk (op S))`, this is the esheaf of morphisms from `M` to `N`: it sends +an object `T : Over S` corresponding to a morphism `p : X ⟶ S` to the type +of morphisms $$p^* M ⟶ p^* N$$. -/ +@[simps] +def sheafHom : Sheaf (J.over S) (Type v') where + val := F.presheafHom M N + cond := HasDescentForMorphisms.isSheaf _ _ + +end Pseudofunctor + +end CategoryTheory From 600c3f7a4efed1373ffe0552ac9e2d40551f9ca2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=ABl=20Riou?= Date: Sun, 27 Apr 2025 17:21:29 +0200 Subject: [PATCH 031/118] typo --- Mathlib/CategoryTheory/Sites/Descent/Morphisms.lean | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Mathlib/CategoryTheory/Sites/Descent/Morphisms.lean b/Mathlib/CategoryTheory/Sites/Descent/Morphisms.lean index 1fad68911786a3..a97cb10c6d380a 100644 --- a/Mathlib/CategoryTheory/Sites/Descent/Morphisms.lean +++ b/Mathlib/CategoryTheory/Sites/Descent/Morphisms.lean @@ -24,7 +24,7 @@ if these presheaves are all sheaves (typeclass `F.HasDescentForMorphisms J`). * Relate this notion to the property that for any covering family `f i : X i ⟶ S` for `J`, the functor `F.obj S` to the category of objects in `F.obj (X i)` for all `i` equipped with a descent datum is fully faithful. -* Define a typeclass `HasEffectiveDescent` extending `HasDescentForMorphisms` +* Define a typeclass `HasEffectiveDescent` extending `HasDescentOfMorphisms` by saying that the functors mentionned above are essentially surjective. -/ @@ -86,11 +86,11 @@ def overMapCompPresheafHomIso {S' : C} (q : S' ⟶ S) : /-- The property that a pseudofunctor `F : Pseudofunctor (LocallyDiscrete Cᵒᵖ) Cat` satisfies the descent property for morphisms. -/ -class HasDescentForMorphisms (J : GrothendieckTopology C) : Prop where +class HasDescentOfMorphisms (J : GrothendieckTopology C) : Prop where isSheaf {S : C} (M N : F.obj (.mk (op S))) : Presheaf.IsSheaf (J.over S) (F.presheafHom M N) -variable (J : GrothendieckTopology C) [F.HasDescentForMorphisms J] +variable (J : GrothendieckTopology C) [F.HasDescentOfMorphisms J] /-- If `F` is a pseudofunctor from `Cᵒᵖ` to `Cat` which satisfies the descent of morphisms for a Grothendieck topology `J`, and `M` and `N` are to objects in @@ -100,7 +100,7 @@ of morphisms $$p^* M ⟶ p^* N$$. -/ @[simps] def sheafHom : Sheaf (J.over S) (Type v') where val := F.presheafHom M N - cond := HasDescentForMorphisms.isSheaf _ _ + cond := HasDescentOfMorphisms.isSheaf _ _ end Pseudofunctor From 70f7fcf5f96773e00af099c5fafcddbc95b9c948 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=ABl=20Riou?= Date: Sun, 27 Apr 2025 18:44:23 +0200 Subject: [PATCH 032/118] wip --- .../Bicategory/Functor/Cat.lean | 7 ++ .../Sites/Descent/CodescentData.lean | 71 ++++++++++++++++++- 2 files changed, 76 insertions(+), 2 deletions(-) diff --git a/Mathlib/CategoryTheory/Bicategory/Functor/Cat.lean b/Mathlib/CategoryTheory/Bicategory/Functor/Cat.lean index 36601762449771..517cbcbc89b1f9 100644 --- a/Mathlib/CategoryTheory/Bicategory/Functor/Cat.lean +++ b/Mathlib/CategoryTheory/Bicategory/Functor/Cat.lean @@ -172,6 +172,13 @@ lemma mapComp'₀₁₃_hom_app (hf : f₀₁ ≫ f₁₃ = f) (X : F.obj b₀) rw [← F.mapComp'_hom_app_comp_mapComp'_hom_app_map_obj_assoc _ _ _ _ _ _ h₀₂ h₁₃ hf X] simp +@[reassoc] +lemma mapComp'_inv_app_comp_mapComp'_hom_app' (hf : f₀₁ ≫ f₁₃ = f) (X : F.obj b₀) : + (F.mapComp' f₀₂ f₂₃ f).inv.app X ≫ (F.mapComp' f₀₁ f₁₃ f).hom.app X = + (F.map f₂₃).map ((F.mapComp' f₀₁ f₁₂ f₀₂ h₀₂).hom.app X) ≫ + (F.mapComp' f₁₂ f₂₃ f₁₃ h₁₃).inv.app ((F.map f₀₁).obj X) := by + simp [F.mapComp'₀₁₃_hom_app f₀₁ f₁₂ f₂₃ f₀₂ f₁₃ f h₀₂ h₁₃ hf] + end associativity end Pseudofunctor diff --git a/Mathlib/CategoryTheory/Sites/Descent/CodescentData.lean b/Mathlib/CategoryTheory/Sites/Descent/CodescentData.lean index e6b876bdddb09e..e6eedb0c0b7784 100644 --- a/Mathlib/CategoryTheory/Sites/Descent/CodescentData.lean +++ b/Mathlib/CategoryTheory/Sites/Descent/CodescentData.lean @@ -13,7 +13,7 @@ import Mathlib.CategoryTheory.Bicategory.LocallyDiscrete -/ -universe t w v v' u u' +universe t t' w v v' u u' namespace CategoryTheory @@ -80,7 +80,7 @@ section variable (D : F.CodescentData X) -@[simp] +@[reassoc (attr := simp)] lemma iso_hom_iso_hom ⦃Y : C⦄ ⦃i₁ i₂ i₃ : ι⦄ (f₁ : X i₁ ⟶ Y) (f₂ : X i₂ ⟶ Y) (f₃ : X i₃ ⟶ Y) : (D.iso f₁ f₂).hom ≫ (D.iso f₂ f₃).hom = (D.iso f₁ f₃).hom := by @@ -155,6 +155,73 @@ lemma map_map' ⦃Y : C⦄ ⦃i₁ i₂ : ι⦄ (f₁ : X i₁ ⟶ Y) (f₂ : X end Hom +variable {ι' : Type t'} {X' : ι' → C} {p : ι' → ι} (π : ∀ i', X (p i') ⟶ X' i') + +abbrev pullbackObjObj (D : F.CodescentData X) (i' : ι') : F.obj (X' i') := + (F.map (π i')).obj (D.obj (p i')) + +def pullbackObjIso + (D : F.CodescentData X) ⦃Y : C⦄ ⦃i₁ i₂ : ι'⦄ (f₁ : X' i₁ ⟶ Y) (f₂ : X' i₂ ⟶ Y) : + (F.map f₁).obj (pullbackObjObj π D i₁) ≅ (F.map f₂).obj (pullbackObjObj π D i₂) := + (F.mapComp' (π i₁) f₁ _ rfl).symm.app _ ≪≫ + D.iso _ _ ≪≫ (F.mapComp' (π i₂) f₂ _ rfl).app _ + +def pullbackObjIso_eq + (D : F.CodescentData X) ⦃Y : C⦄ ⦃i₁ i₂ : ι'⦄ (f₁ : X' i₁ ⟶ Y) (f₂ : X' i₂ ⟶ Y) + (g₁ : X (p i₁) ⟶ Y) (g₂ : X (p i₂) ⟶ Y) (hg₁ : g₁ = π i₁ ≫ f₁) (hg₂ : g₂ = π i₂ ≫ f₂) : + pullbackObjIso π D f₁ f₂ = (F.mapComp' (π i₁) f₁ g₁).symm.app _ ≪≫ + D.iso g₁ g₂ ≪≫ (F.mapComp' (π i₂) f₂ g₂).app _ := by + subst hg₁ hg₂ + rfl + +@[reassoc (attr := simp)] +lemma pullbackObjIso_hom_comp + (D : F.CodescentData X) ⦃Y : C⦄ ⦃i₁ i₂ i₃ : ι'⦄ + (f₁ : X' i₁ ⟶ Y) (f₂ : X' i₂ ⟶ Y) (f₃ : X' i₃ ⟶ Y) + (g₁ : X (p i₁) ⟶ Y) (g₂ : X (p i₂) ⟶ Y) (g₃ : X (p i₃) ⟶ Y) + (hg₁ : g₁ = π i₁ ≫ f₁) (hg₂ : g₂ = π i₂ ≫ f₂) (hg₃ : g₃ = π i₃ ≫ f₃) : + (pullbackObjIso π D f₁ f₂).hom ≫ (pullbackObjIso π D f₂ f₃).hom = + (pullbackObjIso π D f₁ f₃).hom := by + simp [pullbackObjIso_eq π D _ _ g₁ g₂ hg₁ hg₂, pullbackObjIso_eq π D _ _ g₂ g₃ hg₂ hg₃, + pullbackObjIso_eq π D _ _ g₁ g₃ hg₁ hg₃] + +variable [Strict C] + +@[simps] +def pullbackObj (D : F.CodescentData X) : F.CodescentData X' where + obj := pullbackObjObj π D + iso := pullbackObjIso π D + iso_comp' Y' Y g i₁ i₂ f₁ f₂ f₁g f₂g hf₁g hf₂g := by + ext + dsimp + rw [pullbackObjIso_eq π D f₁ f₂ _ _ rfl rfl, + pullbackObjIso_eq π D f₁g f₂g _ _ rfl rfl, + D.iso_comp' g (π i₁ ≫ f₁) (π i₂ ≫ f₂) (π i₁ ≫ f₁g) (π i₂ ≫ f₂g) + (by aesop_cat) (by aesop_cat)] + dsimp [pullbackObjObj] + simp only [assoc, Functor.map_comp_assoc] + rw [F.mapComp'_inv_app_comp_mapComp'_hom_app_assoc _ _ _ _ _ _ rfl hf₁g rfl, + F.mapComp'_inv_app_comp_mapComp'_hom_app' _ _ _ _ _ _ rfl hf₂g rfl] + iso_trans Y i₁ i₂ i₃ f₁ f₂ f₃ := by ext; simp + +abbrev pullbackMapHom {D₁ D₂ : F.CodescentData X} (f : D₁ ⟶ D₂) (i' : ι'): + pullbackObjObj π D₁ i' ⟶ pullbackObjObj π D₂ i' := + (F.map (π i')).map (f.hom (p i')) + +attribute [local simp] pullbackObjIso pullbackMapHom + +@[simps] +def pullbackMap {D₁ D₂ : F.CodescentData X} (f : D₁ ⟶ D₂) : + pullbackObj π D₁ ⟶ pullbackObj π D₂ where + hom i' := pullbackMapHom π f i' + +-- note: up to a natural isomorphism, this should not depend on the choice of `p` or `π`, +-- but only that any object `X' i'` is a target of a map from some `X i` +@[simps] +def pullback : F.CodescentData X ⥤ F.CodescentData X' where + obj := pullbackObj π + map f := pullbackMap π f + end CodescentData variable [Strict C] From fa574fa6062579aae187addadbe7963a537beac6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=ABl=20Riou?= Date: Mon, 28 Apr 2025 12:08:32 +0200 Subject: [PATCH 033/118] wip --- Mathlib.lean | 1 + .../Bicategory/Functor/Cat.lean | 2 +- .../Bicategory/Functor/LocallyDiscrete.lean | 9 ++ .../Sites/Descent/DescentData.lean | 152 ++++++++++++++++++ 4 files changed, 163 insertions(+), 1 deletion(-) create mode 100644 Mathlib/CategoryTheory/Sites/Descent/DescentData.lean diff --git a/Mathlib.lean b/Mathlib.lean index 201b1c1bcdbbd1..7054b54474200c 100644 --- a/Mathlib.lean +++ b/Mathlib.lean @@ -2452,6 +2452,7 @@ import Mathlib.CategoryTheory.Sites.DenseSubsite.Basic import Mathlib.CategoryTheory.Sites.DenseSubsite.InducedTopology import Mathlib.CategoryTheory.Sites.DenseSubsite.SheafEquiv import Mathlib.CategoryTheory.Sites.Descent.CodescentData +import Mathlib.CategoryTheory.Sites.Descent.DescentData import Mathlib.CategoryTheory.Sites.Descent.Morphisms import Mathlib.CategoryTheory.Sites.EffectiveEpimorphic import Mathlib.CategoryTheory.Sites.EpiMono diff --git a/Mathlib/CategoryTheory/Bicategory/Functor/Cat.lean b/Mathlib/CategoryTheory/Bicategory/Functor/Cat.lean index 77241d4490cb4b..517cbcbc89b1f9 100644 --- a/Mathlib/CategoryTheory/Bicategory/Functor/Cat.lean +++ b/Mathlib/CategoryTheory/Bicategory/Functor/Cat.lean @@ -59,7 +59,7 @@ lemma mapComp'_hom_naturality : (F.mapComp' f g fg hfg).hom.app X ≫ (F.map g).map ((F.map f).map a) := (F.mapComp' f g fg hfg).hom.naturality a -@[reassoc] +@[reassoc (attr := simp)] lemma mapComp'_inv_naturality : (F.map g).map ((F.map f).map a) ≫ (F.mapComp' f g fg hfg).inv.app Y = (F.mapComp' f g fg hfg).inv.app X ≫ (F.map fg).map a := diff --git a/Mathlib/CategoryTheory/Bicategory/Functor/LocallyDiscrete.lean b/Mathlib/CategoryTheory/Bicategory/Functor/LocallyDiscrete.lean index 592c7e48b55512..0e8127ee74bfb7 100644 --- a/Mathlib/CategoryTheory/Bicategory/Functor/LocallyDiscrete.lean +++ b/Mathlib/CategoryTheory/Bicategory/Functor/LocallyDiscrete.lean @@ -154,4 +154,13 @@ def mkPseudofunctor {B₀ C : Type*} [Category B₀] [Bicategory C] end LocallyDiscrete +/-- The pseudofunctor from `LocallyDiscrete B` to `LocallyDiscrete C` +induced by a functor `F : B ⥤ C`. -/ +@[simps!] +def mapLocallyDiscrete {B C : Type*} [Category B] [Category C] (F : B ⥤ C): + Pseudofunctor (LocallyDiscrete B) (LocallyDiscrete C) := + LocallyDiscrete.mkPseudofunctor + (fun X ↦ .mk (F.obj X)) (fun f ↦ .toLoc (F.map f)) + (fun _ ↦ eqToIso (by simp)) (fun _ _ ↦ eqToIso (by simp)) + end CategoryTheory diff --git a/Mathlib/CategoryTheory/Sites/Descent/DescentData.lean b/Mathlib/CategoryTheory/Sites/Descent/DescentData.lean new file mode 100644 index 00000000000000..a3249abd4069b7 --- /dev/null +++ b/Mathlib/CategoryTheory/Sites/Descent/DescentData.lean @@ -0,0 +1,152 @@ +/- +Copyright (c) 2025 Joël Riou. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Joël Riou, Christian Merten +-/ +import Mathlib.CategoryTheory.Bicategory.Functor.LocallyDiscrete +import Mathlib.CategoryTheory.Sites.Descent.Morphisms +import Mathlib.CategoryTheory.Sites.Descent.CodescentData + +/-! +# Effectiveness of descent + +-/ + +universe t w v' v u' u + +namespace CategoryTheory + +open Opposite +namespace Presieve + +variable {C : Type u} [Category.{v} C] (P : Cᵒᵖ ⥤ Type w) {X : C} (R : Presieve X) + +@[simps] +def toCompatible (s : P.obj (op X)) : + Subtype (FamilyOfElements.Compatible (P := P) (R := R)) where + val Y f hf := P.map f.op s + property Y₁ Y₂ Z g₁ g₂ f₁ f₂ hf₁ hf₂ fac := by + simp only [← FunctorToTypes.map_comp_apply, ← op_comp, fac] + +lemma isSheafFor_iff_bijective_toCompatible (P : Cᵒᵖ ⥤ Type w) (R : Presieve X) : + IsSheafFor P R ↔ Function.Bijective (toCompatible P R) := by + constructor + · intro h + constructor + · intro s₁ s₂ hs + simp only [Subtype.ext_iff] at hs + apply h.isSeparatedFor.ext + intro Y f hf + exact congr_fun (congr_fun (congr_fun hs Y) f) hf + · rintro ⟨x, hx⟩ + exact ⟨h.amalgamate x hx, by ext; funext; apply h.valid_glue⟩ + · intro h x hx + apply existsUnique_of_exists_of_unique + · obtain ⟨s, hs⟩ := h.surjective ⟨x, hx⟩ + simp only [Subtype.ext_iff] at hs + exact ⟨s, fun Y f hf ↦ congr_fun (congr_fun (congr_fun hs Y) f) hf⟩ + · intro s₁ s₂ hs₁ hs₂ + apply h.injective + ext + funext Y f hf + simp only [toCompatible_coe, hs₁ f hf, hs₂ f hf] + +end Presieve + +open Limits Bicategory + +namespace Pseudofunctor + +variable {C : Type u} [Category.{v} C] (F : Pseudofunctor (LocallyDiscrete Cᵒᵖ) Cat.{v', u'}) + {ι : Type t} {S : C} {X : ι → C} (f : ∀ i, X i ⟶ S) + +-- to be moved +instance {X Y : C} (f : X ⟶ Y) [IsIso f] (F : Pseudofunctor (LocallyDiscrete C) Cat.{v', u'}) : + (F.map (.toLoc f)).IsEquivalence := by + let e : F.obj (.mk X) ≌ F.obj (.mk Y) := + Equivalence.mk (F.map (.toLoc f)) (F.map (.toLoc (inv f))) + ((F.mapId _).symm ≪≫ F.mapComp' f.toLoc (inv f).toLoc (𝟙 _) (by + rw [← Quiver.Hom.comp_toLoc, IsIso.hom_inv_id, Quiver.Hom.id_toLoc])) + ((F.mapComp' (inv f).toLoc f.toLoc (𝟙 _) (by + rw [← Quiver.Hom.comp_toLoc, IsIso.inv_hom_id, Quiver.Hom.id_toLoc])).symm ≪≫ F.mapId _) + exact e.isEquivalence_functor + +/-- If `F` is a pseudofunctor from `(LocallyDiscrete Cᵒᵖ)` to `Cat` and `f i : X i ⟶ S` +is a family of morphisms in `C`, this is the type of family of objects in `F.obj (X i)` +equipped with a descent datum relative to the morphisms `f i`. -/ +abbrev DescentData := + ((mapLocallyDiscrete (Over.forget S).op).comp F).CodescentData + (fun (i : ι) ↦ .mk (op (Over.mk (f i)))) + +/-- The functor `F.obj (.mk (op S)) ⥤ F.DescentData f`. -/ +def toDescentData : F.obj (.mk (op S)) ⥤ F.DescentData f := + ((mapLocallyDiscrete (Over.forget S).op).comp F).toCodescentDataOfIsInitial + (fun (i : ι) ↦ .mk (op (Over.mk (f i)))) (.mk (op (Over.mk (𝟙 _)))) + (IsInitial.ofUniqueHom + (fun Z ↦ .toLoc (Quiver.Hom.op (Over.homMk Z.as.unop.hom))) + (fun ⟨⟨Z⟩⟩ ⟨⟨m⟩⟩ ↦ by + dsimp at m + congr + ext + simpa using Over.w m)) + +/-- The property that a pseudofunctor `(LocallyDiscrete Cᵒᵖ)` to `Cat` has +effective descent relative to a family of morphisms `f i : X i ⟶ S` in `C`. -/ +abbrev HasEffectiveDescentRelativeTo : Prop := (F.toDescentData f).IsEquivalence + +lemma toDescentData_fullyFaithful_iff : + Nonempty (F.toDescentData f).FullyFaithful ↔ + ∀ (M N : F.obj (.mk (op S))), + Presieve.IsSheafFor (F.presheafHom M N) + (Presieve.ofArrows (X := Over.mk (𝟙 S)) (fun (i : ι) ↦ Over.mk (f i)) + (fun (i : ι) ↦ Over.homMk (f i))) := by + trans ∀ (M N : F.obj (.mk (op S))), + Function.Bijective ((F.toDescentData f).map : (M ⟶ N) → _) + · exact ⟨fun ⟨h⟩ ↦ h.map_bijective, fun h ↦ ⟨{ + preimage {M N}:= (Equiv.ofBijective _ (h M N)).invFun + preimage_map := (Equiv.ofBijective _ (h _ _)).left_inv + map_preimage := (Equiv.ofBijective _ (h _ _)).right_inv + }⟩⟩ + · refine forall_congr' (fun M ↦ forall_congr' (fun N ↦ ?_)) + -- instead we need a variant of `isSheafFor_arrows_iff` + rw [Presieve.isSheafFor_iff_bijective_toCompatible] + let R := (Presieve.ofArrows (X := Over.mk (𝟙 S)) (fun (i : ι) ↦ Over.mk (f i)) + (fun (i : ι) ↦ Over.homMk (f i))) + let T := Subtype (Presieve.FamilyOfElements.Compatible (P := F.presheafHom M N) (R := R)) + let α : ((F.toDescentData f).obj M ⟶ (F.toDescentData f).obj N) ≃ T := { + toFun g := ⟨fun Y f hf ↦ by + sorry, sorry⟩ + invFun := sorry + left_inv := sorry + right_inv := sorry + } + let β : (M ⟶ N) ≃ (F.presheafHom M N).obj (op (Over.mk (𝟙 S))) := + Equiv.ofBijective _ (Functor.FullyFaithful.map_bijective + (Functor.FullyFaithful.ofFullyFaithful (F.map (.toLoc (𝟙 (op S))))) M N) + have : Function.comp α (F.toDescentData f).map = + (Presieve.toCompatible (F.presheafHom M N) R).comp β := sorry + rw [← Function.Bijective.of_comp_iff' α.bijective, this, + Function.Bijective.of_comp_iff _ β.bijective] + +class HasEffectiveDescent (J : GrothendieckTopology C) : Prop where + hasEffectiveDescentRelativeTo_of_sieve_mem {S : C} (U : Sieve S) (hU : U ∈ J S) : + F.HasEffectiveDescentRelativeTo (f := fun (i : U.arrows.category) ↦ i.obj.hom) + +lemma hasEffectiveDescentRelativeTo_of_sieve_mem (J : GrothendieckTopology C) + [F.HasEffectiveDescent J] + {S : C} (U : Sieve S) (hU : U ∈ J S) : + F.HasEffectiveDescentRelativeTo (f := fun (i : U.arrows.category) ↦ i.obj.hom) := + HasEffectiveDescent.hasEffectiveDescentRelativeTo_of_sieve_mem _ hU + +instance (J : GrothendieckTopology C) [F.HasEffectiveDescent J] : + F.HasDescentOfMorphisms J where + isSheaf {S} M N := by + rw [isSheaf_iff_isSheaf_of_type] + rintro ⟨X, ⟨⟩, p : X ⟶ S⟩ U hU + obtain ⟨U : Sieve X, rfl⟩ := (Sieve.overEquiv _).symm.surjective U + simp only [J.mem_over_iff, Equiv.apply_symm_apply] at hU + sorry + +end Pseudofunctor + +end CategoryTheory From 9bc555a868b225519cf759af08134899a98b8975 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=ABl=20Riou?= Date: Mon, 28 Apr 2025 18:00:35 +0200 Subject: [PATCH 034/118] mv --- Mathlib.lean | 1 + .../Sites/Descent/DescentData.lean | 61 +------------- .../Sites/Descent/HasEffectiveDescent.lean | 83 +++++++++++++++++++ 3 files changed, 86 insertions(+), 59 deletions(-) create mode 100644 Mathlib/CategoryTheory/Sites/Descent/HasEffectiveDescent.lean diff --git a/Mathlib.lean b/Mathlib.lean index 7054b54474200c..be6d55879c1c15 100644 --- a/Mathlib.lean +++ b/Mathlib.lean @@ -2453,6 +2453,7 @@ import Mathlib.CategoryTheory.Sites.DenseSubsite.InducedTopology import Mathlib.CategoryTheory.Sites.DenseSubsite.SheafEquiv import Mathlib.CategoryTheory.Sites.Descent.CodescentData import Mathlib.CategoryTheory.Sites.Descent.DescentData +import Mathlib.CategoryTheory.Sites.Descent.HasEffectiveDescent import Mathlib.CategoryTheory.Sites.Descent.Morphisms import Mathlib.CategoryTheory.Sites.EffectiveEpimorphic import Mathlib.CategoryTheory.Sites.EpiMono diff --git a/Mathlib/CategoryTheory/Sites/Descent/DescentData.lean b/Mathlib/CategoryTheory/Sites/Descent/DescentData.lean index a3249abd4069b7..540a6c1cda2a6c 100644 --- a/Mathlib/CategoryTheory/Sites/Descent/DescentData.lean +++ b/Mathlib/CategoryTheory/Sites/Descent/DescentData.lean @@ -8,7 +8,7 @@ import Mathlib.CategoryTheory.Sites.Descent.Morphisms import Mathlib.CategoryTheory.Sites.Descent.CodescentData /-! -# Effectiveness of descent +# Descent data -/ @@ -17,6 +17,7 @@ universe t w v' v u' u namespace CategoryTheory open Opposite + namespace Presieve variable {C : Type u} [Category.{v} C] (P : Cᵒᵖ ⥤ Type w) {X : C} (R : Presieve X) @@ -85,68 +86,10 @@ def toDescentData : F.obj (.mk (op S)) ⥤ F.DescentData f := (IsInitial.ofUniqueHom (fun Z ↦ .toLoc (Quiver.Hom.op (Over.homMk Z.as.unop.hom))) (fun ⟨⟨Z⟩⟩ ⟨⟨m⟩⟩ ↦ by - dsimp at m congr ext simpa using Over.w m)) -/-- The property that a pseudofunctor `(LocallyDiscrete Cᵒᵖ)` to `Cat` has -effective descent relative to a family of morphisms `f i : X i ⟶ S` in `C`. -/ -abbrev HasEffectiveDescentRelativeTo : Prop := (F.toDescentData f).IsEquivalence - -lemma toDescentData_fullyFaithful_iff : - Nonempty (F.toDescentData f).FullyFaithful ↔ - ∀ (M N : F.obj (.mk (op S))), - Presieve.IsSheafFor (F.presheafHom M N) - (Presieve.ofArrows (X := Over.mk (𝟙 S)) (fun (i : ι) ↦ Over.mk (f i)) - (fun (i : ι) ↦ Over.homMk (f i))) := by - trans ∀ (M N : F.obj (.mk (op S))), - Function.Bijective ((F.toDescentData f).map : (M ⟶ N) → _) - · exact ⟨fun ⟨h⟩ ↦ h.map_bijective, fun h ↦ ⟨{ - preimage {M N}:= (Equiv.ofBijective _ (h M N)).invFun - preimage_map := (Equiv.ofBijective _ (h _ _)).left_inv - map_preimage := (Equiv.ofBijective _ (h _ _)).right_inv - }⟩⟩ - · refine forall_congr' (fun M ↦ forall_congr' (fun N ↦ ?_)) - -- instead we need a variant of `isSheafFor_arrows_iff` - rw [Presieve.isSheafFor_iff_bijective_toCompatible] - let R := (Presieve.ofArrows (X := Over.mk (𝟙 S)) (fun (i : ι) ↦ Over.mk (f i)) - (fun (i : ι) ↦ Over.homMk (f i))) - let T := Subtype (Presieve.FamilyOfElements.Compatible (P := F.presheafHom M N) (R := R)) - let α : ((F.toDescentData f).obj M ⟶ (F.toDescentData f).obj N) ≃ T := { - toFun g := ⟨fun Y f hf ↦ by - sorry, sorry⟩ - invFun := sorry - left_inv := sorry - right_inv := sorry - } - let β : (M ⟶ N) ≃ (F.presheafHom M N).obj (op (Over.mk (𝟙 S))) := - Equiv.ofBijective _ (Functor.FullyFaithful.map_bijective - (Functor.FullyFaithful.ofFullyFaithful (F.map (.toLoc (𝟙 (op S))))) M N) - have : Function.comp α (F.toDescentData f).map = - (Presieve.toCompatible (F.presheafHom M N) R).comp β := sorry - rw [← Function.Bijective.of_comp_iff' α.bijective, this, - Function.Bijective.of_comp_iff _ β.bijective] - -class HasEffectiveDescent (J : GrothendieckTopology C) : Prop where - hasEffectiveDescentRelativeTo_of_sieve_mem {S : C} (U : Sieve S) (hU : U ∈ J S) : - F.HasEffectiveDescentRelativeTo (f := fun (i : U.arrows.category) ↦ i.obj.hom) - -lemma hasEffectiveDescentRelativeTo_of_sieve_mem (J : GrothendieckTopology C) - [F.HasEffectiveDescent J] - {S : C} (U : Sieve S) (hU : U ∈ J S) : - F.HasEffectiveDescentRelativeTo (f := fun (i : U.arrows.category) ↦ i.obj.hom) := - HasEffectiveDescent.hasEffectiveDescentRelativeTo_of_sieve_mem _ hU - -instance (J : GrothendieckTopology C) [F.HasEffectiveDescent J] : - F.HasDescentOfMorphisms J where - isSheaf {S} M N := by - rw [isSheaf_iff_isSheaf_of_type] - rintro ⟨X, ⟨⟩, p : X ⟶ S⟩ U hU - obtain ⟨U : Sieve X, rfl⟩ := (Sieve.overEquiv _).symm.surjective U - simp only [J.mem_over_iff, Equiv.apply_symm_apply] at hU - sorry - end Pseudofunctor end CategoryTheory diff --git a/Mathlib/CategoryTheory/Sites/Descent/HasEffectiveDescent.lean b/Mathlib/CategoryTheory/Sites/Descent/HasEffectiveDescent.lean new file mode 100644 index 00000000000000..48e3110e6f4d68 --- /dev/null +++ b/Mathlib/CategoryTheory/Sites/Descent/HasEffectiveDescent.lean @@ -0,0 +1,83 @@ +/- +Copyright (c) 2025 Joël Riou. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Joël Riou, Christian Merten +-/ +import Mathlib.CategoryTheory.Sites.Descent.DescentData + +/-! +# Effectiveness of descent + +-/ + +universe t v' v u' u + +namespace CategoryTheory + +open Opposite + +namespace Pseudofunctor + +variable {C : Type u} [Category.{v} C] (F : Pseudofunctor (LocallyDiscrete Cᵒᵖ) Cat.{v', u'}) + {ι : Type t} {S : C} {X : ι → C} (f : ∀ i, X i ⟶ S) + +/-- The property that a pseudofunctor `(LocallyDiscrete Cᵒᵖ)` to `Cat` has +effective descent relative to a family of morphisms `f i : X i ⟶ S` in `C`. -/ +abbrev HasEffectiveDescentRelativeTo : Prop := (F.toDescentData f).IsEquivalence + +lemma toDescentData_fullyFaithful_iff : + Nonempty (F.toDescentData f).FullyFaithful ↔ + ∀ (M N : F.obj (.mk (op S))), + Presieve.IsSheafFor (F.presheafHom M N) + (Presieve.ofArrows (X := Over.mk (𝟙 S)) (fun (i : ι) ↦ Over.mk (f i)) + (fun (i : ι) ↦ Over.homMk (f i))) := by + trans ∀ (M N : F.obj (.mk (op S))), + Function.Bijective ((F.toDescentData f).map : (M ⟶ N) → _) + · exact ⟨fun ⟨h⟩ ↦ h.map_bijective, fun h ↦ ⟨{ + preimage {M N}:= (Equiv.ofBijective _ (h M N)).invFun + preimage_map := (Equiv.ofBijective _ (h _ _)).left_inv + map_preimage := (Equiv.ofBijective _ (h _ _)).right_inv + }⟩⟩ + · refine forall_congr' (fun M ↦ forall_congr' (fun N ↦ ?_)) + -- instead we need a variant of `isSheafFor_arrows_iff` + rw [Presieve.isSheafFor_iff_bijective_toCompatible] + let R := (Presieve.ofArrows (X := Over.mk (𝟙 S)) (fun (i : ι) ↦ Over.mk (f i)) + (fun (i : ι) ↦ Over.homMk (f i))) + let T := Subtype (Presieve.FamilyOfElements.Compatible (P := F.presheafHom M N) (R := R)) + let α : ((F.toDescentData f).obj M ⟶ (F.toDescentData f).obj N) ≃ T := { + toFun g := ⟨fun Y f hf ↦ by + sorry, sorry⟩ + invFun := sorry + left_inv := sorry + right_inv := sorry + } + let β : (M ⟶ N) ≃ (F.presheafHom M N).obj (op (Over.mk (𝟙 S))) := + Equiv.ofBijective _ (Functor.FullyFaithful.map_bijective + (Functor.FullyFaithful.ofFullyFaithful (F.map (.toLoc (𝟙 (op S))))) M N) + have : Function.comp α (F.toDescentData f).map = + (Presieve.toCompatible (F.presheafHom M N) R).comp β := sorry + rw [← Function.Bijective.of_comp_iff' α.bijective, this, + Function.Bijective.of_comp_iff _ β.bijective] + +class HasEffectiveDescent (J : GrothendieckTopology C) : Prop where + hasEffectiveDescentRelativeTo_of_sieve_mem {S : C} (U : Sieve S) (hU : U ∈ J S) : + F.HasEffectiveDescentRelativeTo (f := fun (i : U.arrows.category) ↦ i.obj.hom) + +lemma hasEffectiveDescentRelativeTo_of_sieve_mem (J : GrothendieckTopology C) + [F.HasEffectiveDescent J] + {S : C} (U : Sieve S) (hU : U ∈ J S) : + F.HasEffectiveDescentRelativeTo (f := fun (i : U.arrows.category) ↦ i.obj.hom) := + HasEffectiveDescent.hasEffectiveDescentRelativeTo_of_sieve_mem _ hU + +instance (J : GrothendieckTopology C) [F.HasEffectiveDescent J] : + F.HasDescentOfMorphisms J where + isSheaf {S} M N := by + rw [isSheaf_iff_isSheaf_of_type] + rintro ⟨X, ⟨⟩, p : X ⟶ S⟩ U hU + obtain ⟨U : Sieve X, rfl⟩ := (Sieve.overEquiv _).symm.surjective U + simp only [J.mem_over_iff, Equiv.apply_symm_apply] at hU + sorry + +end Pseudofunctor + +end CategoryTheory From 10fe18766331056946a5163cd851c9b05d881cfc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=ABl=20Riou?= Date: Mon, 28 Apr 2025 18:02:17 +0200 Subject: [PATCH 035/118] mv --- .../Sites/Descent/DescentData.lean | 53 +------------------ .../Sites/Descent/HasEffectiveDescent.lean | 51 +++++++++++++++++- 2 files changed, 51 insertions(+), 53 deletions(-) diff --git a/Mathlib/CategoryTheory/Sites/Descent/DescentData.lean b/Mathlib/CategoryTheory/Sites/Descent/DescentData.lean index 540a6c1cda2a6c..e1446fc95a5e3b 100644 --- a/Mathlib/CategoryTheory/Sites/Descent/DescentData.lean +++ b/Mathlib/CategoryTheory/Sites/Descent/DescentData.lean @@ -12,66 +12,17 @@ import Mathlib.CategoryTheory.Sites.Descent.CodescentData -/ -universe t w v' v u' u +universe t v' v u' u namespace CategoryTheory -open Opposite - -namespace Presieve - -variable {C : Type u} [Category.{v} C] (P : Cᵒᵖ ⥤ Type w) {X : C} (R : Presieve X) - -@[simps] -def toCompatible (s : P.obj (op X)) : - Subtype (FamilyOfElements.Compatible (P := P) (R := R)) where - val Y f hf := P.map f.op s - property Y₁ Y₂ Z g₁ g₂ f₁ f₂ hf₁ hf₂ fac := by - simp only [← FunctorToTypes.map_comp_apply, ← op_comp, fac] - -lemma isSheafFor_iff_bijective_toCompatible (P : Cᵒᵖ ⥤ Type w) (R : Presieve X) : - IsSheafFor P R ↔ Function.Bijective (toCompatible P R) := by - constructor - · intro h - constructor - · intro s₁ s₂ hs - simp only [Subtype.ext_iff] at hs - apply h.isSeparatedFor.ext - intro Y f hf - exact congr_fun (congr_fun (congr_fun hs Y) f) hf - · rintro ⟨x, hx⟩ - exact ⟨h.amalgamate x hx, by ext; funext; apply h.valid_glue⟩ - · intro h x hx - apply existsUnique_of_exists_of_unique - · obtain ⟨s, hs⟩ := h.surjective ⟨x, hx⟩ - simp only [Subtype.ext_iff] at hs - exact ⟨s, fun Y f hf ↦ congr_fun (congr_fun (congr_fun hs Y) f) hf⟩ - · intro s₁ s₂ hs₁ hs₂ - apply h.injective - ext - funext Y f hf - simp only [toCompatible_coe, hs₁ f hf, hs₂ f hf] - -end Presieve - -open Limits Bicategory +open Opposite Limits namespace Pseudofunctor variable {C : Type u} [Category.{v} C] (F : Pseudofunctor (LocallyDiscrete Cᵒᵖ) Cat.{v', u'}) {ι : Type t} {S : C} {X : ι → C} (f : ∀ i, X i ⟶ S) --- to be moved -instance {X Y : C} (f : X ⟶ Y) [IsIso f] (F : Pseudofunctor (LocallyDiscrete C) Cat.{v', u'}) : - (F.map (.toLoc f)).IsEquivalence := by - let e : F.obj (.mk X) ≌ F.obj (.mk Y) := - Equivalence.mk (F.map (.toLoc f)) (F.map (.toLoc (inv f))) - ((F.mapId _).symm ≪≫ F.mapComp' f.toLoc (inv f).toLoc (𝟙 _) (by - rw [← Quiver.Hom.comp_toLoc, IsIso.hom_inv_id, Quiver.Hom.id_toLoc])) - ((F.mapComp' (inv f).toLoc f.toLoc (𝟙 _) (by - rw [← Quiver.Hom.comp_toLoc, IsIso.inv_hom_id, Quiver.Hom.id_toLoc])).symm ≪≫ F.mapId _) - exact e.isEquivalence_functor - /-- If `F` is a pseudofunctor from `(LocallyDiscrete Cᵒᵖ)` to `Cat` and `f i : X i ⟶ S` is a family of morphisms in `C`, this is the type of family of objects in `F.obj (X i)` equipped with a descent datum relative to the morphisms `f i`. -/ diff --git a/Mathlib/CategoryTheory/Sites/Descent/HasEffectiveDescent.lean b/Mathlib/CategoryTheory/Sites/Descent/HasEffectiveDescent.lean index 48e3110e6f4d68..eea7df4081dfdd 100644 --- a/Mathlib/CategoryTheory/Sites/Descent/HasEffectiveDescent.lean +++ b/Mathlib/CategoryTheory/Sites/Descent/HasEffectiveDescent.lean @@ -10,17 +10,64 @@ import Mathlib.CategoryTheory.Sites.Descent.DescentData -/ -universe t v' v u' u +universe t w v' v u' u namespace CategoryTheory -open Opposite +open Opposite Limits Bicategory + +namespace Presieve + +variable {C : Type u} [Category.{v} C] (P : Cᵒᵖ ⥤ Type w) {X : C} (R : Presieve X) + +@[simps] +def toCompatible (s : P.obj (op X)) : + Subtype (FamilyOfElements.Compatible (P := P) (R := R)) where + val Y f hf := P.map f.op s + property Y₁ Y₂ Z g₁ g₂ f₁ f₂ hf₁ hf₂ fac := by + simp only [← FunctorToTypes.map_comp_apply, ← op_comp, fac] + +lemma isSheafFor_iff_bijective_toCompatible (P : Cᵒᵖ ⥤ Type w) (R : Presieve X) : + IsSheafFor P R ↔ Function.Bijective (toCompatible P R) := by + constructor + · intro h + constructor + · intro s₁ s₂ hs + simp only [Subtype.ext_iff] at hs + apply h.isSeparatedFor.ext + intro Y f hf + exact congr_fun (congr_fun (congr_fun hs Y) f) hf + · rintro ⟨x, hx⟩ + exact ⟨h.amalgamate x hx, by ext; funext; apply h.valid_glue⟩ + · intro h x hx + apply existsUnique_of_exists_of_unique + · obtain ⟨s, hs⟩ := h.surjective ⟨x, hx⟩ + simp only [Subtype.ext_iff] at hs + exact ⟨s, fun Y f hf ↦ congr_fun (congr_fun (congr_fun hs Y) f) hf⟩ + · intro s₁ s₂ hs₁ hs₂ + apply h.injective + ext + funext Y f hf + simp only [toCompatible_coe, hs₁ f hf, hs₂ f hf] + +end Presieve namespace Pseudofunctor variable {C : Type u} [Category.{v} C] (F : Pseudofunctor (LocallyDiscrete Cᵒᵖ) Cat.{v', u'}) {ι : Type t} {S : C} {X : ι → C} (f : ∀ i, X i ⟶ S) +-- to be moved +instance {X Y : C} (f : X ⟶ Y) [IsIso f] (F : Pseudofunctor (LocallyDiscrete C) Cat.{v', u'}) : + (F.map (.toLoc f)).IsEquivalence := by + let e : F.obj (.mk X) ≌ F.obj (.mk Y) := + Equivalence.mk (F.map (.toLoc f)) (F.map (.toLoc (inv f))) + ((F.mapId _).symm ≪≫ F.mapComp' f.toLoc (inv f).toLoc (𝟙 _) (by + rw [← Quiver.Hom.comp_toLoc, IsIso.hom_inv_id, Quiver.Hom.id_toLoc])) + ((F.mapComp' (inv f).toLoc f.toLoc (𝟙 _) (by + rw [← Quiver.Hom.comp_toLoc, IsIso.inv_hom_id, Quiver.Hom.id_toLoc])).symm ≪≫ F.mapId _) + exact e.isEquivalence_functor + /-- The property that a pseudofunctor `(LocallyDiscrete Cᵒᵖ)` to `Cat` has effective descent relative to a family of morphisms `f i : X i ⟶ S` in `C`. -/ abbrev HasEffectiveDescentRelativeTo : Prop := (F.toDescentData f).IsEquivalence From 3c691b30ae006abf6f272f655200896a5bed50d6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=ABl=20Riou?= Date: Mon, 28 Apr 2025 19:13:34 +0200 Subject: [PATCH 036/118] wip --- .../Bicategory/Functor/LocallyDiscrete.lean | 2 +- .../Sites/Descent/DescentData.lean | 51 +++++++++++++++++++ .../Sites/Descent/PullbackStruct.lean | 29 +++++++++++ 3 files changed, 81 insertions(+), 1 deletion(-) create mode 100644 Mathlib/CategoryTheory/Sites/Descent/PullbackStruct.lean diff --git a/Mathlib/CategoryTheory/Bicategory/Functor/LocallyDiscrete.lean b/Mathlib/CategoryTheory/Bicategory/Functor/LocallyDiscrete.lean index 0e8127ee74bfb7..2867f0c55682af 100644 --- a/Mathlib/CategoryTheory/Bicategory/Functor/LocallyDiscrete.lean +++ b/Mathlib/CategoryTheory/Bicategory/Functor/LocallyDiscrete.lean @@ -156,7 +156,7 @@ end LocallyDiscrete /-- The pseudofunctor from `LocallyDiscrete B` to `LocallyDiscrete C` induced by a functor `F : B ⥤ C`. -/ -@[simps!] +@[simps! obj map mapId mapComp] def mapLocallyDiscrete {B C : Type*} [Category B] [Category C] (F : B ⥤ C): Pseudofunctor (LocallyDiscrete B) (LocallyDiscrete C) := LocallyDiscrete.mkPseudofunctor diff --git a/Mathlib/CategoryTheory/Sites/Descent/DescentData.lean b/Mathlib/CategoryTheory/Sites/Descent/DescentData.lean index e1446fc95a5e3b..84941f8db2a41f 100644 --- a/Mathlib/CategoryTheory/Sites/Descent/DescentData.lean +++ b/Mathlib/CategoryTheory/Sites/Descent/DescentData.lean @@ -6,6 +6,7 @@ Authors: Joël Riou, Christian Merten import Mathlib.CategoryTheory.Bicategory.Functor.LocallyDiscrete import Mathlib.CategoryTheory.Sites.Descent.Morphisms import Mathlib.CategoryTheory.Sites.Descent.CodescentData +import Mathlib.CategoryTheory.Sites.Descent.PullbackStruct /-! # Descent data @@ -20,6 +21,23 @@ open Opposite Limits namespace Pseudofunctor +section + +@[simp] +lemma mapComp'_mapLocallyDiscrete_comp + {C D : Type*} [Category C] [Category D] (F : C ⥤ D) + (G : Pseudofunctor (LocallyDiscrete D) Cat) + {X Y Z : LocallyDiscrete C} (f : X ⟶ Y) (g : Y ⟶ Z) (fg : X ⟶ Z) (hfg : f ≫ g = fg) : + ((mapLocallyDiscrete F).comp G).mapComp' f g fg hfg = + G.mapComp' ((mapLocallyDiscrete F).map f) ((mapLocallyDiscrete F).map g) + ((mapLocallyDiscrete F).map fg) (by aesop) := by + ext + subst hfg + rw [mapComp'_eq_mapComp] + rfl + +end + variable {C : Type u} [Category.{v} C] (F : Pseudofunctor (LocallyDiscrete Cᵒᵖ) Cat.{v', u'}) {ι : Type t} {S : C} {X : ι → C} (f : ∀ i, X i ⟶ S) @@ -41,6 +59,39 @@ def toDescentData : F.obj (.mk (op S)) ⥤ F.DescentData f := ext simpa using Over.w m)) +namespace DescentData + +def mk' (obj : ∀ i, F.obj (.mk (op (X i)))) + (hom : ∀ ⦃Y : C⦄ (q : Y ⟶ S) ⦃i₁ i₂ : ι⦄ (f₁ : Y ⟶ X i₁) (f₂ : Y ⟶ X i₂) + (hp₁ : f₁ ≫ f i₁ = q) (hp₂ : f₂ ≫ f i₂ = q), + (F.map f₁.op.toLoc).obj (obj i₁) ⟶ (F.map f₂.op.toLoc).obj (obj i₂)) + (hom_comp' : ∀ ⦃Y Y' : C⦄ (g : Y' ⟶ Y) (q : Y ⟶ S) (q' : Y' ⟶ S) (hq : g ≫ q = q') + ⦃i₁ i₂ : ι⦄ (f₁ : Y ⟶ X i₁) (f₂ : Y ⟶ X i₂) (hf₁ : f₁ ≫ f i₁ = q) (hf₂ : f₂ ≫ f i₂ = q) + (gf₁ : Y' ⟶ X i₁) (gf₂ : Y' ⟶ X i₂) (hgf₁ : g ≫ f₁ = gf₁) (hgf₂ : g ≫ f₂ = gf₂), + hom q' gf₁ gf₂ (by aesop_cat) (by aesop_cat) = + (F.mapComp' f₁.op.toLoc g.op.toLoc gf₁.op.toLoc + (by rw [← Quiver.Hom.comp_toLoc, ← op_comp, hgf₁])).hom.app _ ≫ + (F.map (.toLoc g.op)).map (hom q f₁ f₂ hf₁ hf₂) ≫ + (F.mapComp' f₂.op.toLoc g.op.toLoc gf₂.op.toLoc + (by rw [← Quiver.Hom.comp_toLoc, ← op_comp, hgf₂])).inv.app _) : + F.DescentData f := + CodescentData.mk' obj + (fun Y i₁ i₂ f₁ f₂ ↦ hom Y.as.unop.hom f₁.as.unop.left f₂.as.unop.left + (Over.w f₁.as.unop) (Over.w f₂.as.unop)) + (fun Y' Y g i₁ i₂ f₁ f₂ f₁g f₂g hf₁g hf₂g ↦ by + simpa using hom_comp' g.as.unop.left Y.as.unop.hom Y'.as.unop.hom + (Over.w g.as.unop) f₁.as.unop.left f₂.as.unop.left + (Over.w f₁.as.unop) (Over.w f₂.as.unop) f₁g.as.unop.left f₂g.as.unop.left + (by simp [← hf₁g]) (by simp [← hf₂g])) + sorry sorry + +--variable (obj : ∀ i, (F.obj (.mk (op (X i))))) +-- (sq : ∀ i j, ChosenPullback (f i) (f j)) +-- (hom : ∀ (i j : ι), (F.map (sq i j).p₁.op.toLoc).obj (obj i) ⟶ +-- (F.map (sq i j).p₂.op.toLoc).obj (obj j)) + +end DescentData + end Pseudofunctor end CategoryTheory diff --git a/Mathlib/CategoryTheory/Sites/Descent/PullbackStruct.lean b/Mathlib/CategoryTheory/Sites/Descent/PullbackStruct.lean new file mode 100644 index 00000000000000..2ecf9869aaddb4 --- /dev/null +++ b/Mathlib/CategoryTheory/Sites/Descent/PullbackStruct.lean @@ -0,0 +1,29 @@ +/- +Copyright (c) 2025 Joël Riou. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Joël Riou, Christian Merten +-/ +import Mathlib.CategoryTheory.Limits.Shapes.Pullback.CommSq + +/-! +# Chosen pullbacks + +-/ + +universe v u + +namespace CategoryTheory + +variable {C : Type u} [Category.{v} C] + +namespace Limits + +structure ChosenPullback {X₁ X₂ S : C} (f₁ : X₁ ⟶ S) (f₂ : X₂ ⟶ S) where + pullback : C + p₁ : pullback ⟶ X₁ + p₂ : pullback ⟶ X₂ + isPullback : IsPullback p₁ p₂ f₁ f₂ + +end Limits + +end CategoryTheory From 37fda5e5f6ca0b14eacdeeff7ca936e227f3a8cf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=ABl=20Riou?= Date: Mon, 28 Apr 2025 19:44:58 +0200 Subject: [PATCH 037/118] wip --- .../Sites/Descent/ModuleCat.lean | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 Mathlib/CategoryTheory/Sites/Descent/ModuleCat.lean diff --git a/Mathlib/CategoryTheory/Sites/Descent/ModuleCat.lean b/Mathlib/CategoryTheory/Sites/Descent/ModuleCat.lean new file mode 100644 index 00000000000000..49e0d2b956f4e5 --- /dev/null +++ b/Mathlib/CategoryTheory/Sites/Descent/ModuleCat.lean @@ -0,0 +1,20 @@ +import Mathlib.CategoryTheory.Sites.Descent.HasEffectiveDescent +import Mathlib.Algebra.Category.ModuleCat.Pseudofunctor +import Mathlib.RingTheory.Flat.FaithfullyFlat.Algebra + +universe u + +open CategoryTheory + +namespace CommRingCat.moduleCatExtendScalarsPseudofunctor + +-- this is the key statement in faithfully flat descent + +lemma hasEffectiveDescentRelativeTo_of_faithfullyFlat + (A B : Type u) [CommRing A] [CommRing B] [Algebra A B] [Module.FaithfullyFlat A B]: + ((mapLocallyDiscrete (opOpEquivalence CommRingCat.{u}).functor).comp + moduleCatExtendScalarsPseudofunctor).HasEffectiveDescentRelativeTo + (fun (_ : Unit) ↦ (CommRingCat.ofHom (algebraMap A B)).op) := + sorry + +end CommRingCat.moduleCatExtendScalarsPseudofunctor From 19f25ff70cf867f1a5efbd232db35ef2ac19de41 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=ABl=20Riou?= Date: Mon, 28 Apr 2025 20:48:18 +0200 Subject: [PATCH 038/118] wip --- .../Sites/Descent/DescentData.lean | 49 ++++++++++++++++--- .../Sites/Descent/PullbackStruct.lean | 10 +++- 2 files changed, 51 insertions(+), 8 deletions(-) diff --git a/Mathlib/CategoryTheory/Sites/Descent/DescentData.lean b/Mathlib/CategoryTheory/Sites/Descent/DescentData.lean index 84941f8db2a41f..b5717ee54fd242 100644 --- a/Mathlib/CategoryTheory/Sites/Descent/DescentData.lean +++ b/Mathlib/CategoryTheory/Sites/Descent/DescentData.lean @@ -61,9 +61,12 @@ def toDescentData : F.obj (.mk (op S)) ⥤ F.DescentData f := namespace DescentData +variable {F f} + +@[simps!] def mk' (obj : ∀ i, F.obj (.mk (op (X i)))) (hom : ∀ ⦃Y : C⦄ (q : Y ⟶ S) ⦃i₁ i₂ : ι⦄ (f₁ : Y ⟶ X i₁) (f₂ : Y ⟶ X i₂) - (hp₁ : f₁ ≫ f i₁ = q) (hp₂ : f₂ ≫ f i₂ = q), + (_hf₁ : f₁ ≫ f i₁ = q) (_hf₂ : f₂ ≫ f i₂ = q), (F.map f₁.op.toLoc).obj (obj i₁) ⟶ (F.map f₂.op.toLoc).obj (obj i₂)) (hom_comp' : ∀ ⦃Y Y' : C⦄ (g : Y' ⟶ Y) (q : Y ⟶ S) (q' : Y' ⟶ S) (hq : g ≫ q = q') ⦃i₁ i₂ : ι⦄ (f₁ : Y ⟶ X i₁) (f₂ : Y ⟶ X i₂) (hf₁ : f₁ ≫ f i₁ = q) (hf₂ : f₂ ≫ f i₂ = q) @@ -73,7 +76,12 @@ def mk' (obj : ∀ i, F.obj (.mk (op (X i)))) (by rw [← Quiver.Hom.comp_toLoc, ← op_comp, hgf₁])).hom.app _ ≫ (F.map (.toLoc g.op)).map (hom q f₁ f₂ hf₁ hf₂) ≫ (F.mapComp' f₂.op.toLoc g.op.toLoc gf₂.op.toLoc - (by rw [← Quiver.Hom.comp_toLoc, ← op_comp, hgf₂])).inv.app _) : + (by rw [← Quiver.Hom.comp_toLoc, ← op_comp, hgf₂])).inv.app _) + (hom_self : ∀ ⦃Y : C⦄ (q : Y ⟶ S) ⦃i : ι⦄ (g : Y ⟶ X i) (hg : g ≫ f i = q), + hom q g g hg hg = 𝟙 _) + (comp_hom : ∀ ⦃Y : C⦄ (q : Y ⟶ S) ⦃i₁ i₂ i₃ : ι⦄ (f₁ : Y ⟶ X i₁) (f₂ : Y ⟶ X i₂) + (f₃ : Y ⟶ X i₃) (hf₁ : f₁ ≫ f i₁ = q) (hf₂ : f₂ ≫ f i₂ = q) (hf₃ : f₃ ≫ f i₃ = q), + hom q f₁ f₂ hf₁ hf₂ ≫ hom q f₂ f₃ hf₂ hf₃ = hom q f₁ f₃ hf₁ hf₃) : F.DescentData f := CodescentData.mk' obj (fun Y i₁ i₂ f₁ f₂ ↦ hom Y.as.unop.hom f₁.as.unop.left f₂.as.unop.left @@ -83,12 +91,39 @@ def mk' (obj : ∀ i, F.obj (.mk (op (X i)))) (Over.w g.as.unop) f₁.as.unop.left f₂.as.unop.left (Over.w f₁.as.unop) (Over.w f₂.as.unop) f₁g.as.unop.left f₂g.as.unop.left (by simp [← hf₁g]) (by simp [← hf₂g])) - sorry sorry + (fun _ _ _ ↦ hom_self _ _ _) + (fun Y i₁ i₂ i₃ f₁ f₂ f₃ ↦ comp_hom _ _ _ _ _ _ _) + +variable (obj : ∀ i, (F.obj (.mk (op (X i))))) + (sq : ∀ i j, ChosenPullback (f i) (f j)) + (hom : ∀ (i j : ι), (F.map (sq i j).p₁.op.toLoc).obj (obj i) ⟶ + (F.map (sq i j).p₂.op.toLoc).obj (obj j)) + +noncomputable def mk''Hom ⦃Y : C⦄ (q : Y ⟶ S) ⦃i₁ i₂ : ι⦄ (f₁ : Y ⟶ X i₁) (f₂ : Y ⟶ X i₂) + (hf₁ : f₁ ≫ f i₁ = q) (hf₂ : f₂ ≫ f i₂ = q) : + (F.map f₁.op.toLoc).obj (obj i₁) ⟶ (F.map f₂.op.toLoc).obj (obj i₂) := + let p : Y ⟶ (sq i₁ i₂).pullback := (sq i₁ i₂).isPullback.lift f₁ f₂ (by aesop) + (F.mapComp' (sq i₁ i₂).p₁.op.toLoc p.op.toLoc f₁.op.toLoc + (by rw [← Quiver.Hom.comp_toLoc, ← op_comp, IsPullback.lift_fst])).hom.app _ ≫ + (F.map (.toLoc p.op)).map (hom i₁ i₂) ≫ + (F.mapComp' (sq i₁ i₂).p₂.op.toLoc p.op.toLoc f₂.op.toLoc + (by rw [← Quiver.Hom.comp_toLoc, ← op_comp, IsPullback.lift_snd])).inv.app _ + +lemma mk''Hom_eq ⦃Y : C⦄ (q : Y ⟶ S) ⦃i₁ i₂ : ι⦄ (f₁ : Y ⟶ X i₁) (f₂ : Y ⟶ X i₂) + (hf₁ : f₁ ≫ f i₁ = q) (hf₂ : f₂ ≫ f i₂ = q) (p : Y ⟶ (sq i₁ i₂).pullback) + (hp₁ : p ≫ (sq i₁ i₂).p₁ = f₁) (hp₂ : p ≫ (sq i₁ i₂).p₂ = f₂) : + mk''Hom obj sq hom q f₁ f₂ hf₁ hf₂ = + (F.mapComp' (sq i₁ i₂).p₁.op.toLoc p.op.toLoc f₁.op.toLoc (by aesop)).hom.app _ ≫ + (F.map (.toLoc p.op)).map (hom i₁ i₂) ≫ + (F.mapComp' (sq i₁ i₂).p₂.op.toLoc p.op.toLoc f₂.op.toLoc (by aesop)).inv.app _ := by + obtain rfl : p = (sq i₁ i₂).isPullback.lift f₁ f₂ (by rw [hf₁, hf₂]) := by + apply (sq i₁ i₂).isPullback.hom_ext <;> aesop + rfl ---variable (obj : ∀ i, (F.obj (.mk (op (X i))))) --- (sq : ∀ i j, ChosenPullback (f i) (f j)) --- (hom : ∀ (i j : ι), (F.map (sq i j).p₁.op.toLoc).obj (obj i) ⟶ --- (F.map (sq i j).p₂.op.toLoc).obj (obj j)) +noncomputable def mk'' : F.DescentData f := + DescentData.mk' obj + (fun Y q i₁ i₂ f₁ f₂ hf₁ hf₂ ↦ mk''Hom obj sq hom q f₁ f₂ hf₁ hf₂) + sorry sorry sorry end DescentData diff --git a/Mathlib/CategoryTheory/Sites/Descent/PullbackStruct.lean b/Mathlib/CategoryTheory/Sites/Descent/PullbackStruct.lean index 2ecf9869aaddb4..517511f7fc3940 100644 --- a/Mathlib/CategoryTheory/Sites/Descent/PullbackStruct.lean +++ b/Mathlib/CategoryTheory/Sites/Descent/PullbackStruct.lean @@ -18,12 +18,20 @@ variable {C : Type u} [Category.{v} C] namespace Limits -structure ChosenPullback {X₁ X₂ S : C} (f₁ : X₁ ⟶ S) (f₂ : X₂ ⟶ S) where +variable {X₁ X₂ S : C} (f₁ : X₁ ⟶ S) (f₂ : X₂ ⟶ S) + +structure ChosenPullback where pullback : C p₁ : pullback ⟶ X₁ p₂ : pullback ⟶ X₂ isPullback : IsPullback p₁ p₂ f₁ f₂ +variable {f₁ f₂} + +@[reassoc] +lemma ChosenPullback.w (h : ChosenPullback f₁ f₂) : h.p₁ ≫ f₁ = h.p₂ ≫ f₂ := + h.isPullback.w + end Limits end CategoryTheory From eb0cc9958045ee8d91a6bfc541a257a092ba024d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=ABl=20Riou?= Date: Mon, 28 Apr 2025 21:45:38 +0200 Subject: [PATCH 039/118] wip --- .../Sites/Descent/DescentData.lean | 28 +++++++++++-- .../Sites/Descent/PullbackStruct.lean | 39 ++++++++++++++++--- 2 files changed, 59 insertions(+), 8 deletions(-) diff --git a/Mathlib/CategoryTheory/Sites/Descent/DescentData.lean b/Mathlib/CategoryTheory/Sites/Descent/DescentData.lean index b5717ee54fd242..16a9fa7dd4af94 100644 --- a/Mathlib/CategoryTheory/Sites/Descent/DescentData.lean +++ b/Mathlib/CategoryTheory/Sites/Descent/DescentData.lean @@ -98,6 +98,12 @@ variable (obj : ∀ i, (F.obj (.mk (op (X i))))) (sq : ∀ i j, ChosenPullback (f i) (f j)) (hom : ∀ (i j : ι), (F.map (sq i j).p₁.op.toLoc).obj (obj i) ⟶ (F.map (sq i j).p₂.op.toLoc).obj (obj j)) + (diag : ∀ i, (sq i i).Diagonal) + (hom_self : ∀ i, (F.map (diag i).f.op.toLoc).map (hom i i) = + (F.mapComp' (sq i i).p₁.op.toLoc (diag i).f.op.toLoc (𝟙 _) + (by simp [← Quiver.Hom.comp_toLoc, ← op_comp])).inv.app _ ≫ + (F.mapComp' (sq i i).p₂.op.toLoc (diag i).f.op.toLoc (𝟙 _) + (by simp [← Quiver.Hom.comp_toLoc, ← op_comp])).hom.app _) noncomputable def mk''Hom ⦃Y : C⦄ (q : Y ⟶ S) ⦃i₁ i₂ : ι⦄ (f₁ : Y ⟶ X i₁) (f₂ : Y ⟶ X i₂) (hf₁ : f₁ ≫ f i₁ = q) (hf₂ : f₂ ≫ f i₂ = q) : @@ -120,10 +126,26 @@ lemma mk''Hom_eq ⦃Y : C⦄ (q : Y ⟶ S) ⦃i₁ i₂ : ι⦄ (f₁ : Y ⟶ X apply (sq i₁ i₂).isPullback.hom_ext <;> aesop rfl +lemma mk''Hom_comp' ⦃Y Y' : C⦄ (g : Y' ⟶ Y) (q : Y ⟶ S) (q' : Y' ⟶ S) (hq : g ≫ q = q') + ⦃i₁ i₂ : ι⦄ (f₁ : Y ⟶ X i₁) (f₂ : Y ⟶ X i₂) (hf₁ : f₁ ≫ f i₁ = q) (hf₂ : f₂ ≫ f i₂ = q) + (gf₁ : Y' ⟶ X i₁) (gf₂ : Y' ⟶ X i₂) (hgf₁ : g ≫ f₁ = gf₁) (hgf₂ : g ≫ f₂ = gf₂) : + mk''Hom obj sq hom q' gf₁ gf₂ (by aesop) (by aesop) = + (F.mapComp' f₁.op.toLoc g.op.toLoc gf₁.op.toLoc (by aesop)).hom.app (obj i₁) ≫ + (F.map g.op.toLoc).map (mk''Hom obj sq hom q f₁ f₂ hf₁ hf₂) ≫ + (F.mapComp' f₂.op.toLoc g.op.toLoc gf₂.op.toLoc (by aesop)).inv.app (obj i₂) := by + sorry + +include hom_self in +lemma mk''Hom_self ⦃Y : C⦄ (q : Y ⟶ S) ⦃i : ι⦄ (g : Y ⟶ X i) (hg : g ≫ f i = q) : + mk''Hom obj sq hom q g g hg hg = 𝟙 _ := by + have := hom_self + sorry + noncomputable def mk'' : F.DescentData f := - DescentData.mk' obj - (fun Y q i₁ i₂ f₁ f₂ hf₁ hf₂ ↦ mk''Hom obj sq hom q f₁ f₂ hf₁ hf₂) - sorry sorry sorry + DescentData.mk' obj (fun _ _ _ _ _ _ ↦ mk''Hom _ _ _ _ _ _) + (fun _ _ _ _ _ hq _ _ _ _ _ _ _ _ ↦ mk''Hom_comp' _ _ _ _ _ _ hq _ _ _ _ _ _) + (fun _ _ _ _ hg ↦ mk''Hom_self obj sq hom diag hom_self _ _ hg) + sorry end DescentData diff --git a/Mathlib/CategoryTheory/Sites/Descent/PullbackStruct.lean b/Mathlib/CategoryTheory/Sites/Descent/PullbackStruct.lean index 517511f7fc3940..df26a9f60fc5d9 100644 --- a/Mathlib/CategoryTheory/Sites/Descent/PullbackStruct.lean +++ b/Mathlib/CategoryTheory/Sites/Descent/PullbackStruct.lean @@ -18,20 +18,49 @@ variable {C : Type u} [Category.{v} C] namespace Limits -variable {X₁ X₂ S : C} (f₁ : X₁ ⟶ S) (f₂ : X₂ ⟶ S) - -structure ChosenPullback where +structure ChosenPullback {X₁ X₂ S : C} (f₁ : X₁ ⟶ S) (f₂ : X₂ ⟶ S) where pullback : C p₁ : pullback ⟶ X₁ p₂ : pullback ⟶ X₂ isPullback : IsPullback p₁ p₂ f₁ f₂ -variable {f₁ f₂} +namespace ChosenPullback + +section + +variable {X₁ X₂ S : C} {f₁ : X₁ ⟶ S} {f₂ : X₂ ⟶ S} + (h : ChosenPullback f₁ f₂) @[reassoc] -lemma ChosenPullback.w (h : ChosenPullback f₁ f₂) : h.p₁ ≫ f₁ = h.p₂ ≫ f₂ := +lemma w : h.p₁ ≫ f₁ = h.p₂ ≫ f₂ := h.isPullback.w +structure LiftStruct {Y : C} (g₁ : Y ⟶ X₁) (g₂ : Y ⟶ X₂) where + f : Y ⟶ h.pullback + f_p₁ : f ≫ h.p₁ = g₁ + f_p₂ : f ≫ h.p₂ = g₂ + +namespace LiftStruct + +attribute [reassoc (attr := simp)] f_p₁ f_p₂ + +variable {h} {Y : C} {g₁ : Y ⟶ X₁} {g₂ : Y ⟶ X₂} (l : h.LiftStruct g₁ g₂) + +include l in +@[reassoc] +lemma w : g₁ ≫ f₁ = g₂ ≫ f₂ := by + simp only [← l.f_p₁, ← l.f_p₂, Category.assoc, h.w] + +end LiftStruct + +end + +variable {X S : C} {f : X ⟶ S} (h : ChosenPullback f f) + +abbrev Diagonal := h.LiftStruct (𝟙 X) (𝟙 X) + +end ChosenPullback + end Limits end CategoryTheory From 3a8770a8e4cbfa237dc567f2827d0f1c99b966fb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=ABl=20Riou?= Date: Wed, 30 Apr 2025 00:26:53 +0200 Subject: [PATCH 040/118] wip --- .../Sites/Descent/HasEffectiveDescent.lean | 73 +++++++++++++++---- 1 file changed, 59 insertions(+), 14 deletions(-) diff --git a/Mathlib/CategoryTheory/Sites/Descent/HasEffectiveDescent.lean b/Mathlib/CategoryTheory/Sites/Descent/HasEffectiveDescent.lean index eea7df4081dfdd..c62def5a302ee0 100644 --- a/Mathlib/CategoryTheory/Sites/Descent/HasEffectiveDescent.lean +++ b/Mathlib/CategoryTheory/Sites/Descent/HasEffectiveDescent.lean @@ -18,16 +18,20 @@ open Opposite Limits Bicategory namespace Presieve -variable {C : Type u} [Category.{v} C] (P : Cᵒᵖ ⥤ Type w) {X : C} (R : Presieve X) +variable {C : Type u} [Category.{v} C] (P : Cᵒᵖ ⥤ Type w) {S : C} + +section + +variable (R : Presieve S) @[simps] -def toCompatible (s : P.obj (op X)) : +def toCompatible (R : Presieve S) (s : P.obj (op S)) : Subtype (FamilyOfElements.Compatible (P := P) (R := R)) where val Y f hf := P.map f.op s property Y₁ Y₂ Z g₁ g₂ f₁ f₂ hf₁ hf₂ fac := by simp only [← FunctorToTypes.map_comp_apply, ← op_comp, fac] -lemma isSheafFor_iff_bijective_toCompatible (P : Cᵒᵖ ⥤ Type w) (R : Presieve X) : +lemma isSheafFor_iff_bijective_toCompatible : IsSheafFor P R ↔ Function.Bijective (toCompatible P R) := by constructor · intro h @@ -50,6 +54,39 @@ lemma isSheafFor_iff_bijective_toCompatible (P : Cᵒᵖ ⥤ Type w) (R : Presie funext Y f hf simp only [toCompatible_coe, hs₁ f hf, hs₂ f hf] +end + +variable {ι : Type t} {S : C} {X : ι → C} (f : ∀ i, X i ⟶ S) + +@[simps] +def Arrows.toCompatible (s : P.obj (op S)) : + Subtype (Arrows.Compatible P f) where + val i := P.map (f i).op s + property i j Y pi pj w := by simp only [← FunctorToTypes.map_comp_apply, ← op_comp, w] + +lemma isSheafFor_ofArrows_iff_bijective_toCompatible : + IsSheafFor P (ofArrows _ f) ↔ Function.Bijective (Arrows.toCompatible P f) := by + constructor + · intro h + constructor + · intro s₁ s₂ hs + simp only [Subtype.ext_iff] at hs + apply h.isSeparatedFor.ext + rintro _ _ ⟨i⟩ + exact congr_fun hs i + · rw [isSheafFor_arrows_iff] at h + rintro ⟨x, hx⟩ + obtain ⟨s, hs⟩ := (h x hx).exists + exact ⟨s, by aesop⟩ + · rw [isSheafFor_arrows_iff] + intro h x hx + apply existsUnique_of_exists_of_unique + · obtain ⟨s, hs⟩ := h.surjective ⟨x, hx⟩ + simp only [Subtype.ext_iff] at hs + exact ⟨s, congr_fun hs⟩ + · intro s₁ s₂ hs i + apply h.injective (by aesop) + end Presieve namespace Pseudofunctor @@ -86,23 +123,31 @@ lemma toDescentData_fullyFaithful_iff : map_preimage := (Equiv.ofBijective _ (h _ _)).right_inv }⟩⟩ · refine forall_congr' (fun M ↦ forall_congr' (fun N ↦ ?_)) - -- instead we need a variant of `isSheafFor_arrows_iff` - rw [Presieve.isSheafFor_iff_bijective_toCompatible] - let R := (Presieve.ofArrows (X := Over.mk (𝟙 S)) (fun (i : ι) ↦ Over.mk (f i)) - (fun (i : ι) ↦ Over.homMk (f i))) - let T := Subtype (Presieve.FamilyOfElements.Compatible (P := F.presheafHom M N) (R := R)) + rw [Presieve.isSheafFor_ofArrows_iff_bijective_toCompatible] + let T := Subtype (Presieve.Arrows.Compatible (P := F.presheafHom M N) + (B := Over.mk (𝟙 S)) (X := (fun (i : ι) ↦ Over.mk (f i))) + (fun (i : ι) ↦ Over.homMk (f i))) let α : ((F.toDescentData f).obj M ⟶ (F.toDescentData f).obj N) ≃ T := { - toFun g := ⟨fun Y f hf ↦ by - sorry, sorry⟩ - invFun := sorry - left_inv := sorry - right_inv := sorry + toFun φ := ⟨fun i ↦ φ.hom i, fun i j Z gi gj w ↦ by + replace w := (Over.forget _).congr_map w + dsimp at w + sorry⟩ + invFun ψ := + { hom i := ψ.1 i + comm := by + -- needs specialized constructor for morphisms + sorry } + left_inv _ := rfl + right_inv _ := rfl } let β : (M ⟶ N) ≃ (F.presheafHom M N).obj (op (Over.mk (𝟙 S))) := Equiv.ofBijective _ (Functor.FullyFaithful.map_bijective (Functor.FullyFaithful.ofFullyFaithful (F.map (.toLoc (𝟙 (op S))))) M N) have : Function.comp α (F.toDescentData f).map = - (Presieve.toCompatible (F.presheafHom M N) R).comp β := sorry + (Presieve.Arrows.toCompatible _ _).comp β := by + ext φ i + dsimp [α, β] + sorry rw [← Function.Bijective.of_comp_iff' α.bijective, this, Function.Bijective.of_comp_iff _ β.bijective] From c59fe1571d106812193287ba08ceb4ac496a287e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=ABl=20Riou?= Date: Wed, 30 Apr 2025 00:27:25 +0200 Subject: [PATCH 041/118] comment --- Mathlib/CategoryTheory/Sites/Descent/HasEffectiveDescent.lean | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Mathlib/CategoryTheory/Sites/Descent/HasEffectiveDescent.lean b/Mathlib/CategoryTheory/Sites/Descent/HasEffectiveDescent.lean index c62def5a302ee0..a41a58585bf36e 100644 --- a/Mathlib/CategoryTheory/Sites/Descent/HasEffectiveDescent.lean +++ b/Mathlib/CategoryTheory/Sites/Descent/HasEffectiveDescent.lean @@ -135,7 +135,7 @@ lemma toDescentData_fullyFaithful_iff : invFun ψ := { hom i := ψ.1 i comm := by - -- needs specialized constructor for morphisms + -- needs specialized constructor for morphisms in `DescentData` sorry } left_inv _ := rfl right_inv _ := rfl From 91f19bef5c4313b70ecc0f779b636b37df7baf27 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=ABl=20Riou?= Date: Wed, 30 Apr 2025 11:31:49 +0200 Subject: [PATCH 042/118] mk'' --- .../Limits/Shapes/Pullback/CommSq.lean | 10 +++ .../Sites/Descent/DescentData.lean | 65 ++++++++++++++- .../Sites/Descent/PullbackStruct.lean | 80 ++++++++++++++++++- 3 files changed, 147 insertions(+), 8 deletions(-) diff --git a/Mathlib/CategoryTheory/Limits/Shapes/Pullback/CommSq.lean b/Mathlib/CategoryTheory/Limits/Shapes/Pullback/CommSq.lean index ef2e6728057833..140173c87b588e 100644 --- a/Mathlib/CategoryTheory/Limits/Shapes/Pullback/CommSq.lean +++ b/Mathlib/CategoryTheory/Limits/Shapes/Pullback/CommSq.lean @@ -214,6 +214,11 @@ lemma lift_snd (hP : IsPullback fst snd f g) {W : C} (h : W ⟶ X) (k : W ⟶ Y) (w : h ≫ f = k ≫ g) : hP.lift h k w ≫ snd = k := PullbackCone.IsLimit.lift_snd hP.isLimit h k w +noncomputable def exists_lift (hP : IsPullback fst snd f g) {W : C} (h : W ⟶ X) (k : W ⟶ Y) + (w : h ≫ f = k ≫ g) : + ∃ (l : W ⟶ P), l ≫ fst = h ∧ l ≫ snd = k := + ⟨hP.lift h k w, by simp, by simp⟩ + lemma hom_ext (hP : IsPullback fst snd f g) {W : C} {k l : W ⟶ P} (h₀ : k ≫ fst = l ≫ fst) (h₁ : k ≫ snd = l ≫ snd) : k = l := PullbackCone.IsLimit.hom_ext hP.isLimit h₀ h₁ @@ -437,6 +442,11 @@ lemma inr_desc (hP : IsPushout f g inl inr) {W : C} (h : X ⟶ W) (k : Y ⟶ W) (w : f ≫ h = g ≫ k) : inr ≫ hP.desc h k w = k := PushoutCocone.IsColimit.inr_desc hP.isColimit h k w +noncomputable def exists_desc (hP : IsPushout f g inl inr) {W : C} (h : X ⟶ W) (k : Y ⟶ W) + (w : f ≫ h = g ≫ k) : + ∃ (d : P ⟶ W), inl ≫ d = h ∧ inr ≫ d = k := + ⟨hP.desc h k w, by simp, by simp⟩ + lemma hom_ext (hP : IsPushout f g inl inr) {W : C} {k l : P ⟶ W} (h₀ : inl ≫ k = inl ≫ l) (h₁ : inr ≫ k = inr ≫ l) : k = l := PushoutCocone.IsColimit.hom_ext hP.isColimit h₀ h₁ diff --git a/Mathlib/CategoryTheory/Sites/Descent/DescentData.lean b/Mathlib/CategoryTheory/Sites/Descent/DescentData.lean index 16a9fa7dd4af94..91c01aa1be66fb 100644 --- a/Mathlib/CategoryTheory/Sites/Descent/DescentData.lean +++ b/Mathlib/CategoryTheory/Sites/Descent/DescentData.lean @@ -94,6 +94,8 @@ def mk' (obj : ∀ i, F.obj (.mk (op (X i)))) (fun _ _ _ ↦ hom_self _ _ _) (fun Y i₁ i₂ i₃ f₁ f₂ f₃ ↦ comp_hom _ _ _ _ _ _ _) +section mk'' + variable (obj : ∀ i, (F.obj (.mk (op (X i))))) (sq : ∀ i j, ChosenPullback (f i) (f j)) (hom : ∀ (i j : ι), (F.map (sq i j).p₁.op.toLoc).obj (obj i) ⟶ @@ -133,19 +135,74 @@ lemma mk''Hom_comp' ⦃Y Y' : C⦄ (g : Y' ⟶ Y) (q : Y ⟶ S) (q' : Y' ⟶ S) (F.mapComp' f₁.op.toLoc g.op.toLoc gf₁.op.toLoc (by aesop)).hom.app (obj i₁) ≫ (F.map g.op.toLoc).map (mk''Hom obj sq hom q f₁ f₂ hf₁ hf₂) ≫ (F.mapComp' f₂.op.toLoc g.op.toLoc gf₂.op.toLoc (by aesop)).inv.app (obj i₂) := by - sorry + let p := (sq i₁ i₂).isPullback.lift f₁ f₂ (by aesop) + dsimp + rw [mk''Hom_eq _ _ _ _ _ _ _ _ p (by aesop) (by aesop), + mk''Hom_eq _ _ _ _ _ _ _ _ (g ≫ p) (by aesop) (by aesop)] + dsimp + simp only [Functor.map_comp, Category.assoc] + rw [← F.mapComp'_hom_app_comp_mapComp'_hom_app_map_obj_assoc + _ _ _ _ _ _ (by rw [← Quiver.Hom.comp_toLoc, ← op_comp, IsPullback.lift_fst]) rfl + (by rw [← Quiver.Hom.comp_toLoc, ← Quiver.Hom.comp_toLoc, ← op_comp, ← op_comp, + Category.assoc, IsPullback.lift_fst, hgf₁])] + rw [F.map_map_mapComp'_inv_app_comp_mapComp'_inv_app + _ _ _ _ _ _ (by rw [← Quiver.Hom.comp_toLoc, ← op_comp, IsPullback.lift_snd]) rfl + (by rw [← Quiver.Hom.comp_toLoc, ← op_comp, hgf₂]), + mapComp'_inv_naturality_assoc, Iso.hom_inv_id_app_assoc] + +@[simp] +lemma mk''Hom_p₁_p₂ (i : ι) : + mk''Hom obj sq hom (sq i i).p (sq i i).p₁ (sq i i).p₂ (by simp) (by simp) = hom i i := by + rw [mk''Hom_eq obj sq hom (sq i i).p (sq i i).p₁ (sq i i).p₂ (by simp) (by simp) + (𝟙 _) (by simp) (by simp)] + simp [mapComp'_comp_id_hom_app, mapComp'_comp_id_inv_app] include hom_self in lemma mk''Hom_self ⦃Y : C⦄ (q : Y ⟶ S) ⦃i : ι⦄ (g : Y ⟶ X i) (hg : g ≫ f i = q) : mk''Hom obj sq hom q g g hg hg = 𝟙 _ := by - have := hom_self - sorry + rw [mk''Hom_comp' obj sq hom (g ≫ (diag i).f) (sq i i).p _ (by aesop) (sq i i).p₁ (sq i i).p₂ + (by simp) (by simp) _ _ (by simp) (by simp), mk''Hom_p₁_p₂, + ← F.mapComp'_naturality_2_assoc (diag i).f.op.toLoc g.op.toLoc _ (by simp), hom_self, + Functor.map_comp_assoc] + dsimp + rw [F.mapComp'_inv_app_map_obj_comp_mapComp'_inv_app _ _ _ (𝟙 _) _ _ + (by simp only [← Quiver.Hom.comp_toLoc, ← op_comp, ChosenPullback.LiftStruct.f_p₂, + Quiver.Hom.id_toLoc, op_id]) rfl + (by simp only [← Quiver.Hom.comp_toLoc, ← op_comp, Category.assoc, + ChosenPullback.LiftStruct.f_p₂, Category.comp_id])] + simp only [← Functor.map_comp_assoc, Category.assoc, Iso.hom_inv_id_app, Category.comp_id] + rw [F.mapComp'_hom_app_comp_mapComp'_hom_app_map_obj_assoc _ _ _ (𝟙 _) _ _ + (by simp only [← Quiver.Hom.comp_toLoc, ← op_comp, ChosenPullback.LiftStruct.f_p₁, + Quiver.Hom.id_toLoc, op_id]) rfl + (by simp only [← Quiver.Hom.comp_toLoc, ← op_comp, Category.assoc, + ChosenPullback.LiftStruct.f_p₁, Category.comp_id]), + ← Functor.map_comp_assoc] + simp + +variable (sq₃ : ∀ (i₁ i₂ i₃ : ι), ChosenPullback₃ (sq i₁ i₂) (sq i₂ i₃) (sq i₁ i₃)) + (hom_comp : ∀ (i₁ i₂ i₃ : ι), + mk''Hom obj sq hom (sq₃ i₁ i₂ i₃).p (sq₃ i₁ i₂ i₃).p₁ (sq₃ i₁ i₂ i₃).p₂ (by simp) (by simp) ≫ + mk''Hom obj sq hom (sq₃ i₁ i₂ i₃).p (sq₃ i₁ i₂ i₃).p₂ (sq₃ i₁ i₂ i₃).p₃ (by simp) (by simp) = + mk''Hom obj sq hom (sq₃ i₁ i₂ i₃).p (sq₃ i₁ i₂ i₃).p₁ (sq₃ i₁ i₂ i₃).p₃ (by simp) (by simp)) noncomputable def mk'' : F.DescentData f := DescentData.mk' obj (fun _ _ _ _ _ _ ↦ mk''Hom _ _ _ _ _ _) (fun _ _ _ _ _ hq _ _ _ _ _ _ _ _ ↦ mk''Hom_comp' _ _ _ _ _ _ hq _ _ _ _ _ _) (fun _ _ _ _ hg ↦ mk''Hom_self obj sq hom diag hom_self _ _ hg) - sorry + (fun Y q i₁ i₂ i₃ f₁ f₂ f₃ hf₁ hf₂ hf₃ ↦ by + obtain ⟨φ, _, _, _⟩ := (sq₃ i₁ i₂ i₃).exists_lift f₁ f₂ f₃ q hf₁ hf₂ hf₃ + dsimp + rw [mk''Hom_comp' obj sq hom φ (sq₃ i₁ i₂ i₃).p _ _ + (sq₃ i₁ i₂ i₃).p₁ (sq₃ i₁ i₂ i₃).p₂ _ _ _ _ _ _, + mk''Hom_comp' obj sq hom φ (sq₃ i₁ i₂ i₃).p _ _ (sq₃ i₁ i₂ i₃).p₂ + (sq₃ i₁ i₂ i₃).p₃ _ _ _ _ _ _, + mk''Hom_comp' obj sq hom φ (sq₃ i₁ i₂ i₃).p _ (by aesop) (sq₃ i₁ i₂ i₃).p₁ + (sq₃ i₁ i₂ i₃).p₃ _ _ _ _ _ _] + · simp only [Category.assoc, Iso.inv_hom_id_app_assoc, + ← Functor.map_comp_assoc, hom_comp] + all_goals aesop) + +end mk'' end DescentData diff --git a/Mathlib/CategoryTheory/Sites/Descent/PullbackStruct.lean b/Mathlib/CategoryTheory/Sites/Descent/PullbackStruct.lean index df26a9f60fc5d9..efe406c0fb11fb 100644 --- a/Mathlib/CategoryTheory/Sites/Descent/PullbackStruct.lean +++ b/Mathlib/CategoryTheory/Sites/Descent/PullbackStruct.lean @@ -23,6 +23,8 @@ structure ChosenPullback {X₁ X₂ S : C} (f₁ : X₁ ⟶ S) (f₂ : X₂ ⟶ p₁ : pullback ⟶ X₁ p₂ : pullback ⟶ X₂ isPullback : IsPullback p₁ p₂ f₁ f₂ + p : pullback ⟶ S := p₁ ≫ f₁ + hp₁ : p₁ ≫ f₁ = p := by aesop_cat namespace ChosenPullback @@ -35,16 +37,22 @@ variable {X₁ X₂ S : C} {f₁ : X₁ ⟶ S} {f₂ : X₂ ⟶ S} lemma w : h.p₁ ≫ f₁ = h.p₂ ≫ f₂ := h.isPullback.w -structure LiftStruct {Y : C} (g₁ : Y ⟶ X₁) (g₂ : Y ⟶ X₂) where +attribute [reassoc (attr := simp)] hp₁ + +@[reassoc (attr := simp)] +lemma hp₂ : h.p₂ ≫ f₂ = h.p := by rw [← h.w, hp₁] + +structure LiftStruct {Y : C} (g₁ : Y ⟶ X₁) (g₂ : Y ⟶ X₂) (b : Y ⟶ S) where f : Y ⟶ h.pullback f_p₁ : f ≫ h.p₁ = g₁ f_p₂ : f ≫ h.p₂ = g₂ + f_p : f ≫ h.p = b namespace LiftStruct -attribute [reassoc (attr := simp)] f_p₁ f_p₂ +attribute [reassoc (attr := simp)] f_p₁ f_p₂ f_p -variable {h} {Y : C} {g₁ : Y ⟶ X₁} {g₂ : Y ⟶ X₂} (l : h.LiftStruct g₁ g₂) +variable {h} {Y : C} {g₁ : Y ⟶ X₁} {g₂ : Y ⟶ X₂} {b : Y ⟶ S} (l : h.LiftStruct g₁ g₂ b) include l in @[reassoc] @@ -57,10 +65,74 @@ end variable {X S : C} {f : X ⟶ S} (h : ChosenPullback f f) -abbrev Diagonal := h.LiftStruct (𝟙 X) (𝟙 X) +abbrev Diagonal := h.LiftStruct (𝟙 X) (𝟙 X) f end ChosenPullback +variable {X₁ X₂ X₃ S : C} {f₁ : X₁ ⟶ S} {f₂ : X₂ ⟶ S} {f₃ : X₃ ⟶ S} + (h₁₂ : ChosenPullback f₁ f₂) (h₂₃ : ChosenPullback f₂ f₃) (h₁₃ : ChosenPullback f₁ f₃) + +structure ChosenPullback₃ where + chosenPullback : ChosenPullback h₁₂.p₂ h₂₃.p₁ + p : chosenPullback.pullback ⟶ S := chosenPullback.p₁ ≫ h₁₂.p + l : h₁₃.LiftStruct (chosenPullback.p₁ ≫ h₁₂.p₁) (chosenPullback.p₂ ≫ h₂₃.p₂) p + p₁ : chosenPullback.pullback ⟶ X₁ := chosenPullback.p₁ ≫ h₁₂.p₁ + p₃ : chosenPullback.pullback ⟶ X₃ := chosenPullback.p₂ ≫ h₂₃.p₂ + hp₁ : chosenPullback.p₁ ≫ h₁₂.p₁ = p₁ := by aesop_cat + hp₃ : chosenPullback.p₂ ≫ h₂₃.p₂ = p₃ := by aesop_cat + +namespace ChosenPullback₃ + +variable {h₁₂ h₂₃ h₁₃} (h : ChosenPullback₃ h₁₂ h₂₃ h₁₃) + +def p₁₃ : h.chosenPullback.pullback ⟶ h₁₃.pullback := h.l.f +def p₁₂ : h.chosenPullback.pullback ⟶ h₁₂.pullback := h.chosenPullback.p₁ +def p₂₃ : h.chosenPullback.pullback ⟶ h₂₃.pullback := h.chosenPullback.p₂ +def p₂ : h.chosenPullback.pullback ⟶ X₂ := h.chosenPullback.p + +@[reassoc (attr := simp)] +lemma p₁₂_p₁ : h.p₁₂ ≫ h₁₂.p₁ = h.p₁ := by simp [p₁₂, hp₁] + +@[reassoc (attr := simp)] +lemma p₁₂_p₂ : h.p₁₂ ≫ h₁₂.p₂ = h.p₂ := by simp [p₁₂, p₂] + +@[reassoc (attr := simp)] +lemma p₂₃_p₂ : h.p₂₃ ≫ h₂₃.p₁ = h.p₂ := by simp [p₂₃, p₂] + +@[reassoc (attr := simp)] +lemma p₂₃_p₃ : h.p₂₃ ≫ h₂₃.p₂ = h.p₃ := by simp [p₂₃, hp₃] + +@[reassoc (attr := simp)] +lemma p₁₃_p₁ : h.p₁₃ ≫ h₁₃.p₁ = h.p₁ := by simp [p₁₃, hp₁] + +@[reassoc (attr := simp)] +lemma p₁₃_p₃ : h.p₁₃ ≫ h₁₃.p₂ = h.p₃ := by simp [p₁₃, hp₃] + +@[reassoc (attr := simp)] +lemma w₁ : h.p₁ ≫ f₁ = h.p := by + simpa only [← hp₁, Category.assoc, h₁₃.hp₁, h.l.f_p] using h.l.f_p₁.symm =≫ f₁ + +@[reassoc (attr := simp)] +lemma w₃ : h.p₃ ≫ f₃ = h.p := by + simpa only [← hp₃, Category.assoc, h₁₃.hp₂, h.l.f_p] using h.l.f_p₂.symm =≫ f₃ + +@[reassoc (attr := simp)] +lemma w₂ : h.p₂ ≫ f₂ = h.p := by + rw [← p₂₃_p₂_assoc, h₂₃.w, ← w₃, p₂₃_p₃_assoc] + +lemma exists_lift {Y : C} (g₁ : Y ⟶ X₁) (g₂ : Y ⟶ X₂) (g₃ : Y ⟶ X₃) (b : Y ⟶ S) + (hg₁ : g₁ ≫ f₁ = b) (hg₂ : g₂ ≫ f₂ = b) (hg₃ : g₃ ≫ f₃ = b) : + ∃ (φ : Y ⟶ h.chosenPullback.pullback), φ ≫ h.p₁ = g₁ ∧ φ ≫ h.p₂ = g₂ ∧ φ ≫ h.p₃ = g₃ := by + obtain ⟨φ₁₂, w₁, w₂⟩ := h₁₂.isPullback.exists_lift g₁ g₂ (by aesop) + obtain ⟨φ₂₃, w₂', w₃⟩ := h₂₃.isPullback.exists_lift g₂ g₃ (by aesop) + obtain ⟨φ, w₁₂, w₂₃⟩ := h.chosenPullback.isPullback.exists_lift φ₁₂ φ₂₃ (by aesop) + refine ⟨φ, ?_, ?_, ?_⟩ + · rw [← w₁, ← w₁₂, Category.assoc, ← p₁₂, p₁₂_p₁] + · rw [← w₂, ← w₁₂, Category.assoc, ← p₁₂, p₁₂_p₂] + · rw [← w₃, ← w₂₃, Category.assoc, ← p₂₃, p₂₃_p₃] + +end ChosenPullback₃ + end Limits end CategoryTheory From f00346e899cd8709258709c87fff96fb04f01bb7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=ABl=20Riou?= Date: Wed, 30 Apr 2025 11:33:45 +0200 Subject: [PATCH 043/118] moved mk'' to #24434 --- .../Sites/Descent/CodescentData.lean | 96 ------------------- 1 file changed, 96 deletions(-) diff --git a/Mathlib/CategoryTheory/Sites/Descent/CodescentData.lean b/Mathlib/CategoryTheory/Sites/Descent/CodescentData.lean index e6eedb0c0b7784..73f85244523488 100644 --- a/Mathlib/CategoryTheory/Sites/Descent/CodescentData.lean +++ b/Mathlib/CategoryTheory/Sites/Descent/CodescentData.lean @@ -255,102 +255,6 @@ def toCodescentDataOfIsInitial (X₀ : C) (hX₀ : IsInitial X₀) : map_id := by intros; ext; dsimp; simp only [Functor.map_id] map_comp := by intros; ext; dsimp; simp only [Functor.map_comp] -namespace CodescentData - -section Unique - -variable {X : C} (obj : F.obj X) (c : BinaryCofan X X) - (hc : IsColimit c) (map : c.pt ⟶ X) - (heq : map = hc.desc (BinaryCofan.mk (𝟙 _) (𝟙 _))) - {Z : C} {ι₁₂ ι₂₃ : c.pt ⟶ Z} - (h : IsPushout c.inl c.inr ι₂₃ ι₁₂) - (p₁ p₂ p₃ : X ⟶ Z) - (hp₁ : c.inl ≫ ι₁₂ = p₁) (hp₂ : c.inr ≫ ι₁₂ = p₂) (hp₃ : c.inr ≫ ι₂₃ = p₃) - (hom : (F.map c.inl).obj obj ⟶ (F.map c.inr).obj obj) - (hom_self : (F.map map).map hom = - (F.mapComp' c.inl map (𝟙 X)).inv.app obj ≫ - (F.mapComp' c.inr map (𝟙 X)).hom.app obj) - -def mk''Hom {Y : C} (f₁ f₂ : X ⟶ Y) : - (F.map f₁).obj obj ⟶ (F.map f₂).obj obj := - (F.mapComp' c.inl _ f₁ (by simp)).hom.app obj ≫ - (F.map (hc.desc (BinaryCofan.mk f₁ f₂))).map hom ≫ - (F.mapComp' c.inr _ f₂ (by simp)).inv.app obj - -lemma mk''Hom_eq {Y : C} (f₁ f₂ : X ⟶ Y) (p : c.pt ⟶ Y) (hp₁ : c.inl ≫ p = f₁) - (hp₂ : c.inr ≫ p = f₂) : - mk''Hom F obj c hc hom f₁ f₂ = - (F.mapComp' c.inl p f₁ hp₁).hom.app obj ≫ (F.map p).map hom ≫ - (F.mapComp' c.inr p f₂ hp₂).inv.app obj := by - obtain rfl : p = (hc.desc <| BinaryCofan.mk f₁ f₂) := by - apply BinaryCofan.IsColimit.hom_ext hc <;> simp [hp₁, hp₂] - rfl - -@[simp] -lemma mk''Hom_inl_inr : - mk''Hom F obj c hc hom c.inl c.inr = hom := by - simp [mk''Hom_eq F obj c hc hom c.inl c.inr (𝟙 _) (by simp) (by simp), - mapComp'_comp_id_hom_app, mapComp'_comp_id_inv_app] - -lemma mk''Hom_comp' {Y' Y : C} (g : Y ⟶ Y') (f₁ f₂ : X ⟶ Y) - (f₁g : X ⟶ Y') (f₂g : X ⟶ Y') (hf₁g : f₁ ≫ g = f₁g) (hf₂g : f₂ ≫ g = f₂g) : - mk''Hom F obj c hc hom f₁g f₂g = - (F.mapComp' f₁ g f₁g hf₁g).hom.app obj ≫ - (F.map g).map (mk''Hom F obj c hc hom f₁ f₂) ≫ - (F.mapComp' f₂ g f₂g hf₂g).inv.app obj := by - let p : c.pt ⟶ Y := hc.desc (BinaryCofan.mk f₁ f₂) - dsimp - rw [mk''Hom_eq _ _ _ _ _ _ _ p (by simp [p]) (by simp [p]), - mk''Hom_eq _ _ _ _ _ _ _ (p ≫ g) (by aesop_cat) (by aesop_cat)] - dsimp - simp only [Functor.map_comp, assoc] - rw [← F.mapComp'_hom_app_comp_mapComp'_hom_app_map_obj_assoc - _ _ _ _ (p ≫ g) _ (by aesop_cat) (by aesop_cat) (by aesop_cat), - F.map_map_mapComp'_inv_app_comp_mapComp'_inv_app - _ _ _ _ (p ≫ g) _ (by aesop_cat) (by aesop_cat) (by aesop_cat), - ← F.mapComp'_hom_naturality_assoc, Iso.hom_inv_id_app_assoc] - -include hom_self in -lemma mk''Hom_self {Y : C} (f : X ⟶ Y) : - mk''Hom F obj c hc hom f f = 𝟙 _ := by - rw [mk''Hom_comp' F obj c hc hom (map ≫ f) c.inl c.inr f f - (by aesop_cat) (by aesop_cat), mk''Hom_inl_inr, - ← F.mapComp'_naturality_2_assoc map f (map ≫ f) rfl hom, - hom_self, Functor.map_comp_assoc, - F.mapComp'_inv_app_map_obj_comp_mapComp'_inv_app _ _ _ - (𝟙 X) _ _ (by aesop_cat) (by aesop_cat) (by aesop_cat), - ← Functor.map_comp_assoc, ← Functor.map_comp_assoc, assoc, - Iso.hom_inv_id_app, comp_id, - F.mapComp'_hom_app_comp_mapComp'_hom_app_map_obj_assoc - _ _ _ (𝟙 X) _ _ (by aesop_cat) (by aesop_cat) (by aesop_cat), - ← Functor.map_comp_assoc, Iso.hom_inv_id_app, - Functor.map_id] - simp only [id_comp, Iso.hom_inv_id_app] - -/-- Constructor for `Pseudofunctor.CodescentData` for a family consisting -of only one object `X` equipped with a chosen binary and ternary coproduct. -/ -def mk'' - (hom_comp : mk''Hom F obj c hc hom p₁ p₂ ≫ mk''Hom F obj c hc hom p₂ p₃ = - mk''Hom F obj c hc hom p₁ p₃) : F.CodescentData (fun _ : PUnit.{t + 1} ↦ X) := - mk' (fun _ ↦ obj) (fun _ _ _ ↦ mk''Hom F obj c hc hom) - (fun _ _ _ _ _ ↦ mk''Hom_comp' _ _ _ _ _ _) (by - rintro Y ⟨⟩ f - exact mk''Hom_self F obj c hc map heq hom hom_self f) (by - rintro Y ⟨⟩ ⟨⟩ ⟨⟩ f₁ f₂ f₃ - obtain ⟨φ, hφ₁, hφ₂, hφ₃⟩ : - ∃ (φ : Z ⟶ Y), c.inl ≫ ι₁₂ ≫ φ = f₁ ∧ - c.inr ≫ ι₁₂ ≫ φ = f₂ ∧ c.inr ≫ ι₂₃ ≫ φ = f₃ := - ⟨h.desc (hc.desc (BinaryCofan.mk f₂ f₃)) - (hc.desc (BinaryCofan.mk f₁ f₂)) (by simp), by simp, by simp, by simp⟩ - simp only [mk''Hom_comp' F obj c hc hom φ p₁ p₂ f₁ f₂ (by aesop_cat) (by aesop_cat), - mk''Hom_comp' F obj c hc hom φ p₂ p₃ f₂ f₃ (by aesop_cat) (by aesop_cat), - mk''Hom_comp' F obj c hc hom φ p₁ p₃ f₁ f₃ (by aesop_cat) (by aesop_cat), - assoc, Iso.inv_hom_id_app_assoc, ← Functor.map_comp_assoc, hom_comp]) - -end Unique - -end CodescentData - end Pseudofunctor end CategoryTheory From d7e599f6365f6f55c65e05b9340e0560f11852aa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=ABl=20Riou?= Date: Tue, 6 May 2025 10:10:35 +0200 Subject: [PATCH 044/118] wip --- Mathlib.lean | 3 ++ .../Sites/Descent/Coalgebra.lean | 48 +++++++++++++++++++ 2 files changed, 51 insertions(+) create mode 100644 Mathlib/CategoryTheory/Sites/Descent/Coalgebra.lean diff --git a/Mathlib.lean b/Mathlib.lean index a2286d76c47d35..1c2a119d806853 100644 --- a/Mathlib.lean +++ b/Mathlib.lean @@ -2464,10 +2464,13 @@ import Mathlib.CategoryTheory.Sites.CoversTop import Mathlib.CategoryTheory.Sites.DenseSubsite.Basic import Mathlib.CategoryTheory.Sites.DenseSubsite.InducedTopology import Mathlib.CategoryTheory.Sites.DenseSubsite.SheafEquiv +import Mathlib.CategoryTheory.Sites.Descent.Coalgebra import Mathlib.CategoryTheory.Sites.Descent.CodescentData import Mathlib.CategoryTheory.Sites.Descent.DescentData import Mathlib.CategoryTheory.Sites.Descent.HasEffectiveDescent +import Mathlib.CategoryTheory.Sites.Descent.ModuleCat import Mathlib.CategoryTheory.Sites.Descent.Morphisms +import Mathlib.CategoryTheory.Sites.Descent.PullbackStruct import Mathlib.CategoryTheory.Sites.EffectiveEpimorphic import Mathlib.CategoryTheory.Sites.EpiMono import Mathlib.CategoryTheory.Sites.EqualizerSheafCondition diff --git a/Mathlib/CategoryTheory/Sites/Descent/Coalgebra.lean b/Mathlib/CategoryTheory/Sites/Descent/Coalgebra.lean new file mode 100644 index 00000000000000..5d3bb89aaaa5dd --- /dev/null +++ b/Mathlib/CategoryTheory/Sites/Descent/Coalgebra.lean @@ -0,0 +1,48 @@ +/- +Copyright (c) 2025 Joël Riou. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Joël Riou +-/ +import Mathlib.CategoryTheory.Sites.Descent.DescentData +import Mathlib.CategoryTheory.Sites.Descent.PullbackStruct +import Mathlib.CategoryTheory.Bicategory.Adjunction.Adj +import Mathlib.CategoryTheory.Monad.Comonadicity + +/-! +# Descent data and coalgebras... + +-/ + +namespace CategoryTheory + +open Bicategory Limits + +@[simps] +def Bicategory.Adjunction.toCategory {C D : Cat} {F : C ⟶ D} {G : D ⟶ C} + (adj : Bicategory.Adjunction F G) : + CategoryTheory.Adjunction F G where + unit := adj.unit + counit := adj.counit + left_triangle_components X := by + have := congr_app adj.left_triangle X + dsimp [leftZigzag, bicategoricalComp] at this + simpa [Cat.associator_hom_app, Cat.leftUnitor_hom_app, Cat.rightUnitor_inv_app] using this + right_triangle_components X := by + have := congr_app adj.right_triangle X + dsimp [rightZigzag, bicategoricalComp] at this + simpa [Cat.associator_inv_app, Cat.leftUnitor_inv_app] using this + +variable {C : Type*} [Category C] + +namespace Pseudofunctor + +variable (F : Pseudofunctor (LocallyDiscrete Cᵒᵖ) (Adj Cat)) {X S : C} (f : X ⟶ S) + +def descentDataEquivCoalgebra (sq : ChosenPullback f f) (diag : sq.Diagonal) + (sq₃ : ChosenPullback₃ sq sq sq) : + (F.comp Adj.forget₁).DescentData (fun (_ : Unit) ↦ f) ≌ + (F.map f.op.toLoc).adj.toCategory.toComonad.Coalgebra := sorry + +end Pseudofunctor + +end CategoryTheory From 01eef4a77a826fe58659ecbb38f7120185a13536 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=ABl=20Riou?= Date: Tue, 6 May 2025 10:13:11 +0200 Subject: [PATCH 045/118] added comment --- Mathlib/CategoryTheory/Sites/Descent/Coalgebra.lean | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Mathlib/CategoryTheory/Sites/Descent/Coalgebra.lean b/Mathlib/CategoryTheory/Sites/Descent/Coalgebra.lean index 5d3bb89aaaa5dd..f431b03e8efaa5 100644 --- a/Mathlib/CategoryTheory/Sites/Descent/Coalgebra.lean +++ b/Mathlib/CategoryTheory/Sites/Descent/Coalgebra.lean @@ -38,6 +38,8 @@ namespace Pseudofunctor variable (F : Pseudofunctor (LocallyDiscrete Cᵒᵖ) (Adj Cat)) {X S : C} (f : X ⟶ S) +-- needs more assumptions about certain "base change" maps being isomorphisms +-- for the square that are part of the data `sq` and `sq₃` def descentDataEquivCoalgebra (sq : ChosenPullback f f) (diag : sq.Diagonal) (sq₃ : ChosenPullback₃ sq sq sq) : (F.comp Adj.forget₁).DescentData (fun (_ : Unit) ↦ f) ≌ From 951c7165e4a6a43c60ced42ffcc6cea80cb30c3e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=ABl=20Riou?= Date: Wed, 7 May 2025 11:51:48 +0200 Subject: [PATCH 046/118] the category descentDataPrime --- Mathlib.lean | 1 + .../Sites/Descent/DescentData.lean | 1 + .../Sites/Descent/DescentDataPrime.lean | 176 ++++++++++++++++++ 3 files changed, 178 insertions(+) create mode 100644 Mathlib/CategoryTheory/Sites/Descent/DescentDataPrime.lean diff --git a/Mathlib.lean b/Mathlib.lean index 5f58092b357471..2184cec0d768fb 100644 --- a/Mathlib.lean +++ b/Mathlib.lean @@ -2469,6 +2469,7 @@ import Mathlib.CategoryTheory.Sites.DenseSubsite.SheafEquiv import Mathlib.CategoryTheory.Sites.Descent.Coalgebra import Mathlib.CategoryTheory.Sites.Descent.CodescentData import Mathlib.CategoryTheory.Sites.Descent.DescentData +import Mathlib.CategoryTheory.Sites.Descent.DescentDataPrime import Mathlib.CategoryTheory.Sites.Descent.HasEffectiveDescent import Mathlib.CategoryTheory.Sites.Descent.ModuleCat import Mathlib.CategoryTheory.Sites.Descent.Morphisms diff --git a/Mathlib/CategoryTheory/Sites/Descent/DescentData.lean b/Mathlib/CategoryTheory/Sites/Descent/DescentData.lean index 91c01aa1be66fb..fabbf6f5b1527a 100644 --- a/Mathlib/CategoryTheory/Sites/Descent/DescentData.lean +++ b/Mathlib/CategoryTheory/Sites/Descent/DescentData.lean @@ -185,6 +185,7 @@ variable (sq₃ : ∀ (i₁ i₂ i₃ : ι), ChosenPullback₃ (sq i₁ i₂) (s mk''Hom obj sq hom (sq₃ i₁ i₂ i₃).p (sq₃ i₁ i₂ i₃).p₂ (sq₃ i₁ i₂ i₃).p₃ (by simp) (by simp) = mk''Hom obj sq hom (sq₃ i₁ i₂ i₃).p (sq₃ i₁ i₂ i₃).p₁ (sq₃ i₁ i₂ i₃).p₃ (by simp) (by simp)) +-- TODO @jriou: moving to DescentDataPrime.lean noncomputable def mk'' : F.DescentData f := DescentData.mk' obj (fun _ _ _ _ _ _ ↦ mk''Hom _ _ _ _ _ _) (fun _ _ _ _ _ hq _ _ _ _ _ _ _ _ ↦ mk''Hom_comp' _ _ _ _ _ _ hq _ _ _ _ _ _) diff --git a/Mathlib/CategoryTheory/Sites/Descent/DescentDataPrime.lean b/Mathlib/CategoryTheory/Sites/Descent/DescentDataPrime.lean new file mode 100644 index 00000000000000..235d88c623027a --- /dev/null +++ b/Mathlib/CategoryTheory/Sites/Descent/DescentDataPrime.lean @@ -0,0 +1,176 @@ +/- +Copyright (c) 2025 Joël Riou. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Joël Riou +-/ +import Mathlib.CategoryTheory.Sites.Descent.DescentData + +/-! +# Descent data ... + +-/ + +namespace CategoryTheory + +open Opposite Limits + +namespace Pseudofunctor + +variable {C : Type*} [Category C] (F : Pseudofunctor (LocallyDiscrete Cᵒᵖ) Cat) + {ι : Type*} {S : C} {X : ι → C} {f : ∀ i, X i ⟶ S} + (sq : ∀ i j, ChosenPullback (f i) (f j)) + (sq₃ : ∀ (i₁ i₂ i₃ : ι), ChosenPullback₃ (sq i₁ i₂) (sq i₂ i₃) (sq i₁ i₃)) + +namespace DescentData' + +variable {F sq} + +section + +variable {obj obj' : ∀ (i : ι), F.obj (.mk (op (X i)))} + (hom : ∀ (i j : ι), (F.map (sq i j).p₁.op.toLoc).obj (obj i) ⟶ + (F.map (sq i j).p₂.op.toLoc).obj (obj' j)) + +noncomputable def pullHom ⦃Y : C⦄ (q : Y ⟶ S) ⦃i₁ i₂ : ι⦄ (f₁ : Y ⟶ X i₁) (f₂ : Y ⟶ X i₂) + (hf₁ : f₁ ≫ f i₁ = q := by aesop_cat) (hf₂ : f₂ ≫ f i₂ = q := by aesop_cat) : + (F.map f₁.op.toLoc).obj (obj i₁) ⟶ (F.map f₂.op.toLoc).obj (obj' i₂) := + let p : Y ⟶ (sq i₁ i₂).pullback := (sq i₁ i₂).isPullback.lift f₁ f₂ (by aesop) + (F.mapComp' (sq i₁ i₂).p₁.op.toLoc p.op.toLoc f₁.op.toLoc + (by rw [← Quiver.Hom.comp_toLoc, ← op_comp, IsPullback.lift_fst])).hom.app _ ≫ + (F.map (.toLoc p.op)).map (hom i₁ i₂) ≫ + (F.mapComp' (sq i₁ i₂).p₂.op.toLoc p.op.toLoc f₂.op.toLoc + (by rw [← Quiver.Hom.comp_toLoc, ← op_comp, IsPullback.lift_snd])).inv.app _ + +lemma pullHom_eq ⦃Y : C⦄ (q : Y ⟶ S) ⦃i₁ i₂ : ι⦄ (f₁ : Y ⟶ X i₁) (f₂ : Y ⟶ X i₂) + (hf₁ : f₁ ≫ f i₁ = q) (hf₂ : f₂ ≫ f i₂ = q) (p : Y ⟶ (sq i₁ i₂).pullback) + (hp₁ : p ≫ (sq i₁ i₂).p₁ = f₁) (hp₂ : p ≫ (sq i₁ i₂).p₂ = f₂) : + pullHom hom q f₁ f₂ hf₁ hf₂ = + (F.mapComp' (sq i₁ i₂).p₁.op.toLoc p.op.toLoc f₁.op.toLoc (by aesop)).hom.app _ ≫ + (F.map (.toLoc p.op)).map (hom i₁ i₂) ≫ + (F.mapComp' (sq i₁ i₂).p₂.op.toLoc p.op.toLoc f₂.op.toLoc (by aesop)).inv.app _ := by + obtain rfl : p = (sq i₁ i₂).isPullback.lift f₁ f₂ (by rw [hf₁, hf₂]) := by + apply (sq i₁ i₂).isPullback.hom_ext <;> aesop + rfl + +lemma pullHom_comp' ⦃Y Y' : C⦄ (g : Y' ⟶ Y) (q : Y ⟶ S) (q' : Y' ⟶ S) (hq : g ≫ q = q') + ⦃i₁ i₂ : ι⦄ (f₁ : Y ⟶ X i₁) (f₂ : Y ⟶ X i₂) (hf₁ : f₁ ≫ f i₁ = q) (hf₂ : f₂ ≫ f i₂ = q) + (gf₁ : Y' ⟶ X i₁) (gf₂ : Y' ⟶ X i₂) (hgf₁ : g ≫ f₁ = gf₁) (hgf₂ : g ≫ f₂ = gf₂) : + pullHom hom q' gf₁ gf₂ = + (F.mapComp' f₁.op.toLoc g.op.toLoc gf₁.op.toLoc (by aesop)).hom.app (obj i₁) ≫ + (F.map g.op.toLoc).map (pullHom hom q f₁ f₂ hf₁ hf₂) ≫ + (F.mapComp' f₂.op.toLoc g.op.toLoc gf₂.op.toLoc (by aesop)).inv.app (obj' i₂) := by + let p := (sq i₁ i₂).isPullback.lift f₁ f₂ (by aesop) + dsimp + rw [pullHom_eq _ _ _ _ _ _ p (by aesop) (by aesop), + pullHom_eq _ _ _ _ _ _ (g ≫ p) (by aesop) (by aesop)] + dsimp + simp only [Functor.map_comp, Category.assoc] + rw [← F.mapComp'_hom_app_comp_mapComp'_hom_app_map_obj_assoc + _ _ _ _ _ _ (by rw [← Quiver.Hom.comp_toLoc, ← op_comp, IsPullback.lift_fst]) rfl + (by rw [← Quiver.Hom.comp_toLoc, ← Quiver.Hom.comp_toLoc, ← op_comp, ← op_comp, + Category.assoc, IsPullback.lift_fst, hgf₁])] + rw [F.map_map_mapComp'_inv_app_comp_mapComp'_inv_app + _ _ _ _ _ _ (by rw [← Quiver.Hom.comp_toLoc, ← op_comp, IsPullback.lift_snd]) rfl + (by rw [← Quiver.Hom.comp_toLoc, ← op_comp, hgf₂]), + mapComp'_inv_naturality_assoc, Iso.hom_inv_id_app_assoc] + +end + +section + +variable {obj : ∀ (i : ι), F.obj (.mk (op (X i)))} + (hom : ∀ (i j : ι), (F.map (sq i j).p₁.op.toLoc).obj (obj i) ⟶ + (F.map (sq i j).p₂.op.toLoc).obj (obj j)) + +@[simp] +lemma pullHom_p₁_p₂ (i : ι) : + pullHom hom (sq i i).p (sq i i).p₁ (sq i i).p₂ (by simp) (by simp) = hom i i := by + rw [pullHom_eq hom (sq i i).p (sq i i).p₁ (sq i i).p₂ (by simp) (by simp) + (𝟙 _) (by simp) (by simp)] + simp [mapComp'_comp_id_hom_app, mapComp'_comp_id_inv_app] + +lemma pullHom_self' (hom_self : ∀ i, pullHom hom (f i) (𝟙 (X i)) (𝟙 (X i)) = 𝟙 _) + ⦃Y : C⦄ (q : Y ⟶ S) ⦃i : ι⦄ (g : Y ⟶ X i) (hg : g ≫ f i = q) : + pullHom hom q g g hg hg = 𝟙 _ := by + simp [pullHom_comp' hom g (f i) q hg (𝟙 (X i)) (𝟙 (X i)) (by simp) (by simp) g g + (by simp) (by simp), hom_self] + +end + +end DescentData' + +open DescentData' in + +structure DescentData' where + obj (i : ι) : F.obj (.mk (op (X i))) + hom : ∀ (i j : ι), (F.map (sq i j).p₁.op.toLoc).obj (obj i) ⟶ + (F.map (sq i j).p₂.op.toLoc).obj (obj j) + hom_self : ∀ i, pullHom hom (f i) (𝟙 (X i)) (𝟙 (X i)) = 𝟙 _ + hom_comp (i₁ i₂ i₃ : ι) : + pullHom hom (sq₃ i₁ i₂ i₃).p (sq₃ i₁ i₂ i₃).p₁ (sq₃ i₁ i₂ i₃).p₂ ≫ + pullHom hom (sq₃ i₁ i₂ i₃).p (sq₃ i₁ i₂ i₃).p₂ (sq₃ i₁ i₂ i₃).p₃ = + pullHom hom (sq₃ i₁ i₂ i₃).p (sq₃ i₁ i₂ i₃).p₁ (sq₃ i₁ i₂ i₃).p₃ + +namespace DescentData' + +variable {F sq sq₃} + +@[simp] +lemma pullHom_self (D : F.DescentData' sq sq₃) + ⦃Y : C⦄ (q : Y ⟶ S) ⦃i : ι⦄ (g : Y ⟶ X i) (hg : g ≫ f i = q) : + pullHom D.hom q g g hg hg = 𝟙 _ := + pullHom_self' _ D.hom_self _ _ _ + +@[ext] +structure Hom (D₁ D₂ : F.DescentData' sq sq₃) where + hom (i : ι) : D₁.obj i ⟶ D₂.obj i + comm (i₁ i₂ : ι) : + (F.map (sq i₁ i₂).p₁.op.toLoc).map (hom i₁) ≫ + pullHom D₂.hom (sq i₁ i₂).p (sq i₁ i₂).p₁ (sq i₁ i₂).p₂ = + pullHom D₁.hom (sq i₁ i₂).p (sq i₁ i₂).p₁ (sq i₁ i₂).p₂ ≫ + (F.map (sq i₁ i₂).p₂.op.toLoc).map (hom i₂) := by aesop_cat + +attribute [reassoc (attr := simp)] Hom.comm + +@[simps] +def Hom.id (D : F.DescentData' sq sq₃) : Hom D D where + hom _ := 𝟙 _ + +@[simps] +def Hom.comp {D₁ D₂ D₃ : F.DescentData' sq sq₃} (f : Hom D₁ D₂) (g : Hom D₂ D₃) : Hom D₁ D₃ where + hom i := f.hom i ≫ g.hom i + +instance : Category (F.DescentData' sq sq₃) where + Hom := Hom + id := Hom.id + comp := Hom.comp + +@[ext] +lemma hom_ext {D₁ D₂ : F.DescentData' sq sq₃} {f g : D₁ ⟶ D₂} + (h : ∀ i, f.hom i = g.hom i) : f = g := + Hom.ext (funext h) + +@[reassoc, simp] +lemma comp_hom {D₁ D₂ D₃ : F.DescentData' sq sq₃} (f : D₁ ⟶ D₂) (g : D₂ ⟶ D₃) (i : ι) : + (f ≫ g).hom i = f.hom i ≫ g.hom i := + rfl + +@[simp] +lemma id_hom (D : F.DescentData' sq sq₃) (i : ι) : + Hom.hom (𝟙 D) i = 𝟙 _ := + rfl + +/-noncomputable def descentData (D : F.DescentData' sq sq₃) : F.DescentData f := + .mk' D.obj + (fun _ _ _ _ _ _ _ _ ↦ pullHom D.hom _ _ _ (by aesop) (by aesop)) + (fun _ _ _ _ _ hq _ _ _ _ _ _ _ _ hgf₁ hgf₂ ↦ + pullHom_comp' _ _ _ _ hq _ _ _ _ _ _ hgf₁ hgf₂) + (by simp) sorry-/ + +end DescentData' + +--def DescentData'.toDescentData : F.DescentData' sq sq₃ ⥤ F.DescentData f := sorry + +end Pseudofunctor + +end CategoryTheory From d7f2c38a4198831ef824bd030fc202d810e9d362 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=ABl=20Riou?= Date: Wed, 7 May 2025 12:20:16 +0200 Subject: [PATCH 047/118] wip --- .../Sites/Descent/DescentDataPrime.lean | 34 +++++++++++++++++-- 1 file changed, 31 insertions(+), 3 deletions(-) diff --git a/Mathlib/CategoryTheory/Sites/Descent/DescentDataPrime.lean b/Mathlib/CategoryTheory/Sites/Descent/DescentDataPrime.lean index 235d88c623027a..2dfaf8bedad8bd 100644 --- a/Mathlib/CategoryTheory/Sites/Descent/DescentDataPrime.lean +++ b/Mathlib/CategoryTheory/Sites/Descent/DescentDataPrime.lean @@ -95,6 +95,18 @@ lemma pullHom_self' (hom_self : ∀ i, pullHom hom (f i) (𝟙 (X i)) (𝟙 (X i simp [pullHom_comp' hom g (f i) q hg (𝟙 (X i)) (𝟙 (X i)) (by simp) (by simp) g g (by simp) (by simp), hom_self] +variable {sq₃} in +@[reassoc] +lemma comp_pullHom' (hom_comp : ∀ (i₁ i₂ i₃ : ι), + pullHom hom (sq₃ i₁ i₂ i₃).p (sq₃ i₁ i₂ i₃).p₁ (sq₃ i₁ i₂ i₃).p₂ ≫ + pullHom hom (sq₃ i₁ i₂ i₃).p (sq₃ i₁ i₂ i₃).p₂ (sq₃ i₁ i₂ i₃).p₃ = + pullHom hom (sq₃ i₁ i₂ i₃).p (sq₃ i₁ i₂ i₃).p₁ (sq₃ i₁ i₂ i₃).p₃) + ⦃Y : C⦄ (q : Y ⟶ S) ⦃i₁ i₂ i₃ : ι⦄ (f₁ : Y ⟶ X i₁) + (f₂ : Y ⟶ X i₂) (f₃ : Y ⟶ X i₃) (hf₁ : f₁ ≫ f i₁ = q) + (hf₂ : f₂ ≫ f i₂ = q) (hf₃ : f₃ ≫ f i₃ = q) : + pullHom hom q f₁ f₂ ≫ pullHom hom q f₂ f₃ = pullHom hom q f₁ f₃ := by + sorry + end end DescentData' @@ -121,6 +133,15 @@ lemma pullHom_self (D : F.DescentData' sq sq₃) pullHom D.hom q g g hg hg = 𝟙 _ := pullHom_self' _ D.hom_self _ _ _ +@[reassoc (attr := simp)] +lemma comp_pullHom (D : F.DescentData' sq sq₃) + ⦃Y : C⦄ (q : Y ⟶ S) ⦃i₁ i₂ i₃ : ι⦄ (f₁ : Y ⟶ X i₁) + (f₂ : Y ⟶ X i₂) (f₃ : Y ⟶ X i₃) (hf₁ : f₁ ≫ f i₁ = q) + (hf₂ : f₂ ≫ f i₂ = q) (hf₃ : f₃ ≫ f i₃ = q) : + pullHom D.hom q f₁ f₂ hf₁ hf₂ ≫ pullHom D.hom q f₂ f₃ hf₂ hf₃ = + pullHom D.hom q f₁ f₃ hf₁ hf₃ := + comp_pullHom' _ D.hom_comp _ _ _ _ hf₁ hf₂ hf₃ + @[ext] structure Hom (D₁ D₂ : F.DescentData' sq sq₃) where hom (i : ι) : D₁.obj i ⟶ D₂.obj i @@ -160,16 +181,23 @@ lemma id_hom (D : F.DescentData' sq sq₃) (i : ι) : Hom.hom (𝟙 D) i = 𝟙 _ := rfl -/-noncomputable def descentData (D : F.DescentData' sq sq₃) : F.DescentData f := +@[simps!] +noncomputable def descentData (D : F.DescentData' sq sq₃) : F.DescentData f := .mk' D.obj (fun _ _ _ _ _ _ _ _ ↦ pullHom D.hom _ _ _ (by aesop) (by aesop)) (fun _ _ _ _ _ hq _ _ _ _ _ _ _ _ hgf₁ hgf₂ ↦ pullHom_comp' _ _ _ _ hq _ _ _ _ _ _ hgf₁ hgf₂) - (by simp) sorry-/ + (by simp) (by simp) end DescentData' ---def DescentData'.toDescentData : F.DescentData' sq sq₃ ⥤ F.DescentData f := sorry +noncomputable def DescentData'.toDescentData : F.DescentData' sq sq₃ ⥤ F.DescentData f where + obj D := D.descentData + map φ := + { hom i := φ.hom i + comm := sorry } + map_id := by intros; ext; dsimp + map_comp := by intros; ext; dsimp end Pseudofunctor From 5fa3f38f2d0805a300fa8a7cf309b42e52c21923 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=ABl=20Riou?= Date: Wed, 7 May 2025 13:56:05 +0200 Subject: [PATCH 048/118] cleanup --- .../Sites/Descent/DescentData.lean | 111 ------------------ .../Sites/Descent/DescentDataPrime.lean | 9 +- 2 files changed, 8 insertions(+), 112 deletions(-) diff --git a/Mathlib/CategoryTheory/Sites/Descent/DescentData.lean b/Mathlib/CategoryTheory/Sites/Descent/DescentData.lean index fabbf6f5b1527a..a7b9afb7e49971 100644 --- a/Mathlib/CategoryTheory/Sites/Descent/DescentData.lean +++ b/Mathlib/CategoryTheory/Sites/Descent/DescentData.lean @@ -94,117 +94,6 @@ def mk' (obj : ∀ i, F.obj (.mk (op (X i)))) (fun _ _ _ ↦ hom_self _ _ _) (fun Y i₁ i₂ i₃ f₁ f₂ f₃ ↦ comp_hom _ _ _ _ _ _ _) -section mk'' - -variable (obj : ∀ i, (F.obj (.mk (op (X i))))) - (sq : ∀ i j, ChosenPullback (f i) (f j)) - (hom : ∀ (i j : ι), (F.map (sq i j).p₁.op.toLoc).obj (obj i) ⟶ - (F.map (sq i j).p₂.op.toLoc).obj (obj j)) - (diag : ∀ i, (sq i i).Diagonal) - (hom_self : ∀ i, (F.map (diag i).f.op.toLoc).map (hom i i) = - (F.mapComp' (sq i i).p₁.op.toLoc (diag i).f.op.toLoc (𝟙 _) - (by simp [← Quiver.Hom.comp_toLoc, ← op_comp])).inv.app _ ≫ - (F.mapComp' (sq i i).p₂.op.toLoc (diag i).f.op.toLoc (𝟙 _) - (by simp [← Quiver.Hom.comp_toLoc, ← op_comp])).hom.app _) - -noncomputable def mk''Hom ⦃Y : C⦄ (q : Y ⟶ S) ⦃i₁ i₂ : ι⦄ (f₁ : Y ⟶ X i₁) (f₂ : Y ⟶ X i₂) - (hf₁ : f₁ ≫ f i₁ = q) (hf₂ : f₂ ≫ f i₂ = q) : - (F.map f₁.op.toLoc).obj (obj i₁) ⟶ (F.map f₂.op.toLoc).obj (obj i₂) := - let p : Y ⟶ (sq i₁ i₂).pullback := (sq i₁ i₂).isPullback.lift f₁ f₂ (by aesop) - (F.mapComp' (sq i₁ i₂).p₁.op.toLoc p.op.toLoc f₁.op.toLoc - (by rw [← Quiver.Hom.comp_toLoc, ← op_comp, IsPullback.lift_fst])).hom.app _ ≫ - (F.map (.toLoc p.op)).map (hom i₁ i₂) ≫ - (F.mapComp' (sq i₁ i₂).p₂.op.toLoc p.op.toLoc f₂.op.toLoc - (by rw [← Quiver.Hom.comp_toLoc, ← op_comp, IsPullback.lift_snd])).inv.app _ - -lemma mk''Hom_eq ⦃Y : C⦄ (q : Y ⟶ S) ⦃i₁ i₂ : ι⦄ (f₁ : Y ⟶ X i₁) (f₂ : Y ⟶ X i₂) - (hf₁ : f₁ ≫ f i₁ = q) (hf₂ : f₂ ≫ f i₂ = q) (p : Y ⟶ (sq i₁ i₂).pullback) - (hp₁ : p ≫ (sq i₁ i₂).p₁ = f₁) (hp₂ : p ≫ (sq i₁ i₂).p₂ = f₂) : - mk''Hom obj sq hom q f₁ f₂ hf₁ hf₂ = - (F.mapComp' (sq i₁ i₂).p₁.op.toLoc p.op.toLoc f₁.op.toLoc (by aesop)).hom.app _ ≫ - (F.map (.toLoc p.op)).map (hom i₁ i₂) ≫ - (F.mapComp' (sq i₁ i₂).p₂.op.toLoc p.op.toLoc f₂.op.toLoc (by aesop)).inv.app _ := by - obtain rfl : p = (sq i₁ i₂).isPullback.lift f₁ f₂ (by rw [hf₁, hf₂]) := by - apply (sq i₁ i₂).isPullback.hom_ext <;> aesop - rfl - -lemma mk''Hom_comp' ⦃Y Y' : C⦄ (g : Y' ⟶ Y) (q : Y ⟶ S) (q' : Y' ⟶ S) (hq : g ≫ q = q') - ⦃i₁ i₂ : ι⦄ (f₁ : Y ⟶ X i₁) (f₂ : Y ⟶ X i₂) (hf₁ : f₁ ≫ f i₁ = q) (hf₂ : f₂ ≫ f i₂ = q) - (gf₁ : Y' ⟶ X i₁) (gf₂ : Y' ⟶ X i₂) (hgf₁ : g ≫ f₁ = gf₁) (hgf₂ : g ≫ f₂ = gf₂) : - mk''Hom obj sq hom q' gf₁ gf₂ (by aesop) (by aesop) = - (F.mapComp' f₁.op.toLoc g.op.toLoc gf₁.op.toLoc (by aesop)).hom.app (obj i₁) ≫ - (F.map g.op.toLoc).map (mk''Hom obj sq hom q f₁ f₂ hf₁ hf₂) ≫ - (F.mapComp' f₂.op.toLoc g.op.toLoc gf₂.op.toLoc (by aesop)).inv.app (obj i₂) := by - let p := (sq i₁ i₂).isPullback.lift f₁ f₂ (by aesop) - dsimp - rw [mk''Hom_eq _ _ _ _ _ _ _ _ p (by aesop) (by aesop), - mk''Hom_eq _ _ _ _ _ _ _ _ (g ≫ p) (by aesop) (by aesop)] - dsimp - simp only [Functor.map_comp, Category.assoc] - rw [← F.mapComp'_hom_app_comp_mapComp'_hom_app_map_obj_assoc - _ _ _ _ _ _ (by rw [← Quiver.Hom.comp_toLoc, ← op_comp, IsPullback.lift_fst]) rfl - (by rw [← Quiver.Hom.comp_toLoc, ← Quiver.Hom.comp_toLoc, ← op_comp, ← op_comp, - Category.assoc, IsPullback.lift_fst, hgf₁])] - rw [F.map_map_mapComp'_inv_app_comp_mapComp'_inv_app - _ _ _ _ _ _ (by rw [← Quiver.Hom.comp_toLoc, ← op_comp, IsPullback.lift_snd]) rfl - (by rw [← Quiver.Hom.comp_toLoc, ← op_comp, hgf₂]), - mapComp'_inv_naturality_assoc, Iso.hom_inv_id_app_assoc] - -@[simp] -lemma mk''Hom_p₁_p₂ (i : ι) : - mk''Hom obj sq hom (sq i i).p (sq i i).p₁ (sq i i).p₂ (by simp) (by simp) = hom i i := by - rw [mk''Hom_eq obj sq hom (sq i i).p (sq i i).p₁ (sq i i).p₂ (by simp) (by simp) - (𝟙 _) (by simp) (by simp)] - simp [mapComp'_comp_id_hom_app, mapComp'_comp_id_inv_app] - -include hom_self in -lemma mk''Hom_self ⦃Y : C⦄ (q : Y ⟶ S) ⦃i : ι⦄ (g : Y ⟶ X i) (hg : g ≫ f i = q) : - mk''Hom obj sq hom q g g hg hg = 𝟙 _ := by - rw [mk''Hom_comp' obj sq hom (g ≫ (diag i).f) (sq i i).p _ (by aesop) (sq i i).p₁ (sq i i).p₂ - (by simp) (by simp) _ _ (by simp) (by simp), mk''Hom_p₁_p₂, - ← F.mapComp'_naturality_2_assoc (diag i).f.op.toLoc g.op.toLoc _ (by simp), hom_self, - Functor.map_comp_assoc] - dsimp - rw [F.mapComp'_inv_app_map_obj_comp_mapComp'_inv_app _ _ _ (𝟙 _) _ _ - (by simp only [← Quiver.Hom.comp_toLoc, ← op_comp, ChosenPullback.LiftStruct.f_p₂, - Quiver.Hom.id_toLoc, op_id]) rfl - (by simp only [← Quiver.Hom.comp_toLoc, ← op_comp, Category.assoc, - ChosenPullback.LiftStruct.f_p₂, Category.comp_id])] - simp only [← Functor.map_comp_assoc, Category.assoc, Iso.hom_inv_id_app, Category.comp_id] - rw [F.mapComp'_hom_app_comp_mapComp'_hom_app_map_obj_assoc _ _ _ (𝟙 _) _ _ - (by simp only [← Quiver.Hom.comp_toLoc, ← op_comp, ChosenPullback.LiftStruct.f_p₁, - Quiver.Hom.id_toLoc, op_id]) rfl - (by simp only [← Quiver.Hom.comp_toLoc, ← op_comp, Category.assoc, - ChosenPullback.LiftStruct.f_p₁, Category.comp_id]), - ← Functor.map_comp_assoc] - simp - -variable (sq₃ : ∀ (i₁ i₂ i₃ : ι), ChosenPullback₃ (sq i₁ i₂) (sq i₂ i₃) (sq i₁ i₃)) - (hom_comp : ∀ (i₁ i₂ i₃ : ι), - mk''Hom obj sq hom (sq₃ i₁ i₂ i₃).p (sq₃ i₁ i₂ i₃).p₁ (sq₃ i₁ i₂ i₃).p₂ (by simp) (by simp) ≫ - mk''Hom obj sq hom (sq₃ i₁ i₂ i₃).p (sq₃ i₁ i₂ i₃).p₂ (sq₃ i₁ i₂ i₃).p₃ (by simp) (by simp) = - mk''Hom obj sq hom (sq₃ i₁ i₂ i₃).p (sq₃ i₁ i₂ i₃).p₁ (sq₃ i₁ i₂ i₃).p₃ (by simp) (by simp)) - --- TODO @jriou: moving to DescentDataPrime.lean -noncomputable def mk'' : F.DescentData f := - DescentData.mk' obj (fun _ _ _ _ _ _ ↦ mk''Hom _ _ _ _ _ _) - (fun _ _ _ _ _ hq _ _ _ _ _ _ _ _ ↦ mk''Hom_comp' _ _ _ _ _ _ hq _ _ _ _ _ _) - (fun _ _ _ _ hg ↦ mk''Hom_self obj sq hom diag hom_self _ _ hg) - (fun Y q i₁ i₂ i₃ f₁ f₂ f₃ hf₁ hf₂ hf₃ ↦ by - obtain ⟨φ, _, _, _⟩ := (sq₃ i₁ i₂ i₃).exists_lift f₁ f₂ f₃ q hf₁ hf₂ hf₃ - dsimp - rw [mk''Hom_comp' obj sq hom φ (sq₃ i₁ i₂ i₃).p _ _ - (sq₃ i₁ i₂ i₃).p₁ (sq₃ i₁ i₂ i₃).p₂ _ _ _ _ _ _, - mk''Hom_comp' obj sq hom φ (sq₃ i₁ i₂ i₃).p _ _ (sq₃ i₁ i₂ i₃).p₂ - (sq₃ i₁ i₂ i₃).p₃ _ _ _ _ _ _, - mk''Hom_comp' obj sq hom φ (sq₃ i₁ i₂ i₃).p _ (by aesop) (sq₃ i₁ i₂ i₃).p₁ - (sq₃ i₁ i₂ i₃).p₃ _ _ _ _ _ _] - · simp only [Category.assoc, Iso.inv_hom_id_app_assoc, - ← Functor.map_comp_assoc, hom_comp] - all_goals aesop) - -end mk'' - end DescentData end Pseudofunctor diff --git a/Mathlib/CategoryTheory/Sites/Descent/DescentDataPrime.lean b/Mathlib/CategoryTheory/Sites/Descent/DescentDataPrime.lean index 2dfaf8bedad8bd..121196e43fd826 100644 --- a/Mathlib/CategoryTheory/Sites/Descent/DescentDataPrime.lean +++ b/Mathlib/CategoryTheory/Sites/Descent/DescentDataPrime.lean @@ -41,6 +41,7 @@ noncomputable def pullHom ⦃Y : C⦄ (q : Y ⟶ S) ⦃i₁ i₂ : ι⦄ (f₁ : (F.mapComp' (sq i₁ i₂).p₂.op.toLoc p.op.toLoc f₂.op.toLoc (by rw [← Quiver.Hom.comp_toLoc, ← op_comp, IsPullback.lift_snd])).inv.app _ +@[reassoc] lemma pullHom_eq ⦃Y : C⦄ (q : Y ⟶ S) ⦃i₁ i₂ : ι⦄ (f₁ : Y ⟶ X i₁) (f₂ : Y ⟶ X i₂) (hf₁ : f₁ ≫ f i₁ = q) (hf₂ : f₂ ≫ f i₂ = q) (p : Y ⟶ (sq i₁ i₂).pullback) (hp₁ : p ≫ (sq i₁ i₂).p₁ = f₁) (hp₂ : p ≫ (sq i₁ i₂).p₂ = f₂) : @@ -52,6 +53,7 @@ lemma pullHom_eq ⦃Y : C⦄ (q : Y ⟶ S) ⦃i₁ i₂ : ι⦄ (f₁ : Y ⟶ X apply (sq i₁ i₂).isPullback.hom_ext <;> aesop rfl +@[reassoc] lemma pullHom_comp' ⦃Y Y' : C⦄ (g : Y' ⟶ Y) (q : Y ⟶ S) (q' : Y' ⟶ S) (hq : g ≫ q = q') ⦃i₁ i₂ : ι⦄ (f₁ : Y ⟶ X i₁) (f₂ : Y ⟶ X i₂) (hf₁ : f₁ ≫ f i₁ = q) (hf₂ : f₂ ≫ f i₂ = q) (gf₁ : Y' ⟶ X i₁) (gf₂ : Y' ⟶ X i₂) (hgf₁ : g ≫ f₁ = gf₁) (hgf₂ : g ≫ f₂ = gf₂) : @@ -105,7 +107,12 @@ lemma comp_pullHom' (hom_comp : ∀ (i₁ i₂ i₃ : ι), (f₂ : Y ⟶ X i₂) (f₃ : Y ⟶ X i₃) (hf₁ : f₁ ≫ f i₁ = q) (hf₂ : f₂ ≫ f i₂ = q) (hf₃ : f₃ ≫ f i₃ = q) : pullHom hom q f₁ f₂ ≫ pullHom hom q f₂ f₃ = pullHom hom q f₁ f₃ := by - sorry + obtain ⟨φ, _, _, _⟩ := (sq₃ i₁ i₂ i₃).exists_lift f₁ f₂ f₃ q hf₁ hf₂ hf₃ + rw [pullHom_comp'_assoc hom φ (sq₃ i₁ i₂ i₃).p _ _ (sq₃ i₁ i₂ i₃).p₁ (sq₃ i₁ i₂ i₃).p₂, + pullHom_comp' hom φ (sq₃ i₁ i₂ i₃).p _ _ (sq₃ i₁ i₂ i₃).p₂ (sq₃ i₁ i₂ i₃).p₃, + pullHom_comp' hom φ (sq₃ i₁ i₂ i₃).p _ _ (sq₃ i₁ i₂ i₃).p₁ (sq₃ i₁ i₂ i₃).p₃, + Iso.inv_hom_id_app_assoc, ← Functor.map_comp_assoc, hom_comp] + all_goals aesop end From efae283baf912afbc37984cfab00663f2b48bdf0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=ABl=20Riou?= Date: Wed, 7 May 2025 14:45:33 +0200 Subject: [PATCH 049/118] wip --- .../Sites/Descent/DescentData.lean | 58 +++++++++++++++++++ .../Sites/Descent/DescentDataPrime.lean | 13 ++--- 2 files changed, 62 insertions(+), 9 deletions(-) diff --git a/Mathlib/CategoryTheory/Sites/Descent/DescentData.lean b/Mathlib/CategoryTheory/Sites/Descent/DescentData.lean index a7b9afb7e49971..6102c41161f48b 100644 --- a/Mathlib/CategoryTheory/Sites/Descent/DescentData.lean +++ b/Mathlib/CategoryTheory/Sites/Descent/DescentData.lean @@ -63,6 +63,53 @@ namespace DescentData variable {F f} +nonrec def iso (D : F.DescentData f) ⦃Y : C⦄ (q : Y ⟶ S) ⦃i₁ i₂ : ι⦄ (f₁ : Y ⟶ X i₁) + (f₂ : Y ⟶ X i₂) (hf₁ : f₁ ≫ f i₁ = q := by aesop) (hf₂ : f₂ ≫ f i₂ = q := by aesop) : + (F.map f₁.op.toLoc).obj (D.obj i₁) ≅ (F.map f₂.op.toLoc).obj (D.obj i₂) := by + exact D.iso (Y := .mk (op (Over.mk q))) + ((Over.homMk f₁).op.toLoc) ((Over.homMk f₂).op.toLoc) + +nonrec lemma iso_comp' (D : F.DescentData f) + ⦃Y' Y : C⦄ (g : Y' ⟶ Y) (q : Y ⟶ S) (q' : Y' ⟶ S) (hq : g ≫ q = q') + ⦃i₁ i₂ : ι⦄ (f₁ : Y ⟶ X i₁) (f₂ : Y ⟶ X i₂) (hf₁ : f₁ ≫ f i₁ = q) (hf₂ : f₂ ≫ f i₂ = q) + (gf₁ : Y' ⟶ X i₁) (gf₂ : Y' ⟶ X i₂) (hgf₁ : g ≫ f₁ = gf₁) (hgf₂ : g ≫ f₂ = gf₂) : + D.iso q' gf₁ gf₂ (by aesop) (by aesop) = + (F.mapComp' f₁.op.toLoc g.op.toLoc gf₁.op.toLoc (by + simp only [← Quiver.Hom.comp_toLoc, ← op_comp, hgf₁])).app _ ≪≫ + (F.map g.op.toLoc).mapIso (D.iso q f₁ f₂) ≪≫ + (F.mapComp' f₂.op.toLoc g.op.toLoc gf₂.op.toLoc (by + simp only [← Quiver.Hom.comp_toLoc, ← op_comp, hgf₂])).symm.app _ := by + ext : 1 + simpa using congr_arg Iso.hom (D.iso_comp' (Y' := .mk (op (Over.mk q'))) + (Y := .mk (op (Over.mk q))) (Over.homMk g).op.toLoc (Over.homMk f₁).op.toLoc + (Over.homMk f₂).op.toLoc (Over.homMk gf₁).op.toLoc (Over.homMk gf₂).op.toLoc (by + simp only [← Quiver.Hom.comp_toLoc, ← op_comp] + congr 2 + aesop) (by + simp only [← Quiver.Hom.comp_toLoc, ← op_comp] + congr 2 + aesop)) + +nonrec lemma iso_trans (D : F.DescentData f) ⦃Y : C⦄ (q : Y ⟶ S) ⦃i₁ i₂ i₃ : ι⦄ (f₁ : Y ⟶ X i₁) + (f₂ : Y ⟶ X i₂) (f₃ : Y ⟶ X i₃) (hf₁ : f₁ ≫ f i₁ = q) + (hf₂ : f₂ ≫ f i₂ = q) (hf₃ : f₃ ≫ f i₃ = q) : + D.iso q f₁ f₂ hf₁ hf₂ ≪≫ D.iso q f₂ f₃ hf₂ hf₃ = D.iso q f₁ f₃ hf₁ hf₃ := by + apply D.iso_trans + +@[reassoc (attr := simp)] +nonrec lemma iso_hom_iso_hom + (D : F.DescentData f) ⦃Y : C⦄ (q : Y ⟶ S) ⦃i₁ i₂ i₃ : ι⦄ (f₁ : Y ⟶ X i₁) + (f₂ : Y ⟶ X i₂) (f₃ : Y ⟶ X i₃) (hf₁ : f₁ ≫ f i₁ = q) + (hf₂ : f₂ ≫ f i₂ = q) (hf₃ : f₃ ≫ f i₃ = q) : + (D.iso q f₁ f₂ hf₁ hf₂).hom ≫ (D.iso q f₂ f₃ hf₂ hf₃).hom = + (D.iso q f₁ f₃ hf₁ hf₃).hom := by + apply D.iso_hom_iso_hom + +@[ext] +lemma hom_ext {D₁ D₂ : F.DescentData f} {φ φ' : D₁ ⟶ D₂} + (h : ∀ i, φ.hom i = φ'.hom i): φ = φ' := + CodescentData.hom_ext h + @[simps!] def mk' (obj : ∀ i, F.obj (.mk (op (X i)))) (hom : ∀ ⦃Y : C⦄ (q : Y ⟶ S) ⦃i₁ i₂ : ι⦄ (f₁ : Y ⟶ X i₁) (f₂ : Y ⟶ X i₂) @@ -94,6 +141,17 @@ def mk' (obj : ∀ i, F.obj (.mk (op (X i)))) (fun _ _ _ ↦ hom_self _ _ _) (fun Y i₁ i₂ i₃ f₁ f₂ f₃ ↦ comp_hom _ _ _ _ _ _ _) +@[simps] +def homMk {D₁ D₂ : F.DescentData f} (φ : ∀ i, D₁.obj i ⟶ D₂.obj i) + (hφ : ∀ ⦃Y : C⦄ (q : Y ⟶ S) ⦃i₁ i₂ : ι⦄ (f₁ : Y ⟶ X i₁) + (f₂ : Y ⟶ X i₂) (hf₁ : f₁ ≫ f i₁ = q) (hf₂ : f₂ ≫ f i₂ = q), + (F.map f₁.op.toLoc).map (φ i₁) ≫ (D₂.iso q f₁ f₂ hf₁ hf₂).hom = + (D₁.iso q f₁ f₂ hf₁ hf₂).hom ≫ (F.map f₂.op.toLoc).map (φ i₂)) : D₁ ⟶ D₂ where + hom i := φ i + comm Y _ _ f₁ f₂ := + hφ Y.as.unop.hom f₁.as.unop.left f₂.as.unop.left + (Over.w f₁.as.unop) (Over.w f₂.as.unop) + end DescentData end Pseudofunctor diff --git a/Mathlib/CategoryTheory/Sites/Descent/DescentDataPrime.lean b/Mathlib/CategoryTheory/Sites/Descent/DescentDataPrime.lean index 121196e43fd826..54bbdd2b142b40 100644 --- a/Mathlib/CategoryTheory/Sites/Descent/DescentDataPrime.lean +++ b/Mathlib/CategoryTheory/Sites/Descent/DescentDataPrime.lean @@ -54,7 +54,7 @@ lemma pullHom_eq ⦃Y : C⦄ (q : Y ⟶ S) ⦃i₁ i₂ : ι⦄ (f₁ : Y ⟶ X rfl @[reassoc] -lemma pullHom_comp' ⦃Y Y' : C⦄ (g : Y' ⟶ Y) (q : Y ⟶ S) (q' : Y' ⟶ S) (hq : g ≫ q = q') + lemma pullHom_comp' ⦃Y Y' : C⦄ (g : Y' ⟶ Y) (q : Y ⟶ S) (q' : Y' ⟶ S) (hq : g ≫ q = q') ⦃i₁ i₂ : ι⦄ (f₁ : Y ⟶ X i₁) (f₂ : Y ⟶ X i₂) (hf₁ : f₁ ≫ f i₁ = q) (hf₂ : f₂ ≫ f i₂ = q) (gf₁ : Y' ⟶ X i₁) (gf₂ : Y' ⟶ X i₂) (hgf₁ : g ≫ f₁ = gf₁) (hgf₂ : g ≫ f₂ = gf₂) : pullHom hom q' gf₁ gf₂ = @@ -190,19 +190,14 @@ lemma id_hom (D : F.DescentData' sq sq₃) (i : ι) : @[simps!] noncomputable def descentData (D : F.DescentData' sq sq₃) : F.DescentData f := - .mk' D.obj - (fun _ _ _ _ _ _ _ _ ↦ pullHom D.hom _ _ _ (by aesop) (by aesop)) - (fun _ _ _ _ _ hq _ _ _ _ _ _ _ _ hgf₁ hgf₂ ↦ - pullHom_comp' _ _ _ _ hq _ _ _ _ _ _ hgf₁ hgf₂) - (by simp) (by simp) + .mk' D.obj (fun _ _ _ _ _ _ _ _ ↦ pullHom D.hom _ _ _ (by aesop) (by aesop)) + (fun _ _ _ _ _ hq _ _ _ _ _ _ ↦ pullHom_comp' _ _ _ _ hq _ _ _ _) (by simp) (by simp) end DescentData' noncomputable def DescentData'.toDescentData : F.DescentData' sq sq₃ ⥤ F.DescentData f where obj D := D.descentData - map φ := - { hom i := φ.hom i - comm := sorry } + map φ := DescentData.homMk φ.hom sorry map_id := by intros; ext; dsimp map_comp := by intros; ext; dsimp From 3b1d0394fa6b232e1c2bf2dd8e7d7c999f0cef7e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=ABl=20Riou?= Date: Wed, 7 May 2025 15:03:23 +0200 Subject: [PATCH 050/118] wip --- .../Sites/Descent/DescentData.lean | 32 ++++++++++++++++--- .../Sites/Descent/DescentDataPrime.lean | 21 +++++++++--- 2 files changed, 44 insertions(+), 9 deletions(-) diff --git a/Mathlib/CategoryTheory/Sites/Descent/DescentData.lean b/Mathlib/CategoryTheory/Sites/Descent/DescentData.lean index 6102c41161f48b..7f8f908dd4e469 100644 --- a/Mathlib/CategoryTheory/Sites/Descent/DescentData.lean +++ b/Mathlib/CategoryTheory/Sites/Descent/DescentData.lean @@ -110,8 +110,9 @@ lemma hom_ext {D₁ D₂ : F.DescentData f} {φ φ' : D₁ ⟶ D₂} (h : ∀ i, φ.hom i = φ'.hom i): φ = φ' := CodescentData.hom_ext h -@[simps!] -def mk' (obj : ∀ i, F.obj (.mk (op (X i)))) +section + +variable (obj : ∀ i, F.obj (.mk (op (X i)))) (hom : ∀ ⦃Y : C⦄ (q : Y ⟶ S) ⦃i₁ i₂ : ι⦄ (f₁ : Y ⟶ X i₁) (f₂ : Y ⟶ X i₂) (_hf₁ : f₁ ≫ f i₁ = q) (_hf₂ : f₂ ≫ f i₂ = q), (F.map f₁.op.toLoc).obj (obj i₁) ⟶ (F.map f₂.op.toLoc).obj (obj i₂)) @@ -128,8 +129,10 @@ def mk' (obj : ∀ i, F.obj (.mk (op (X i)))) hom q g g hg hg = 𝟙 _) (comp_hom : ∀ ⦃Y : C⦄ (q : Y ⟶ S) ⦃i₁ i₂ i₃ : ι⦄ (f₁ : Y ⟶ X i₁) (f₂ : Y ⟶ X i₂) (f₃ : Y ⟶ X i₃) (hf₁ : f₁ ≫ f i₁ = q) (hf₂ : f₂ ≫ f i₂ = q) (hf₃ : f₃ ≫ f i₃ = q), - hom q f₁ f₂ hf₁ hf₂ ≫ hom q f₂ f₃ hf₂ hf₃ = hom q f₁ f₃ hf₁ hf₃) : - F.DescentData f := + hom q f₁ f₂ hf₁ hf₂ ≫ hom q f₂ f₃ hf₂ hf₃ = hom q f₁ f₃ hf₁ hf₃) + +@[simps! obj] +def mk' : F.DescentData f := CodescentData.mk' obj (fun Y i₁ i₂ f₁ f₂ ↦ hom Y.as.unop.hom f₁.as.unop.left f₂.as.unop.left (Over.w f₁.as.unop) (Over.w f₂.as.unop)) @@ -141,17 +144,36 @@ def mk' (obj : ∀ i, F.obj (.mk (op (X i)))) (fun _ _ _ ↦ hom_self _ _ _) (fun Y i₁ i₂ i₃ f₁ f₂ f₃ ↦ comp_hom _ _ _ _ _ _ _) +@[simp] +lemma mk'_iso_hom ⦃Y : C⦄ (q : Y ⟶ S) ⦃i₁ i₂ : ι⦄ (f₁ : Y ⟶ X i₁) + (f₂ : Y ⟶ X i₂) (hf₁ : f₁ ≫ f i₁ = q) (hf₂ : f₂ ≫ f i₂ = q) : + ((mk' obj hom hom_comp' hom_self comp_hom).iso q f₁ f₂ hf₁ hf₂).hom = + hom q f₁ f₂ hf₁ hf₂ := rfl + +end + + @[simps] def homMk {D₁ D₂ : F.DescentData f} (φ : ∀ i, D₁.obj i ⟶ D₂.obj i) (hφ : ∀ ⦃Y : C⦄ (q : Y ⟶ S) ⦃i₁ i₂ : ι⦄ (f₁ : Y ⟶ X i₁) (f₂ : Y ⟶ X i₂) (hf₁ : f₁ ≫ f i₁ = q) (hf₂ : f₂ ≫ f i₂ = q), (F.map f₁.op.toLoc).map (φ i₁) ≫ (D₂.iso q f₁ f₂ hf₁ hf₂).hom = - (D₁.iso q f₁ f₂ hf₁ hf₂).hom ≫ (F.map f₂.op.toLoc).map (φ i₂)) : D₁ ⟶ D₂ where + (D₁.iso q f₁ f₂ hf₁ hf₂).hom ≫ (F.map f₂.op.toLoc).map (φ i₂) := by aesop_cat) : + D₁ ⟶ D₂ where hom i := φ i comm Y _ _ f₁ f₂ := hφ Y.as.unop.hom f₁.as.unop.left f₂.as.unop.left (Over.w f₁.as.unop) (Over.w f₂.as.unop) +@[reassoc] +lemma comm {D₁ D₂ : F.DescentData f} (φ : D₁ ⟶ D₂) + ⦃Y : C⦄ (q : Y ⟶ S) ⦃i₁ i₂ : ι⦄ (f₁ : Y ⟶ X i₁) + (f₂ : Y ⟶ X i₂) (hf₁ : f₁ ≫ f i₁ = q) (hf₂ : f₂ ≫ f i₂ = q) : + (F.map f₁.op.toLoc).map (φ.hom i₁) ≫ (D₂.iso q f₁ f₂ hf₁ hf₂).hom = + (D₁.iso q f₁ f₂ hf₁ hf₂).hom ≫ (F.map f₂.op.toLoc).map (φ.hom i₂) := by + exact φ.comm (Y := .mk (op (Over.mk q))) + (Over.homMk f₁).op.toLoc (Over.homMk f₂).op.toLoc + end DescentData end Pseudofunctor diff --git a/Mathlib/CategoryTheory/Sites/Descent/DescentDataPrime.lean b/Mathlib/CategoryTheory/Sites/Descent/DescentDataPrime.lean index 54bbdd2b142b40..2cf82c7bba5561 100644 --- a/Mathlib/CategoryTheory/Sites/Descent/DescentDataPrime.lean +++ b/Mathlib/CategoryTheory/Sites/Descent/DescentDataPrime.lean @@ -188,18 +188,31 @@ lemma id_hom (D : F.DescentData' sq sq₃) (i : ι) : Hom.hom (𝟙 D) i = 𝟙 _ := rfl -@[simps!] +@[reassoc] +lemma comm {D₁ D₂ : F.DescentData' sq sq₃} (φ : D₁ ⟶ D₂) + ⦃Y : C⦄ (q : Y ⟶ S) ⦃i₁ i₂ : ι⦄ (f₁ : Y ⟶ X i₁) + (f₂ : Y ⟶ X i₂) (hf₁ : f₁ ≫ f i₁ = q) (hf₂ : f₂ ≫ f i₂ = q) : + (F.map f₁.op.toLoc).map (φ.hom i₁) ≫ pullHom D₂.hom q f₁ f₂ hf₁ hf₂ = + pullHom D₁.hom q f₁ f₂ hf₁ hf₂ ≫ (F.map f₂.op.toLoc).map (φ.hom i₂) := sorry + +@[simps! obj] noncomputable def descentData (D : F.DescentData' sq sq₃) : F.DescentData f := .mk' D.obj (fun _ _ _ _ _ _ _ _ ↦ pullHom D.hom _ _ _ (by aesop) (by aesop)) (fun _ _ _ _ _ hq _ _ _ _ _ _ ↦ pullHom_comp' _ _ _ _ hq _ _ _ _) (by simp) (by simp) +@[simp] +lemma descentData_iso_hom (D : F.DescentData' sq sq₃) + ⦃Y : C⦄ (q : Y ⟶ S) ⦃i₁ i₂ : ι⦄ (f₁ : Y ⟶ X i₁) + (f₂ : Y ⟶ X i₂) (hf₁ : f₁ ≫ f i₁ = q) (hf₂ : f₂ ≫ f i₂ = q) : + (D.descentData.iso q f₁ f₂ hf₁ hf₂).hom = pullHom D.hom q f₁ f₂ hf₁ hf₂ := + rfl + end DescentData' +@[simps] noncomputable def DescentData'.toDescentData : F.DescentData' sq sq₃ ⥤ F.DescentData f where obj D := D.descentData - map φ := DescentData.homMk φ.hom sorry - map_id := by intros; ext; dsimp - map_comp := by intros; ext; dsimp + map {D₁ D₂} φ := DescentData.homMk φ.hom (by simp [DescentData'.comm]) end Pseudofunctor From ab37cf53d09dc7fde4ef804f374f0a872f332d1a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=ABl=20Riou?= Date: Wed, 7 May 2025 15:39:02 +0200 Subject: [PATCH 051/118] added TODO --- Mathlib/CategoryTheory/Sites/Descent/DescentData.lean | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/Mathlib/CategoryTheory/Sites/Descent/DescentData.lean b/Mathlib/CategoryTheory/Sites/Descent/DescentData.lean index 7f8f908dd4e469..0957d96688333f 100644 --- a/Mathlib/CategoryTheory/Sites/Descent/DescentData.lean +++ b/Mathlib/CategoryTheory/Sites/Descent/DescentData.lean @@ -41,6 +41,10 @@ end variable {C : Type u} [Category.{v} C] (F : Pseudofunctor (LocallyDiscrete Cᵒᵖ) Cat.{v', u'}) {ι : Type t} {S : C} {X : ι → C} (f : ∀ i, X i ⟶ S) +-- Defining `DescentData` as a wrapper for `CodescentData` is problematic +-- as we do not get good lemmas using `simps`, and we have do state the +-- lemmas like `mk'_iso_hom` by hand. TODO: Redefine `DescentData` using +-- the same inputs as in `mk'` (and probably remove `CodescentData`) /-- If `F` is a pseudofunctor from `(LocallyDiscrete Cᵒᵖ)` to `Cat` and `f i : X i ⟶ S` is a family of morphisms in `C`, this is the type of family of objects in `F.obj (X i)` equipped with a descent datum relative to the morphisms `f i`. -/ @@ -152,7 +156,6 @@ lemma mk'_iso_hom ⦃Y : C⦄ (q : Y ⟶ S) ⦃i₁ i₂ : ι⦄ (f₁ : Y ⟶ X end - @[simps] def homMk {D₁ D₂ : F.DescentData f} (φ : ∀ i, D₁.obj i ⟶ D₂.obj i) (hφ : ∀ ⦃Y : C⦄ (q : Y ⟶ S) ⦃i₁ i₂ : ι⦄ (f₁ : Y ⟶ X i₁) From 9d7a76ef38e71898b9e7365ee61790691c16d863 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=ABl=20Riou?= Date: Thu, 8 May 2025 11:11:56 +0200 Subject: [PATCH 052/118] wip --- .../Bicategory/Functor/Cat.lean | 8 + .../Sites/Descent/DescentData.lean | 231 +++++++----------- .../Sites/Descent/DescentDataPrime.lean | 63 ++--- .../{Morphisms.lean => IsPrestack.lean} | 6 +- ...{HasEffectiveDescent.lean => IsStack.lean} | 11 +- .../Sites/Descent/ModuleCat.lean | 2 +- 6 files changed, 137 insertions(+), 184 deletions(-) rename Mathlib/CategoryTheory/Sites/Descent/{Morphisms.lean => IsPrestack.lean} (96%) rename Mathlib/CategoryTheory/Sites/Descent/{HasEffectiveDescent.lean => IsStack.lean} (95%) diff --git a/Mathlib/CategoryTheory/Bicategory/Functor/Cat.lean b/Mathlib/CategoryTheory/Bicategory/Functor/Cat.lean index 517cbcbc89b1f9..80de8f06ac30ff 100644 --- a/Mathlib/CategoryTheory/Bicategory/Functor/Cat.lean +++ b/Mathlib/CategoryTheory/Bicategory/Functor/Cat.lean @@ -179,6 +179,14 @@ lemma mapComp'_inv_app_comp_mapComp'_hom_app' (hf : f₀₁ ≫ f₁₃ = f) (X (F.mapComp' f₁₂ f₂₃ f₁₃ h₁₃).inv.app ((F.map f₀₁).obj X) := by simp [F.mapComp'₀₁₃_hom_app f₀₁ f₁₂ f₂₃ f₀₂ f₁₃ f h₀₂ h₁₃ hf] +@[reassoc] +lemma mapComp'_hom_app_comp_mapComp'_inv_app (hf : f₀₁ ≫ f₁₃ = f) (X : F.obj b₀) : + (F.mapComp' f₀₂ f₂₃ f).inv.app X ≫ (F.mapComp' f₀₁ f₁₃ f).hom.app X = + (F.map f₂₃).map ((F.mapComp' f₀₁ f₁₂ f₀₂ h₀₂).hom.app X) ≫ + (F.mapComp' f₁₂ f₂₃ f₁₃ h₁₃).inv.app ((F.map f₀₁).obj X) := by + simp [F.mapComp'₀₁₃_hom_app f₀₁ f₁₂ f₂₃ f₀₂ f₁₃ f h₀₂ h₁₃ hf] + + end associativity end Pseudofunctor diff --git a/Mathlib/CategoryTheory/Sites/Descent/DescentData.lean b/Mathlib/CategoryTheory/Sites/Descent/DescentData.lean index 0957d96688333f..4cc8755344ce65 100644 --- a/Mathlib/CategoryTheory/Sites/Descent/DescentData.lean +++ b/Mathlib/CategoryTheory/Sites/Descent/DescentData.lean @@ -4,8 +4,7 @@ Released under Apache 2.0 license as described in the file LICENSE. Authors: Joël Riou, Christian Merten -/ import Mathlib.CategoryTheory.Bicategory.Functor.LocallyDiscrete -import Mathlib.CategoryTheory.Sites.Descent.Morphisms -import Mathlib.CategoryTheory.Sites.Descent.CodescentData +import Mathlib.CategoryTheory.Bicategory.Functor.Cat import Mathlib.CategoryTheory.Sites.Descent.PullbackStruct /-! @@ -21,164 +20,118 @@ open Opposite Limits namespace Pseudofunctor -section - -@[simp] -lemma mapComp'_mapLocallyDiscrete_comp - {C D : Type*} [Category C] [Category D] (F : C ⥤ D) - (G : Pseudofunctor (LocallyDiscrete D) Cat) - {X Y Z : LocallyDiscrete C} (f : X ⟶ Y) (g : Y ⟶ Z) (fg : X ⟶ Z) (hfg : f ≫ g = fg) : - ((mapLocallyDiscrete F).comp G).mapComp' f g fg hfg = - G.mapComp' ((mapLocallyDiscrete F).map f) ((mapLocallyDiscrete F).map g) - ((mapLocallyDiscrete F).map fg) (by aesop) := by - ext - subst hfg - rw [mapComp'_eq_mapComp] - rfl - -end +macro "aesoptoloc" : tactic => `(tactic|(simp [← Quiver.Hom.comp_toLoc, ← op_comp] <;> aesop)) variable {C : Type u} [Category.{v} C] (F : Pseudofunctor (LocallyDiscrete Cᵒᵖ) Cat.{v', u'}) {ι : Type t} {S : C} {X : ι → C} (f : ∀ i, X i ⟶ S) --- Defining `DescentData` as a wrapper for `CodescentData` is problematic --- as we do not get good lemmas using `simps`, and we have do state the --- lemmas like `mk'_iso_hom` by hand. TODO: Redefine `DescentData` using --- the same inputs as in `mk'` (and probably remove `CodescentData`) -/-- If `F` is a pseudofunctor from `(LocallyDiscrete Cᵒᵖ)` to `Cat` and `f i : X i ⟶ S` -is a family of morphisms in `C`, this is the type of family of objects in `F.obj (X i)` -equipped with a descent datum relative to the morphisms `f i`. -/ -abbrev DescentData := - ((mapLocallyDiscrete (Over.forget S).op).comp F).CodescentData - (fun (i : ι) ↦ .mk (op (Over.mk (f i)))) - -/-- The functor `F.obj (.mk (op S)) ⥤ F.DescentData f`. -/ -def toDescentData : F.obj (.mk (op S)) ⥤ F.DescentData f := - ((mapLocallyDiscrete (Over.forget S).op).comp F).toCodescentDataOfIsInitial - (fun (i : ι) ↦ .mk (op (Over.mk (f i)))) (.mk (op (Over.mk (𝟙 _)))) - (IsInitial.ofUniqueHom - (fun Z ↦ .toLoc (Quiver.Hom.op (Over.homMk Z.as.unop.hom))) - (fun ⟨⟨Z⟩⟩ ⟨⟨m⟩⟩ ↦ by - congr - ext - simpa using Over.w m)) - namespace DescentData -variable {F f} +variable {F} in +def pull ⦃X₁ X₂ : C⦄ ⦃M₁ : F.obj (.mk (op X₁))⦄ ⦃M₂ : F.obj (.mk (op X₂))⦄ + ⦃Y : C⦄ ⦃f₁ : Y ⟶ X₁⦄ ⦃f₂ : Y ⟶ X₂⦄ + (φ : (F.map f₁.op.toLoc).obj M₁ ⟶ (F.map f₂.op.toLoc).obj M₂) ⦃Y' : C⦄ (g : Y' ⟶ Y) + (gf₁ : Y' ⟶ X₁) (gf₂ : Y' ⟶ X₂) (hgf₁ : g ≫ f₁ = gf₁ := by aesop_cat) + (hgf₂ : g ≫ f₂ = gf₂ := by aesop_cat) : + (F.map gf₁.op.toLoc).obj M₁ ⟶ (F.map gf₂.op.toLoc).obj M₂ := + (F.mapComp' f₁.op.toLoc g.op.toLoc gf₁.op.toLoc (by aesoptoloc)).hom.app _ ≫ + (F.map g.op.toLoc).map φ ≫ + (F.mapComp' f₂.op.toLoc g.op.toLoc gf₂.op.toLoc (by aesoptoloc)).inv.app _ -nonrec def iso (D : F.DescentData f) ⦃Y : C⦄ (q : Y ⟶ S) ⦃i₁ i₂ : ι⦄ (f₁ : Y ⟶ X i₁) - (f₂ : Y ⟶ X i₂) (hf₁ : f₁ ≫ f i₁ = q := by aesop) (hf₂ : f₂ ≫ f i₂ = q := by aesop) : - (F.map f₁.op.toLoc).obj (D.obj i₁) ≅ (F.map f₂.op.toLoc).obj (D.obj i₂) := by - exact D.iso (Y := .mk (op (Over.mk q))) - ((Over.homMk f₁).op.toLoc) ((Over.homMk f₂).op.toLoc) +end DescentData -nonrec lemma iso_comp' (D : F.DescentData f) - ⦃Y' Y : C⦄ (g : Y' ⟶ Y) (q : Y ⟶ S) (q' : Y' ⟶ S) (hq : g ≫ q = q') +open DescentData +structure DescentData where + obj (i : ι) : F.obj (.mk (op (X i))) + hom ⦃Y : C⦄ (q : Y ⟶ S) ⦃i₁ i₂ : ι⦄ (f₁ : Y ⟶ X i₁) (f₂ : Y ⟶ X i₂) + (_hf₁ : f₁ ≫ f i₁ = q := by aesop_cat) (_hf₂ : f₂ ≫ f i₂ = q := by aesop_cat) : + (F.map f₁.op.toLoc).obj (obj i₁) ⟶ (F.map f₂.op.toLoc).obj (obj i₂) + pull_hom ⦃Y' Y : C⦄ (g : Y' ⟶ Y) (q : Y ⟶ S) (q' : Y' ⟶ S) (hq : g ≫ q = q') ⦃i₁ i₂ : ι⦄ (f₁ : Y ⟶ X i₁) (f₂ : Y ⟶ X i₂) (hf₁ : f₁ ≫ f i₁ = q) (hf₂ : f₂ ≫ f i₂ = q) (gf₁ : Y' ⟶ X i₁) (gf₂ : Y' ⟶ X i₂) (hgf₁ : g ≫ f₁ = gf₁) (hgf₂ : g ≫ f₂ = gf₂) : - D.iso q' gf₁ gf₂ (by aesop) (by aesop) = - (F.mapComp' f₁.op.toLoc g.op.toLoc gf₁.op.toLoc (by - simp only [← Quiver.Hom.comp_toLoc, ← op_comp, hgf₁])).app _ ≪≫ - (F.map g.op.toLoc).mapIso (D.iso q f₁ f₂) ≪≫ - (F.mapComp' f₂.op.toLoc g.op.toLoc gf₂.op.toLoc (by - simp only [← Quiver.Hom.comp_toLoc, ← op_comp, hgf₂])).symm.app _ := by - ext : 1 - simpa using congr_arg Iso.hom (D.iso_comp' (Y' := .mk (op (Over.mk q'))) - (Y := .mk (op (Over.mk q))) (Over.homMk g).op.toLoc (Over.homMk f₁).op.toLoc - (Over.homMk f₂).op.toLoc (Over.homMk gf₁).op.toLoc (Over.homMk gf₂).op.toLoc (by - simp only [← Quiver.Hom.comp_toLoc, ← op_comp] - congr 2 - aesop) (by - simp only [← Quiver.Hom.comp_toLoc, ← op_comp] - congr 2 - aesop)) - -nonrec lemma iso_trans (D : F.DescentData f) ⦃Y : C⦄ (q : Y ⟶ S) ⦃i₁ i₂ i₃ : ι⦄ (f₁ : Y ⟶ X i₁) - (f₂ : Y ⟶ X i₂) (f₃ : Y ⟶ X i₃) (hf₁ : f₁ ≫ f i₁ = q) - (hf₂ : f₂ ≫ f i₂ = q) (hf₃ : f₃ ≫ f i₃ = q) : - D.iso q f₁ f₂ hf₁ hf₂ ≪≫ D.iso q f₂ f₃ hf₂ hf₃ = D.iso q f₁ f₃ hf₁ hf₃ := by - apply D.iso_trans - -@[reassoc (attr := simp)] -nonrec lemma iso_hom_iso_hom - (D : F.DescentData f) ⦃Y : C⦄ (q : Y ⟶ S) ⦃i₁ i₂ i₃ : ι⦄ (f₁ : Y ⟶ X i₁) - (f₂ : Y ⟶ X i₂) (f₃ : Y ⟶ X i₃) (hf₁ : f₁ ≫ f i₁ = q) - (hf₂ : f₂ ≫ f i₂ = q) (hf₃ : f₃ ≫ f i₃ = q) : - (D.iso q f₁ f₂ hf₁ hf₂).hom ≫ (D.iso q f₂ f₃ hf₂ hf₃).hom = - (D.iso q f₁ f₃ hf₁ hf₃).hom := by - apply D.iso_hom_iso_hom + pull (hom q f₁ f₂) g gf₁ gf₂ = hom q' gf₁ gf₂ := by aesop_cat + hom_self ⦃Y : C⦄ (q : Y ⟶ S) ⦃i : ι⦄ (g : Y ⟶ X i) (_ : g ≫ f i = q) : + hom q g g = 𝟙 _ := by aesop_cat + hom_comp ⦃Y : C⦄ (q : Y ⟶ S) ⦃i₁ i₂ i₃ : ι⦄ (f₁ : Y ⟶ X i₁) (f₂ : Y ⟶ X i₂) (f₃ : Y ⟶ X i₃) + (hf₁ : f₁ ≫ f i₁ = q) (hf₂ : f₂ ≫ f i₂ = q) (hf₃ : f₃ ≫ f i₃ = q) : + hom q f₁ f₂ hf₁ hf₂ ≫ hom q f₂ f₃ hf₂ hf₃ = hom q f₁ f₃ hf₁ hf₃ := by aesop_cat + +namespace DescentData + +variable {F f} (D : F.DescentData f) + +attribute [simp] hom_self +attribute [reassoc (attr := simp)] hom_comp + +@[simps] +def iso ⦃Y : C⦄ (q : Y ⟶ S) ⦃i₁ i₂ : ι⦄ (f₁ : Y ⟶ X i₁) (f₂ : Y ⟶ X i₂) + (_hf₁ : f₁ ≫ f i₁ = q := by aesop_cat) (_hf₂ : f₂ ≫ f i₂ = q := by aesop_cat) : + (F.map f₁.op.toLoc).obj (D.obj i₁) ≅ (F.map f₂.op.toLoc).obj (D.obj i₂) where + hom := D.hom q f₁ f₂ + inv := D.hom q f₂ f₁ + +instance {Y : C} (q : Y ⟶ S) {i₁ i₂ : ι} (f₁ : Y ⟶ X i₁) (f₂ : Y ⟶ X i₂) + (hf₁ : f₁ ≫ f i₁ = q) (hf₂ : f₂ ≫ f i₂ = q) : + IsIso (D.hom q f₁ f₂ hf₁ hf₂) := + (D.iso q f₁ f₂).isIso_hom + +@[ext] +structure Hom (D₁ D₂ : F.DescentData f) where + hom (i : ι) : D₁.obj i ⟶ D₂.obj i + comm ⦃Y : C⦄ (q : Y ⟶ S) ⦃i₁ i₂ : ι⦄ (f₁ : Y ⟶ X i₁) + (f₂ : Y ⟶ X i₂) (hf₁ : f₁ ≫ f i₁ = q) (hf₂ : f₂ ≫ f i₂ = q) : + (F.map f₁.op.toLoc).map (hom i₁) ≫ D₂.hom q f₁ f₂ = + D₁.hom q f₁ f₂ ≫ (F.map f₂.op.toLoc).map (hom i₂) := by aesop_cat + +attribute [reassoc (attr := simp)] Hom.comm + +@[simps] +def Hom.id (D : F.DescentData f) : Hom D D where + hom i := 𝟙 _ + +@[simps] +def Hom.comp {D₁ D₂ D₃ : F.DescentData f} (φ : Hom D₁ D₂) (φ' : Hom D₂ D₃) : Hom D₁ D₃ where + hom i := φ.hom i ≫ φ'.hom i + +instance : Category (F.DescentData f) where + Hom := Hom + id := Hom.id + comp := Hom.comp @[ext] lemma hom_ext {D₁ D₂ : F.DescentData f} {φ φ' : D₁ ⟶ D₂} - (h : ∀ i, φ.hom i = φ'.hom i): φ = φ' := - CodescentData.hom_ext h - -section - -variable (obj : ∀ i, F.obj (.mk (op (X i)))) - (hom : ∀ ⦃Y : C⦄ (q : Y ⟶ S) ⦃i₁ i₂ : ι⦄ (f₁ : Y ⟶ X i₁) (f₂ : Y ⟶ X i₂) - (_hf₁ : f₁ ≫ f i₁ = q) (_hf₂ : f₂ ≫ f i₂ = q), - (F.map f₁.op.toLoc).obj (obj i₁) ⟶ (F.map f₂.op.toLoc).obj (obj i₂)) - (hom_comp' : ∀ ⦃Y Y' : C⦄ (g : Y' ⟶ Y) (q : Y ⟶ S) (q' : Y' ⟶ S) (hq : g ≫ q = q') - ⦃i₁ i₂ : ι⦄ (f₁ : Y ⟶ X i₁) (f₂ : Y ⟶ X i₂) (hf₁ : f₁ ≫ f i₁ = q) (hf₂ : f₂ ≫ f i₂ = q) - (gf₁ : Y' ⟶ X i₁) (gf₂ : Y' ⟶ X i₂) (hgf₁ : g ≫ f₁ = gf₁) (hgf₂ : g ≫ f₂ = gf₂), - hom q' gf₁ gf₂ (by aesop_cat) (by aesop_cat) = - (F.mapComp' f₁.op.toLoc g.op.toLoc gf₁.op.toLoc - (by rw [← Quiver.Hom.comp_toLoc, ← op_comp, hgf₁])).hom.app _ ≫ - (F.map (.toLoc g.op)).map (hom q f₁ f₂ hf₁ hf₂) ≫ - (F.mapComp' f₂.op.toLoc g.op.toLoc gf₂.op.toLoc - (by rw [← Quiver.Hom.comp_toLoc, ← op_comp, hgf₂])).inv.app _) - (hom_self : ∀ ⦃Y : C⦄ (q : Y ⟶ S) ⦃i : ι⦄ (g : Y ⟶ X i) (hg : g ≫ f i = q), - hom q g g hg hg = 𝟙 _) - (comp_hom : ∀ ⦃Y : C⦄ (q : Y ⟶ S) ⦃i₁ i₂ i₃ : ι⦄ (f₁ : Y ⟶ X i₁) (f₂ : Y ⟶ X i₂) - (f₃ : Y ⟶ X i₃) (hf₁ : f₁ ≫ f i₁ = q) (hf₂ : f₂ ≫ f i₂ = q) (hf₃ : f₃ ≫ f i₃ = q), - hom q f₁ f₂ hf₁ hf₂ ≫ hom q f₂ f₃ hf₂ hf₃ = hom q f₁ f₃ hf₁ hf₃) - -@[simps! obj] -def mk' : F.DescentData f := - CodescentData.mk' obj - (fun Y i₁ i₂ f₁ f₂ ↦ hom Y.as.unop.hom f₁.as.unop.left f₂.as.unop.left - (Over.w f₁.as.unop) (Over.w f₂.as.unop)) - (fun Y' Y g i₁ i₂ f₁ f₂ f₁g f₂g hf₁g hf₂g ↦ by - simpa using hom_comp' g.as.unop.left Y.as.unop.hom Y'.as.unop.hom - (Over.w g.as.unop) f₁.as.unop.left f₂.as.unop.left - (Over.w f₁.as.unop) (Over.w f₂.as.unop) f₁g.as.unop.left f₂g.as.unop.left - (by simp [← hf₁g]) (by simp [← hf₂g])) - (fun _ _ _ ↦ hom_self _ _ _) - (fun Y i₁ i₂ i₃ f₁ f₂ f₃ ↦ comp_hom _ _ _ _ _ _ _) + (h : ∀ i, φ.hom i = φ'.hom i) : φ = φ' := + Hom.ext (funext h) @[simp] -lemma mk'_iso_hom ⦃Y : C⦄ (q : Y ⟶ S) ⦃i₁ i₂ : ι⦄ (f₁ : Y ⟶ X i₁) - (f₂ : Y ⟶ X i₂) (hf₁ : f₁ ≫ f i₁ = q) (hf₂ : f₂ ≫ f i₂ = q) : - ((mk' obj hom hom_comp' hom_self comp_hom).iso q f₁ f₂ hf₁ hf₂).hom = - hom q f₁ f₂ hf₁ hf₂ := rfl +lemma id_hom (D : F.DescentData f) (i : ι) : Hom.hom (𝟙 D) i = 𝟙 _ := rfl -end +@[simp, reassoc] +lemma comp_hom {D₁ D₂ D₃ : F.DescentData f} (φ : D₁ ⟶ D₂) (φ' : D₂ ⟶ D₃) (i : ι) : + (φ ≫ φ').hom i = φ.hom i ≫ φ'.hom i := rfl @[simps] -def homMk {D₁ D₂ : F.DescentData f} (φ : ∀ i, D₁.obj i ⟶ D₂.obj i) - (hφ : ∀ ⦃Y : C⦄ (q : Y ⟶ S) ⦃i₁ i₂ : ι⦄ (f₁ : Y ⟶ X i₁) - (f₂ : Y ⟶ X i₂) (hf₁ : f₁ ≫ f i₁ = q) (hf₂ : f₂ ≫ f i₂ = q), - (F.map f₁.op.toLoc).map (φ i₁) ≫ (D₂.iso q f₁ f₂ hf₁ hf₂).hom = - (D₁.iso q f₁ f₂ hf₁ hf₂).hom ≫ (F.map f₂.op.toLoc).map (φ i₂) := by aesop_cat) : - D₁ ⟶ D₂ where - hom i := φ i - comm Y _ _ f₁ f₂ := - hφ Y.as.unop.hom f₁.as.unop.left f₂.as.unop.left - (Over.w f₁.as.unop) (Over.w f₂.as.unop) - -@[reassoc] -lemma comm {D₁ D₂ : F.DescentData f} (φ : D₁ ⟶ D₂) - ⦃Y : C⦄ (q : Y ⟶ S) ⦃i₁ i₂ : ι⦄ (f₁ : Y ⟶ X i₁) - (f₂ : Y ⟶ X i₂) (hf₁ : f₁ ≫ f i₁ = q) (hf₂ : f₂ ≫ f i₂ = q) : - (F.map f₁.op.toLoc).map (φ.hom i₁) ≫ (D₂.iso q f₁ f₂ hf₁ hf₂).hom = - (D₁.iso q f₁ f₂ hf₁ hf₂).hom ≫ (F.map f₂.op.toLoc).map (φ.hom i₂) := by - exact φ.comm (Y := .mk (op (Over.mk q))) - (Over.homMk f₁).op.toLoc (Over.homMk f₂).op.toLoc +def ofObj (M : F.obj (.mk (op S))) : F.DescentData f where + obj i := (F.map (f i).op.toLoc).obj M + hom Y q i₁ i₂ f₁ f₂ hf₁ hf₂ := + (F.mapComp' (f i₁).op.toLoc f₁.op.toLoc q.op.toLoc (by aesoptoloc)).inv.app _ ≫ + (F.mapComp' (f i₂).op.toLoc f₂.op.toLoc q.op.toLoc (by aesoptoloc)).hom.app _ + pull_hom Y' Y g q q' hq i₁ i₂ f₁ f₂ hf₁ hf₂ gf₁ gf₂ hgf₁ hgf₂ := by + dsimp + simp only [pull, Functor.map_comp, Category.assoc, + F.mapComp'₀₁₃_inv_app (f i₁).op.toLoc f₁.op.toLoc g.op.toLoc q.op.toLoc + gf₁.op.toLoc q'.op.toLoc (by aesoptoloc) (by aesoptoloc) (by aesoptoloc), + F.mapComp'_hom_app_comp_mapComp'_inv_app + (f i₂).op.toLoc f₂.op.toLoc g.op.toLoc q.op.toLoc gf₂.op.toLoc q'.op.toLoc + (by aesoptoloc) (by aesoptoloc) (by aesoptoloc) M] end DescentData +/-- The functor `F.obj (.mk (op S)) ⥤ F.DescentData f`. -/ +def toDescentData : F.obj (.mk (op S)) ⥤ F.DescentData f where + obj M := .ofObj M + map {M M'} φ := { hom i := (F.map (f i).op.toLoc).map φ } + end Pseudofunctor end CategoryTheory diff --git a/Mathlib/CategoryTheory/Sites/Descent/DescentDataPrime.lean b/Mathlib/CategoryTheory/Sites/Descent/DescentDataPrime.lean index 2cf82c7bba5561..e4d63c5502e1fa 100644 --- a/Mathlib/CategoryTheory/Sites/Descent/DescentDataPrime.lean +++ b/Mathlib/CategoryTheory/Sites/Descent/DescentDataPrime.lean @@ -34,38 +34,29 @@ variable {obj obj' : ∀ (i : ι), F.obj (.mk (op (X i)))} noncomputable def pullHom ⦃Y : C⦄ (q : Y ⟶ S) ⦃i₁ i₂ : ι⦄ (f₁ : Y ⟶ X i₁) (f₂ : Y ⟶ X i₂) (hf₁ : f₁ ≫ f i₁ = q := by aesop_cat) (hf₂ : f₂ ≫ f i₂ = q := by aesop_cat) : (F.map f₁.op.toLoc).obj (obj i₁) ⟶ (F.map f₂.op.toLoc).obj (obj' i₂) := - let p : Y ⟶ (sq i₁ i₂).pullback := (sq i₁ i₂).isPullback.lift f₁ f₂ (by aesop) - (F.mapComp' (sq i₁ i₂).p₁.op.toLoc p.op.toLoc f₁.op.toLoc - (by rw [← Quiver.Hom.comp_toLoc, ← op_comp, IsPullback.lift_fst])).hom.app _ ≫ - (F.map (.toLoc p.op)).map (hom i₁ i₂) ≫ - (F.mapComp' (sq i₁ i₂).p₂.op.toLoc p.op.toLoc f₂.op.toLoc - (by rw [← Quiver.Hom.comp_toLoc, ← op_comp, IsPullback.lift_snd])).inv.app _ + DescentData.pull (hom i₁ i₂) ((sq i₁ i₂).isPullback.lift f₁ f₂ (by aesop)) f₁ f₂ @[reassoc] -lemma pullHom_eq ⦃Y : C⦄ (q : Y ⟶ S) ⦃i₁ i₂ : ι⦄ (f₁ : Y ⟶ X i₁) (f₂ : Y ⟶ X i₂) +lemma pullHom_eq_pull ⦃Y : C⦄ (q : Y ⟶ S) ⦃i₁ i₂ : ι⦄ (f₁ : Y ⟶ X i₁) (f₂ : Y ⟶ X i₂) (hf₁ : f₁ ≫ f i₁ = q) (hf₂ : f₂ ≫ f i₂ = q) (p : Y ⟶ (sq i₁ i₂).pullback) (hp₁ : p ≫ (sq i₁ i₂).p₁ = f₁) (hp₂ : p ≫ (sq i₁ i₂).p₂ = f₂) : pullHom hom q f₁ f₂ hf₁ hf₂ = - (F.mapComp' (sq i₁ i₂).p₁.op.toLoc p.op.toLoc f₁.op.toLoc (by aesop)).hom.app _ ≫ - (F.map (.toLoc p.op)).map (hom i₁ i₂) ≫ - (F.mapComp' (sq i₁ i₂).p₂.op.toLoc p.op.toLoc f₂.op.toLoc (by aesop)).inv.app _ := by + DescentData.pull (hom i₁ i₂) p f₁ f₂ := by obtain rfl : p = (sq i₁ i₂).isPullback.lift f₁ f₂ (by rw [hf₁, hf₂]) := by apply (sq i₁ i₂).isPullback.hom_ext <;> aesop rfl @[reassoc] - lemma pullHom_comp' ⦃Y Y' : C⦄ (g : Y' ⟶ Y) (q : Y ⟶ S) (q' : Y' ⟶ S) (hq : g ≫ q = q') + lemma pull_pullHom ⦃Y Y' : C⦄ (g : Y' ⟶ Y) (q : Y ⟶ S) (q' : Y' ⟶ S) (hq : g ≫ q = q') ⦃i₁ i₂ : ι⦄ (f₁ : Y ⟶ X i₁) (f₂ : Y ⟶ X i₂) (hf₁ : f₁ ≫ f i₁ = q) (hf₂ : f₂ ≫ f i₂ = q) (gf₁ : Y' ⟶ X i₁) (gf₂ : Y' ⟶ X i₂) (hgf₁ : g ≫ f₁ = gf₁) (hgf₂ : g ≫ f₂ = gf₂) : - pullHom hom q' gf₁ gf₂ = - (F.mapComp' f₁.op.toLoc g.op.toLoc gf₁.op.toLoc (by aesop)).hom.app (obj i₁) ≫ - (F.map g.op.toLoc).map (pullHom hom q f₁ f₂ hf₁ hf₂) ≫ - (F.mapComp' f₂.op.toLoc g.op.toLoc gf₂.op.toLoc (by aesop)).inv.app (obj' i₂) := by + DescentData.pull (pullHom hom q f₁ f₂ hf₁ hf₂) g gf₁ gf₂ = + pullHom hom q' gf₁ gf₂ := by let p := (sq i₁ i₂).isPullback.lift f₁ f₂ (by aesop) dsimp - rw [pullHom_eq _ _ _ _ _ _ p (by aesop) (by aesop), - pullHom_eq _ _ _ _ _ _ (g ≫ p) (by aesop) (by aesop)] - dsimp + rw [pullHom_eq_pull _ _ _ _ _ _ p (by aesop) (by aesop), + pullHom_eq_pull _ _ _ _ _ _ (g ≫ p) (by aesop) (by aesop)] + dsimp [DescentData.pull] simp only [Functor.map_comp, Category.assoc] rw [← F.mapComp'_hom_app_comp_mapComp'_hom_app_map_obj_assoc _ _ _ _ _ _ (by rw [← Quiver.Hom.comp_toLoc, ← op_comp, IsPullback.lift_fst]) rfl @@ -87,15 +78,15 @@ variable {obj : ∀ (i : ι), F.obj (.mk (op (X i)))} @[simp] lemma pullHom_p₁_p₂ (i : ι) : pullHom hom (sq i i).p (sq i i).p₁ (sq i i).p₂ (by simp) (by simp) = hom i i := by - rw [pullHom_eq hom (sq i i).p (sq i i).p₁ (sq i i).p₂ (by simp) (by simp) + rw [pullHom_eq_pull hom (sq i i).p (sq i i).p₁ (sq i i).p₂ (by simp) (by simp) (𝟙 _) (by simp) (by simp)] - simp [mapComp'_comp_id_hom_app, mapComp'_comp_id_inv_app] + simp [DescentData.pull, mapComp'_comp_id_hom_app, mapComp'_comp_id_inv_app] lemma pullHom_self' (hom_self : ∀ i, pullHom hom (f i) (𝟙 (X i)) (𝟙 (X i)) = 𝟙 _) ⦃Y : C⦄ (q : Y ⟶ S) ⦃i : ι⦄ (g : Y ⟶ X i) (hg : g ≫ f i = q) : pullHom hom q g g hg hg = 𝟙 _ := by - simp [pullHom_comp' hom g (f i) q hg (𝟙 (X i)) (𝟙 (X i)) (by simp) (by simp) g g - (by simp) (by simp), hom_self] + simp [← pull_pullHom hom g (f i) q hg (𝟙 (X i)) (𝟙 (X i)) (by simp) (by simp) g g + (by simp) (by simp), hom_self, DescentData.pull] variable {sq₃} in @[reassoc] @@ -108,9 +99,11 @@ lemma comp_pullHom' (hom_comp : ∀ (i₁ i₂ i₃ : ι), (hf₂ : f₂ ≫ f i₂ = q) (hf₃ : f₃ ≫ f i₃ = q) : pullHom hom q f₁ f₂ ≫ pullHom hom q f₂ f₃ = pullHom hom q f₁ f₃ := by obtain ⟨φ, _, _, _⟩ := (sq₃ i₁ i₂ i₃).exists_lift f₁ f₂ f₃ q hf₁ hf₂ hf₃ - rw [pullHom_comp'_assoc hom φ (sq₃ i₁ i₂ i₃).p _ _ (sq₃ i₁ i₂ i₃).p₁ (sq₃ i₁ i₂ i₃).p₂, - pullHom_comp' hom φ (sq₃ i₁ i₂ i₃).p _ _ (sq₃ i₁ i₂ i₃).p₂ (sq₃ i₁ i₂ i₃).p₃, - pullHom_comp' hom φ (sq₃ i₁ i₂ i₃).p _ _ (sq₃ i₁ i₂ i₃).p₁ (sq₃ i₁ i₂ i₃).p₃, + rw [← pull_pullHom_assoc hom φ (sq₃ i₁ i₂ i₃).p _ _ (sq₃ i₁ i₂ i₃).p₁ (sq₃ i₁ i₂ i₃).p₂, + DescentData.pull, Category.assoc, Category.assoc, + ← pull_pullHom hom φ (sq₃ i₁ i₂ i₃).p _ _ (sq₃ i₁ i₂ i₃).p₂ (sq₃ i₁ i₂ i₃).p₃, + ← pull_pullHom hom φ (sq₃ i₁ i₂ i₃).p _ _ (sq₃ i₁ i₂ i₃).p₁ (sq₃ i₁ i₂ i₃).p₃, + DescentData.pull, DescentData.pull, Iso.inv_hom_id_app_assoc, ← Functor.map_comp_assoc, hom_comp] all_goals aesop @@ -195,24 +188,22 @@ lemma comm {D₁ D₂ : F.DescentData' sq sq₃} (φ : D₁ ⟶ D₂) (F.map f₁.op.toLoc).map (φ.hom i₁) ≫ pullHom D₂.hom q f₁ f₂ hf₁ hf₂ = pullHom D₁.hom q f₁ f₂ hf₁ hf₂ ≫ (F.map f₂.op.toLoc).map (φ.hom i₂) := sorry -@[simps! obj] -noncomputable def descentData (D : F.DescentData' sq sq₃) : F.DescentData f := - .mk' D.obj (fun _ _ _ _ _ _ _ _ ↦ pullHom D.hom _ _ _ (by aesop) (by aesop)) - (fun _ _ _ _ _ hq _ _ _ _ _ _ ↦ pullHom_comp' _ _ _ _ hq _ _ _ _) (by simp) (by simp) +@[simps] +noncomputable def descentData (D : F.DescentData' sq sq₃) : F.DescentData f where + obj := D.obj + hom _ _ _ _ _ _ hf₁ hf₂ := pullHom D.hom _ _ _ hf₁ hf₂ + pull_hom _ _ _ _ _ hq _ _ _ _ _ _ _ _ hgf₁ hgf₂ := + pull_pullHom _ _ _ _ hq _ _ _ _ _ _ hgf₁ hgf₂ -@[simp] -lemma descentData_iso_hom (D : F.DescentData' sq sq₃) - ⦃Y : C⦄ (q : Y ⟶ S) ⦃i₁ i₂ : ι⦄ (f₁ : Y ⟶ X i₁) - (f₂ : Y ⟶ X i₂) (hf₁ : f₁ ≫ f i₁ = q) (hf₂ : f₂ ≫ f i₂ = q) : - (D.descentData.iso q f₁ f₂ hf₁ hf₂).hom = pullHom D.hom q f₁ f₂ hf₁ hf₂ := - rfl end DescentData' @[simps] noncomputable def DescentData'.toDescentData : F.DescentData' sq sq₃ ⥤ F.DescentData f where obj D := D.descentData - map {D₁ D₂} φ := DescentData.homMk φ.hom (by simp [DescentData'.comm]) + map {D₁ D₂} φ := + { hom := φ.hom + comm := comm φ } end Pseudofunctor diff --git a/Mathlib/CategoryTheory/Sites/Descent/Morphisms.lean b/Mathlib/CategoryTheory/Sites/Descent/IsPrestack.lean similarity index 96% rename from Mathlib/CategoryTheory/Sites/Descent/Morphisms.lean rename to Mathlib/CategoryTheory/Sites/Descent/IsPrestack.lean index a97cb10c6d380a..4488c7a564ff1b 100644 --- a/Mathlib/CategoryTheory/Sites/Descent/Morphisms.lean +++ b/Mathlib/CategoryTheory/Sites/Descent/IsPrestack.lean @@ -86,11 +86,11 @@ def overMapCompPresheafHomIso {S' : C} (q : S' ⟶ S) : /-- The property that a pseudofunctor `F : Pseudofunctor (LocallyDiscrete Cᵒᵖ) Cat` satisfies the descent property for morphisms. -/ -class HasDescentOfMorphisms (J : GrothendieckTopology C) : Prop where +class IsPrestack (J : GrothendieckTopology C) : Prop where isSheaf {S : C} (M N : F.obj (.mk (op S))) : Presheaf.IsSheaf (J.over S) (F.presheafHom M N) -variable (J : GrothendieckTopology C) [F.HasDescentOfMorphisms J] +variable (J : GrothendieckTopology C) [F.IsPrestack J] /-- If `F` is a pseudofunctor from `Cᵒᵖ` to `Cat` which satisfies the descent of morphisms for a Grothendieck topology `J`, and `M` and `N` are to objects in @@ -100,7 +100,7 @@ of morphisms $$p^* M ⟶ p^* N$$. -/ @[simps] def sheafHom : Sheaf (J.over S) (Type v') where val := F.presheafHom M N - cond := HasDescentOfMorphisms.isSheaf _ _ + cond := IsPrestack.isSheaf _ _ end Pseudofunctor diff --git a/Mathlib/CategoryTheory/Sites/Descent/HasEffectiveDescent.lean b/Mathlib/CategoryTheory/Sites/Descent/IsStack.lean similarity index 95% rename from Mathlib/CategoryTheory/Sites/Descent/HasEffectiveDescent.lean rename to Mathlib/CategoryTheory/Sites/Descent/IsStack.lean index a41a58585bf36e..c9ab461e0c360f 100644 --- a/Mathlib/CategoryTheory/Sites/Descent/HasEffectiveDescent.lean +++ b/Mathlib/CategoryTheory/Sites/Descent/IsStack.lean @@ -4,6 +4,7 @@ Released under Apache 2.0 license as described in the file LICENSE. Authors: Joël Riou, Christian Merten -/ import Mathlib.CategoryTheory.Sites.Descent.DescentData +import Mathlib.CategoryTheory.Sites.Descent.IsPrestack /-! # Effectiveness of descent @@ -151,18 +152,18 @@ lemma toDescentData_fullyFaithful_iff : rw [← Function.Bijective.of_comp_iff' α.bijective, this, Function.Bijective.of_comp_iff _ β.bijective] -class HasEffectiveDescent (J : GrothendieckTopology C) : Prop where +class IsStack (J : GrothendieckTopology C) : Prop where hasEffectiveDescentRelativeTo_of_sieve_mem {S : C} (U : Sieve S) (hU : U ∈ J S) : F.HasEffectiveDescentRelativeTo (f := fun (i : U.arrows.category) ↦ i.obj.hom) lemma hasEffectiveDescentRelativeTo_of_sieve_mem (J : GrothendieckTopology C) - [F.HasEffectiveDescent J] + [F.IsStack J] {S : C} (U : Sieve S) (hU : U ∈ J S) : F.HasEffectiveDescentRelativeTo (f := fun (i : U.arrows.category) ↦ i.obj.hom) := - HasEffectiveDescent.hasEffectiveDescentRelativeTo_of_sieve_mem _ hU + IsStack.hasEffectiveDescentRelativeTo_of_sieve_mem _ hU -instance (J : GrothendieckTopology C) [F.HasEffectiveDescent J] : - F.HasDescentOfMorphisms J where +instance (J : GrothendieckTopology C) [F.IsStack J] : + F.IsPrestack J where isSheaf {S} M N := by rw [isSheaf_iff_isSheaf_of_type] rintro ⟨X, ⟨⟩, p : X ⟶ S⟩ U hU diff --git a/Mathlib/CategoryTheory/Sites/Descent/ModuleCat.lean b/Mathlib/CategoryTheory/Sites/Descent/ModuleCat.lean index 49e0d2b956f4e5..720f256bb18734 100644 --- a/Mathlib/CategoryTheory/Sites/Descent/ModuleCat.lean +++ b/Mathlib/CategoryTheory/Sites/Descent/ModuleCat.lean @@ -1,4 +1,4 @@ -import Mathlib.CategoryTheory.Sites.Descent.HasEffectiveDescent +import Mathlib.CategoryTheory.Sites.Descent.IsStack import Mathlib.Algebra.Category.ModuleCat.Pseudofunctor import Mathlib.RingTheory.Flat.FaithfullyFlat.Algebra From 22f992001c636a5659893dafccb0f65d8a4307ec Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=ABl=20Riou?= Date: Thu, 8 May 2025 11:23:24 +0200 Subject: [PATCH 053/118] removed a sorry --- .../Sites/Descent/DescentDataPrime.lean | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/Mathlib/CategoryTheory/Sites/Descent/DescentDataPrime.lean b/Mathlib/CategoryTheory/Sites/Descent/DescentDataPrime.lean index e4d63c5502e1fa..d1c8a9bc92e1da 100644 --- a/Mathlib/CategoryTheory/Sites/Descent/DescentDataPrime.lean +++ b/Mathlib/CategoryTheory/Sites/Descent/DescentDataPrime.lean @@ -186,7 +186,18 @@ lemma comm {D₁ D₂ : F.DescentData' sq sq₃} (φ : D₁ ⟶ D₂) ⦃Y : C⦄ (q : Y ⟶ S) ⦃i₁ i₂ : ι⦄ (f₁ : Y ⟶ X i₁) (f₂ : Y ⟶ X i₂) (hf₁ : f₁ ≫ f i₁ = q) (hf₂ : f₂ ≫ f i₂ = q) : (F.map f₁.op.toLoc).map (φ.hom i₁) ≫ pullHom D₂.hom q f₁ f₂ hf₁ hf₂ = - pullHom D₁.hom q f₁ f₂ hf₁ hf₂ ≫ (F.map f₂.op.toLoc).map (φ.hom i₂) := sorry + pullHom D₁.hom q f₁ f₂ hf₁ hf₂ ≫ (F.map f₂.op.toLoc).map (φ.hom i₂) := by + obtain ⟨p, _, _⟩ := (sq i₁ i₂).isPullback.exists_lift f₁ f₂ (by aesop) + rw [← pull_pullHom D₂.hom p (sq i₁ i₂).p q (by aesop) (sq i₁ i₂).p₁ (sq i₁ i₂).p₂ + (by simp) (by simp) f₁ f₂ (by aesop) (by aesop), + ← pull_pullHom D₁.hom p (sq i₁ i₂).p q (by aesop) (sq i₁ i₂).p₁ (sq i₁ i₂).p₂ + (by simp) (by simp) f₁ f₂ (by aesop) (by aesop)] + dsimp only [DescentData.pull] + rw [NatTrans.naturality_assoc] + dsimp + rw [← Functor.map_comp_assoc, φ.comm i₁ i₂, Functor.map_comp_assoc, + mapComp'_inv_naturality] + simp only [Category.assoc] @[simps] noncomputable def descentData (D : F.DescentData' sq sq₃) : F.DescentData f where @@ -195,7 +206,6 @@ noncomputable def descentData (D : F.DescentData' sq sq₃) : F.DescentData f wh pull_hom _ _ _ _ _ hq _ _ _ _ _ _ _ _ hgf₁ hgf₂ := pull_pullHom _ _ _ _ hq _ _ _ _ _ _ hgf₁ hgf₂ - end DescentData' @[simps] From 0810ebe3c19fc85b6b692608d7c9f0cc05e49077 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=ABl=20Riou?= Date: Thu, 8 May 2025 13:51:03 +0200 Subject: [PATCH 054/118] constructors for isomorphisms --- .../Sites/Descent/DescentData.lean | 19 ++++++- .../Sites/Descent/DescentDataPrime.lean | 51 +++++++++++++++++-- .../Sites/Descent/PullbackStruct.lean | 12 +++++ 3 files changed, 78 insertions(+), 4 deletions(-) diff --git a/Mathlib/CategoryTheory/Sites/Descent/DescentData.lean b/Mathlib/CategoryTheory/Sites/Descent/DescentData.lean index 4cc8755344ce65..186935b4d6ef83 100644 --- a/Mathlib/CategoryTheory/Sites/Descent/DescentData.lean +++ b/Mathlib/CategoryTheory/Sites/Descent/DescentData.lean @@ -60,7 +60,7 @@ namespace DescentData variable {F f} (D : F.DescentData f) -attribute [simp] hom_self +attribute [simp] hom_self pull_hom attribute [reassoc (attr := simp)] hom_comp @[simps] @@ -125,6 +125,23 @@ def ofObj (M : F.obj (.mk (op S))) : F.DescentData f where (f i₂).op.toLoc f₂.op.toLoc g.op.toLoc q.op.toLoc gf₂.op.toLoc q'.op.toLoc (by aesoptoloc) (by aesoptoloc) (by aesoptoloc) M] +@[simps] +def isoMk {D₁ D₂ : F.DescentData f} (e : ∀ (i : ι), D₁.obj i ≅ D₂.obj i) + (comm : ∀ ⦃Y : C⦄ (q : Y ⟶ S) ⦃i₁ i₂ : ι⦄ (f₁ : Y ⟶ X i₁) + (f₂ : Y ⟶ X i₂) (hf₁ : f₁ ≫ f i₁ = q) (hf₂ : f₂ ≫ f i₂ = q), + (F.map f₁.op.toLoc).map (e i₁).hom ≫ D₂.hom q f₁ f₂ = + D₁.hom q f₁ f₂ ≫ (F.map f₂.op.toLoc).map (e i₂).hom := by aesop_cat) : D₁ ≅ D₂ where + hom := + { hom i := (e i).hom + comm := comm } + inv := + { hom i := (e i).inv + comm Y q i₁ i₂ f₁ f₂ hf₁ hf₂ := by + rw [← cancel_mono ((F.map f₂.op.toLoc).map (e i₂).hom), Category.assoc, + Category.assoc, Iso.map_inv_hom_id, Category.comp_id, + ← cancel_epi ((F.map f₁.op.toLoc).map (e i₁).hom), + Iso.map_hom_inv_id_assoc, comm q f₁ f₂ hf₁ hf₂] } + end DescentData /-- The functor `F.obj (.mk (op S)) ⥤ F.DescentData f`. -/ diff --git a/Mathlib/CategoryTheory/Sites/Descent/DescentDataPrime.lean b/Mathlib/CategoryTheory/Sites/Descent/DescentDataPrime.lean index d1c8a9bc92e1da..5ad5ef3eec9868 100644 --- a/Mathlib/CategoryTheory/Sites/Descent/DescentDataPrime.lean +++ b/Mathlib/CategoryTheory/Sites/Descent/DescentDataPrime.lean @@ -199,6 +199,23 @@ lemma comm {D₁ D₂ : F.DescentData' sq sq₃} (φ : D₁ ⟶ D₂) mapComp'_inv_naturality] simp only [Category.assoc] +@[simps] +def isoMk {D₁ D₂ : F.DescentData' sq sq₃} (e : ∀ (i : ι), D₁.obj i ≅ D₂.obj i) + (comm : ∀ (i₁ i₂ : ι), (F.map (sq i₁ i₂).p₁.op.toLoc).map (e i₁).hom ≫ + pullHom D₂.hom (sq i₁ i₂).p (sq i₁ i₂).p₁ (sq i₁ i₂).p₂ = + pullHom D₁.hom (sq i₁ i₂).p (sq i₁ i₂).p₁ (sq i₁ i₂).p₂ ≫ + (F.map (sq i₁ i₂).p₂.op.toLoc).map (e i₂).hom := by aesop_cat) : D₁ ≅ D₂ where + hom := + { hom i := (e i).hom + comm := comm } + inv := + { hom i := (e i).inv + comm i₁ i₂ := by + rw [← cancel_mono ((F.map _).map (e i₂).hom), Category.assoc, + Category.assoc, Iso.map_inv_hom_id, Category.comp_id, + ← cancel_epi ((F.map _).map (e i₁).hom), + Iso.map_hom_inv_id_assoc, comm i₁ i₂] } + @[simps] noncomputable def descentData (D : F.DescentData' sq sq₃) : F.DescentData f where obj := D.obj @@ -206,15 +223,43 @@ noncomputable def descentData (D : F.DescentData' sq sq₃) : F.DescentData f wh pull_hom _ _ _ _ _ hq _ _ _ _ _ _ _ _ hgf₁ hgf₂ := pull_pullHom _ _ _ _ hq _ _ _ _ _ _ hgf₁ hgf₂ -end DescentData' +@[simps] +def ofDescentData (D : F.DescentData f) : F.DescentData' sq sq₃ where + obj := D.obj + hom i₁ i₂ := D.hom (sq i₁ i₂).p (sq i₁ i₂).p₁ (sq i₁ i₂).p₂ + hom_self i := by + obtain ⟨p, h₁, h₂⟩ := (sq i i).isPullback.exists_lift (𝟙 _) (𝟙 _) (by simp) + have : p ≫ (sq i i).p = f i := by rw [← (sq i i).hp₁, reassoc_of% h₁] + rw [pullHom_eq_pull _ _ _ _ _ _ p, D.pull_hom _ _ (f i), D.hom_self (f i) (𝟙 _)] + all_goals aesop + hom_comp i₁ i₂ i₃ := by + rw [pullHom_eq_pull _ _ _ _ _ _ (sq₃ i₁ i₂ i₃).p₁₂, + pullHom_eq_pull _ _ _ _ _ _ (sq₃ i₁ i₂ i₃).p₂₃, + pullHom_eq_pull _ _ _ _ _ _ (sq₃ i₁ i₂ i₃).p₁₃, + D.pull_hom _ _ (sq₃ i₁ i₂ i₃).p, D.pull_hom _ _ (sq₃ i₁ i₂ i₃).p, + D.pull_hom _ _ (sq₃ i₁ i₂ i₃).p, + D.hom_comp] + all_goals aesop @[simps] -noncomputable def DescentData'.toDescentData : F.DescentData' sq sq₃ ⥤ F.DescentData f where +noncomputable def toDescentDataFunctor : F.DescentData' sq sq₃ ⥤ F.DescentData f where obj D := D.descentData - map {D₁ D₂} φ := + map φ := { hom := φ.hom comm := comm φ } +@[simps] +noncomputable def fromDescentDataFunctor : F.DescentData f ⥤ F.DescentData' sq sq₃ where + obj D := .ofDescentData D + map {D₁ D₂} φ := + { hom := φ.hom + comm i₁ i₂ := by + rw [pullHom_eq_pull _ _ _ _ _ _ (𝟙 _) (by simp) (by simp), + pullHom_eq_pull _ _ _ _ _ _ (𝟙 _) (by simp) (by simp)] + simp } + +end DescentData' + end Pseudofunctor end CategoryTheory diff --git a/Mathlib/CategoryTheory/Sites/Descent/PullbackStruct.lean b/Mathlib/CategoryTheory/Sites/Descent/PullbackStruct.lean index efe406c0fb11fb..7f894cfba152a6 100644 --- a/Mathlib/CategoryTheory/Sites/Descent/PullbackStruct.lean +++ b/Mathlib/CategoryTheory/Sites/Descent/PullbackStruct.lean @@ -120,6 +120,18 @@ lemma w₃ : h.p₃ ≫ f₃ = h.p := by lemma w₂ : h.p₂ ≫ f₂ = h.p := by rw [← p₂₃_p₂_assoc, h₂₃.w, ← w₃, p₂₃_p₃_assoc] +@[reassoc (attr := simp)] +lemma p₁₂_p : h.p₁₂ ≫ h₁₂.p = h.p := by + rw [← h₁₂.hp₂, p₁₂_p₂_assoc, w₂] + +@[reassoc (attr := simp)] +lemma p₂₃_p : h.p₂₃ ≫ h₂₃.p = h.p := by + rw [← h₂₃.hp₂, p₂₃_p₃_assoc, w₃] + +@[reassoc (attr := simp)] +lemma p₁₃_p : h.p₁₃ ≫ h₁₃.p = h.p := by + rw [← h₁₃.hp₁, p₁₃_p₁_assoc, w₁] + lemma exists_lift {Y : C} (g₁ : Y ⟶ X₁) (g₂ : Y ⟶ X₂) (g₃ : Y ⟶ X₃) (b : Y ⟶ S) (hg₁ : g₁ ≫ f₁ = b) (hg₂ : g₂ ≫ f₂ = b) (hg₃ : g₃ ≫ f₃ = b) : ∃ (φ : Y ⟶ h.chosenPullback.pullback), φ ≫ h.p₁ = g₁ ∧ φ ≫ h.p₂ = g₂ ∧ φ ≫ h.p₃ = g₃ := by From 28d332fea970d3c6d31a143a977f845f738ed40f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=ABl=20Riou?= Date: Thu, 8 May 2025 14:22:22 +0200 Subject: [PATCH 055/118] DescentData' is equivalent to DescentData --- .../Sites/Descent/DescentData.lean | 8 ++++- .../Sites/Descent/DescentDataPrime.lean | 30 ++++++++++++++++--- 2 files changed, 33 insertions(+), 5 deletions(-) diff --git a/Mathlib/CategoryTheory/Sites/Descent/DescentData.lean b/Mathlib/CategoryTheory/Sites/Descent/DescentData.lean index 186935b4d6ef83..5ad64ec5a21432 100644 --- a/Mathlib/CategoryTheory/Sites/Descent/DescentData.lean +++ b/Mathlib/CategoryTheory/Sites/Descent/DescentData.lean @@ -36,7 +36,13 @@ def pull ⦃X₁ X₂ : C⦄ ⦃M₁ : F.obj (.mk (op X₁))⦄ ⦃M₂ : F.obj (F.map gf₁.op.toLoc).obj M₁ ⟶ (F.map gf₂.op.toLoc).obj M₂ := (F.mapComp' f₁.op.toLoc g.op.toLoc gf₁.op.toLoc (by aesoptoloc)).hom.app _ ≫ (F.map g.op.toLoc).map φ ≫ - (F.mapComp' f₂.op.toLoc g.op.toLoc gf₂.op.toLoc (by aesoptoloc)).inv.app _ + (F.mapComp' f₂.op.toLoc g.op.toLoc gf₂.op.toLoc (by aesoptoloc)).inv.app _ + +/-@[simp] +lemma pull_id ⦃X₁ X₂ : C⦄ ⦃M₁ : F.obj (.mk (op X₁))⦄ ⦃M₂ : F.obj (.mk (op X₂))⦄ + ⦃Y : C⦄ ⦃f₁ : Y ⟶ X₁⦄ ⦃f₂ : Y ⟶ X₂⦄ + (φ : (F.map f₁.op.toLoc).obj M₁ ⟶ (F.map f₂.op.toLoc).obj M₂) : + pull φ (𝟙 _) f₁ f₂ = φ := sorry-/ end DescentData diff --git a/Mathlib/CategoryTheory/Sites/Descent/DescentDataPrime.lean b/Mathlib/CategoryTheory/Sites/Descent/DescentDataPrime.lean index 5ad5ef3eec9868..2687c412f6f718 100644 --- a/Mathlib/CategoryTheory/Sites/Descent/DescentDataPrime.lean +++ b/Mathlib/CategoryTheory/Sites/Descent/DescentDataPrime.lean @@ -76,9 +76,9 @@ variable {obj : ∀ (i : ι), F.obj (.mk (op (X i)))} (F.map (sq i j).p₂.op.toLoc).obj (obj j)) @[simp] -lemma pullHom_p₁_p₂ (i : ι) : - pullHom hom (sq i i).p (sq i i).p₁ (sq i i).p₂ (by simp) (by simp) = hom i i := by - rw [pullHom_eq_pull hom (sq i i).p (sq i i).p₁ (sq i i).p₂ (by simp) (by simp) +lemma pullHom_p₁_p₂ (i₁ i₂ : ι) : + pullHom hom (sq i₁ i₂).p (sq i₁ i₂).p₁ (sq i₁ i₂).p₂ (by simp) (by simp) = hom i₁ i₂ := by + rw [pullHom_eq_pull hom (sq i₁ i₂).p (sq i₁ i₂).p₁ (sq i₁ i₂).p₂ (by simp) (by simp) (𝟙 _) (by simp) (by simp)] simp [DescentData.pull, mapComp'_comp_id_hom_app, mapComp'_comp_id_inv_app] @@ -223,6 +223,7 @@ noncomputable def descentData (D : F.DescentData' sq sq₃) : F.DescentData f wh pull_hom _ _ _ _ _ hq _ _ _ _ _ _ _ _ hgf₁ hgf₂ := pull_pullHom _ _ _ _ hq _ _ _ _ _ _ hgf₁ hgf₂ +variable (sq sq₃) in @[simps] def ofDescentData (D : F.DescentData f) : F.DescentData' sq sq₃ where obj := D.obj @@ -241,6 +242,20 @@ def ofDescentData (D : F.DescentData f) : F.DescentData' sq sq₃ where D.hom_comp] all_goals aesop +variable (sq sq₃) in +@[simp] +lemma pullHom_ofDescentData_hom (D : F.DescentData f) + ⦃Y : C⦄ (q : Y ⟶ S) ⦃i₁ i₂ : ι⦄ (f₁ : Y ⟶ X i₁) + (f₂ : Y ⟶ X i₂) (hf₁ : f₁ ≫ f i₁ = q) (hf₂ : f₂ ≫ f i₂ = q): + pullHom (ofDescentData sq sq₃ D).hom q f₁ f₂ hf₁ hf₂ = D.hom q f₁ f₂ hf₁ hf₂ := by + obtain ⟨p, h₁, h₂⟩ := (sq i₁ i₂).isPullback.exists_lift f₁ f₂ (by aesop) + rw [pullHom_eq_pull _ _ _ _ _ _ p (by aesop) (by aesop)] + dsimp + rw [D.pull_hom _ _ _ (by rw [← (sq i₁ i₂).hp₁, reassoc_of% h₁, hf₁]) _ _ + (by simp) (by simp) _ _ h₁ h₂] + +variable (F sq sq₃) + @[simps] noncomputable def toDescentDataFunctor : F.DescentData' sq sq₃ ⥤ F.DescentData f where obj D := D.descentData @@ -250,7 +265,7 @@ noncomputable def toDescentDataFunctor : F.DescentData' sq sq₃ ⥤ F.DescentDa @[simps] noncomputable def fromDescentDataFunctor : F.DescentData f ⥤ F.DescentData' sq sq₃ where - obj D := .ofDescentData D + obj D := .ofDescentData _ _ D map {D₁ D₂} φ := { hom := φ.hom comm i₁ i₂ := by @@ -258,6 +273,13 @@ noncomputable def fromDescentDataFunctor : F.DescentData f ⥤ F.DescentData' sq pullHom_eq_pull _ _ _ _ _ _ (𝟙 _) (by simp) (by simp)] simp } +@[simps] +noncomputable def descentDataEquivalence : F.DescentData' sq sq₃ ≌ F.DescentData f where + functor := toDescentDataFunctor _ _ _ + inverse := fromDescentDataFunctor _ _ _ + unitIso := NatIso.ofComponents (fun D ↦ isoMk (fun _ ↦ Iso.refl _)) + counitIso := NatIso.ofComponents (fun D ↦ DescentData.isoMk (fun _ ↦ Iso.refl _)) + end DescentData' end Pseudofunctor From ddcf8515a7590134c8cf31672af6db20155ea735 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=ABl=20Riou?= Date: Thu, 8 May 2025 14:43:19 +0200 Subject: [PATCH 056/118] wip --- Mathlib.lean | 4 +-- .../Sites/Descent/DescentData.lean | 9 ++++--- .../Sites/Descent/DescentDataPrime.lean | 26 +++++++------------ .../Sites/Descent/IsPrestack.lean | 1 + 4 files changed, 17 insertions(+), 23 deletions(-) diff --git a/Mathlib.lean b/Mathlib.lean index 2184cec0d768fb..3c510ade6cc414 100644 --- a/Mathlib.lean +++ b/Mathlib.lean @@ -2470,9 +2470,9 @@ import Mathlib.CategoryTheory.Sites.Descent.Coalgebra import Mathlib.CategoryTheory.Sites.Descent.CodescentData import Mathlib.CategoryTheory.Sites.Descent.DescentData import Mathlib.CategoryTheory.Sites.Descent.DescentDataPrime -import Mathlib.CategoryTheory.Sites.Descent.HasEffectiveDescent +import Mathlib.CategoryTheory.Sites.Descent.IsPrestack +import Mathlib.CategoryTheory.Sites.Descent.IsStack import Mathlib.CategoryTheory.Sites.Descent.ModuleCat -import Mathlib.CategoryTheory.Sites.Descent.Morphisms import Mathlib.CategoryTheory.Sites.Descent.PullbackStruct import Mathlib.CategoryTheory.Sites.EffectiveEpimorphic import Mathlib.CategoryTheory.Sites.EpiMono diff --git a/Mathlib/CategoryTheory/Sites/Descent/DescentData.lean b/Mathlib/CategoryTheory/Sites/Descent/DescentData.lean index 5ad64ec5a21432..11a6a797513154 100644 --- a/Mathlib/CategoryTheory/Sites/Descent/DescentData.lean +++ b/Mathlib/CategoryTheory/Sites/Descent/DescentData.lean @@ -38,11 +38,12 @@ def pull ⦃X₁ X₂ : C⦄ ⦃M₁ : F.obj (.mk (op X₁))⦄ ⦃M₂ : F.obj (F.map g.op.toLoc).map φ ≫ (F.mapComp' f₂.op.toLoc g.op.toLoc gf₂.op.toLoc (by aesoptoloc)).inv.app _ -/-@[simp] +@[simp] lemma pull_id ⦃X₁ X₂ : C⦄ ⦃M₁ : F.obj (.mk (op X₁))⦄ ⦃M₂ : F.obj (.mk (op X₂))⦄ ⦃Y : C⦄ ⦃f₁ : Y ⟶ X₁⦄ ⦃f₂ : Y ⟶ X₂⦄ (φ : (F.map f₁.op.toLoc).obj M₁ ⟶ (F.map f₂.op.toLoc).obj M₂) : - pull φ (𝟙 _) f₁ f₂ = φ := sorry-/ + pull φ (𝟙 _) f₁ f₂ = φ := by + simp [pull, mapComp'_comp_id_hom_app, mapComp'_comp_id_inv_app] end DescentData @@ -66,7 +67,7 @@ namespace DescentData variable {F f} (D : F.DescentData f) -attribute [simp] hom_self pull_hom +attribute [local simp] hom_self pull_hom attribute [reassoc (attr := simp)] hom_comp @[simps] @@ -89,7 +90,7 @@ structure Hom (D₁ D₂ : F.DescentData f) where (F.map f₁.op.toLoc).map (hom i₁) ≫ D₂.hom q f₁ f₂ = D₁.hom q f₁ f₂ ≫ (F.map f₂.op.toLoc).map (hom i₂) := by aesop_cat -attribute [reassoc (attr := simp)] Hom.comm +attribute [reassoc (attr := local simp)] Hom.comm @[simps] def Hom.id (D : F.DescentData f) : Hom D D where diff --git a/Mathlib/CategoryTheory/Sites/Descent/DescentDataPrime.lean b/Mathlib/CategoryTheory/Sites/Descent/DescentDataPrime.lean index 2687c412f6f718..89575606a72609 100644 --- a/Mathlib/CategoryTheory/Sites/Descent/DescentDataPrime.lean +++ b/Mathlib/CategoryTheory/Sites/Descent/DescentDataPrime.lean @@ -146,10 +146,8 @@ lemma comp_pullHom (D : F.DescentData' sq sq₃) structure Hom (D₁ D₂ : F.DescentData' sq sq₃) where hom (i : ι) : D₁.obj i ⟶ D₂.obj i comm (i₁ i₂ : ι) : - (F.map (sq i₁ i₂).p₁.op.toLoc).map (hom i₁) ≫ - pullHom D₂.hom (sq i₁ i₂).p (sq i₁ i₂).p₁ (sq i₁ i₂).p₂ = - pullHom D₁.hom (sq i₁ i₂).p (sq i₁ i₂).p₁ (sq i₁ i₂).p₂ ≫ - (F.map (sq i₁ i₂).p₂.op.toLoc).map (hom i₂) := by aesop_cat + (F.map (sq i₁ i₂).p₁.op.toLoc).map (hom i₁) ≫ D₂.hom i₁ i₂ = + D₁.hom i₁ i₂ ≫ (F.map (sq i₁ i₂).p₂.op.toLoc).map (hom i₂) := by aesop_cat attribute [reassoc (attr := simp)] Hom.comm @@ -191,20 +189,18 @@ lemma comm {D₁ D₂ : F.DescentData' sq sq₃} (φ : D₁ ⟶ D₂) rw [← pull_pullHom D₂.hom p (sq i₁ i₂).p q (by aesop) (sq i₁ i₂).p₁ (sq i₁ i₂).p₂ (by simp) (by simp) f₁ f₂ (by aesop) (by aesop), ← pull_pullHom D₁.hom p (sq i₁ i₂).p q (by aesop) (sq i₁ i₂).p₁ (sq i₁ i₂).p₂ - (by simp) (by simp) f₁ f₂ (by aesop) (by aesop)] + (by simp) (by simp) f₁ f₂ (by aesop) (by aesop), pullHom_p₁_p₂, pullHom_p₁_p₂] dsimp only [DescentData.pull] rw [NatTrans.naturality_assoc] dsimp - rw [← Functor.map_comp_assoc, φ.comm i₁ i₂, Functor.map_comp_assoc, - mapComp'_inv_naturality] + rw [← Functor.map_comp_assoc, φ.comm, Functor.map_comp_assoc, mapComp'_inv_naturality] simp only [Category.assoc] @[simps] def isoMk {D₁ D₂ : F.DescentData' sq sq₃} (e : ∀ (i : ι), D₁.obj i ≅ D₂.obj i) - (comm : ∀ (i₁ i₂ : ι), (F.map (sq i₁ i₂).p₁.op.toLoc).map (e i₁).hom ≫ - pullHom D₂.hom (sq i₁ i₂).p (sq i₁ i₂).p₁ (sq i₁ i₂).p₂ = - pullHom D₁.hom (sq i₁ i₂).p (sq i₁ i₂).p₁ (sq i₁ i₂).p₂ ≫ - (F.map (sq i₁ i₂).p₂.op.toLoc).map (e i₂).hom := by aesop_cat) : D₁ ≅ D₂ where + (comm : ∀ (i₁ i₂ : ι), (F.map (sq i₁ i₂).p₁.op.toLoc).map (e i₁).hom ≫ D₂.hom i₁ i₂ = + D₁.hom i₁ i₂ ≫ (F.map (sq i₁ i₂).p₂.op.toLoc).map (e i₂).hom := by aesop_cat) : + D₁ ≅ D₂ where hom := { hom i := (e i).hom comm := comm } @@ -263,15 +259,11 @@ noncomputable def toDescentDataFunctor : F.DescentData' sq sq₃ ⥤ F.DescentDa { hom := φ.hom comm := comm φ } +attribute [local simp] DescentData.Hom.comm @[simps] noncomputable def fromDescentDataFunctor : F.DescentData f ⥤ F.DescentData' sq sq₃ where obj D := .ofDescentData _ _ D - map {D₁ D₂} φ := - { hom := φ.hom - comm i₁ i₂ := by - rw [pullHom_eq_pull _ _ _ _ _ _ (𝟙 _) (by simp) (by simp), - pullHom_eq_pull _ _ _ _ _ _ (𝟙 _) (by simp) (by simp)] - simp } + map {D₁ D₂} φ := { hom := φ.hom } @[simps] noncomputable def descentDataEquivalence : F.DescentData' sq sq₃ ≌ F.DescentData f where diff --git a/Mathlib/CategoryTheory/Sites/Descent/IsPrestack.lean b/Mathlib/CategoryTheory/Sites/Descent/IsPrestack.lean index 4488c7a564ff1b..367132027bd806 100644 --- a/Mathlib/CategoryTheory/Sites/Descent/IsPrestack.lean +++ b/Mathlib/CategoryTheory/Sites/Descent/IsPrestack.lean @@ -48,6 +48,7 @@ of morphisms $$p^* M ⟶ p^* N$$. -/ def presheafHom : (Over S)ᵒᵖ ⥤ Type v' where obj T := (F.map (.toLoc T.unop.hom.op)).obj M ⟶ (F.map (.toLoc T.unop.hom.op)).obj N map {T₁ T₂} p f := by + -- this should be reconciled with `DescentData.pull` letI e := F.mapComp' (.toLoc T₁.unop.hom.op) (.toLoc p.unop.left.op) (.toLoc T₂.unop.hom.op) (by rw [← Quiver.Hom.comp_toLoc, ← op_comp, Over.w p.unop]) exact e.hom.app M ≫ (F.map (.toLoc p.unop.left.op)).map f ≫ e.inv.app N From 85301ae04eab1235a0f15d5692c48c6f327ec938 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=ABl=20Riou?= Date: Thu, 8 May 2025 14:44:05 +0200 Subject: [PATCH 057/118] removed CodescentData which has become unnecessary --- Mathlib.lean | 1 - .../Sites/Descent/CodescentData.lean | 260 ------------------ 2 files changed, 261 deletions(-) delete mode 100644 Mathlib/CategoryTheory/Sites/Descent/CodescentData.lean diff --git a/Mathlib.lean b/Mathlib.lean index 3c510ade6cc414..9298c68ff0f7fd 100644 --- a/Mathlib.lean +++ b/Mathlib.lean @@ -2467,7 +2467,6 @@ import Mathlib.CategoryTheory.Sites.DenseSubsite.Basic import Mathlib.CategoryTheory.Sites.DenseSubsite.InducedTopology import Mathlib.CategoryTheory.Sites.DenseSubsite.SheafEquiv import Mathlib.CategoryTheory.Sites.Descent.Coalgebra -import Mathlib.CategoryTheory.Sites.Descent.CodescentData import Mathlib.CategoryTheory.Sites.Descent.DescentData import Mathlib.CategoryTheory.Sites.Descent.DescentDataPrime import Mathlib.CategoryTheory.Sites.Descent.IsPrestack diff --git a/Mathlib/CategoryTheory/Sites/Descent/CodescentData.lean b/Mathlib/CategoryTheory/Sites/Descent/CodescentData.lean deleted file mode 100644 index 73f85244523488..00000000000000 --- a/Mathlib/CategoryTheory/Sites/Descent/CodescentData.lean +++ /dev/null @@ -1,260 +0,0 @@ -/- -Copyright (c) 2025 Joël Riou. All rights reserved. -Released under Apache 2.0 license as described in the file LICENSE. -Authors: Joël Riou --/ -import Mathlib.CategoryTheory.Sites.Grothendieck -import Mathlib.CategoryTheory.Limits.Shapes.Pullback.CommSq -import Mathlib.CategoryTheory.Bicategory.Functor.Cat -import Mathlib.CategoryTheory.Bicategory.LocallyDiscrete - -/-! -# Codescent data - --/ - -universe t t' w v v' u u' - -namespace CategoryTheory - -open Category Limits Bicategory - -namespace Pseudofunctor - -variable {C : Type u} [Bicategory.{w, v} C] - (F : Pseudofunctor C Cat.{v', u'}) {ι : Type t} (X : ι → C) - -/- -Let us use `CodescentData` for a "covariant" pseudofunctor from `F` to `Cat`. -The "codescent" property for `F`, a family of objects `X : ι → C` and -an initial object `X₀`, there is an equivalence of categories -(induced by `toCodescentDataOfIsInitial`) from `F.obj X₀` to -`F.CodescentData X`. - -We shall use the name `DescentData` for the case of a pseudofunctor -from the locally discrete bicategory associated to the opposite category -of `C`, especially when `C` is endowed with a Grothendieck topology, and -for this we shall apply `CodescentData` to the restriction of the -pseudofunctor to `LocallyDiscrete (Over X)ᵒᵖ` for `X : C`. - --/ - -structure CodescentData where - obj (i : ι) : F.obj (X i) - iso ⦃Y : C⦄ ⦃i₁ i₂ : ι⦄ (f₁ : X i₁ ⟶ Y) (f₂ : X i₂ ⟶ Y) : - (F.map f₁).obj (obj i₁) ≅ (F.map f₂).obj (obj i₂) - iso_comp' ⦃Y' Y : C⦄ (g : Y ⟶ Y') ⦃i₁ i₂ : ι⦄ (f₁ : X i₁ ⟶ Y) (f₂ : X i₂ ⟶ Y) - (f₁g : X i₁ ⟶ Y') (f₂g : X i₂ ⟶ Y') (hf₁g : f₁ ≫ g = f₁g) (hf₂g : f₂ ≫ g = f₂g) : - iso f₁g f₂g = - (F.mapComp' f₁ g f₁g).app (obj i₁) ≪≫ Functor.mapIso (F.map g) (iso f₁ f₂) ≪≫ - (F.mapComp' f₂ g f₂g).symm.app (obj i₂) - iso_trans ⦃Y : C⦄ ⦃i₁ i₂ i₃ : ι⦄ (f₁ : X i₁ ⟶ Y) (f₂ : X i₂ ⟶ Y) (f₃ : X i₃ ⟶ Y) : - iso f₁ f₂ ≪≫ iso f₂ f₃ = iso f₁ f₃ := by aesop_cat - -namespace CodescentData - -variable {F X} - -@[simps] -def mk' (obj : ∀ i, F.obj (X i)) - (hom : ∀ ⦃Y : C⦄ ⦃i₁ i₂ : ι⦄ (f₁ : X i₁ ⟶ Y) (f₂ : X i₂ ⟶ Y), - (F.map f₁).obj (obj i₁) ⟶ (F.map f₂).obj (obj i₂)) - (hom_comp' : ∀ ⦃Y' Y : C⦄ (g : Y ⟶ Y') ⦃i₁ i₂ : ι⦄ (f₁ : X i₁ ⟶ Y) (f₂ : X i₂ ⟶ Y) - (f₁g : X i₁ ⟶ Y') (f₂g : X i₂ ⟶ Y') (hf₁g : f₁ ≫ g = f₁g) (hf₂g : f₂ ≫ g = f₂g), - hom f₁g f₂g = - (F.mapComp' f₁ g f₁g).hom.app _ ≫ - (F.map g).map (hom f₁ f₂) ≫ - (F.mapComp' f₂ g f₂g).inv.app _ := by aesop_cat) - (hom_self : ∀ ⦃Y : C⦄ ⦃i : ι⦄ (f : X i ⟶ Y), hom f f = 𝟙 _ := by aesop_cat) - (comp_hom : ∀ ⦃Y : C⦄ ⦃i₁ i₂ i₃ : ι⦄ (f₁ : X i₁ ⟶ Y) (f₂ : X i₂ ⟶ Y) (f₃ : X i₃ ⟶ Y), - hom f₁ f₂ ≫ hom f₂ f₃ = hom f₁ f₃ := by aesop_cat) : F.CodescentData X where - obj := obj - iso Y i₁ i₂ f₁ f₂ := - { hom := hom f₁ f₂ - inv := hom f₂ f₁ } - iso_comp' Y' Y g i₁ i₂ f₁ f₂ f₁g f₂g hf₁g hf₂g := by - ext - exact hom_comp' g f₁ f₂ f₁g f₂g hf₁g hf₂g - -section - -variable (D : F.CodescentData X) - -@[reassoc (attr := simp)] -lemma iso_hom_iso_hom ⦃Y : C⦄ ⦃i₁ i₂ i₃ : ι⦄ - (f₁ : X i₁ ⟶ Y) (f₂ : X i₂ ⟶ Y) (f₃ : X i₃ ⟶ Y) : - (D.iso f₁ f₂).hom ≫ (D.iso f₂ f₃).hom = (D.iso f₁ f₃).hom := by - simp [← D.iso_trans f₁ f₂ f₃] - -@[simp] -lemma iso_self ⦃Y : C⦄ ⦃i : ι⦄ (f : X i ⟶ Y) : - D.iso f f = Iso.refl _ := by - ext - simp [← cancel_epi (D.iso f f).hom] - -@[simp] -lemma iso_symm ⦃Y : C⦄ ⦃i₁ i₂ : ι⦄ - (f₁ : X i₁ ⟶ Y) (f₂ : X i₂ ⟶ Y) : - (D.iso f₁ f₂).symm = D.iso f₂ f₁ := by - ext - simp [← cancel_epi (D.iso f₁ f₂).hom] - -lemma iso_inv ⦃Y : C⦄ ⦃i₁ i₂ : ι⦄ - (f₁ : X i₁ ⟶ Y) (f₂ : X i₂ ⟶ Y) : - (D.iso f₁ f₂).inv = (D.iso f₂ f₁).hom := - congr_arg Iso.hom (D.iso_symm f₁ f₂) - -end - -@[ext] -structure Hom (D₁ D₂ : F.CodescentData X) where - hom (i : ι) : D₁.obj i ⟶ D₂.obj i - comm ⦃Y : C⦄ ⦃i₁ i₂ : ι⦄ (f₁ : X i₁ ⟶ Y) (f₂ : X i₂ ⟶ Y) : - (F.map f₁).map (hom i₁) ≫ (D₂.iso f₁ f₂).hom = - (D₁.iso f₁ f₂).hom ≫ (F.map f₂).map (hom i₂) := by aesop_cat - -attribute [reassoc (attr := simp)] Hom.comm - -instance : Category (F.CodescentData X) where - Hom := Hom - id D := { hom i := 𝟙 _ } - comp {D₁ D₂ D₃} φ ψ := - { hom i := φ.hom i ≫ ψ.hom i - comm Y i₁ i₂ f₁ f₂ := by - simp only [Functor.map_comp, assoc] - rw [ψ.comm, φ.comm_assoc] } - -@[ext] -lemma hom_ext {D₁ D₂ : F.CodescentData X} {f g : D₁ ⟶ D₂} - (h : ∀ i, f.hom i = g.hom i) : f = g := - Hom.ext (funext h) - -@[simp] -lemma id_hom (D : F.CodescentData X) (i : ι) : Hom.hom (𝟙 D) i = 𝟙 _ := rfl - -@[simp, reassoc] -lemma comp_hom {D₁ D₂ D₃ : F.CodescentData X} (f : D₁ ⟶ D₂) (g : D₂ ⟶ D₃) (i : ι) : - (f ≫ g).hom i = f.hom i ≫ g.hom i := rfl - - -namespace Hom - -variable {D₁ D₂ : F.CodescentData X} (f : D₁ ⟶ D₂) - -@[reassoc] -lemma map_map ⦃Y : C⦄ ⦃i₁ i₂ : ι⦄ (f₁ : X i₁ ⟶ Y) (f₂ : X i₂ ⟶ Y) : - (F.map f₁).map (f.hom i₁) = - (D₁.iso f₁ f₂).hom ≫ (F.map f₂).map (f.hom i₂) ≫ (D₂.iso f₁ f₂).inv := by - rw [← comm_assoc, Iso.hom_inv_id, comp_id] - -@[reassoc] -lemma map_map' ⦃Y : C⦄ ⦃i₁ i₂ : ι⦄ (f₁ : X i₁ ⟶ Y) (f₂ : X i₂ ⟶ Y) : - (F.map f₂).map (f.hom i₂) = - (D₁.iso f₁ f₂).inv ≫ (F.map f₁).map (f.hom i₁) ≫ (D₂.iso f₁ f₂).hom := by - simp - -end Hom - -variable {ι' : Type t'} {X' : ι' → C} {p : ι' → ι} (π : ∀ i', X (p i') ⟶ X' i') - -abbrev pullbackObjObj (D : F.CodescentData X) (i' : ι') : F.obj (X' i') := - (F.map (π i')).obj (D.obj (p i')) - -def pullbackObjIso - (D : F.CodescentData X) ⦃Y : C⦄ ⦃i₁ i₂ : ι'⦄ (f₁ : X' i₁ ⟶ Y) (f₂ : X' i₂ ⟶ Y) : - (F.map f₁).obj (pullbackObjObj π D i₁) ≅ (F.map f₂).obj (pullbackObjObj π D i₂) := - (F.mapComp' (π i₁) f₁ _ rfl).symm.app _ ≪≫ - D.iso _ _ ≪≫ (F.mapComp' (π i₂) f₂ _ rfl).app _ - -def pullbackObjIso_eq - (D : F.CodescentData X) ⦃Y : C⦄ ⦃i₁ i₂ : ι'⦄ (f₁ : X' i₁ ⟶ Y) (f₂ : X' i₂ ⟶ Y) - (g₁ : X (p i₁) ⟶ Y) (g₂ : X (p i₂) ⟶ Y) (hg₁ : g₁ = π i₁ ≫ f₁) (hg₂ : g₂ = π i₂ ≫ f₂) : - pullbackObjIso π D f₁ f₂ = (F.mapComp' (π i₁) f₁ g₁).symm.app _ ≪≫ - D.iso g₁ g₂ ≪≫ (F.mapComp' (π i₂) f₂ g₂).app _ := by - subst hg₁ hg₂ - rfl - -@[reassoc (attr := simp)] -lemma pullbackObjIso_hom_comp - (D : F.CodescentData X) ⦃Y : C⦄ ⦃i₁ i₂ i₃ : ι'⦄ - (f₁ : X' i₁ ⟶ Y) (f₂ : X' i₂ ⟶ Y) (f₃ : X' i₃ ⟶ Y) - (g₁ : X (p i₁) ⟶ Y) (g₂ : X (p i₂) ⟶ Y) (g₃ : X (p i₃) ⟶ Y) - (hg₁ : g₁ = π i₁ ≫ f₁) (hg₂ : g₂ = π i₂ ≫ f₂) (hg₃ : g₃ = π i₃ ≫ f₃) : - (pullbackObjIso π D f₁ f₂).hom ≫ (pullbackObjIso π D f₂ f₃).hom = - (pullbackObjIso π D f₁ f₃).hom := by - simp [pullbackObjIso_eq π D _ _ g₁ g₂ hg₁ hg₂, pullbackObjIso_eq π D _ _ g₂ g₃ hg₂ hg₃, - pullbackObjIso_eq π D _ _ g₁ g₃ hg₁ hg₃] - -variable [Strict C] - -@[simps] -def pullbackObj (D : F.CodescentData X) : F.CodescentData X' where - obj := pullbackObjObj π D - iso := pullbackObjIso π D - iso_comp' Y' Y g i₁ i₂ f₁ f₂ f₁g f₂g hf₁g hf₂g := by - ext - dsimp - rw [pullbackObjIso_eq π D f₁ f₂ _ _ rfl rfl, - pullbackObjIso_eq π D f₁g f₂g _ _ rfl rfl, - D.iso_comp' g (π i₁ ≫ f₁) (π i₂ ≫ f₂) (π i₁ ≫ f₁g) (π i₂ ≫ f₂g) - (by aesop_cat) (by aesop_cat)] - dsimp [pullbackObjObj] - simp only [assoc, Functor.map_comp_assoc] - rw [F.mapComp'_inv_app_comp_mapComp'_hom_app_assoc _ _ _ _ _ _ rfl hf₁g rfl, - F.mapComp'_inv_app_comp_mapComp'_hom_app' _ _ _ _ _ _ rfl hf₂g rfl] - iso_trans Y i₁ i₂ i₃ f₁ f₂ f₃ := by ext; simp - -abbrev pullbackMapHom {D₁ D₂ : F.CodescentData X} (f : D₁ ⟶ D₂) (i' : ι'): - pullbackObjObj π D₁ i' ⟶ pullbackObjObj π D₂ i' := - (F.map (π i')).map (f.hom (p i')) - -attribute [local simp] pullbackObjIso pullbackMapHom - -@[simps] -def pullbackMap {D₁ D₂ : F.CodescentData X} (f : D₁ ⟶ D₂) : - pullbackObj π D₁ ⟶ pullbackObj π D₂ where - hom i' := pullbackMapHom π f i' - --- note: up to a natural isomorphism, this should not depend on the choice of `p` or `π`, --- but only that any object `X' i'` is a target of a map from some `X i` -@[simps] -def pullback : F.CodescentData X ⥤ F.CodescentData X' where - obj := pullbackObj π - map f := pullbackMap π f - -end CodescentData - -variable [Strict C] - -def toCodescentDataOfIsInitial (X₀ : C) (hX₀ : IsInitial X₀) : - F.obj X₀ ⥤ F.CodescentData X where - obj A := - { obj i := (F.map (hX₀.to (X i))).obj A - iso Y i₁ i₂ f₁ f₂ := - (F.mapComp' (hX₀.to (X i₁)) f₁ (hX₀.to Y) (by simp)).symm.app A ≪≫ - (F.mapComp' (hX₀.to (X i₂)) f₂ (hX₀.to Y) (by simp)).app A - iso_comp' Y' Y g i₁ i₂ f₁ f₂ f₁g f₂g hf₁g hf₂g := by - ext - dsimp - rw [Functor.map_comp, assoc, F.mapComp'₀₁₃_inv_app_assoc (hX₀.to (X i₁)) - f₁ g (hX₀.to Y) f₁g (hX₀.to Y') (by simp) hf₁g (by simp) A, - F.mapComp'₀₁₃_hom_app (hX₀.to (X i₂)) - f₂ g (hX₀.to Y) f₂g (hX₀.to Y') (by simp) hf₂g (by simp) A, - Iso.inv_hom_id_app_assoc] - iso_trans := by - intros - ext - dsimp - rw [assoc, Iso.hom_inv_id_app_assoc] } - map {A B} f := - { hom i := (F.map _).map f - comm := by - intros - dsimp - rw [mapComp'_inv_naturality_assoc, NatTrans.naturality, assoc, Cat.comp_map] } - map_id := by intros; ext; dsimp; simp only [Functor.map_id] - map_comp := by intros; ext; dsimp; simp only [Functor.map_comp] - -end Pseudofunctor - -end CategoryTheory From dbe0d1a3452e97cb66dbb35e52bcda2f6eba433f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=ABl=20Riou?= Date: Thu, 8 May 2025 17:29:14 +0200 Subject: [PATCH 058/118] wip --- Mathlib.lean | 2 +- .../Sites/Descent/Coalgebra.lean | 50 ----- .../Sites/Descent/DescentDataAsCoalgebra.lean | 198 ++++++++++++++++++ 3 files changed, 199 insertions(+), 51 deletions(-) delete mode 100644 Mathlib/CategoryTheory/Sites/Descent/Coalgebra.lean create mode 100644 Mathlib/CategoryTheory/Sites/Descent/DescentDataAsCoalgebra.lean diff --git a/Mathlib.lean b/Mathlib.lean index 9298c68ff0f7fd..dab86c61a7c8f8 100644 --- a/Mathlib.lean +++ b/Mathlib.lean @@ -2466,8 +2466,8 @@ import Mathlib.CategoryTheory.Sites.CoversTop import Mathlib.CategoryTheory.Sites.DenseSubsite.Basic import Mathlib.CategoryTheory.Sites.DenseSubsite.InducedTopology import Mathlib.CategoryTheory.Sites.DenseSubsite.SheafEquiv -import Mathlib.CategoryTheory.Sites.Descent.Coalgebra import Mathlib.CategoryTheory.Sites.Descent.DescentData +import Mathlib.CategoryTheory.Sites.Descent.DescentDataAsCoalgebra import Mathlib.CategoryTheory.Sites.Descent.DescentDataPrime import Mathlib.CategoryTheory.Sites.Descent.IsPrestack import Mathlib.CategoryTheory.Sites.Descent.IsStack diff --git a/Mathlib/CategoryTheory/Sites/Descent/Coalgebra.lean b/Mathlib/CategoryTheory/Sites/Descent/Coalgebra.lean deleted file mode 100644 index f431b03e8efaa5..00000000000000 --- a/Mathlib/CategoryTheory/Sites/Descent/Coalgebra.lean +++ /dev/null @@ -1,50 +0,0 @@ -/- -Copyright (c) 2025 Joël Riou. All rights reserved. -Released under Apache 2.0 license as described in the file LICENSE. -Authors: Joël Riou --/ -import Mathlib.CategoryTheory.Sites.Descent.DescentData -import Mathlib.CategoryTheory.Sites.Descent.PullbackStruct -import Mathlib.CategoryTheory.Bicategory.Adjunction.Adj -import Mathlib.CategoryTheory.Monad.Comonadicity - -/-! -# Descent data and coalgebras... - --/ - -namespace CategoryTheory - -open Bicategory Limits - -@[simps] -def Bicategory.Adjunction.toCategory {C D : Cat} {F : C ⟶ D} {G : D ⟶ C} - (adj : Bicategory.Adjunction F G) : - CategoryTheory.Adjunction F G where - unit := adj.unit - counit := adj.counit - left_triangle_components X := by - have := congr_app adj.left_triangle X - dsimp [leftZigzag, bicategoricalComp] at this - simpa [Cat.associator_hom_app, Cat.leftUnitor_hom_app, Cat.rightUnitor_inv_app] using this - right_triangle_components X := by - have := congr_app adj.right_triangle X - dsimp [rightZigzag, bicategoricalComp] at this - simpa [Cat.associator_inv_app, Cat.leftUnitor_inv_app] using this - -variable {C : Type*} [Category C] - -namespace Pseudofunctor - -variable (F : Pseudofunctor (LocallyDiscrete Cᵒᵖ) (Adj Cat)) {X S : C} (f : X ⟶ S) - --- needs more assumptions about certain "base change" maps being isomorphisms --- for the square that are part of the data `sq` and `sq₃` -def descentDataEquivCoalgebra (sq : ChosenPullback f f) (diag : sq.Diagonal) - (sq₃ : ChosenPullback₃ sq sq sq) : - (F.comp Adj.forget₁).DescentData (fun (_ : Unit) ↦ f) ≌ - (F.map f.op.toLoc).adj.toCategory.toComonad.Coalgebra := sorry - -end Pseudofunctor - -end CategoryTheory diff --git a/Mathlib/CategoryTheory/Sites/Descent/DescentDataAsCoalgebra.lean b/Mathlib/CategoryTheory/Sites/Descent/DescentDataAsCoalgebra.lean new file mode 100644 index 00000000000000..175a3de0d91b60 --- /dev/null +++ b/Mathlib/CategoryTheory/Sites/Descent/DescentDataAsCoalgebra.lean @@ -0,0 +1,198 @@ +/- +Copyright (c) 2025 Joël Riou. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Joël Riou +-/ +import Mathlib.CategoryTheory.Sites.Descent.DescentDataPrime +import Mathlib.CategoryTheory.Bicategory.Adjunction.Adj +import Mathlib.CategoryTheory.Monad.Adjunction + +/-! +# Descent data as coalgebras... + +-/ + +namespace CategoryTheory + +@[simps] +def Bicategory.Adjunction.toCategory {C D : Cat} {F : C ⟶ D} {G : D ⟶ C} + (adj : Bicategory.Adjunction F G) : + CategoryTheory.Adjunction F G where + unit := adj.unit + counit := adj.counit + left_triangle_components X := by + have := congr_app adj.left_triangle X + dsimp [leftZigzag, bicategoricalComp] at this + simpa [Cat.associator_hom_app, Cat.leftUnitor_hom_app, Cat.rightUnitor_inv_app] using this + right_triangle_components X := by + have := congr_app adj.right_triangle X + dsimp [rightZigzag, bicategoricalComp] at this + simpa [Cat.associator_inv_app, Cat.leftUnitor_inv_app] using this + +open Opposite Limits Bicategory + +namespace Pseudofunctor + +variable {C : Type*} [Category C] (F : Pseudofunctor (LocallyDiscrete Cᵒᵖ) (Adj Cat)) + +namespace ToAdjCat + +set_option quotPrecheck false in +scoped notation g:80 " _* " M:81 => ((_ : Pseudofunctor _ (Adj Cat)).map + (Quiver.Hom.op g).toLoc).g.obj M + +set_option quotPrecheck false in +scoped notation g:80 " ^* " M:81 => ((_ : Pseudofunctor _ (Adj Cat)).map + (Quiver.Hom.op g).toLoc).f.obj M + +end ToAdjCat + +open ToAdjCat + +structure DescentDataAsCoalgebra {ι : Type*} {S : C} {X : ι → C} (f : ∀ i, X i ⟶ S) where + obj (i : ι) : (F.obj (.mk (op (X i)))).obj + hom (i₁ i₂ : ι) : obj i₁ ⟶ (f i₁) ^* (f i₂) _* (obj i₂) + counit (i : ι) : hom i i ≫ (F.map (f i).op.toLoc).adj.counit.app _ = 𝟙 _ := by aesop_cat + coassoc (i₁ i₂ i₃ : ι) : + hom i₁ i₂ ≫ (F.map (f i₁).op.toLoc).f.map ((F.map (f i₂).op.toLoc).g.map (hom i₂ i₃)) = + hom i₁ i₃ ≫ + (F.map (f i₁).op.toLoc).f.map ((F.map (f i₂).op.toLoc).adj.unit.app _) := by aesop_cat + +namespace DescentDataAsCoalgebra + +attribute [reassoc (attr := simp)] counit coassoc +variable {F} + +section + +variable {ι : Type*} {S : C} {X : ι → C} {f : ∀ i, X i ⟶ S} + +@[ext] +structure Hom (D₁ D₂ : F.DescentDataAsCoalgebra f) where + hom (i : ι) : D₁.obj i ⟶ D₂.obj i + comm (i₁ i₂ : ι) : + D₁.hom i₁ i₂ ≫ + (F.map (f i₁).op.toLoc).f.map ((F.map (f i₂).op.toLoc).g.map (hom i₂)) = + hom i₁ ≫ D₂.hom i₁ i₂ := by aesop_cat + +attribute [reassoc (attr := simp)] Hom.comm + +@[simps] +def Hom.id (D : F.DescentDataAsCoalgebra f) : Hom D D where + hom _ := 𝟙 _ + +@[simps] +def Hom.comp {D₁ D₂ D₃ : F.DescentDataAsCoalgebra f} (φ : Hom D₁ D₂) (φ' : Hom D₂ D₃) : + Hom D₁ D₃ where + hom i := φ.hom i ≫ φ'.hom i + +instance : Category (F.DescentDataAsCoalgebra f) where + Hom := Hom + id := Hom.id + comp := Hom.comp + +@[ext] +lemma hom_ext {D₁ D₂ : F.DescentDataAsCoalgebra f} {φ φ' : D₁ ⟶ D₂} + (h : ∀ i, φ.hom i = φ'.hom i): φ = φ' := + Hom.ext (funext h) + +@[simp] +lemma id_hom (D : F.DescentDataAsCoalgebra f) (i : ι) : + Hom.hom (𝟙 D) i = 𝟙 _ := rfl + +@[reassoc, simp] +lemma comp_hom {D₁ D₂ D₃ : F.DescentDataAsCoalgebra f} (φ : D₁ ⟶ D₂) (φ' : D₂ ⟶ D₃) (i : ι) : + (φ ≫ φ').hom i = φ.hom i ≫ φ'.hom i := rfl + +end + +section Unit + +variable {X S : C} {f : X ⟶ S} + +@[simps] +def toCoalgebra (D : F.DescentDataAsCoalgebra (fun (_ : Unit) ↦ f)) : + (F.map f.op.toLoc).adj.toCategory.toComonad.Coalgebra where + A := D.obj .unit + a := D.hom .unit .unit + +@[simps] +def ofCoalgebra (A : (F.map f.op.toLoc).adj.toCategory.toComonad.Coalgebra) : + F.DescentDataAsCoalgebra (fun (_ : Unit) ↦ f) where + obj _ := A.A + hom _ _ := A.a + counit _ := A.counit + coassoc _ _ _ := A.coassoc.symm + +variable (F f) + +@[simps] +def toCoalgebraFunctor : + F.DescentDataAsCoalgebra (fun (_ : Unit) ↦ f) ⥤ + (F.map f.op.toLoc).adj.toCategory.toComonad.Coalgebra where + obj D := D.toCoalgebra + map φ := { f := φ.hom .unit } + +@[simps] +def fromCoalgebraFunctor : + (F.map f.op.toLoc).adj.toCategory.toComonad.Coalgebra ⥤ + F.DescentDataAsCoalgebra (fun (_ : Unit) ↦ f) where + obj A := ofCoalgebra A + map φ := + { hom _ := φ.f + comm _ _ := φ.h } + +@[simps] +def coalgebraEquivalence : + F.DescentDataAsCoalgebra (fun (_ : Unit) ↦ f) ≌ + (F.map f.op.toLoc).adj.toCategory.toComonad.Coalgebra where + functor := toCoalgebraFunctor F f + inverse := fromCoalgebraFunctor F f + unitIso := Iso.refl _ + counitIso := Iso.refl _ + +end Unit + +variable (F) {ι : Type*} {S : C} {X : ι → C} {f : ∀ i, X i ⟶ S} + (sq : ∀ i j, ChosenPullback (f i) (f j)) + (sq₃ : ∀ (i₁ i₂ i₃ : ι), ChosenPullback₃ (sq i₁ i₂) (sq i₂ i₃) (sq i₁ i₃)) + +-- needs "base change" assumptions +def descentData'Equivalence : + F.DescentDataAsCoalgebra f ≌ (F.comp Adj.forget₁).DescentData' sq sq₃ := by + sorry + +end DescentDataAsCoalgebra + +namespace DescentData' + +variable {X S : C} {f : X ⟶ S} (sq : ChosenPullback f f) (sq₃ : ChosenPullback₃ sq sq sq) + +-- needs "base change" assumptions +noncomputable def equivalenceOfComonadicLeftAdjoint + [(Comonad.comparison (F.map f.op.toLoc).adj.toCategory).IsEquivalence] : + (F.obj (.mk (op S))).obj ≌ + (F.comp Adj.forget₁).DescentData' (fun (_ : Unit) _ ↦ sq) (fun _ _ _ ↦ sq₃) := + (Comonad.comparison (F.map f.op.toLoc).adj.toCategory).asEquivalence.trans + ((DescentDataAsCoalgebra.coalgebraEquivalence _ _).symm.trans + (DescentDataAsCoalgebra.descentData'Equivalence _ _ _)) + +end DescentData' + +namespace DescentData + +variable {X S : C} (f : X ⟶ S) (sq : ChosenPullback f f) (sq₃ : ChosenPullback₃ sq sq sq) + +-- needs "base change" assumptions +noncomputable def equivalenceOfComonadicLeftAdjoint + [(Comonad.comparison (F.map f.op.toLoc).adj.toCategory).IsEquivalence] : + (F.obj (.mk (op S))).obj ≌ + (F.comp Adj.forget₁).DescentData (fun (_ : Unit) ↦ f) := + (DescentData'.equivalenceOfComonadicLeftAdjoint F sq sq₃).trans + (DescentData'.descentDataEquivalence (F.comp Adj.forget₁) _ _) + +end DescentData + +end Pseudofunctor + +end CategoryTheory From 2d5b3f8d8672199ff3f06470b95125283969f5f8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=ABl=20Riou?= Date: Thu, 8 May 2025 18:40:37 +0200 Subject: [PATCH 059/118] cleaning up --- .../Sites/Descent/DescentData.lean | 39 ++---- .../Sites/Descent/DescentDataPrime.lean | 127 +++++++++--------- .../Sites/Descent/IsPrestack.lean | 77 +++++++---- 3 files changed, 123 insertions(+), 120 deletions(-) diff --git a/Mathlib/CategoryTheory/Sites/Descent/DescentData.lean b/Mathlib/CategoryTheory/Sites/Descent/DescentData.lean index 11a6a797513154..b6994d1b1362c6 100644 --- a/Mathlib/CategoryTheory/Sites/Descent/DescentData.lean +++ b/Mathlib/CategoryTheory/Sites/Descent/DescentData.lean @@ -6,6 +6,7 @@ Authors: Joël Riou, Christian Merten import Mathlib.CategoryTheory.Bicategory.Functor.LocallyDiscrete import Mathlib.CategoryTheory.Bicategory.Functor.Cat import Mathlib.CategoryTheory.Sites.Descent.PullbackStruct +import Mathlib.CategoryTheory.Sites.Descent.IsPrestack /-! # Descent data @@ -20,43 +21,23 @@ open Opposite Limits namespace Pseudofunctor -macro "aesoptoloc" : tactic => `(tactic|(simp [← Quiver.Hom.comp_toLoc, ← op_comp] <;> aesop)) +macro "aesoptoloc" : tactic => + `(tactic|(simp [← Quiver.Hom.comp_toLoc, ← op_comp] <;> aesop)) + +open LocallyDiscreteOpToCat variable {C : Type u} [Category.{v} C] (F : Pseudofunctor (LocallyDiscrete Cᵒᵖ) Cat.{v', u'}) {ι : Type t} {S : C} {X : ι → C} (f : ∀ i, X i ⟶ S) -namespace DescentData - -variable {F} in -def pull ⦃X₁ X₂ : C⦄ ⦃M₁ : F.obj (.mk (op X₁))⦄ ⦃M₂ : F.obj (.mk (op X₂))⦄ - ⦃Y : C⦄ ⦃f₁ : Y ⟶ X₁⦄ ⦃f₂ : Y ⟶ X₂⦄ - (φ : (F.map f₁.op.toLoc).obj M₁ ⟶ (F.map f₂.op.toLoc).obj M₂) ⦃Y' : C⦄ (g : Y' ⟶ Y) - (gf₁ : Y' ⟶ X₁) (gf₂ : Y' ⟶ X₂) (hgf₁ : g ≫ f₁ = gf₁ := by aesop_cat) - (hgf₂ : g ≫ f₂ = gf₂ := by aesop_cat) : - (F.map gf₁.op.toLoc).obj M₁ ⟶ (F.map gf₂.op.toLoc).obj M₂ := - (F.mapComp' f₁.op.toLoc g.op.toLoc gf₁.op.toLoc (by aesoptoloc)).hom.app _ ≫ - (F.map g.op.toLoc).map φ ≫ - (F.mapComp' f₂.op.toLoc g.op.toLoc gf₂.op.toLoc (by aesoptoloc)).inv.app _ - -@[simp] -lemma pull_id ⦃X₁ X₂ : C⦄ ⦃M₁ : F.obj (.mk (op X₁))⦄ ⦃M₂ : F.obj (.mk (op X₂))⦄ - ⦃Y : C⦄ ⦃f₁ : Y ⟶ X₁⦄ ⦃f₂ : Y ⟶ X₂⦄ - (φ : (F.map f₁.op.toLoc).obj M₁ ⟶ (F.map f₂.op.toLoc).obj M₂) : - pull φ (𝟙 _) f₁ f₂ = φ := by - simp [pull, mapComp'_comp_id_hom_app, mapComp'_comp_id_inv_app] - -end DescentData - -open DescentData structure DescentData where obj (i : ι) : F.obj (.mk (op (X i))) hom ⦃Y : C⦄ (q : Y ⟶ S) ⦃i₁ i₂ : ι⦄ (f₁ : Y ⟶ X i₁) (f₂ : Y ⟶ X i₂) (_hf₁ : f₁ ≫ f i₁ = q := by aesop_cat) (_hf₂ : f₂ ≫ f i₂ = q := by aesop_cat) : (F.map f₁.op.toLoc).obj (obj i₁) ⟶ (F.map f₂.op.toLoc).obj (obj i₂) - pull_hom ⦃Y' Y : C⦄ (g : Y' ⟶ Y) (q : Y ⟶ S) (q' : Y' ⟶ S) (hq : g ≫ q = q') + pullHom_hom ⦃Y' Y : C⦄ (g : Y' ⟶ Y) (q : Y ⟶ S) (q' : Y' ⟶ S) (hq : g ≫ q = q') ⦃i₁ i₂ : ι⦄ (f₁ : Y ⟶ X i₁) (f₂ : Y ⟶ X i₂) (hf₁ : f₁ ≫ f i₁ = q) (hf₂ : f₂ ≫ f i₂ = q) (gf₁ : Y' ⟶ X i₁) (gf₂ : Y' ⟶ X i₂) (hgf₁ : g ≫ f₁ = gf₁) (hgf₂ : g ≫ f₂ = gf₂) : - pull (hom q f₁ f₂) g gf₁ gf₂ = hom q' gf₁ gf₂ := by aesop_cat + pullHom (hom q f₁ f₂) g gf₁ gf₂ = hom q' gf₁ gf₂ := by aesop_cat hom_self ⦃Y : C⦄ (q : Y ⟶ S) ⦃i : ι⦄ (g : Y ⟶ X i) (_ : g ≫ f i = q) : hom q g g = 𝟙 _ := by aesop_cat hom_comp ⦃Y : C⦄ (q : Y ⟶ S) ⦃i₁ i₂ i₃ : ι⦄ (f₁ : Y ⟶ X i₁) (f₂ : Y ⟶ X i₂) (f₃ : Y ⟶ X i₃) @@ -67,7 +48,7 @@ namespace DescentData variable {F f} (D : F.DescentData f) -attribute [local simp] hom_self pull_hom +attribute [local simp] hom_self pullHom_hom attribute [reassoc (attr := simp)] hom_comp @[simps] @@ -123,9 +104,9 @@ def ofObj (M : F.obj (.mk (op S))) : F.DescentData f where hom Y q i₁ i₂ f₁ f₂ hf₁ hf₂ := (F.mapComp' (f i₁).op.toLoc f₁.op.toLoc q.op.toLoc (by aesoptoloc)).inv.app _ ≫ (F.mapComp' (f i₂).op.toLoc f₂.op.toLoc q.op.toLoc (by aesoptoloc)).hom.app _ - pull_hom Y' Y g q q' hq i₁ i₂ f₁ f₂ hf₁ hf₂ gf₁ gf₂ hgf₁ hgf₂ := by + pullHom_hom Y' Y g q q' hq i₁ i₂ f₁ f₂ hf₁ hf₂ gf₁ gf₂ hgf₁ hgf₂ := by dsimp - simp only [pull, Functor.map_comp, Category.assoc, + simp only [pullHom, Functor.map_comp, Category.assoc, F.mapComp'₀₁₃_inv_app (f i₁).op.toLoc f₁.op.toLoc g.op.toLoc q.op.toLoc gf₁.op.toLoc q'.op.toLoc (by aesoptoloc) (by aesoptoloc) (by aesoptoloc), F.mapComp'_hom_app_comp_mapComp'_inv_app diff --git a/Mathlib/CategoryTheory/Sites/Descent/DescentDataPrime.lean b/Mathlib/CategoryTheory/Sites/Descent/DescentDataPrime.lean index 89575606a72609..7606462232e032 100644 --- a/Mathlib/CategoryTheory/Sites/Descent/DescentDataPrime.lean +++ b/Mathlib/CategoryTheory/Sites/Descent/DescentDataPrime.lean @@ -16,6 +16,8 @@ open Opposite Limits namespace Pseudofunctor +open LocallyDiscreteOpToCat + variable {C : Type*} [Category C] (F : Pseudofunctor (LocallyDiscrete Cᵒᵖ) Cat) {ι : Type*} {S : C} {X : ι → C} {f : ∀ i, X i ⟶ S} (sq : ∀ i j, ChosenPullback (f i) (f j)) @@ -31,32 +33,32 @@ variable {obj obj' : ∀ (i : ι), F.obj (.mk (op (X i)))} (hom : ∀ (i j : ι), (F.map (sq i j).p₁.op.toLoc).obj (obj i) ⟶ (F.map (sq i j).p₂.op.toLoc).obj (obj' j)) -noncomputable def pullHom ⦃Y : C⦄ (q : Y ⟶ S) ⦃i₁ i₂ : ι⦄ (f₁ : Y ⟶ X i₁) (f₂ : Y ⟶ X i₂) +noncomputable def pullHom' ⦃Y : C⦄ (q : Y ⟶ S) ⦃i₁ i₂ : ι⦄ (f₁ : Y ⟶ X i₁) (f₂ : Y ⟶ X i₂) (hf₁ : f₁ ≫ f i₁ = q := by aesop_cat) (hf₂ : f₂ ≫ f i₂ = q := by aesop_cat) : (F.map f₁.op.toLoc).obj (obj i₁) ⟶ (F.map f₂.op.toLoc).obj (obj' i₂) := - DescentData.pull (hom i₁ i₂) ((sq i₁ i₂).isPullback.lift f₁ f₂ (by aesop)) f₁ f₂ + pullHom (hom i₁ i₂) ((sq i₁ i₂).isPullback.lift f₁ f₂ (by aesop)) f₁ f₂ @[reassoc] -lemma pullHom_eq_pull ⦃Y : C⦄ (q : Y ⟶ S) ⦃i₁ i₂ : ι⦄ (f₁ : Y ⟶ X i₁) (f₂ : Y ⟶ X i₂) +lemma pullHom'_eq_pullHom ⦃Y : C⦄ (q : Y ⟶ S) ⦃i₁ i₂ : ι⦄ (f₁ : Y ⟶ X i₁) (f₂ : Y ⟶ X i₂) (hf₁ : f₁ ≫ f i₁ = q) (hf₂ : f₂ ≫ f i₂ = q) (p : Y ⟶ (sq i₁ i₂).pullback) (hp₁ : p ≫ (sq i₁ i₂).p₁ = f₁) (hp₂ : p ≫ (sq i₁ i₂).p₂ = f₂) : - pullHom hom q f₁ f₂ hf₁ hf₂ = - DescentData.pull (hom i₁ i₂) p f₁ f₂ := by + pullHom' hom q f₁ f₂ hf₁ hf₂ = + pullHom (hom i₁ i₂) p f₁ f₂ := by obtain rfl : p = (sq i₁ i₂).isPullback.lift f₁ f₂ (by rw [hf₁, hf₂]) := by apply (sq i₁ i₂).isPullback.hom_ext <;> aesop rfl @[reassoc] - lemma pull_pullHom ⦃Y Y' : C⦄ (g : Y' ⟶ Y) (q : Y ⟶ S) (q' : Y' ⟶ S) (hq : g ≫ q = q') + lemma pullHom_pullHom' ⦃Y Y' : C⦄ (g : Y' ⟶ Y) (q : Y ⟶ S) (q' : Y' ⟶ S) (hq : g ≫ q = q') ⦃i₁ i₂ : ι⦄ (f₁ : Y ⟶ X i₁) (f₂ : Y ⟶ X i₂) (hf₁ : f₁ ≫ f i₁ = q) (hf₂ : f₂ ≫ f i₂ = q) (gf₁ : Y' ⟶ X i₁) (gf₂ : Y' ⟶ X i₂) (hgf₁ : g ≫ f₁ = gf₁) (hgf₂ : g ≫ f₂ = gf₂) : - DescentData.pull (pullHom hom q f₁ f₂ hf₁ hf₂) g gf₁ gf₂ = - pullHom hom q' gf₁ gf₂ := by + pullHom (pullHom' hom q f₁ f₂ hf₁ hf₂) g gf₁ gf₂ = + pullHom' hom q' gf₁ gf₂ := by let p := (sq i₁ i₂).isPullback.lift f₁ f₂ (by aesop) dsimp - rw [pullHom_eq_pull _ _ _ _ _ _ p (by aesop) (by aesop), - pullHom_eq_pull _ _ _ _ _ _ (g ≫ p) (by aesop) (by aesop)] - dsimp [DescentData.pull] + rw [pullHom'_eq_pullHom _ _ _ _ _ _ p (by aesop) (by aesop), + pullHom'_eq_pullHom _ _ _ _ _ _ (g ≫ p) (by aesop) (by aesop)] + dsimp [pullHom] simp only [Functor.map_comp, Category.assoc] rw [← F.mapComp'_hom_app_comp_mapComp'_hom_app_map_obj_assoc _ _ _ _ _ _ (by rw [← Quiver.Hom.comp_toLoc, ← op_comp, IsPullback.lift_fst]) rfl @@ -76,35 +78,34 @@ variable {obj : ∀ (i : ι), F.obj (.mk (op (X i)))} (F.map (sq i j).p₂.op.toLoc).obj (obj j)) @[simp] -lemma pullHom_p₁_p₂ (i₁ i₂ : ι) : - pullHom hom (sq i₁ i₂).p (sq i₁ i₂).p₁ (sq i₁ i₂).p₂ (by simp) (by simp) = hom i₁ i₂ := by - rw [pullHom_eq_pull hom (sq i₁ i₂).p (sq i₁ i₂).p₁ (sq i₁ i₂).p₂ (by simp) (by simp) +lemma pullHom'_p₁_p₂ (i₁ i₂ : ι) : + pullHom' hom (sq i₁ i₂).p (sq i₁ i₂).p₁ (sq i₁ i₂).p₂ (by simp) (by simp) = hom i₁ i₂ := by + rw [pullHom'_eq_pullHom hom (sq i₁ i₂).p (sq i₁ i₂).p₁ (sq i₁ i₂).p₂ (by simp) (by simp) (𝟙 _) (by simp) (by simp)] - simp [DescentData.pull, mapComp'_comp_id_hom_app, mapComp'_comp_id_inv_app] + simp [pullHom, mapComp'_comp_id_hom_app, mapComp'_comp_id_inv_app] -lemma pullHom_self' (hom_self : ∀ i, pullHom hom (f i) (𝟙 (X i)) (𝟙 (X i)) = 𝟙 _) +lemma pullHom'_self' (hom_self : ∀ i, pullHom' hom (f i) (𝟙 (X i)) (𝟙 (X i)) = 𝟙 _) ⦃Y : C⦄ (q : Y ⟶ S) ⦃i : ι⦄ (g : Y ⟶ X i) (hg : g ≫ f i = q) : - pullHom hom q g g hg hg = 𝟙 _ := by - simp [← pull_pullHom hom g (f i) q hg (𝟙 (X i)) (𝟙 (X i)) (by simp) (by simp) g g - (by simp) (by simp), hom_self, DescentData.pull] + pullHom' hom q g g hg hg = 𝟙 _ := by + simp [← pullHom_pullHom' hom g (f i) q hg (𝟙 (X i)) (𝟙 (X i)) (by simp) (by simp) g g + (by simp) (by simp), hom_self, pullHom] variable {sq₃} in @[reassoc] -lemma comp_pullHom' (hom_comp : ∀ (i₁ i₂ i₃ : ι), - pullHom hom (sq₃ i₁ i₂ i₃).p (sq₃ i₁ i₂ i₃).p₁ (sq₃ i₁ i₂ i₃).p₂ ≫ - pullHom hom (sq₃ i₁ i₂ i₃).p (sq₃ i₁ i₂ i₃).p₂ (sq₃ i₁ i₂ i₃).p₃ = - pullHom hom (sq₃ i₁ i₂ i₃).p (sq₃ i₁ i₂ i₃).p₁ (sq₃ i₁ i₂ i₃).p₃) +lemma comp_pullHom'' (hom_comp : ∀ (i₁ i₂ i₃ : ι), + pullHom' hom (sq₃ i₁ i₂ i₃).p (sq₃ i₁ i₂ i₃).p₁ (sq₃ i₁ i₂ i₃).p₂ ≫ + pullHom' hom (sq₃ i₁ i₂ i₃).p (sq₃ i₁ i₂ i₃).p₂ (sq₃ i₁ i₂ i₃).p₃ = + pullHom' hom (sq₃ i₁ i₂ i₃).p (sq₃ i₁ i₂ i₃).p₁ (sq₃ i₁ i₂ i₃).p₃) ⦃Y : C⦄ (q : Y ⟶ S) ⦃i₁ i₂ i₃ : ι⦄ (f₁ : Y ⟶ X i₁) (f₂ : Y ⟶ X i₂) (f₃ : Y ⟶ X i₃) (hf₁ : f₁ ≫ f i₁ = q) (hf₂ : f₂ ≫ f i₂ = q) (hf₃ : f₃ ≫ f i₃ = q) : - pullHom hom q f₁ f₂ ≫ pullHom hom q f₂ f₃ = pullHom hom q f₁ f₃ := by + pullHom' hom q f₁ f₂ ≫ pullHom' hom q f₂ f₃ = pullHom' hom q f₁ f₃ := by obtain ⟨φ, _, _, _⟩ := (sq₃ i₁ i₂ i₃).exists_lift f₁ f₂ f₃ q hf₁ hf₂ hf₃ - rw [← pull_pullHom_assoc hom φ (sq₃ i₁ i₂ i₃).p _ _ (sq₃ i₁ i₂ i₃).p₁ (sq₃ i₁ i₂ i₃).p₂, - DescentData.pull, Category.assoc, Category.assoc, - ← pull_pullHom hom φ (sq₃ i₁ i₂ i₃).p _ _ (sq₃ i₁ i₂ i₃).p₂ (sq₃ i₁ i₂ i₃).p₃, - ← pull_pullHom hom φ (sq₃ i₁ i₂ i₃).p _ _ (sq₃ i₁ i₂ i₃).p₁ (sq₃ i₁ i₂ i₃).p₃, - DescentData.pull, DescentData.pull, - Iso.inv_hom_id_app_assoc, ← Functor.map_comp_assoc, hom_comp] + rw [← pullHom_pullHom'_assoc hom φ (sq₃ i₁ i₂ i₃).p _ _ (sq₃ i₁ i₂ i₃).p₁ (sq₃ i₁ i₂ i₃).p₂, + pullHom, Category.assoc, Category.assoc, + ← pullHom_pullHom' hom φ (sq₃ i₁ i₂ i₃).p _ _ (sq₃ i₁ i₂ i₃).p₂ (sq₃ i₁ i₂ i₃).p₃, + ← pullHom_pullHom' hom φ (sq₃ i₁ i₂ i₃).p _ _ (sq₃ i₁ i₂ i₃).p₁ (sq₃ i₁ i₂ i₃).p₃, + pullHom, pullHom, Iso.inv_hom_id_app_assoc, ← Functor.map_comp_assoc, hom_comp] all_goals aesop end @@ -117,30 +118,30 @@ structure DescentData' where obj (i : ι) : F.obj (.mk (op (X i))) hom : ∀ (i j : ι), (F.map (sq i j).p₁.op.toLoc).obj (obj i) ⟶ (F.map (sq i j).p₂.op.toLoc).obj (obj j) - hom_self : ∀ i, pullHom hom (f i) (𝟙 (X i)) (𝟙 (X i)) = 𝟙 _ - hom_comp (i₁ i₂ i₃ : ι) : - pullHom hom (sq₃ i₁ i₂ i₃).p (sq₃ i₁ i₂ i₃).p₁ (sq₃ i₁ i₂ i₃).p₂ ≫ - pullHom hom (sq₃ i₁ i₂ i₃).p (sq₃ i₁ i₂ i₃).p₂ (sq₃ i₁ i₂ i₃).p₃ = - pullHom hom (sq₃ i₁ i₂ i₃).p (sq₃ i₁ i₂ i₃).p₁ (sq₃ i₁ i₂ i₃).p₃ + pullHom'_hom_self : ∀ i, pullHom' hom (f i) (𝟙 (X i)) (𝟙 (X i)) = 𝟙 _ + pullHom'_hom_comp (i₁ i₂ i₃ : ι) : + pullHom' hom (sq₃ i₁ i₂ i₃).p (sq₃ i₁ i₂ i₃).p₁ (sq₃ i₁ i₂ i₃).p₂ ≫ + pullHom' hom (sq₃ i₁ i₂ i₃).p (sq₃ i₁ i₂ i₃).p₂ (sq₃ i₁ i₂ i₃).p₃ = + pullHom' hom (sq₃ i₁ i₂ i₃).p (sq₃ i₁ i₂ i₃).p₁ (sq₃ i₁ i₂ i₃).p₃ namespace DescentData' variable {F sq sq₃} @[simp] -lemma pullHom_self (D : F.DescentData' sq sq₃) +lemma pullHom'_self (D : F.DescentData' sq sq₃) ⦃Y : C⦄ (q : Y ⟶ S) ⦃i : ι⦄ (g : Y ⟶ X i) (hg : g ≫ f i = q) : - pullHom D.hom q g g hg hg = 𝟙 _ := - pullHom_self' _ D.hom_self _ _ _ + pullHom' D.hom q g g hg hg = 𝟙 _ := + pullHom'_self' _ D.pullHom'_hom_self _ _ _ @[reassoc (attr := simp)] -lemma comp_pullHom (D : F.DescentData' sq sq₃) +lemma comp_pullHom' (D : F.DescentData' sq sq₃) ⦃Y : C⦄ (q : Y ⟶ S) ⦃i₁ i₂ i₃ : ι⦄ (f₁ : Y ⟶ X i₁) (f₂ : Y ⟶ X i₂) (f₃ : Y ⟶ X i₃) (hf₁ : f₁ ≫ f i₁ = q) (hf₂ : f₂ ≫ f i₂ = q) (hf₃ : f₃ ≫ f i₃ = q) : - pullHom D.hom q f₁ f₂ hf₁ hf₂ ≫ pullHom D.hom q f₂ f₃ hf₂ hf₃ = - pullHom D.hom q f₁ f₃ hf₁ hf₃ := - comp_pullHom' _ D.hom_comp _ _ _ _ hf₁ hf₂ hf₃ + pullHom' D.hom q f₁ f₂ hf₁ hf₂ ≫ pullHom' D.hom q f₂ f₃ hf₂ hf₃ = + pullHom' D.hom q f₁ f₃ hf₁ hf₃ := + comp_pullHom'' _ D.pullHom'_hom_comp _ _ _ _ hf₁ hf₂ hf₃ @[ext] structure Hom (D₁ D₂ : F.DescentData' sq sq₃) where @@ -183,14 +184,14 @@ lemma id_hom (D : F.DescentData' sq sq₃) (i : ι) : lemma comm {D₁ D₂ : F.DescentData' sq sq₃} (φ : D₁ ⟶ D₂) ⦃Y : C⦄ (q : Y ⟶ S) ⦃i₁ i₂ : ι⦄ (f₁ : Y ⟶ X i₁) (f₂ : Y ⟶ X i₂) (hf₁ : f₁ ≫ f i₁ = q) (hf₂ : f₂ ≫ f i₂ = q) : - (F.map f₁.op.toLoc).map (φ.hom i₁) ≫ pullHom D₂.hom q f₁ f₂ hf₁ hf₂ = - pullHom D₁.hom q f₁ f₂ hf₁ hf₂ ≫ (F.map f₂.op.toLoc).map (φ.hom i₂) := by + (F.map f₁.op.toLoc).map (φ.hom i₁) ≫ pullHom' D₂.hom q f₁ f₂ hf₁ hf₂ = + pullHom' D₁.hom q f₁ f₂ hf₁ hf₂ ≫ (F.map f₂.op.toLoc).map (φ.hom i₂) := by obtain ⟨p, _, _⟩ := (sq i₁ i₂).isPullback.exists_lift f₁ f₂ (by aesop) - rw [← pull_pullHom D₂.hom p (sq i₁ i₂).p q (by aesop) (sq i₁ i₂).p₁ (sq i₁ i₂).p₂ + rw [← pullHom_pullHom' D₂.hom p (sq i₁ i₂).p q (by aesop) (sq i₁ i₂).p₁ (sq i₁ i₂).p₂ (by simp) (by simp) f₁ f₂ (by aesop) (by aesop), - ← pull_pullHom D₁.hom p (sq i₁ i₂).p q (by aesop) (sq i₁ i₂).p₁ (sq i₁ i₂).p₂ - (by simp) (by simp) f₁ f₂ (by aesop) (by aesop), pullHom_p₁_p₂, pullHom_p₁_p₂] - dsimp only [DescentData.pull] + ← pullHom_pullHom' D₁.hom p (sq i₁ i₂).p q (by aesop) (sq i₁ i₂).p₁ (sq i₁ i₂).p₂ + (by simp) (by simp) f₁ f₂ (by aesop) (by aesop), pullHom'_p₁_p₂, pullHom'_p₁_p₂] + dsimp only [pullHom] rw [NatTrans.naturality_assoc] dsimp rw [← Functor.map_comp_assoc, φ.comm, Functor.map_comp_assoc, mapComp'_inv_naturality] @@ -215,39 +216,39 @@ def isoMk {D₁ D₂ : F.DescentData' sq sq₃} (e : ∀ (i : ι), D₁.obj i @[simps] noncomputable def descentData (D : F.DescentData' sq sq₃) : F.DescentData f where obj := D.obj - hom _ _ _ _ _ _ hf₁ hf₂ := pullHom D.hom _ _ _ hf₁ hf₂ - pull_hom _ _ _ _ _ hq _ _ _ _ _ _ _ _ hgf₁ hgf₂ := - pull_pullHom _ _ _ _ hq _ _ _ _ _ _ hgf₁ hgf₂ + hom _ _ _ _ _ _ hf₁ hf₂ := pullHom' D.hom _ _ _ hf₁ hf₂ + pullHom_hom _ _ _ _ _ hq _ _ _ _ _ _ _ _ hgf₁ hgf₂ := + pullHom_pullHom' _ _ _ _ hq _ _ _ _ _ _ hgf₁ hgf₂ variable (sq sq₃) in @[simps] def ofDescentData (D : F.DescentData f) : F.DescentData' sq sq₃ where obj := D.obj hom i₁ i₂ := D.hom (sq i₁ i₂).p (sq i₁ i₂).p₁ (sq i₁ i₂).p₂ - hom_self i := by + pullHom'_hom_self i := by obtain ⟨p, h₁, h₂⟩ := (sq i i).isPullback.exists_lift (𝟙 _) (𝟙 _) (by simp) have : p ≫ (sq i i).p = f i := by rw [← (sq i i).hp₁, reassoc_of% h₁] - rw [pullHom_eq_pull _ _ _ _ _ _ p, D.pull_hom _ _ (f i), D.hom_self (f i) (𝟙 _)] + rw [pullHom'_eq_pullHom _ _ _ _ _ _ p, D.pullHom_hom _ _ (f i), D.hom_self (f i) (𝟙 _)] all_goals aesop - hom_comp i₁ i₂ i₃ := by - rw [pullHom_eq_pull _ _ _ _ _ _ (sq₃ i₁ i₂ i₃).p₁₂, - pullHom_eq_pull _ _ _ _ _ _ (sq₃ i₁ i₂ i₃).p₂₃, - pullHom_eq_pull _ _ _ _ _ _ (sq₃ i₁ i₂ i₃).p₁₃, - D.pull_hom _ _ (sq₃ i₁ i₂ i₃).p, D.pull_hom _ _ (sq₃ i₁ i₂ i₃).p, - D.pull_hom _ _ (sq₃ i₁ i₂ i₃).p, + pullHom'_hom_comp i₁ i₂ i₃ := by + rw [pullHom'_eq_pullHom _ _ _ _ _ _ (sq₃ i₁ i₂ i₃).p₁₂, + pullHom'_eq_pullHom _ _ _ _ _ _ (sq₃ i₁ i₂ i₃).p₂₃, + pullHom'_eq_pullHom _ _ _ _ _ _ (sq₃ i₁ i₂ i₃).p₁₃, + D.pullHom_hom _ _ (sq₃ i₁ i₂ i₃).p, D.pullHom_hom _ _ (sq₃ i₁ i₂ i₃).p, + D.pullHom_hom _ _ (sq₃ i₁ i₂ i₃).p, D.hom_comp] all_goals aesop variable (sq sq₃) in @[simp] -lemma pullHom_ofDescentData_hom (D : F.DescentData f) +lemma pullHom'_ofDescentData_hom (D : F.DescentData f) ⦃Y : C⦄ (q : Y ⟶ S) ⦃i₁ i₂ : ι⦄ (f₁ : Y ⟶ X i₁) (f₂ : Y ⟶ X i₂) (hf₁ : f₁ ≫ f i₁ = q) (hf₂ : f₂ ≫ f i₂ = q): - pullHom (ofDescentData sq sq₃ D).hom q f₁ f₂ hf₁ hf₂ = D.hom q f₁ f₂ hf₁ hf₂ := by + pullHom' (ofDescentData sq sq₃ D).hom q f₁ f₂ hf₁ hf₂ = D.hom q f₁ f₂ hf₁ hf₂ := by obtain ⟨p, h₁, h₂⟩ := (sq i₁ i₂).isPullback.exists_lift f₁ f₂ (by aesop) - rw [pullHom_eq_pull _ _ _ _ _ _ p (by aesop) (by aesop)] + rw [pullHom'_eq_pullHom _ _ _ _ _ _ p (by aesop) (by aesop)] dsimp - rw [D.pull_hom _ _ _ (by rw [← (sq i₁ i₂).hp₁, reassoc_of% h₁, hf₁]) _ _ + rw [D.pullHom_hom _ _ _ (by rw [← (sq i₁ i₂).hp₁, reassoc_of% h₁, hf₁]) _ _ (by simp) (by simp) _ _ h₁ h₂] variable (F sq sq₃) diff --git a/Mathlib/CategoryTheory/Sites/Descent/IsPrestack.lean b/Mathlib/CategoryTheory/Sites/Descent/IsPrestack.lean index 367132027bd806..5771334b6d7fe3 100644 --- a/Mathlib/CategoryTheory/Sites/Descent/IsPrestack.lean +++ b/Mathlib/CategoryTheory/Sites/Descent/IsPrestack.lean @@ -37,35 +37,59 @@ open Opposite Bicategory namespace Pseudofunctor -variable {C : Type u} [Category.{v} C] (F : Pseudofunctor (LocallyDiscrete Cᵒᵖ) Cat.{v', u'}) - {S : C} (M N : F.obj (.mk (op S))) - +variable {C : Type u} [Category.{v} C] {F : Pseudofunctor (LocallyDiscrete Cᵒᵖ) Cat.{v', u'}} + +namespace LocallyDiscreteOpToCat + +def pullHom ⦃X₁ X₂ : C⦄ ⦃M₁ : F.obj (.mk (op X₁))⦄ ⦃M₂ : F.obj (.mk (op X₂))⦄ + ⦃Y : C⦄ ⦃f₁ : Y ⟶ X₁⦄ ⦃f₂ : Y ⟶ X₂⦄ + (φ : (F.map f₁.op.toLoc).obj M₁ ⟶ (F.map f₂.op.toLoc).obj M₂) ⦃Y' : C⦄ (g : Y' ⟶ Y) + (gf₁ : Y' ⟶ X₁) (gf₂ : Y' ⟶ X₂) (hgf₁ : g ≫ f₁ = gf₁ := by aesop_cat) + (hgf₂ : g ≫ f₂ = gf₂ := by aesop_cat) : + (F.map gf₁.op.toLoc).obj M₁ ⟶ (F.map gf₂.op.toLoc).obj M₂ := + (F.mapComp' f₁.op.toLoc g.op.toLoc gf₁.op.toLoc (by aesop)).hom.app _ ≫ + (F.map g.op.toLoc).map φ ≫ + (F.mapComp' f₂.op.toLoc g.op.toLoc gf₂.op.toLoc (by aesop)).inv.app _ + +@[simp] +lemma pullHom_id ⦃X₁ X₂ : C⦄ ⦃M₁ : F.obj (.mk (op X₁))⦄ ⦃M₂ : F.obj (.mk (op X₂))⦄ + ⦃Y : C⦄ ⦃f₁ : Y ⟶ X₁⦄ ⦃f₂ : Y ⟶ X₂⦄ + (φ : (F.map f₁.op.toLoc).obj M₁ ⟶ (F.map f₂.op.toLoc).obj M₂) : + pullHom φ (𝟙 _) f₁ f₂ = φ := by + simp [pullHom, mapComp'_comp_id_hom_app, mapComp'_comp_id_inv_app] + +@[simp] +lemma pullHom_pullHom + ⦃X₁ X₂ : C⦄ ⦃M₁ : F.obj (.mk (op X₁))⦄ ⦃M₂ : F.obj (.mk (op X₂))⦄ + ⦃Y : C⦄ ⦃f₁ : Y ⟶ X₁⦄ ⦃f₂ : Y ⟶ X₂⦄ + (φ : (F.map f₁.op.toLoc).obj M₁ ⟶ (F.map f₂.op.toLoc).obj M₂) ⦃Y' : C⦄ (g : Y' ⟶ Y) + (gf₁ : Y' ⟶ X₁) (gf₂ : Y' ⟶ X₂) ⦃Y'' : C⦄ + (g' : Y'' ⟶ Y') (g'f₁ : Y'' ⟶ X₁) (g'f₂ : Y'' ⟶ X₂) + (hgf₁ : g ≫ f₁ = gf₁ := by aesop_cat) + (hgf₂ : g ≫ f₂ = gf₂ := by aesop_cat) + (hg'f₁ : g' ≫ gf₁ = g'f₁ := by aesop_cat) + (hg'f₂ : g' ≫ gf₂ = g'f₂ := by aesop_cat) : + pullHom (pullHom φ g gf₁ gf₂ hgf₁ hgf₂) g' g'f₁ g'f₂ hg'f₁ hg'f₂ = + pullHom φ (g' ≫ g) g'f₁ g'f₂ := by + dsimp [pullHom] + rw [Functor.map_comp_assoc, Functor.map_comp_assoc, + F.map_map_mapComp'_inv_app_comp_mapComp'_inv_app _ _ _ _ _ _ _ rfl (by aesop), + F.mapComp'_hom_app_comp_map_map_mapComp'_hom_app_assoc _ _ _ _ _ _ _ rfl (by aesop), + mapComp'_inv_naturality_assoc, Iso.hom_inv_id_app_assoc] + +end LocallyDiscreteOpToCat + +open LocallyDiscreteOpToCat + +variable (F) {S : C} (M N : F.obj (.mk (op S))) /-- If `F` is a pseudofunctor from `Cᵒᵖ` to `Cat`, and `M` and `N` are objects in `F.obj (.mk (op S))`, this is the presheaf of morphisms from `M` to `N`: it sends an object `T : Over S` corresponding to a morphism `p : X ⟶ S` to the type of morphisms $$p^* M ⟶ p^* N$$. -/ -@[simps -isSimp obj map] +@[simps] def presheafHom : (Over S)ᵒᵖ ⥤ Type v' where obj T := (F.map (.toLoc T.unop.hom.op)).obj M ⟶ (F.map (.toLoc T.unop.hom.op)).obj N - map {T₁ T₂} p f := by - -- this should be reconciled with `DescentData.pull` - letI e := F.mapComp' (.toLoc T₁.unop.hom.op) (.toLoc p.unop.left.op) - (.toLoc T₂.unop.hom.op) (by rw [← Quiver.Hom.comp_toLoc, ← op_comp, Over.w p.unop]) - exact e.hom.app M ≫ (F.map (.toLoc p.unop.left.op)).map f ≫ e.inv.app N - map_id T := by - ext - simp [mapComp'_comp_id_hom_app, mapComp'_comp_id_inv_app] - map_comp {T₁ T₂ T₃} p q := by - ext f - dsimp - rw [Functor.map_comp_assoc, Functor.map_comp_assoc, - F.map_map_mapComp'_inv_app_comp_mapComp'_inv_app _ _ _ _ _ _ - (by rw [← Quiver.Hom.comp_toLoc, ← op_comp, Over.w p.unop]) rfl - (by rw [← Quiver.Hom.comp_toLoc, ← op_comp, Over.w q.unop]), - F.mapComp'_hom_app_comp_map_map_mapComp'_hom_app_assoc _ _ _ _ _ _ - (by rw [← Quiver.Hom.comp_toLoc, ← op_comp, Over.w p.unop]) rfl - (by rw [← Quiver.Hom.comp_toLoc, ← op_comp, Over.w q.unop]), - ← mapComp'_hom_naturality_assoc, Iso.hom_inv_id_app_assoc] + map {T₁ T₂} p f := pullHom f p.unop.left T₂.unop.hom T₂.unop.hom /-- Compatiblity isomorphism of `Pseudofunctor.presheafHom` with the "restrictions". -/ def overMapCompPresheafHomIso {S' : C} (q : S' ⟶ S) : @@ -77,11 +101,8 @@ def overMapCompPresheafHomIso {S' : C} (q : S' ⟶ S) : exact (Iso.homFromEquiv (e.app M)).trans (Iso.homToEquiv (e.app N)))) (by rintro ⟨T₁⟩ ⟨T₂⟩ ⟨f⟩ ext g - dsimp - erw [Iso.homToEquiv_apply, Iso.homToEquiv_apply, - Iso.homFromEquiv_apply, Iso.homFromEquiv_apply] - dsimp [presheafHom_obj, presheafHom_map] - simp only [Functor.map_comp, Category.assoc] + dsimp [pullHom] + simp only [Category.assoc, Functor.map_comp] rw [F.mapComp'_inv_app_comp_mapComp'_hom_app_assoc _ _ _ _ _ _ rfl _ rfl, F.mapComp'_inv_app_comp_mapComp'_hom_app' _ _ _ _ _ _ _ _ rfl]) From 161b7b44be143ae58a963306943345d0e6242044 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=ABl=20Riou?= Date: Thu, 8 May 2025 19:01:22 +0200 Subject: [PATCH 060/118] cleaning up --- .../Sites/Descent/DescentDataAsCoalgebra.lean | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Mathlib/CategoryTheory/Sites/Descent/DescentDataAsCoalgebra.lean b/Mathlib/CategoryTheory/Sites/Descent/DescentDataAsCoalgebra.lean index 175a3de0d91b60..58d469e8be4579 100644 --- a/Mathlib/CategoryTheory/Sites/Descent/DescentDataAsCoalgebra.lean +++ b/Mathlib/CategoryTheory/Sites/Descent/DescentDataAsCoalgebra.lean @@ -35,7 +35,7 @@ namespace Pseudofunctor variable {C : Type*} [Category C] (F : Pseudofunctor (LocallyDiscrete Cᵒᵖ) (Adj Cat)) -namespace ToAdjCat +namespace LocallyDiscreteToAdjCat set_option quotPrecheck false in scoped notation g:80 " _* " M:81 => ((_ : Pseudofunctor _ (Adj Cat)).map @@ -45,9 +45,9 @@ set_option quotPrecheck false in scoped notation g:80 " ^* " M:81 => ((_ : Pseudofunctor _ (Adj Cat)).map (Quiver.Hom.op g).toLoc).f.obj M -end ToAdjCat +end LocallyDiscreteToAdjCat -open ToAdjCat +open LocallyDiscreteToAdjCat structure DescentDataAsCoalgebra {ι : Type*} {S : C} {X : ι → C} (f : ∀ i, X i ⟶ S) where obj (i : ι) : (F.obj (.mk (op (X i)))).obj From 27da849eb049f4362979dc9d7b53d15f42b02cb6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=ABl=20Riou?= Date: Thu, 8 May 2025 19:24:46 +0200 Subject: [PATCH 061/118] removed one sorry --- .../Bicategory/Adjunction/Adj.lean | 21 ++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/Mathlib/CategoryTheory/Bicategory/Adjunction/Adj.lean b/Mathlib/CategoryTheory/Bicategory/Adjunction/Adj.lean index d12167fc17b212..1433b58651eb0d 100644 --- a/Mathlib/CategoryTheory/Bicategory/Adjunction/Adj.lean +++ b/Mathlib/CategoryTheory/Bicategory/Adjunction/Adj.lean @@ -34,6 +34,23 @@ namespace Bicategory variable (B : Type u) [Bicategory.{w, v} B] +section + +variable {B} {c d e f : B} {g : c ⟶ e} {h : d ⟶ f} + {l₁ : c ⟶ d} {r₁ : d ⟶ c} {l₂ : e ⟶ f} {r₂ : f ⟶ e} + (adj₁ : l₁ ⊣ r₁) (adj₂ : l₂ ⊣ r₂) + +/- +--Would this be helpful? +lemma mateEquiv_eq_iff (α : g ≫ l₂ ⟶ l₁ ≫ h) (β : r₁ ≫ g ⟶ h ≫ r₂) : + mateEquiv adj₁ adj₂ α = β ↔ + (λ_ _).inv ≫ adj₁.unit ▷ _ ≫ (α_ _ _ _).hom ≫ l₁ ◁ β = + (ρ_ _).inv ≫ g ◁ adj₂.unit ≫ + (α_ _ _ _).inv ≫ α ▷ r₂ ≫ (α_ _ _ _).hom := by + sorry-/ + +end + /-- The bicategory that has the same objects as a bicategory `B`, in which `1`-morphisms are adjunctions, and `2`-morphisms are tuples of mate maps between the left and right @@ -137,7 +154,9 @@ def iso₂Mk {α β : a ⟶ b} (ef : α.f ≅ β.f) (eg : β.g ≅ α.g) inv := { τf := ef.inv τg := eg.inv - conjugateEquiv_τf := sorry } + conjugateEquiv_τf := by + rw [← cancel_mono eg.hom, Iso.inv_hom_id, ← h, + conjugateEquiv_comp, Iso.hom_inv_id, conjugateEquiv_id] } /-- The associator in the bicategory `Adj B`. -/ @[simps!] From 82dec67c4b48c16e3574ebb57c297e41f815c11f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=ABl=20Riou?= Date: Thu, 8 May 2025 20:00:52 +0200 Subject: [PATCH 062/118] wip --- Mathlib/CategoryTheory/Bicategory/Adjunction/Adj.lean | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Mathlib/CategoryTheory/Bicategory/Adjunction/Adj.lean b/Mathlib/CategoryTheory/Bicategory/Adjunction/Adj.lean index 1433b58651eb0d..633214ba4f31cb 100644 --- a/Mathlib/CategoryTheory/Bicategory/Adjunction/Adj.lean +++ b/Mathlib/CategoryTheory/Bicategory/Adjunction/Adj.lean @@ -179,9 +179,9 @@ def whiskerLeft (α : a ⟶ b) {β β' : b ⟶ c} (y : β ⟶ β') : α ≫ β τf := _ ◁ y.τf τg := y.τg ▷ _ conjugateEquiv_τf := by - dsimp - rw [← iterated_mateEquiv_conjugateEquiv] rw [← Hom₂.conjugateEquiv_τf] + -- there should be lemma `conjugateEquiv_whiskerLeft` + --rw [← iterated_mateEquiv_conjugateEquiv] sorry /-- The right whiskering in the bicategory `Adj B`. -/ From 3ef3c451fd14d6b26980117579f2f2623e198824 Mon Sep 17 00:00:00 2001 From: Christian Merten Date: Sat, 10 May 2025 13:56:35 +0200 Subject: [PATCH 063/118] opposite of bicategories --- .../Bicategory/Adjunction/Adj.lean | 17 ++++ .../CategoryTheory/Bicategory/Opposite.lean | 82 +++++++++++++++++++ 2 files changed, 99 insertions(+) create mode 100644 Mathlib/CategoryTheory/Bicategory/Opposite.lean diff --git a/Mathlib/CategoryTheory/Bicategory/Adjunction/Adj.lean b/Mathlib/CategoryTheory/Bicategory/Adjunction/Adj.lean index 633214ba4f31cb..235118c7d42afb 100644 --- a/Mathlib/CategoryTheory/Bicategory/Adjunction/Adj.lean +++ b/Mathlib/CategoryTheory/Bicategory/Adjunction/Adj.lean @@ -5,6 +5,7 @@ Authors: Joël Riou -/ import Mathlib.CategoryTheory.Bicategory.Adjunction.Mate import Mathlib.CategoryTheory.Bicategory.Functor.Pseudofunctor +import Mathlib.CategoryTheory.Bicategory.Opposite /-! # The bicategory of adjunctions in a bicategory @@ -200,7 +201,14 @@ instance : Bicategory (Adj B) where leftUnitor := leftUnitor rightUnitor := rightUnitor +@[simp] lemma whiskerRight_τg' {α α' : a ⟶ b} (x : α ⟶ α') (β : b ⟶ c) : + (x ▷ β).τg = β.g ◁ x.τg := rfl + +@[simp] lemma whiskerRight_τf' {α α' : a ⟶ b} (x : α ⟶ α') (β : b ⟶ c) : + (x ▷ β).τf = x.τf ▷ β.f := rfl + -- this forgets the right adjoints +@[simps obj map, simps -isSimp map₂ mapId mapComp] def forget₁ : Pseudofunctor (Adj B) B where obj a := a.obj map x := x.f @@ -208,6 +216,15 @@ def forget₁ : Pseudofunctor (Adj B) B where mapId _ := Iso.refl _ mapComp _ _ := Iso.refl _ +-- this forgets the left adjoints +@[simps obj map, simps -isSimp map₂ mapId mapComp] +def forget₂ : Pseudofunctor (Adj B)ᵒᵖ B where + obj a := a.unop.obj + map x := x.unop.g + map₂ α := α.unop.τg + mapId _ := Iso.refl _ + mapComp _ _ := Iso.refl _ + end Adj end Bicategory diff --git a/Mathlib/CategoryTheory/Bicategory/Opposite.lean b/Mathlib/CategoryTheory/Bicategory/Opposite.lean new file mode 100644 index 00000000000000..7ec6831c091804 --- /dev/null +++ b/Mathlib/CategoryTheory/Bicategory/Opposite.lean @@ -0,0 +1,82 @@ +/- +Copyright (c) 2025 Christian Merten. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Christian Merten, Joël Riou +-/ +import Mathlib.CategoryTheory.Bicategory.Functor.Pseudofunctor + +/-! +# The opposite of a bicategory +-/ + +universe w v u + +namespace CategoryTheory + +open Opposite + +namespace Bicategory.Opposite + +variable {B : Type u} [Bicategory.{w, v} B] + +instance {X Y : Bᵒᵖ} : Category.{w} (X ⟶ Y) := + inferInstanceAs <| Category (Y.unop ⟶ X.unop)ᵒᵖ + +@[simp] +lemma Hom.unop_comp {a b : Bᵒᵖ} {f g h : a ⟶ b} (u : f ⟶ g) (v : g ⟶ h) : + (u ≫ v).unop = v.unop ≫ u.unop := rfl + +@[simp] +lemma Hom.unop_id {a b : Bᵒᵖ} (f : a ⟶ b) : + (𝟙 f).unop = 𝟙 f.unop := rfl + +@[ext] +lemma Hom.ext {a b : Bᵒᵖ} {f g : a ⟶ b} (u v : f ⟶ g) (h : u.unop = v.unop) : u = v := + congrArg op h + +@[simps!] +def associator {a b c d : Bᵒᵖ} (f : a ⟶ b) (g : b ⟶ c) (h : c ⟶ d) : + op (h.unop ≫ Quiver.Hom.unop (Opposite.op (g.unop ≫ f.unop))) ≅ + op (Quiver.Hom.unop (Opposite.op (h.unop ≫ g.unop)) ≫ f.unop) := + (α_ h.unop g.unop f.unop).op + +@[simps!] +def leftUnitor {a b : Bᵒᵖ} (f : a ⟶ b) : + op (f.unop ≫ Quiver.Hom.unop (op (𝟙 (unop a)))) ≅ f := + (rightUnitor f.unop).symm.op + +@[simps!] +def rightUnitor {a b : Bᵒᵖ} (f : a ⟶ b) : + op (Quiver.Hom.unop (op (𝟙 (unop b))) ≫ f.unop) ≅ f := + (Bicategory.leftUnitor f.unop).symm.op + +instance : Bicategory Bᵒᵖ where + id X := ⟨𝟙 X.unop⟩ + comp {X Y Z} f g := ⟨g.unop ≫ f.unop⟩ + whiskerLeft {X Y Z} f g h u := (u.unop ▷ f.unop).op + whiskerRight {X Y Z} f g h u := (u.unop ◁ h.unop).op + associator {a b c d} f g h := associator f g h + leftUnitor {a b} f := leftUnitor f + rightUnitor {a b} f := rightUnitor f + whiskerLeft_id {a b c} f g := congrArg op <| id_whiskerRight g.unop f.unop + id_whiskerRight f g := congrArg op <| whiskerLeft_id g.unop f.unop + whisker_exchange η θ := congrArg op <| whisker_exchange θ.unop η.unop + whisker_assoc f g h u v := by + ext + dsimp + rw [whisker_assoc_symm, Category.assoc] + rfl + triangle f g := congrArg op <| triangle_assoc_comp_right_inv (unop g) f.unop + +@[simp] +lemma unop_comp {a b c : Bᵒᵖ} {f : a ⟶ b} {g : b ⟶ c} : (f ≫ g).unop = g.unop ≫ f.unop := rfl + +@[simp] lemma unop_whiskerLeft {a b c : Bᵒᵖ} {f : a ⟶ b} {g h : b ⟶ c} {u : g ⟶ h} : + (f ◁ u).unop = u.unop ▷ f.unop := rfl + +@[simp] lemma unop_whiskerRight {a b c : Bᵒᵖ} {f g : a ⟶ b} (h : b ⟶ c) (u : f ⟶ g) : + (u ▷ h).unop = h.unop ◁ u.unop := rfl + +end Bicategory.Opposite + +end CategoryTheory From 5461570d920f52d1875d57d71ddbfb7cd82c3dee Mon Sep 17 00:00:00 2001 From: Christian Merten Date: Sat, 10 May 2025 13:57:15 +0200 Subject: [PATCH 064/118] add commsq lemma --- Mathlib/CategoryTheory/Sites/Descent/PullbackStruct.lean | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Mathlib/CategoryTheory/Sites/Descent/PullbackStruct.lean b/Mathlib/CategoryTheory/Sites/Descent/PullbackStruct.lean index 7f894cfba152a6..b1241dd1203251 100644 --- a/Mathlib/CategoryTheory/Sites/Descent/PullbackStruct.lean +++ b/Mathlib/CategoryTheory/Sites/Descent/PullbackStruct.lean @@ -37,6 +37,9 @@ variable {X₁ X₂ S : C} {f₁ : X₁ ⟶ S} {f₂ : X₂ ⟶ S} lemma w : h.p₁ ≫ f₁ = h.p₂ ≫ f₂ := h.isPullback.w +lemma commSq : CommSq h.p₁ h.p₂ f₁ f₂ where + w := h.w + attribute [reassoc (attr := simp)] hp₁ @[reassoc (attr := simp)] From 54217a56caf10671bbe53153235c581e9addd95d Mon Sep 17 00:00:00 2001 From: Christian Merten Date: Sat, 10 May 2025 14:46:34 +0200 Subject: [PATCH 065/118] base change comparison morphisms --- Mathlib.lean | 2 + .../Bicategory/Adjunction/BaseChange.lean | 208 ++++++++++++++++++ 2 files changed, 210 insertions(+) create mode 100644 Mathlib/CategoryTheory/Bicategory/Adjunction/BaseChange.lean diff --git a/Mathlib.lean b/Mathlib.lean index dab86c61a7c8f8..594eb7546ef665 100644 --- a/Mathlib.lean +++ b/Mathlib.lean @@ -1872,6 +1872,7 @@ import Mathlib.CategoryTheory.Adjunction.Unique import Mathlib.CategoryTheory.Adjunction.Whiskering import Mathlib.CategoryTheory.Balanced import Mathlib.CategoryTheory.Bicategory.Adjunction.Adj +import Mathlib.CategoryTheory.Bicategory.Adjunction.BaseChange import Mathlib.CategoryTheory.Bicategory.Adjunction.Basic import Mathlib.CategoryTheory.Bicategory.Adjunction.Mate import Mathlib.CategoryTheory.Bicategory.Basic @@ -1895,6 +1896,7 @@ import Mathlib.CategoryTheory.Bicategory.LocallyDiscrete import Mathlib.CategoryTheory.Bicategory.Modification.Oplax import Mathlib.CategoryTheory.Bicategory.NaturalTransformation.Oplax import Mathlib.CategoryTheory.Bicategory.NaturalTransformation.Strong +import Mathlib.CategoryTheory.Bicategory.Opposite import Mathlib.CategoryTheory.Bicategory.SingleObj import Mathlib.CategoryTheory.Bicategory.Strict import Mathlib.CategoryTheory.CatCommSq diff --git a/Mathlib/CategoryTheory/Bicategory/Adjunction/BaseChange.lean b/Mathlib/CategoryTheory/Bicategory/Adjunction/BaseChange.lean new file mode 100644 index 00000000000000..67f86ef1f40bae --- /dev/null +++ b/Mathlib/CategoryTheory/Bicategory/Adjunction/BaseChange.lean @@ -0,0 +1,208 @@ +/- +Copyright (c) 2025 Christian Merten, Joël Riou. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Christian Merten, Joël Riou +-/ +import Mathlib.CategoryTheory.Sites.Descent.DescentData +import Mathlib.CategoryTheory.Sites.Descent.PullbackStruct +import Mathlib.CategoryTheory.Bicategory.Adjunction.Adj +import Mathlib.CategoryTheory.Monad.Comonadicity + +/-! +# Base change morphisms associated to commutative squares + +-/ + +namespace CategoryTheory + +-- TODO: move +namespace CommSq + +variable {C : Type*} [Category C] + +def toLoc {C : Type*} [Category C] {W X Y Z : C} + {f : W ⟶ X} {g : W ⟶ Y} {h : X ⟶ Z} {i : Y ⟶ Z} (sq : CommSq f g h i) : + CommSq f.toLoc g.toLoc h.toLoc i.toLoc where + w := by simp [← Quiver.Hom.comp_toLoc, sq.w] + +section Horizontal + +variable {X₁ X₂ Y₁ Y₂ Z₁ Z₂ : C} {t : X₁ ⟶ Y₁} {t' : Y₁ ⟶ Z₁} + {l : X₁ ⟶ X₂} {m : Y₁ ⟶ Y₂} {r : Z₁ ⟶ Z₂} + {b : X₂ ⟶ Y₂} {b' : Y₂ ⟶ Z₂} + (sq : CommSq t l m b) (sq' : CommSq t' m r b') + {t'' : X₁ ⟶ Z₁} {b'' : X₂ ⟶ Z₂} + (ht : t ≫ t' = t'') (hb : b ≫ b' = b'') + +include ht hb sq sq' + +/-- +``` + X₁ ---t---> Y₁ ---t'---> Z₁ + | | | + l m r + | | | + v v v + X₂ ---b---> Y₂ ---b'---> Z₂ +``` +-/ +lemma horiz_comp' : CommSq t'' l r b'' := ht ▸ hb ▸ sq.horiz_comp sq' + +end Horizontal + +section Vertical + +variable {X₁ X₂ X₃ Y₁ Y₂ Y₃ : C} + {t : X₁ ⟶ Y₁} {m : X₂ ⟶ Y₂} {b : X₃ ⟶ Y₃} + {l : X₁ ⟶ X₂} {l' : X₂ ⟶ X₃} + {r : Y₁ ⟶ Y₂} {r' : Y₂ ⟶ Y₃} + (sq : CommSq t l r m) + (sq' : CommSq m l' r' b) + {l'' : X₁ ⟶ X₃} {r'' : Y₁ ⟶ Y₃} + (hl : l ≫ l' = l'') (hr : r ≫ r' = r'') + +include hl hr sq sq' + +/-- +``` + X₁ ---t---> Y₁ + | | + l r + | | + v v + X₂ ---m---> Y₂ + | | + l' r' + | | + v v + X₃ ---b---> Y₃ +``` +-/ +lemma vert_comp' : CommSq t l'' r'' b := hl ▸ hr ▸ sq.vert_comp sq' + +end Vertical + +end CommSq + +section + +-- TODO: move +end + +open Bicategory Limits Opposite + +@[simps] +def Bicategory.Adjunction.toCategory {C D : Cat} {F : C ⟶ D} {G : D ⟶ C} + (adj : Bicategory.Adjunction F G) : + CategoryTheory.Adjunction F G where + unit := adj.unit + counit := adj.counit + left_triangle_components X := by + have := congr_app adj.left_triangle X + dsimp [leftZigzag, bicategoricalComp] at this + simpa [Cat.associator_hom_app, Cat.leftUnitor_hom_app, Cat.rightUnitor_inv_app] using this + right_triangle_components X := by + have := congr_app adj.right_triangle X + dsimp [rightZigzag, bicategoricalComp] at this + simpa [Cat.associator_inv_app, Cat.leftUnitor_inv_app] using this + +variable {C : Type*} [Category C] + +namespace Pseudofunctor + +variable (F : Pseudofunctor (LocallyDiscrete Cᵒᵖ) (Adj Cat)) {X S : C} (f : X ⟶ S) + +/- +I was trying to provide some notation for `(F.map f.op.toLoc).f` (resp. `(F.map f.op.toLoc).g`) +with this we could write `f[F]^*` (resp. `f[F]_*`) for pullback (resp. pushforward). +I am not yet convinced though. +-/ +notation f "[" F "]" " ^* " => + Adj.Hom.f <| + Prefunctor.map + (PrelaxFunctorStruct.toPrefunctor <| PrelaxFunctor.toPrelaxFunctorStruct <| + Pseudofunctor.toPrelaxFunctor F) + (Quiver.Hom.toLoc <| Opposite.op f) + +notation f "[" F "]" " _* " => + Adj.Hom.g <| + Prefunctor.map + (PrelaxFunctorStruct.toPrefunctor <| PrelaxFunctor.toPrelaxFunctorStruct <| + Pseudofunctor.toPrelaxFunctor F) + (Quiver.Hom.toLoc <| Opposite.op f) + +/-- Given a commutative square, this is the natural map `f_* ⋙ g^* ⟶ p₁^* ⋙ p₂_*` -/ +def baseChangeComparison {P X Y S : C} {p₁ : P ⟶ Y} {p₂ : P ⟶ X} {f : X ⟶ S} {g : Y ⟶ S} + (sq : CommSq p₁ p₂ g f) : + (F.map f.op.toLoc).g ⋙ (F.map g.op.toLoc).f ⟶ + (F.map p₂.op.toLoc).f ⋙ (F.map p₁.op.toLoc).g := + letI u : (F.map f.op.toLoc).g ⟶ + (F.map p₂.op.toLoc).f ⋙ (F.map p₂.op.toLoc).g ⋙ (F.map f.op.toLoc).g := + (Functor.leftUnitor _).inv ≫ + whiskerRight (F.map p₂.op.toLoc).adj.unit (F.map f.op.toLoc).g ≫ + (Functor.associator _ _ _).hom + letI v : (F.map p₂.op.toLoc).f ⋙ (F.map p₂.op.toLoc).g ⋙ (F.map f.op.toLoc).g ≅ + (F.map p₂.op.toLoc).f ⋙ (F.map p₁.op.toLoc).g ⋙ (F.map g.op.toLoc).g := + isoWhiskerLeft _ (Adj.forget₂.map₂Iso (F.isoMapOfCommSq sq.flip.op.toLoc).op) + whiskerRight u (F.map g.op.toLoc).f ≫ + whiskerRight v.hom (F.map g.op.toLoc).f ≫ + (Functor.associator _ _ _).hom ≫ + whiskerLeft ((F.map p₂.op.toLoc).f ⋙ (F.map p₁.op.toLoc).g) + (F.map g.op.toLoc).adj.counit ≫ + (Functor.rightUnitor _).hom + +section Horizontal + +variable {X₁ X₂ Y₁ Y₂ Z₁ Z₂ : C} {t : X₁ ⟶ Y₁} {t' : Y₁ ⟶ Z₁} + {l : X₁ ⟶ X₂} {m : Y₁ ⟶ Y₂} {r : Z₁ ⟶ Z₂} + {b : X₂ ⟶ Y₂} {b' : Y₂ ⟶ Z₂} + (sq : CommSq t l m b) (sq' : CommSq t' m r b') + {t'' : X₁ ⟶ Z₁} {b'' : X₂ ⟶ Z₂} + (ht : t ≫ t' = t'') (hb : b ≫ b' = b'') + +lemma baseChangeComparision_horiz_comp' : + baseChangeComparison F (sq.horiz_comp' sq' ht hb) = + whiskerRight (Adj.forget₂.map₂ + (F.mapComp' b'.op.toLoc b.op.toLoc b''.op.toLoc + (by rw [← Quiver.Hom.comp_toLoc, ← op_comp, hb])).inv.op) _ ≫ + (Functor.associator _ _ _).hom ≫ + whiskerLeft _ (baseChangeComparison F sq') ≫ + (Functor.associator _ _ _).inv ≫ + whiskerRight (baseChangeComparison F sq) _ ≫ + (Functor.associator _ _ _).hom ≫ + whiskerLeft _ (Adj.forget₂.map₂ + (F.mapComp' t'.op.toLoc t.op.toLoc t''.op.toLoc + (by rw [← Quiver.Hom.comp_toLoc, ← op_comp, ht])).hom.op) := by + sorry + +end Horizontal + +section Vertical + +variable {X₁ X₂ X₃ Y₁ Y₂ Y₃ : C} + {t : X₁ ⟶ Y₁} {m : X₂ ⟶ Y₂} {b : X₃ ⟶ Y₃} + {l : X₁ ⟶ X₂} {l' : X₂ ⟶ X₃} + {r : Y₁ ⟶ Y₂} {r' : Y₂ ⟶ Y₃} + (sq : CommSq t l r m) + (sq' : CommSq m l' r' b) + {l'' : X₁ ⟶ X₃} {r'' : Y₁ ⟶ Y₃} + (hl : l ≫ l' = l'') (hr : r ≫ r' = r'') + +lemma baseChangeComparison_vert_comp : + baseChangeComparison F (sq.vert_comp' sq' hl hr) = + whiskerLeft _ (Adj.forget₁.map₂ + (F.mapComp' _ _ _ (by rw [← Quiver.Hom.comp_toLoc, ← op_comp, hr])).hom) ≫ + (Functor.associator _ _ _).inv ≫ + whiskerRight (baseChangeComparison F sq') _ ≫ + (Functor.associator _ _ _).hom ≫ + whiskerLeft _ (baseChangeComparison F sq) ≫ + (Functor.associator _ _ _).inv ≫ + whiskerRight (Adj.forget₁.map₂ + (F.mapComp' _ _ _ (by rw [← Quiver.Hom.comp_toLoc, ← op_comp, hl])).inv) _ := + sorry + +end Vertical + +end Pseudofunctor + +end CategoryTheory From d55301d7f4ccd984963227d5a382fa1d8464d01b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=ABl=20Riou?= Date: Sat, 10 May 2025 15:43:22 +0200 Subject: [PATCH 066/118] alternative definition of the base change --- .../Bicategory/Adjunction/BaseChange.lean | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/Mathlib/CategoryTheory/Bicategory/Adjunction/BaseChange.lean b/Mathlib/CategoryTheory/Bicategory/Adjunction/BaseChange.lean index 67f86ef1f40bae..6a4effb72f5e1b 100644 --- a/Mathlib/CategoryTheory/Bicategory/Adjunction/BaseChange.lean +++ b/Mathlib/CategoryTheory/Bicategory/Adjunction/BaseChange.lean @@ -151,6 +151,26 @@ def baseChangeComparison {P X Y S : C} {p₁ : P ⟶ Y} {p₂ : P ⟶ X} {f : X (F.map g.op.toLoc).adj.counit ≫ (Functor.rightUnitor _).hom +/- +Let us think that `sq` is a square in `LocallyDiscrete B₀ᵒᵖ` that is dual to a square in `B₀` +``` + t b.unop + X₁ ⟶ Y₁ Y₂ ⟶ X₂ +l| |r dual of r.unop| | l.unop + v v v v + X₂ ⟶ Y₂ Y₁ ⟶ X₁ + b t.unop +``` +This is the base change natural transformation +`l_* ≫ t^* ⟶ b^* ≫ r_*` +-/ +def baseChangeAlt + {B C : Type*} [Bicategory B] [Strict B] [Bicategory C] (F : Pseudofunctor B (Adj C)) + {X₁ X₂ Y₁ Y₂ : B} {t : X₁ ⟶ Y₁} {l : X₁ ⟶ X₂} + {r : Y₁ ⟶ Y₂} {b : X₂ ⟶ Y₂} (sq : CommSq t l r b) : + (F.map l).g ≫ (F.map t).f ⟶ (F.map b).f ≫ (F.map r).g := + Bicategory.mateEquiv (F.map l).adj (F.map r).adj (F.isoMapOfCommSq sq).hom.τf + section Horizontal variable {X₁ X₂ Y₁ Y₂ Z₁ Z₂ : C} {t : X₁ ⟶ Y₁} {t' : Y₁ ⟶ Z₁} From cff9da71a36a2b6df51703d4c063de72dffe1a52 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=ABl=20Riou?= Date: Sun, 11 May 2025 11:40:25 +0200 Subject: [PATCH 067/118] compatibility of isoMapOfCommSq with horizontal composition --- .../Bicategory/Adjunction/BaseChange.lean | 62 ------------------- .../Bicategory/Functor/Strict.lean | 35 +++++++++++ Mathlib/CategoryTheory/CommSq.lean | 36 +++++++++++ 3 files changed, 71 insertions(+), 62 deletions(-) diff --git a/Mathlib/CategoryTheory/Bicategory/Adjunction/BaseChange.lean b/Mathlib/CategoryTheory/Bicategory/Adjunction/BaseChange.lean index 6a4effb72f5e1b..2040e62ce92702 100644 --- a/Mathlib/CategoryTheory/Bicategory/Adjunction/BaseChange.lean +++ b/Mathlib/CategoryTheory/Bicategory/Adjunction/BaseChange.lean @@ -25,70 +25,8 @@ def toLoc {C : Type*} [Category C] {W X Y Z : C} CommSq f.toLoc g.toLoc h.toLoc i.toLoc where w := by simp [← Quiver.Hom.comp_toLoc, sq.w] -section Horizontal - -variable {X₁ X₂ Y₁ Y₂ Z₁ Z₂ : C} {t : X₁ ⟶ Y₁} {t' : Y₁ ⟶ Z₁} - {l : X₁ ⟶ X₂} {m : Y₁ ⟶ Y₂} {r : Z₁ ⟶ Z₂} - {b : X₂ ⟶ Y₂} {b' : Y₂ ⟶ Z₂} - (sq : CommSq t l m b) (sq' : CommSq t' m r b') - {t'' : X₁ ⟶ Z₁} {b'' : X₂ ⟶ Z₂} - (ht : t ≫ t' = t'') (hb : b ≫ b' = b'') - -include ht hb sq sq' - -/-- -``` - X₁ ---t---> Y₁ ---t'---> Z₁ - | | | - l m r - | | | - v v v - X₂ ---b---> Y₂ ---b'---> Z₂ -``` --/ -lemma horiz_comp' : CommSq t'' l r b'' := ht ▸ hb ▸ sq.horiz_comp sq' - -end Horizontal - -section Vertical - -variable {X₁ X₂ X₃ Y₁ Y₂ Y₃ : C} - {t : X₁ ⟶ Y₁} {m : X₂ ⟶ Y₂} {b : X₃ ⟶ Y₃} - {l : X₁ ⟶ X₂} {l' : X₂ ⟶ X₃} - {r : Y₁ ⟶ Y₂} {r' : Y₂ ⟶ Y₃} - (sq : CommSq t l r m) - (sq' : CommSq m l' r' b) - {l'' : X₁ ⟶ X₃} {r'' : Y₁ ⟶ Y₃} - (hl : l ≫ l' = l'') (hr : r ≫ r' = r'') - -include hl hr sq sq' - -/-- -``` - X₁ ---t---> Y₁ - | | - l r - | | - v v - X₂ ---m---> Y₂ - | | - l' r' - | | - v v - X₃ ---b---> Y₃ -``` --/ -lemma vert_comp' : CommSq t l'' r'' b := hl ▸ hr ▸ sq.vert_comp sq' - -end Vertical - end CommSq -section - --- TODO: move -end - open Bicategory Limits Opposite @[simps] diff --git a/Mathlib/CategoryTheory/Bicategory/Functor/Strict.lean b/Mathlib/CategoryTheory/Bicategory/Functor/Strict.lean index 955207213ca169..4412cc5dda4875 100644 --- a/Mathlib/CategoryTheory/Bicategory/Functor/Strict.lean +++ b/Mathlib/CategoryTheory/Bicategory/Functor/Strict.lean @@ -118,6 +118,13 @@ lemma mapComp'_hom_comp_mapComp'_hom_whiskerRight (hf : f₀₂ ≫ f₂₃ = f) rw [F.mapComp'_hom_comp_whiskerLeft_mapComp'_hom_assoc _ _ _ _ _ f h₀₂ h₁₃ (by aesop_cat)] simp +@[reassoc] +lemma mapComp'_inv_comp_mapComp'_hom' (hf : f₀₂ ≫ f₂₃ = f) : + (F.mapComp' f₀₁ f₁₃ f).inv ≫ (F.mapComp' f₀₂ f₂₃ f).hom = + F.map f₀₁ ◁ (F.mapComp' f₁₂ f₂₃ f₁₃ h₁₃).hom ≫ + (α_ _ _ _).inv ≫ (F.mapComp' f₀₁ f₁₂ f₀₂ h₀₂).inv ▷ F.map f₂₃:= by + sorry + @[reassoc] lemma mapComp'_inv_whiskerRight_comp_mapComp'_inv (hf : f₀₂ ≫ f₂₃ = f) : (F.mapComp' f₀₁ f₁₂ f₀₂ h₀₂).inv ▷ F.map f₂₃ ≫ (F.mapComp' f₀₂ f₂₃ f).inv = @@ -171,6 +178,34 @@ lemma isoMapOfCommSq_vert_id (f : X₁ ⟶ X₂) : rw [isoMapOfCommSq_eq _ _ f (by simp), mapComp'_comp_id, mapComp'_id_comp] simp +lemma isoMapOfCommSq_horiz_comp + {t : X₁ ⟶ Y₁} {t' : Y₁ ⟶ Z₁} {l : X₁ ⟶ X₂} {m : Y₁ ⟶ Y₂} {r : Z₁ ⟶ Z₂} + {b : X₂ ⟶ Y₂} {b' : Y₂ ⟶ Z₂} (sq : CommSq t l m b) (sq' : CommSq t' m r b') + {t'' : X₁ ⟶ Z₁} {b'' : X₂ ⟶ Z₂} (ht : t ≫ t' = t'') (hb : b ≫ b' = b'') : + F.isoMapOfCommSq (sq.horiz_comp' sq' ht hb) = + whiskerRightIso (F.mapComp' t t' t'' (by rw [← ht])) (F.map r) ≪≫ + α_ _ _ _ ≪≫ whiskerLeftIso (F.map t) (F.isoMapOfCommSq sq') ≪≫ + (α_ _ _ _).symm ≪≫ whiskerRightIso (F.isoMapOfCommSq sq) (F.map b') ≪≫ + α_ _ _ _ ≪≫ whiskerLeftIso (F.map l) + ((F.mapComp' b b' b'' (by rw [← hb])).symm) := by + ext + obtain ⟨φ, hφ⟩ : ∃ φ, t ≫ m = φ := ⟨_, rfl⟩ + obtain ⟨ψ, hψ⟩ : ∃ ψ, t' ≫ r = ψ := ⟨_, rfl⟩ + obtain ⟨δ, hδ⟩ : ∃ δ, t ≫ ψ = δ := ⟨_, rfl⟩ + have hδ' : t'' ≫ r = δ := by rw [← hδ, ← hψ, reassoc_of% ht] + rw [F.isoMapOfCommSq_eq ((sq.horiz_comp' sq' ht hb)) δ hδ', + F.isoMapOfCommSq_eq sq' ψ hψ, F.isoMapOfCommSq_eq sq φ hφ] + dsimp + simp only [Bicategory.whiskerLeft_comp, comp_whiskerRight, Category.assoc] + rw [← F.mapComp'_inv_comp_mapComp'_hom_assoc _ _ _ _ _ _ _ _ hδ, + F.mapComp'_hom_comp_mapComp'_hom_whiskerRight_assoc _ _ _ _ _ _ _ hb + (by rw [← hδ, ← hφ, Category.assoc, ← sq'.w, hψ]), + Iso.inv_hom_id_assoc, whiskerLeft_hom_inv, Category.comp_id, + ← cancel_epi (F.mapComp' t'' r δ hδ').hom, + F.mapComp'_hom_comp_mapComp'_hom_whiskerRight_assoc _ _ _ _ ψ _ ht hψ hδ', + Iso.hom_inv_id_assoc, Iso.inv_hom_id_assoc, + whiskerLeft_hom_inv_assoc, Iso.hom_inv_id_assoc] + end CommSq end Pseudofunctor diff --git a/Mathlib/CategoryTheory/CommSq.lean b/Mathlib/CategoryTheory/CommSq.lean index ec4b0c6f19775e..7aa60b07dbf312 100644 --- a/Mathlib/CategoryTheory/CommSq.lean +++ b/Mathlib/CategoryTheory/CommSq.lean @@ -88,6 +88,22 @@ lemma horiz_comp {W X X' Y Z Z' : C} {f : W ⟶ X} {f' : X ⟶ X'} {g : W ⟶ Y} CommSq (f ≫ f') g h' (i ≫ i') := ⟨by rw [← Category.assoc, Category.assoc, ← hsq₁.w, hsq₂.w, Category.assoc]⟩ +/-- +``` + X₁ ---t---> Y₁ ---t'---> Z₁ + | | | + l m r + | | | + v v v + X₂ ---b---> Y₂ ---b'---> Z₂ +``` +-/ +lemma horiz_comp' {X₁ X₂ Y₁ Y₂ Z₁ Z₂ : C} {t : X₁ ⟶ Y₁} {t' : Y₁ ⟶ Z₁} + {l : X₁ ⟶ X₂} {m : Y₁ ⟶ Y₂} {r : Z₁ ⟶ Z₂} {b : X₂ ⟶ Y₂} {b' : Y₂ ⟶ Z₂} + (sq : CommSq t l m b) (sq' : CommSq t' m r b') {t'' : X₁ ⟶ Z₁} {b'' : X₂ ⟶ Z₂} + (ht : t ≫ t' = t'') (hb : b ≫ b' = b''): CommSq t'' l r b'' := + ht ▸ hb ▸ sq.horiz_comp sq' + /-- The vertical composition of two commutative squares as below is a commutative square. ``` W ---f---> X @@ -109,6 +125,26 @@ lemma vert_comp {W X Y Y' Z Z' : C} {f : W ⟶ X} {g : W ⟶ Y} {g' : Y ⟶ Y'} CommSq f (g ≫ g') (h ≫ h') i' := flip (horiz_comp (flip hsq₁) (flip hsq₂)) +/-- +``` + X₁ ---t---> Y₁ + | | + l r + | | + v v + X₂ ---m---> Y₂ + | | + l' r' + | | + v v + X₃ ---b---> Y₃ +``` +-/ +lemma vert_comp' {X₁ X₂ X₃ Y₁ Y₂ Y₃ : C} {t : X₁ ⟶ Y₁} {m : X₂ ⟶ Y₂} {b : X₃ ⟶ Y₃} + {l : X₁ ⟶ X₂} {l' : X₂ ⟶ X₃} {r : Y₁ ⟶ Y₂} {r' : Y₂ ⟶ Y₃} + (sq : CommSq t l r m) (sq' : CommSq m l' r' b) {l'' : X₁ ⟶ X₃} {r'' : Y₁ ⟶ Y₃} + (hl : l ≫ l' = l'') (hr : r ≫ r' = r'') : CommSq t l'' r'' b := + hl ▸ hr ▸ sq.vert_comp sq' section From ff23dc55ca3b653e31dde65d485086b3789011e4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=ABl=20Riou?= Date: Sun, 11 May 2025 11:44:47 +0200 Subject: [PATCH 068/118] isoMapOfCommSq_horiz_comp --- Mathlib/CategoryTheory/Bicategory/Functor/Strict.lean | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/Mathlib/CategoryTheory/Bicategory/Functor/Strict.lean b/Mathlib/CategoryTheory/Bicategory/Functor/Strict.lean index 4412cc5dda4875..95d5307bd807c7 100644 --- a/Mathlib/CategoryTheory/Bicategory/Functor/Strict.lean +++ b/Mathlib/CategoryTheory/Bicategory/Functor/Strict.lean @@ -120,10 +120,12 @@ lemma mapComp'_hom_comp_mapComp'_hom_whiskerRight (hf : f₀₂ ≫ f₂₃ = f) @[reassoc] lemma mapComp'_inv_comp_mapComp'_hom' (hf : f₀₂ ≫ f₂₃ = f) : - (F.mapComp' f₀₁ f₁₃ f).inv ≫ (F.mapComp' f₀₂ f₂₃ f).hom = + (F.mapComp' f₀₁ f₁₃ f).inv ≫ (F.mapComp' f₀₂ f₂₃ f).hom = F.map f₀₁ ◁ (F.mapComp' f₁₂ f₂₃ f₁₃ h₁₃).hom ≫ (α_ _ _ _).inv ≫ (F.mapComp' f₀₁ f₁₂ f₀₂ h₀₂).inv ▷ F.map f₂₃:= by - sorry + simp only [← cancel_mono ((F.mapComp' f₀₁ f₁₂ f₀₂ h₀₂).hom ▷ F.map f₂₃), + mapComp'_hom_comp_mapComp'_hom_whiskerRight _ _ _ _ _ _ _ h₀₂ h₁₃ hf, + Category.assoc, Iso.inv_hom_id_assoc, inv_hom_whiskerRight, Category.comp_id] @[reassoc] lemma mapComp'_inv_whiskerRight_comp_mapComp'_inv (hf : f₀₂ ≫ f₂₃ = f) : From 51532698170eef7436f611354a7fb90df37b118c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=ABl=20Riou?= Date: Sun, 11 May 2025 11:47:38 +0200 Subject: [PATCH 069/118] removed mapComp'_def --- .../Bicategory/Functor/Strict.lean | 17 ++++------------- 1 file changed, 4 insertions(+), 13 deletions(-) diff --git a/Mathlib/CategoryTheory/Bicategory/Functor/Strict.lean b/Mathlib/CategoryTheory/Bicategory/Functor/Strict.lean index 95d5307bd807c7..f8530a2605b351 100644 --- a/Mathlib/CategoryTheory/Bicategory/Functor/Strict.lean +++ b/Mathlib/CategoryTheory/Bicategory/Functor/Strict.lean @@ -37,12 +37,9 @@ def mapId' {b : B} (f : b ⟶ b) (hf : f = 𝟙 b := by aesop_cat) : F.map f ≅ 𝟙 _ := F.map₂Iso (eqToIso (by rw [hf])) ≪≫ F.mapId _ -lemma mapId'_def {b : B} (f : b ⟶ b) (hf : f = 𝟙 b) : - F.mapId' f hf = F.map₂Iso (eqToIso (by rw [hf])) ≪≫ F.mapId _ := rfl - lemma mapId'_eq_mapId (b : B) : F.mapId' (𝟙 b) rfl = F.mapId b := by - simp [mapId'_def] + simp [mapId'] /-- More flexible variant of `mapComp`. -/ def mapComp' {b₀ b₁ b₂ : B} (f : b₀ ⟶ b₁) (g : b₁ ⟶ b₂) (fg : b₀ ⟶ b₂) @@ -50,21 +47,16 @@ def mapComp' {b₀ b₁ b₂ : B} (f : b₀ ⟶ b₁) (g : b₁ ⟶ b₂) (fg : F.map fg ≅ F.map f ≫ F.map g := F.map₂Iso (eqToIso (by rw [h])) ≪≫ F.mapComp f g -lemma mapComp'_def {b₀ b₁ b₂ : B} (f : b₀ ⟶ b₁) (g : b₁ ⟶ b₂) (fg : b₀ ⟶ b₂) - (h : f ≫ g = fg) : - F.mapComp' f g fg h = F.map₂Iso (eqToIso (by rw [h])) ≪≫ F.mapComp f g := rfl - lemma mapComp'_eq_mapComp {b₀ b₁ b₂ : B} (f : b₀ ⟶ b₁) (g : b₁ ⟶ b₂) : F.mapComp' f g _ rfl = F.mapComp f g := by - simp [mapComp'_def] + simp [mapComp'] variable [Strict B] lemma mapComp'_comp_id {b₀ b₁ : B} (f : b₀ ⟶ b₁) : F.mapComp' f (𝟙 b₁) f = (ρ_ _).symm ≪≫ whiskerLeftIso _ (F.mapId b₁).symm := by ext - rw [mapComp'_def] - dsimp + dsimp [mapComp'] rw [F.mapComp_id_right_hom f, Strict.rightUnitor_eqToIso, eqToIso.hom, ← F.map₂_comp_assoc, eqToHom_trans, eqToHom_refl, PrelaxFunctor.map₂_id, Category.id_comp] @@ -72,8 +64,7 @@ lemma mapComp'_comp_id {b₀ b₁ : B} (f : b₀ ⟶ b₁) : lemma mapComp'_id_comp {b₀ b₁ : B} (f : b₀ ⟶ b₁) : F.mapComp' (𝟙 b₀) f f = (λ_ _).symm ≪≫ whiskerRightIso (F.mapId b₀).symm _ := by ext - rw [mapComp'_def] - dsimp + dsimp [mapComp'] rw [F.mapComp_id_left_hom f, Strict.leftUnitor_eqToIso, eqToIso.hom, ← F.map₂_comp_assoc, eqToHom_trans, eqToHom_refl, PrelaxFunctor.map₂_id, Category.id_comp] From 09b004ec64dec75bc4588159b10274f104913e54 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=ABl=20Riou?= Date: Sun, 11 May 2025 12:02:44 +0200 Subject: [PATCH 070/118] statement of isoMapOfCommSq_vert_comp --- .../Bicategory/Functor/Strict.lean | 31 ++++++++++++------- 1 file changed, 20 insertions(+), 11 deletions(-) diff --git a/Mathlib/CategoryTheory/Bicategory/Functor/Strict.lean b/Mathlib/CategoryTheory/Bicategory/Functor/Strict.lean index f8530a2605b351..e4a1bf254af105 100644 --- a/Mathlib/CategoryTheory/Bicategory/Functor/Strict.lean +++ b/Mathlib/CategoryTheory/Bicategory/Functor/Strict.lean @@ -130,7 +130,7 @@ end associativity section CommSq -variable {X₁ X₂ Y₁ Y₂ Z₁ Z₂ : B} +variable {X₁ X₂ X₃ Y₁ Y₂ Y₃ Z₁ Z₂ : B} section @@ -182,23 +182,32 @@ lemma isoMapOfCommSq_horiz_comp α_ _ _ _ ≪≫ whiskerLeftIso (F.map l) ((F.mapComp' b b' b'' (by rw [← hb])).symm) := by ext - obtain ⟨φ, hφ⟩ : ∃ φ, t ≫ m = φ := ⟨_, rfl⟩ - obtain ⟨ψ, hψ⟩ : ∃ ψ, t' ≫ r = ψ := ⟨_, rfl⟩ - obtain ⟨δ, hδ⟩ : ∃ δ, t ≫ ψ = δ := ⟨_, rfl⟩ - have hδ' : t'' ≫ r = δ := by rw [← hδ, ← hψ, reassoc_of% ht] - rw [F.isoMapOfCommSq_eq ((sq.horiz_comp' sq' ht hb)) δ hδ', - F.isoMapOfCommSq_eq sq' ψ hψ, F.isoMapOfCommSq_eq sq φ hφ] + have w : t'' ≫ r = t ≫ t' ≫ r := by rw [reassoc_of% ht] + rw [F.isoMapOfCommSq_eq ((sq.horiz_comp' sq' ht hb)) (t ≫ t' ≫ r) w, + F.isoMapOfCommSq_eq sq' (t' ≫ r) rfl, F.isoMapOfCommSq_eq sq (t ≫ m) rfl] dsimp simp only [Bicategory.whiskerLeft_comp, comp_whiskerRight, Category.assoc] - rw [← F.mapComp'_inv_comp_mapComp'_hom_assoc _ _ _ _ _ _ _ _ hδ, + rw [← F.mapComp'_inv_comp_mapComp'_hom_assoc t _ _ _ (t' ≫ r) _ _ _ rfl, F.mapComp'_hom_comp_mapComp'_hom_whiskerRight_assoc _ _ _ _ _ _ _ hb - (by rw [← hδ, ← hφ, Category.assoc, ← sq'.w, hψ]), + (by rw [Category.assoc, ← sq'.w]), Iso.inv_hom_id_assoc, whiskerLeft_hom_inv, Category.comp_id, - ← cancel_epi (F.mapComp' t'' r δ hδ').hom, - F.mapComp'_hom_comp_mapComp'_hom_whiskerRight_assoc _ _ _ _ ψ _ ht hψ hδ', + ← cancel_epi (F.mapComp' t'' r (t ≫ t' ≫ r) w).hom, + F.mapComp'_hom_comp_mapComp'_hom_whiskerRight_assoc _ _ _ _ _ _ ht rfl w, Iso.hom_inv_id_assoc, Iso.inv_hom_id_assoc, whiskerLeft_hom_inv_assoc, Iso.hom_inv_id_assoc] +lemma isoMapOfCommSq_vert_comp + {t : X₁ ⟶ Y₁} {m : X₂ ⟶ Y₂} {b : X₃ ⟶ Y₃} + {l : X₁ ⟶ X₂} {l' : X₂ ⟶ X₃} {r : Y₁ ⟶ Y₂} {r' : Y₂ ⟶ Y₃} + (sq : CommSq t l r m) (sq' : CommSq m l' r' b) + {l'' : X₁ ⟶ X₃} {r'' : Y₁ ⟶ Y₃} (hl : l ≫ l' = l'') (hr : r ≫ r' = r'') : + F.isoMapOfCommSq (sq.vert_comp' sq' hl hr) = + whiskerLeftIso (F.map t) (F.mapComp' r r' r'' hr) ≪≫ + (α_ _ _ _).symm ≪≫ whiskerRightIso (F.isoMapOfCommSq sq) (F.map r') ≪≫ + α_ _ _ _ ≪≫ whiskerLeftIso (F.map l) (F.isoMapOfCommSq sq') ≪≫ + (α_ _ _ _).symm ≪≫ whiskerRightIso (F.mapComp' l l' l'' hl).symm (F.map b) := by + sorry + end CommSq end Pseudofunctor From 67937928613ceb034d26c6eb21a4e10e1f5a82d4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=ABl=20Riou?= Date: Sun, 11 May 2025 12:22:39 +0200 Subject: [PATCH 071/118] proof of isoMapOfCommSq_vert_comp --- .../CategoryTheory/Bicategory/Functor/Strict.lean | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/Mathlib/CategoryTheory/Bicategory/Functor/Strict.lean b/Mathlib/CategoryTheory/Bicategory/Functor/Strict.lean index e4a1bf254af105..779cd4b5929a95 100644 --- a/Mathlib/CategoryTheory/Bicategory/Functor/Strict.lean +++ b/Mathlib/CategoryTheory/Bicategory/Functor/Strict.lean @@ -149,6 +149,12 @@ lemma isoMapOfCommSq_eq (φ : X₁ ⟶ Y₂) (hφ : t ≫ r = φ) : subst hφ simp [isoMapOfCommSq, mapComp'_eq_mapComp] +lemma isoMapOfCommSq_flip : F.isoMapOfCommSq sq.flip = + (F.isoMapOfCommSq sq).symm := by + rw [F.isoMapOfCommSq_eq sq.flip (t ≫ r) sq.w.symm, + F.isoMapOfCommSq_eq sq (t ≫ r) rfl, + Iso.trans_symm, Iso.symm_symm_eq] + end /-- Equational lemma for `Pseudofunctor.isoMapOfCommSq` when @@ -206,7 +212,12 @@ lemma isoMapOfCommSq_vert_comp (α_ _ _ _).symm ≪≫ whiskerRightIso (F.isoMapOfCommSq sq) (F.map r') ≪≫ α_ _ _ _ ≪≫ whiskerLeftIso (F.map l) (F.isoMapOfCommSq sq') ≪≫ (α_ _ _ _).symm ≪≫ whiskerRightIso (F.mapComp' l l' l'' hl).symm (F.map b) := by - sorry + rw [← Iso.symm_eq_iff, ← isoMapOfCommSq_flip, + F.isoMapOfCommSq_horiz_comp sq.flip sq'.flip hl hr, + F.isoMapOfCommSq_flip sq', F.isoMapOfCommSq_flip sq] + ext + dsimp + simp only [Category.assoc] end CommSq From fd539c22f63c4bb09aa0c05b38b3207c1eefaaf4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=ABl=20Riou?= Date: Thu, 15 May 2025 12:40:10 +0200 Subject: [PATCH 072/118] removed a few sorries --- .../Sites/Descent/IsPrestack.lean | 13 +++ .../CategoryTheory/Sites/Descent/IsStack.lean | 94 +++++++++---------- 2 files changed, 56 insertions(+), 51 deletions(-) diff --git a/Mathlib/CategoryTheory/Sites/Descent/IsPrestack.lean b/Mathlib/CategoryTheory/Sites/Descent/IsPrestack.lean index 5771334b6d7fe3..0bc157628a372c 100644 --- a/Mathlib/CategoryTheory/Sites/Descent/IsPrestack.lean +++ b/Mathlib/CategoryTheory/Sites/Descent/IsPrestack.lean @@ -51,6 +51,19 @@ def pullHom ⦃X₁ X₂ : C⦄ ⦃M₁ : F.obj (.mk (op X₁))⦄ ⦃M₂ : F.o (F.map g.op.toLoc).map φ ≫ (F.mapComp' f₂.op.toLoc g.op.toLoc gf₂.op.toLoc (by aesop)).inv.app _ +@[reassoc] +lemma map_eq_pullHom + ⦃X₁ X₂ : C⦄ ⦃M₁ : F.obj (.mk (op X₁))⦄ ⦃M₂ : F.obj (.mk (op X₂))⦄ + ⦃Y : C⦄ ⦃f₁ : Y ⟶ X₁⦄ ⦃f₂ : Y ⟶ X₂⦄ + (φ : (F.map f₁.op.toLoc).obj M₁ ⟶ (F.map f₂.op.toLoc).obj M₂) ⦃Y' : C⦄ (g : Y' ⟶ Y) + (gf₁ : Y' ⟶ X₁) (gf₂ : Y' ⟶ X₂) (hgf₁ : g ≫ f₁ = gf₁) + (hgf₂ : g ≫ f₂ = gf₂) : + (F.map g.op.toLoc).map φ = + (F.mapComp' f₁.op.toLoc g.op.toLoc gf₁.op.toLoc (by aesop)).inv.app _ ≫ + pullHom φ g gf₁ gf₂ hgf₁ hgf₂ ≫ + (F.mapComp' f₂.op.toLoc g.op.toLoc gf₂.op.toLoc (by aesop)).hom.app _ := by + simp [pullHom] + @[simp] lemma pullHom_id ⦃X₁ X₂ : C⦄ ⦃M₁ : F.obj (.mk (op X₁))⦄ ⦃M₂ : F.obj (.mk (op X₂))⦄ ⦃Y : C⦄ ⦃f₁ : Y ⟶ X₁⦄ ⦃f₂ : Y ⟶ X₂⦄ diff --git a/Mathlib/CategoryTheory/Sites/Descent/IsStack.lean b/Mathlib/CategoryTheory/Sites/Descent/IsStack.lean index c9ab461e0c360f..7847144b2de2ee 100644 --- a/Mathlib/CategoryTheory/Sites/Descent/IsStack.lean +++ b/Mathlib/CategoryTheory/Sites/Descent/IsStack.lean @@ -17,47 +17,11 @@ namespace CategoryTheory open Opposite Limits Bicategory +-- to be moved namespace Presieve -variable {C : Type u} [Category.{v} C] (P : Cᵒᵖ ⥤ Type w) {S : C} - -section - -variable (R : Presieve S) - -@[simps] -def toCompatible (R : Presieve S) (s : P.obj (op S)) : - Subtype (FamilyOfElements.Compatible (P := P) (R := R)) where - val Y f hf := P.map f.op s - property Y₁ Y₂ Z g₁ g₂ f₁ f₂ hf₁ hf₂ fac := by - simp only [← FunctorToTypes.map_comp_apply, ← op_comp, fac] - -lemma isSheafFor_iff_bijective_toCompatible : - IsSheafFor P R ↔ Function.Bijective (toCompatible P R) := by - constructor - · intro h - constructor - · intro s₁ s₂ hs - simp only [Subtype.ext_iff] at hs - apply h.isSeparatedFor.ext - intro Y f hf - exact congr_fun (congr_fun (congr_fun hs Y) f) hf - · rintro ⟨x, hx⟩ - exact ⟨h.amalgamate x hx, by ext; funext; apply h.valid_glue⟩ - · intro h x hx - apply existsUnique_of_exists_of_unique - · obtain ⟨s, hs⟩ := h.surjective ⟨x, hx⟩ - simp only [Subtype.ext_iff] at hs - exact ⟨s, fun Y f hf ↦ congr_fun (congr_fun (congr_fun hs Y) f) hf⟩ - · intro s₁ s₂ hs₁ hs₂ - apply h.injective - ext - funext Y f hf - simp only [toCompatible_coe, hs₁ f hf, hs₂ f hf] - -end - -variable {ι : Type t} {S : C} {X : ι → C} (f : ∀ i, X i ⟶ S) +variable {C : Type u} [Category.{v} C] (J : GrothendieckTopology C) + (P : Cᵒᵖ ⥤ Type w) {S : C} {ι : Type t} {S : C} {X : ι → C} (f : ∀ i, X i ⟶ S) @[simps] def Arrows.toCompatible (s : P.obj (op S)) : @@ -88,6 +52,28 @@ lemma isSheafFor_ofArrows_iff_bijective_toCompatible : · intro s₁ s₂ hs i apply h.injective (by aesop) +lemma isSheaf_iff_isSheafFor_ofArrows : + Presieve.IsSheaf J P ↔ ∀ ⦃ι : Type max u v⦄ ⦃S : C⦄ ⦃X : ι → C⦄ (f : ∀ i, X i ⟶ S) + (_ : (Sieve.ofArrows _ f) ∈ J S), + IsSheafFor P (ofArrows _ f) := by + constructor + · intro h ι S X f hf + rw [isSheafFor_iff_generate] + exact h _ hf + · intro h S R hR + let X (i : R.arrows.category) : C := i.1.left + let f (i : R.arrows.category) : X i ⟶ S := i.1.hom + have : Presieve.ofArrows _ f = R := by + apply le_antisymm + · rintro _ _ ⟨i⟩ + exact i.2 + · intro _ g hg + rw [Sieve.arrows] at hg + exact ⟨(⟨Over.mk g, hg⟩ : R.arrows.category)⟩ + rw [← this] + apply h + simpa [Sieve.ofArrows, this] + end Presieve namespace Pseudofunctor @@ -110,6 +96,8 @@ instance {X Y : C} (f : X ⟶ Y) [IsIso f] (F : Pseudofunctor (LocallyDiscrete C effective descent relative to a family of morphisms `f i : X i ⟶ S` in `C`. -/ abbrev HasEffectiveDescentRelativeTo : Prop := (F.toDescentData f).IsEquivalence +open LocallyDiscreteOpToCat + lemma toDescentData_fullyFaithful_iff : Nonempty (F.toDescentData f).FullyFaithful ↔ ∀ (M N : F.obj (.mk (op S))), @@ -130,14 +118,21 @@ lemma toDescentData_fullyFaithful_iff : (fun (i : ι) ↦ Over.homMk (f i))) let α : ((F.toDescentData f).obj M ⟶ (F.toDescentData f).obj N) ≃ T := { toFun φ := ⟨fun i ↦ φ.hom i, fun i j Z gi gj w ↦ by - replace w := (Over.forget _).congr_map w - dsimp at w - sorry⟩ + have := φ.comm Z.hom gi.left gj.left (Over.w gi) (Over.w gj) + simp only [Functor.id_obj, toDescentData, DescentData.ofObj_obj, + DescentData.ofObj_hom, Category.assoc] at this + rw [← cancel_mono ((F.mapComp' (f j).op.toLoc gj.left.op.toLoc + Z.hom.op.toLoc (by simp [← Over.w gj])).hom.app N)] + simp [pullHom, this] ⟩ invFun ψ := { hom i := ψ.1 i - comm := by - -- needs specialized constructor for morphisms in `DescentData` - sorry } + comm Y q i₁ i₂ f₁ f₂ hf₁ hf₂ := by + have this := ψ.2 i₁ i₂ (Over.mk q) (Over.homMk f₁) (Over.homMk f₂) + (by aesop) + dsimp at this ⊢ + rw [map_eq_pullHom (ψ.1 i₁) f₁ q q (by aesop) (by aesop), + map_eq_pullHom (ψ.1 i₂) f₂ q q (by aesop) (by aesop), this] + simp [toDescentData] } left_inv _ := rfl right_inv _ := rfl } @@ -147,8 +142,7 @@ lemma toDescentData_fullyFaithful_iff : have : Function.comp α (F.toDescentData f).map = (Presieve.Arrows.toCompatible _ _).comp β := by ext φ i - dsimp [α, β] - sorry + simp [α, β, pullHom, toDescentData] rw [← Function.Bijective.of_comp_iff' α.bijective, this, Function.Bijective.of_comp_iff _ β.bijective] @@ -165,10 +159,8 @@ lemma hasEffectiveDescentRelativeTo_of_sieve_mem (J : GrothendieckTopology C) instance (J : GrothendieckTopology C) [F.IsStack J] : F.IsPrestack J where isSheaf {S} M N := by - rw [isSheaf_iff_isSheaf_of_type] - rintro ⟨X, ⟨⟩, p : X ⟶ S⟩ U hU - obtain ⟨U : Sieve X, rfl⟩ := (Sieve.overEquiv _).symm.surjective U - simp only [J.mem_over_iff, Equiv.apply_symm_apply] at hU + rw [isSheaf_iff_isSheaf_of_type, Presieve.isSheaf_iff_isSheafFor_ofArrows] + intro ι X Y f hf sorry end Pseudofunctor From 52bf9be18d6c8605618876cc0f06b2056760f003 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=ABl=20Riou?= Date: Thu, 15 May 2025 14:00:42 +0200 Subject: [PATCH 073/118] removed two sorries --- .../Bicategory/Adjunction/Adj.lean | 58 ++++++++++++++----- .../Bicategory/Adjunction/Mate.lean | 2 +- 2 files changed, 43 insertions(+), 17 deletions(-) diff --git a/Mathlib/CategoryTheory/Bicategory/Adjunction/Adj.lean b/Mathlib/CategoryTheory/Bicategory/Adjunction/Adj.lean index 235118c7d42afb..c3240aa7023e5d 100644 --- a/Mathlib/CategoryTheory/Bicategory/Adjunction/Adj.lean +++ b/Mathlib/CategoryTheory/Bicategory/Adjunction/Adj.lean @@ -33,25 +33,51 @@ namespace CategoryTheory namespace Bicategory -variable (B : Type u) [Bicategory.{w, v} B] +variable {B : Type u} [Bicategory.{w, v} B] section -variable {B} {c d e f : B} {g : c ⟶ e} {h : d ⟶ f} - {l₁ : c ⟶ d} {r₁ : d ⟶ c} {l₂ : e ⟶ f} {r₂ : f ⟶ e} - (adj₁ : l₁ ⊣ r₁) (adj₂ : l₂ ⊣ r₂) +variable {a b c d : B} {l₁ : a ⟶ b} {r₁ : b ⟶ a} (adj₁ : l₁ ⊣ r₁) + {l₂ : c ⟶ d} {r₂ : d ⟶ c} (adj₂ : l₂ ⊣ r₂) + {f : a ⟶ c} {g : b ⟶ d} -/- ---Would this be helpful? -lemma mateEquiv_eq_iff (α : g ≫ l₂ ⟶ l₁ ≫ h) (β : r₁ ≫ g ⟶ h ≫ r₂) : - mateEquiv adj₁ adj₂ α = β ↔ - (λ_ _).inv ≫ adj₁.unit ▷ _ ≫ (α_ _ _ _).hom ≫ l₁ ◁ β = - (ρ_ _).inv ≫ g ◁ adj₂.unit ≫ - (α_ _ _ _).inv ≫ α ▷ r₂ ≫ (α_ _ _ _).hom := by - sorry-/ +lemma mateEquiv_id_comp_right (φ : f ≫ 𝟙 _ ≫ l₂ ⟶ l₁ ≫ g) : + mateEquiv adj₁ ((Adjunction.id _).comp adj₂) φ = + mateEquiv adj₁ adj₂ (f ◁ (λ_ l₂).inv ≫ φ) ≫ (ρ_ _).inv ≫ (α_ _ _ _).hom := by + dsimp [mateEquiv_apply, Adjunction.id] + bicategory + +lemma mateEquiv_comp_id_right (φ : f ≫ l₂ ≫ 𝟙 d ⟶ l₁ ≫ g) : + mateEquiv adj₁ (adj₂.comp (Adjunction.id _)) φ = + mateEquiv adj₁ adj₂ ((ρ_ _).inv ≫ (α_ _ _ _).hom ≫ φ) ≫ g ◁ (λ_ r₂).inv := by + dsimp [mateEquiv_apply, Adjunction.id] + bicategory + +end + +section + +variable {a b : B} {f : a ⟶ b} {g : b ⟶ a} (adj : f ⊣ g) + {f' : a ⟶ b} {g' : b ⟶ a} (adj' : f' ⊣ g') (φ : f' ⟶ f) + +lemma conjugateEquiv_id_comp_right_apply : + conjugateEquiv adj ((Adjunction.id _).comp adj') ((λ_ _).hom ≫ φ) = + conjugateEquiv adj adj' φ ≫ (ρ_ _).inv := by + simp only [conjugateEquiv_apply, mateEquiv_id_comp_right, + id_whiskerLeft, Category.assoc, Iso.inv_hom_id_assoc] + bicategory + +lemma conjugateEquiv_comp_id_right_apply : + conjugateEquiv adj (adj'.comp (Adjunction.id _)) ((ρ_ _).hom ≫ φ) = + conjugateEquiv adj adj' φ ≫ (λ_ _).inv := by + simp only [conjugateEquiv_apply, Category.assoc, mateEquiv_comp_id_right, id_whiskerLeft, + Iso.inv_hom_id, Category.comp_id, Iso.hom_inv_id, Iso.cancel_iso_inv_left, + EmbeddingLike.apply_eq_iff_eq] + bicategory end +variable (B) in /-- The bicategory that has the same objects as a bicategory `B`, in which `1`-morphisms are adjunctions, and `2`-morphisms are tuples of mate maps between the left and right @@ -61,8 +87,6 @@ def Adj : Type u := B namespace Adj -variable {B} - abbrev obj (a : Adj B) : B := a variable (a b c d : B) @@ -167,12 +191,14 @@ def associator (α : a ⟶ b) (β : b ⟶ c) (γ : c ⟶ d) : (α ≫ β) ≫ γ /-- The left unitor in the bicategory `Adj B`. -/ @[simps!] def leftUnitor (α : a ⟶ b) : 𝟙 a ≫ α ≅ α := - iso₂Mk (λ_ _) (ρ_ _).symm sorry + iso₂Mk (λ_ _) (ρ_ _).symm + (by simpa using conjugateEquiv_id_comp_right_apply α.adj α.adj (𝟙 _)) /-- The right unitor in the bicategory `Adj B`. -/ @[simps!] def rightUnitor (α : a ⟶ b) : α ≫ 𝟙 b ≅ α := - iso₂Mk (ρ_ _) (λ_ _).symm sorry + iso₂Mk (ρ_ _) (λ_ _).symm + (by simpa using conjugateEquiv_comp_id_right_apply α.adj α.adj (𝟙 _) ) /-- The left whiskering in the bicategory `Adj B`. -/ @[simps] diff --git a/Mathlib/CategoryTheory/Bicategory/Adjunction/Mate.lean b/Mathlib/CategoryTheory/Bicategory/Adjunction/Mate.lean index 2484df94193291..da37714783c863 100644 --- a/Mathlib/CategoryTheory/Bicategory/Adjunction/Mate.lean +++ b/Mathlib/CategoryTheory/Bicategory/Adjunction/Mate.lean @@ -65,7 +65,7 @@ Then we have a bijection between natural transformations `g ≫ l₂ ⟶ l₁ Note that if one of the transformations is an iso, it does not imply the other is an iso. -/ -@[simps] +@[simps -isSimp] def mateEquiv : (g ≫ l₂ ⟶ l₁ ≫ h) ≃ (r₁ ≫ g ⟶ h ≫ r₂) where toFun α := 𝟙 _ ⊗≫ r₁ ◁ g ◁ adj₂.unit ⊗≫ r₁ ◁ α ▷ r₂ ⊗≫ adj₁.counit ▷ h ▷ r₂ ⊗≫ 𝟙 _ invFun β := 𝟙 _ ⊗≫ adj₁.unit ▷ g ▷ l₂ ⊗≫ l₁ ◁ β ▷ l₂ ⊗≫ l₁ ◁ h ◁ adj₂.counit ⊗≫ 𝟙 _ From 8cdd8f7361eaa0c83c908f655adc7fc618f048f5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=ABl=20Riou?= Date: Thu, 15 May 2025 15:48:29 +0200 Subject: [PATCH 074/118] removed two sorries --- .../Bicategory/Adjunction/Adj.lean | 72 ++++++++++++++++--- 1 file changed, 64 insertions(+), 8 deletions(-) diff --git a/Mathlib/CategoryTheory/Bicategory/Adjunction/Adj.lean b/Mathlib/CategoryTheory/Bicategory/Adjunction/Adj.lean index c3240aa7023e5d..d555c22fa6a8cb 100644 --- a/Mathlib/CategoryTheory/Bicategory/Adjunction/Adj.lean +++ b/Mathlib/CategoryTheory/Bicategory/Adjunction/Adj.lean @@ -57,8 +57,8 @@ end section -variable {a b : B} {f : a ⟶ b} {g : b ⟶ a} (adj : f ⊣ g) - {f' : a ⟶ b} {g' : b ⟶ a} (adj' : f' ⊣ g') (φ : f' ⟶ f) +variable {a b : B} {l : a ⟶ b} {r : b ⟶ a} (adj : l ⊣ r) + {l' : a ⟶ b} {r' : b ⟶ a} (adj' : l' ⊣ r') (φ : l' ⟶ l) lemma conjugateEquiv_id_comp_right_apply : conjugateEquiv adj ((Adjunction.id _).comp adj') ((λ_ _).hom ≫ φ) = @@ -77,6 +77,61 @@ lemma conjugateEquiv_comp_id_right_apply : end +section + +variable {a b : B} {l : a ⟶ b} {r : b ⟶ a} (adj : l ⊣ r) + +@[simp] +lemma mateEquiv_leftUnitor_hom_rightUnitor_inv : + mateEquiv adj adj ((λ_ _).hom ≫ (ρ_ _).inv) = (ρ_ _).hom ≫ (λ_ _).inv := by + simp only [← cancel_mono (λ_ r).hom, ← cancel_epi (ρ_ r).inv, + Category.assoc, Iso.inv_hom_id_assoc, Iso.inv_hom_id, + ← conjugateEquiv_id adj, conjugateEquiv_apply, Category.id_comp] + +end + +section + +variable {a b c : B} {l₁ : a ⟶ b} {r₁ : b ⟶ a} (adj₁ : l₁ ⊣ r₁) + {l₂ : b ⟶ c} {r₂ : c ⟶ b} (adj₂ : l₂ ⊣ r₂) + {l₂' : b ⟶ c} {r₂' : c ⟶ b} (adj₂' : l₂' ⊣ r₂') + +lemma conjugateEquiv_whiskerLeft (φ : l₂' ⟶ l₂) : + conjugateEquiv (adj₁.comp adj₂) (adj₁.comp adj₂') (l₁ ◁ φ) = + conjugateEquiv adj₂ adj₂' φ ▷ r₁ := by + have := mateEquiv_hcomp adj₁ adj₁ adj₂ adj₂' ((λ_ _).hom ≫ (ρ_ _).inv) + ((λ_ _).hom ≫ φ ≫ (ρ_ _).inv) + dsimp [leftAdjointSquare.hcomp, rightAdjointSquare.hcomp] at this + simp only [comp_whiskerRight, leftUnitor_whiskerRight, Category.assoc, whiskerLeft_comp, + whiskerLeft_rightUnitor_inv, Iso.hom_inv_id, Category.comp_id, triangle_assoc, + inv_hom_whiskerRight_assoc, Iso.inv_hom_id_assoc, mateEquiv_leftUnitor_hom_rightUnitor_inv, + whiskerLeft_rightUnitor, triangle_assoc_comp_left_inv_assoc, Iso.hom_inv_id_assoc] at this + simp [conjugateEquiv_apply, this] + +end + +section + +variable {a b c : B} {l₁ : a ⟶ b} {r₁ : b ⟶ a} (adj₁ : l₁ ⊣ r₁) + {l₁' : a ⟶ b} {r₁' : b ⟶ a} (adj₁' : l₁' ⊣ r₁') + {l₂ : b ⟶ c} {r₂ : c ⟶ b} (adj₂ : l₂ ⊣ r₂) + {l₂' : b ⟶ c} {r₂' : c ⟶ b} (adj₂' : l₂' ⊣ r₂') + +lemma conjugateEquiv_whiskerRight (φ : l₁' ⟶ l₁) : + conjugateEquiv (adj₁.comp adj₂) (adj₁'.comp adj₂) (φ ▷ l₂) = + r₂ ◁ conjugateEquiv adj₁ adj₁' φ := by + have := mateEquiv_hcomp adj₁ adj₁' adj₂ adj₂ + ((λ_ _).hom ≫ φ ≫ (ρ_ _).inv) ((λ_ _).hom ≫ (ρ_ _).inv) + dsimp [leftAdjointSquare.hcomp, rightAdjointSquare.hcomp] at this + simp only [comp_whiskerRight, leftUnitor_whiskerRight, Category.assoc, whiskerLeft_comp, + whiskerLeft_rightUnitor_inv, Iso.hom_inv_id, Category.comp_id, triangle_assoc, + inv_hom_whiskerRight_assoc, Iso.inv_hom_id_assoc, mateEquiv_leftUnitor_hom_rightUnitor_inv, + leftUnitor_inv_whiskerRight, Iso.inv_hom_id, triangle_assoc_comp_right_assoc] at this + simp [conjugateEquiv_apply, this] + +end + + variable (B) in /-- The bicategory that has the same objects as a bicategory `B`, in which `1`-morphisms @@ -186,7 +241,8 @@ def iso₂Mk {α β : a ⟶ b} (ef : α.f ≅ β.f) (eg : β.g ≅ α.g) /-- The associator in the bicategory `Adj B`. -/ @[simps!] def associator (α : a ⟶ b) (β : b ⟶ c) (γ : c ⟶ d) : (α ≫ β) ≫ γ ≅ α ≫ β ≫ γ := - iso₂Mk (α_ _ _ _) (α_ _ _ _) sorry + iso₂Mk (α_ _ _ _) (α_ _ _ _) (by + sorry) /-- The left unitor in the bicategory `Adj B`. -/ @[simps!] @@ -206,17 +262,17 @@ def whiskerLeft (α : a ⟶ b) {β β' : b ⟶ c} (y : β ⟶ β') : α ≫ β τf := _ ◁ y.τf τg := y.τg ▷ _ conjugateEquiv_τf := by - rw [← Hom₂.conjugateEquiv_τf] - -- there should be lemma `conjugateEquiv_whiskerLeft` - --rw [← iterated_mateEquiv_conjugateEquiv] - sorry + dsimp + simp only [conjugateEquiv_whiskerLeft, Hom₂.conjugateEquiv_τf] /-- The right whiskering in the bicategory `Adj B`. -/ @[simps] def whiskerRight {α α' : a ⟶ b} (x : α ⟶ α') (β : b ⟶ c) : α ≫ β ⟶ α' ≫ β where τf := x.τf ▷ _ τg := _ ◁ x.τg - conjugateEquiv_τf := sorry + conjugateEquiv_τf := by + dsimp + simp only [conjugateEquiv_whiskerRight, Hom₂.conjugateEquiv_τf] attribute [local simp] whisker_exchange From 5fbb1ad0accff79c31924d677fbd00c486095177 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=ABl=20Riou?= Date: Thu, 15 May 2025 16:46:00 +0200 Subject: [PATCH 075/118] wip --- .../Bicategory/Adjunction/Adj.lean | 61 ++++++++++++++++++- 1 file changed, 59 insertions(+), 2 deletions(-) diff --git a/Mathlib/CategoryTheory/Bicategory/Adjunction/Adj.lean b/Mathlib/CategoryTheory/Bicategory/Adjunction/Adj.lean index d555c22fa6a8cb..b5c5849f4e2fdc 100644 --- a/Mathlib/CategoryTheory/Bicategory/Adjunction/Adj.lean +++ b/Mathlib/CategoryTheory/Bicategory/Adjunction/Adj.lean @@ -131,6 +131,63 @@ lemma conjugateEquiv_whiskerRight (φ : l₁' ⟶ l₁) : end +section + +variable {a b c d a' b' c' d' : B} + {l₁ : a ⟶ b} {r₁ : b ⟶ a} (adj₁ : l₁ ⊣ r₁) + {l₁' : a' ⟶ b'} {r₁' : b' ⟶ a'} (adj₁' : l₁' ⊣ r₁') + {l₂ : b ⟶ c} {r₂ : c ⟶ b} (adj₂ : l₂ ⊣ r₂) + {l₂' : b' ⟶ c'} {r₂' : c' ⟶ b'} (adj₂' : l₂' ⊣ r₂') + {l₃ : c ⟶ d} {r₃ : d ⟶ c} (adj₃ : l₃ ⊣ r₃) + {l₃' : c' ⟶ d'} {r₃' : d' ⟶ c'} (adj₃' : l₃' ⊣ r₃') + {f : a ⟶ a'} {g : b ⟶ b'} {h : c ⟶ c'} {i : d ⟶ d'} + (φ₁ : f ≫ l₁' ⟶ l₁ ≫ g) (φ₂ : g ≫ l₂' ⟶ l₂ ≫ h) (φ₃ : h ≫ l₃' ⟶ l₃ ≫ i) + +lemma test : (𝟙 (f ≫ (l₁' ≫ l₂') ≫ l₃') ⊗≫ φ₁ ▷ (l₂' ≫ l₃') ⊗≫ l₁ ◁ φ₂ ▷ l₃' ⊗≫ (l₁ ≫ l₂) ◁ φ₃ ⊗≫ + 𝟙 ((l₁ ≫ l₂ ≫ l₃) ≫ i)) = + (α_ _ _ _).inv ≫ (((α_ _ _ _).inv ≫ φ₁ ▷ _ ≫ (α_ _ _ _).hom ≫ _ ◁ φ₂) ▷ _) ≫ + (α_ _ _ _).hom ≫ (_ ◁ ((α_ _ _ _).hom ≫ l₂ ◁ φ₃)) ≫ _ ◁ (α_ _ _ _).inv ≫ (α_ _ _ _ ).inv := by + bicategory + +lemma mateEquiv_assoc : + mateEquiv (adj₁.comp (adj₂.comp adj₃)) ((adj₁'.comp adj₂').comp adj₃') + ((α_ _ _ _).inv ≫ (((α_ _ _ _).inv ≫ φ₁ ▷ _ ≫ (α_ _ _ _).hom ≫ _ ◁ φ₂) ▷ _) ≫ + (α_ _ _ _).hom ≫ (_ ◁ ((α_ _ _ _).hom ≫ l₂ ◁ φ₃)) ≫ _ ◁ (α_ _ _ _).inv ≫ (α_ _ _ _ ).inv) = + (α_ _ _ _).hom ≫ _ ◁ mateEquiv adj₁ adj₁' φ₁ ≫ (α_ _ _ _).hom ≫ + r₃ ◁ ((α_ _ _ _ ).inv ≫ mateEquiv adj₂ adj₂' φ₂ ▷ r₁') ≫ + r₃ ◁ (α_ _ _ _ ).hom ≫ (α_ _ _ _ ).inv ≫ + mateEquiv adj₃ adj₃' φ₃ ▷ _ ≫ (α_ _ _ _ ).hom := by + sorry + +end +section + +variable {a b c d : B} {l₁ : a ⟶ b} {r₁ : b ⟶ a} (adj₁ : l₁ ⊣ r₁) + {l₁' : a ⟶ b} {r₁' : b ⟶ a} (adj₁' : l₁' ⊣ r₁') + {l₂ : b ⟶ c} {r₂ : c ⟶ b} (adj₂ : l₂ ⊣ r₂) + {l₂' : b ⟶ c} {r₂' : c ⟶ b} (adj₂' : l₂' ⊣ r₂') + {l₃ : c ⟶ d} {r₃ : d ⟶ c} (adj₃ : l₃ ⊣ r₃) + {l₃' : c ⟶ d} {r₃' : d ⟶ c} (adj₃' : l₃' ⊣ r₃') + (φ₁ : l₁' ⟶ l₁) (φ₂ : l₂' ⟶ l₂) (φ₃ : l₃' ⟶ l₃) + +lemma conjugateEquiv_assoc : + conjugateEquiv (adj₁.comp (adj₂.comp adj₃)) + ((adj₁'.comp adj₂').comp adj₃') ((α_ _ _ _).hom ≫ φ₁ ▷ _ ≫ l₁ ◁ (φ₂ ▷ _ ≫ _ ◁ φ₃)) = + _ ◁ conjugateEquiv adj₁ adj₁' φ₁ ≫ + ((_ ◁ conjugateEquiv adj₂ adj₂' φ₂ ≫ + conjugateEquiv adj₃ adj₃' φ₃ ▷ _) ▷ _) ≫ (α_ _ _ _).hom := by + have := mateEquiv_assoc adj₁ adj₁' adj₂ adj₂' adj₃ adj₃' + ((λ_ _).hom ≫ φ₁ ≫ (ρ_ _).inv) ((λ_ _).hom ≫ φ₂ ≫ (ρ_ _).inv) ((λ_ _).hom ≫ φ₃ ≫ (ρ_ _).inv) + simp at this + rw [← cancel_epi (ρ_ _).hom, ← cancel_mono (λ_ _).inv] + simp [conjugateEquiv] + convert this using 1 + · congr 1 + bicategory + · bicategory + +end + variable (B) in /-- @@ -241,8 +298,8 @@ def iso₂Mk {α β : a ⟶ b} (ef : α.f ≅ β.f) (eg : β.g ≅ α.g) /-- The associator in the bicategory `Adj B`. -/ @[simps!] def associator (α : a ⟶ b) (β : b ⟶ c) (γ : c ⟶ d) : (α ≫ β) ≫ γ ≅ α ≫ β ≫ γ := - iso₂Mk (α_ _ _ _) (α_ _ _ _) (by - sorry) + iso₂Mk (α_ _ _ _) (α_ _ _ _) + (by simpa using conjugateEquiv_assoc α.adj α.adj β.adj β.adj γ.adj γ.adj (𝟙 _) (𝟙 _) (𝟙 _)) /-- The left unitor in the bicategory `Adj B`. -/ @[simps!] From 7fe0aaae560247ae660828768ade53f4355a20dd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=ABl=20Riou?= Date: Thu, 15 May 2025 16:47:32 +0200 Subject: [PATCH 076/118] removed unnecessary lemma --- Mathlib/CategoryTheory/Bicategory/Adjunction/Adj.lean | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/Mathlib/CategoryTheory/Bicategory/Adjunction/Adj.lean b/Mathlib/CategoryTheory/Bicategory/Adjunction/Adj.lean index b5c5849f4e2fdc..c8e1452d6c0cb9 100644 --- a/Mathlib/CategoryTheory/Bicategory/Adjunction/Adj.lean +++ b/Mathlib/CategoryTheory/Bicategory/Adjunction/Adj.lean @@ -143,12 +143,6 @@ variable {a b c d a' b' c' d' : B} {f : a ⟶ a'} {g : b ⟶ b'} {h : c ⟶ c'} {i : d ⟶ d'} (φ₁ : f ≫ l₁' ⟶ l₁ ≫ g) (φ₂ : g ≫ l₂' ⟶ l₂ ≫ h) (φ₃ : h ≫ l₃' ⟶ l₃ ≫ i) -lemma test : (𝟙 (f ≫ (l₁' ≫ l₂') ≫ l₃') ⊗≫ φ₁ ▷ (l₂' ≫ l₃') ⊗≫ l₁ ◁ φ₂ ▷ l₃' ⊗≫ (l₁ ≫ l₂) ◁ φ₃ ⊗≫ - 𝟙 ((l₁ ≫ l₂ ≫ l₃) ≫ i)) = - (α_ _ _ _).inv ≫ (((α_ _ _ _).inv ≫ φ₁ ▷ _ ≫ (α_ _ _ _).hom ≫ _ ◁ φ₂) ▷ _) ≫ - (α_ _ _ _).hom ≫ (_ ◁ ((α_ _ _ _).hom ≫ l₂ ◁ φ₃)) ≫ _ ◁ (α_ _ _ _).inv ≫ (α_ _ _ _ ).inv := by - bicategory - lemma mateEquiv_assoc : mateEquiv (adj₁.comp (adj₂.comp adj₃)) ((adj₁'.comp adj₂').comp adj₃') ((α_ _ _ _).inv ≫ (((α_ _ _ _).inv ≫ φ₁ ▷ _ ≫ (α_ _ _ _).hom ≫ _ ◁ φ₂) ▷ _) ≫ @@ -160,6 +154,7 @@ lemma mateEquiv_assoc : sorry end + section variable {a b c d : B} {l₁ : a ⟶ b} {r₁ : b ⟶ a} (adj₁ : l₁ ⊣ r₁) From 823b139110209abc1081bf1e75989a929d554816 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=ABl=20Riou?= Date: Thu, 15 May 2025 19:16:10 +0200 Subject: [PATCH 077/118] wip --- .../Bicategory/Adjunction/Adj.lean | 65 ++++++------------- 1 file changed, 20 insertions(+), 45 deletions(-) diff --git a/Mathlib/CategoryTheory/Bicategory/Adjunction/Adj.lean b/Mathlib/CategoryTheory/Bicategory/Adjunction/Adj.lean index c8e1452d6c0cb9..c15fdb32665b9b 100644 --- a/Mathlib/CategoryTheory/Bicategory/Adjunction/Adj.lean +++ b/Mathlib/CategoryTheory/Bicategory/Adjunction/Adj.lean @@ -39,7 +39,18 @@ section variable {a b c d : B} {l₁ : a ⟶ b} {r₁ : b ⟶ a} (adj₁ : l₁ ⊣ r₁) {l₂ : c ⟶ d} {r₂ : d ⟶ c} (adj₂ : l₂ ⊣ r₂) - {f : a ⟶ c} {g : b ⟶ d} + +lemma mateEquiv_eq_iff {g : a ⟶ c} {h : b ⟶ d} + (α : g ≫ l₂ ⟶ l₁ ≫ h) (β : r₁ ≫ g ⟶ h ≫ r₂) : + mateEquiv adj₁ adj₂ α = β ↔ + adj₁.unit ▷ _ ≫ (α_ _ _ _).hom ≫ l₁ ◁ β = + (λ_ _).hom ≫ (ρ_ _).inv ≫ g ◁ adj₂.unit ≫ + (α_ _ _ _).inv ≫ α ▷ r₂ ≫ (α_ _ _ _).hom := by + constructor + · sorry + · sorry + +variable {f : a ⟶ c} {g : b ⟶ d} lemma mateEquiv_id_comp_right (φ : f ≫ 𝟙 _ ≫ l₂ ⟶ l₁ ≫ g) : mateEquiv adj₁ ((Adjunction.id _).comp adj₂) φ = @@ -133,53 +144,18 @@ end section -variable {a b c d a' b' c' d' : B} - {l₁ : a ⟶ b} {r₁ : b ⟶ a} (adj₁ : l₁ ⊣ r₁) - {l₁' : a' ⟶ b'} {r₁' : b' ⟶ a'} (adj₁' : l₁' ⊣ r₁') - {l₂ : b ⟶ c} {r₂ : c ⟶ b} (adj₂ : l₂ ⊣ r₂) - {l₂' : b' ⟶ c'} {r₂' : c' ⟶ b'} (adj₂' : l₂' ⊣ r₂') - {l₃ : c ⟶ d} {r₃ : d ⟶ c} (adj₃ : l₃ ⊣ r₃) - {l₃' : c' ⟶ d'} {r₃' : d' ⟶ c'} (adj₃' : l₃' ⊣ r₃') - {f : a ⟶ a'} {g : b ⟶ b'} {h : c ⟶ c'} {i : d ⟶ d'} - (φ₁ : f ≫ l₁' ⟶ l₁ ≫ g) (φ₂ : g ≫ l₂' ⟶ l₂ ≫ h) (φ₃ : h ≫ l₃' ⟶ l₃ ≫ i) - -lemma mateEquiv_assoc : - mateEquiv (adj₁.comp (adj₂.comp adj₃)) ((adj₁'.comp adj₂').comp adj₃') - ((α_ _ _ _).inv ≫ (((α_ _ _ _).inv ≫ φ₁ ▷ _ ≫ (α_ _ _ _).hom ≫ _ ◁ φ₂) ▷ _) ≫ - (α_ _ _ _).hom ≫ (_ ◁ ((α_ _ _ _).hom ≫ l₂ ◁ φ₃)) ≫ _ ◁ (α_ _ _ _).inv ≫ (α_ _ _ _ ).inv) = - (α_ _ _ _).hom ≫ _ ◁ mateEquiv adj₁ adj₁' φ₁ ≫ (α_ _ _ _).hom ≫ - r₃ ◁ ((α_ _ _ _ ).inv ≫ mateEquiv adj₂ adj₂' φ₂ ▷ r₁') ≫ - r₃ ◁ (α_ _ _ _ ).hom ≫ (α_ _ _ _ ).inv ≫ - mateEquiv adj₃ adj₃' φ₃ ▷ _ ≫ (α_ _ _ _ ).hom := by - sorry - -end - -section - variable {a b c d : B} {l₁ : a ⟶ b} {r₁ : b ⟶ a} (adj₁ : l₁ ⊣ r₁) - {l₁' : a ⟶ b} {r₁' : b ⟶ a} (adj₁' : l₁' ⊣ r₁') {l₂ : b ⟶ c} {r₂ : c ⟶ b} (adj₂ : l₂ ⊣ r₂) - {l₂' : b ⟶ c} {r₂' : c ⟶ b} (adj₂' : l₂' ⊣ r₂') {l₃ : c ⟶ d} {r₃ : d ⟶ c} (adj₃ : l₃ ⊣ r₃) - {l₃' : c ⟶ d} {r₃' : d ⟶ c} (adj₃' : l₃' ⊣ r₃') - (φ₁ : l₁' ⟶ l₁) (φ₂ : l₂' ⟶ l₂) (φ₃ : l₃' ⟶ l₃) -lemma conjugateEquiv_assoc : +lemma conjugateEquiv_associator_hom : conjugateEquiv (adj₁.comp (adj₂.comp adj₃)) - ((adj₁'.comp adj₂').comp adj₃') ((α_ _ _ _).hom ≫ φ₁ ▷ _ ≫ l₁ ◁ (φ₂ ▷ _ ≫ _ ◁ φ₃)) = - _ ◁ conjugateEquiv adj₁ adj₁' φ₁ ≫ - ((_ ◁ conjugateEquiv adj₂ adj₂' φ₂ ≫ - conjugateEquiv adj₃ adj₃' φ₃ ▷ _) ▷ _) ≫ (α_ _ _ _).hom := by - have := mateEquiv_assoc adj₁ adj₁' adj₂ adj₂' adj₃ adj₃' - ((λ_ _).hom ≫ φ₁ ≫ (ρ_ _).inv) ((λ_ _).hom ≫ φ₂ ≫ (ρ_ _).inv) ((λ_ _).hom ≫ φ₃ ≫ (ρ_ _).inv) - simp at this - rw [← cancel_epi (ρ_ _).hom, ← cancel_mono (λ_ _).inv] - simp [conjugateEquiv] - convert this using 1 - · congr 1 - bicategory - · bicategory + ((adj₁.comp adj₂).comp adj₃) (α_ _ _ _).hom = (α_ _ _ _).hom := by + rw [← cancel_epi (ρ_ _).hom, ← cancel_mono (λ_ _).inv, conjugateEquiv_apply, + Iso.hom_inv_id_assoc, Category.assoc, Iso.hom_inv_id, Category.comp_id, + Category.assoc, mateEquiv_eq_iff] + simp + bicategory end @@ -293,8 +269,7 @@ def iso₂Mk {α β : a ⟶ b} (ef : α.f ≅ β.f) (eg : β.g ≅ α.g) /-- The associator in the bicategory `Adj B`. -/ @[simps!] def associator (α : a ⟶ b) (β : b ⟶ c) (γ : c ⟶ d) : (α ≫ β) ≫ γ ≅ α ≫ β ≫ γ := - iso₂Mk (α_ _ _ _) (α_ _ _ _) - (by simpa using conjugateEquiv_assoc α.adj α.adj β.adj β.adj γ.adj γ.adj (𝟙 _) (𝟙 _) (𝟙 _)) + iso₂Mk (α_ _ _ _) (α_ _ _ _) (conjugateEquiv_associator_hom _ _ _) /-- The left unitor in the bicategory `Adj B`. -/ @[simps!] From 5b29588f29479fb7fa1403bf0c73f9763bb9dd17 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=ABl=20Riou?= Date: Thu, 15 May 2025 20:10:51 +0200 Subject: [PATCH 078/118] wip --- .../CategoryTheory/Bicategory/Adjunction/Adj.lean | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/Mathlib/CategoryTheory/Bicategory/Adjunction/Adj.lean b/Mathlib/CategoryTheory/Bicategory/Adjunction/Adj.lean index c15fdb32665b9b..dd722ed64d13ce 100644 --- a/Mathlib/CategoryTheory/Bicategory/Adjunction/Adj.lean +++ b/Mathlib/CategoryTheory/Bicategory/Adjunction/Adj.lean @@ -43,12 +43,17 @@ variable {a b c d : B} {l₁ : a ⟶ b} {r₁ : b ⟶ a} (adj₁ : l₁ ⊣ r₁ lemma mateEquiv_eq_iff {g : a ⟶ c} {h : b ⟶ d} (α : g ≫ l₂ ⟶ l₁ ≫ h) (β : r₁ ≫ g ⟶ h ≫ r₂) : mateEquiv adj₁ adj₂ α = β ↔ - adj₁.unit ▷ _ ≫ (α_ _ _ _).hom ≫ l₁ ◁ β = - (λ_ _).hom ≫ (ρ_ _).inv ≫ g ◁ adj₂.unit ≫ + (λ_ _).inv ≫ adj₁.unit ▷ _ ≫ (α_ _ _ _).hom ≫ l₁ ◁ β = + (ρ_ _).inv ≫ g ◁ adj₂.unit ≫ (α_ _ _ _).inv ≫ α ▷ r₂ ≫ (α_ _ _ _).hom := by - constructor - · sorry - · sorry + let ψ (γ : r₁ ≫ g ⟶ h ≫ r₂) := + (λ_ _).inv ≫ adj₁.unit ▷ _ ≫ (α_ _ _ _).hom ≫ l₁ ◁ γ + have H : Function.Injective ψ := sorry + conv_lhs => rw [eq_comm, ← H.eq_iff'] + convert Iff.rfl using 2 + dsimp [ψ, mateEquiv, bicategoricalComp] + simp + sorry variable {f : a ⟶ c} {g : b ⟶ d} From 1557de162d99398402e73a7318cd5b218869d0c4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=ABl=20Riou?= Date: Thu, 15 May 2025 23:20:22 +0200 Subject: [PATCH 079/118] removed sorries --- .../Bicategory/Adjunction/Adj.lean | 76 +++++++++++++++++-- 1 file changed, 69 insertions(+), 7 deletions(-) diff --git a/Mathlib/CategoryTheory/Bicategory/Adjunction/Adj.lean b/Mathlib/CategoryTheory/Bicategory/Adjunction/Adj.lean index dd722ed64d13ce..d7ac4cda6de378 100644 --- a/Mathlib/CategoryTheory/Bicategory/Adjunction/Adj.lean +++ b/Mathlib/CategoryTheory/Bicategory/Adjunction/Adj.lean @@ -35,25 +35,87 @@ namespace Bicategory variable {B : Type u} [Bicategory.{w, v} B] +namespace Adjunction + +/- TODO: refactor `mateEquiv` by using `homEquiv₁/₂`. -/ +variable {a b c d : B} {l : b ⟶ c} {r : c ⟶ b} (adj : l ⊣ r) + +@[simps -isSimp] +def homEquiv₁ {g : b ⟶ d} {h : c ⟶ d} : (g ⟶ l ≫ h) ≃ (r ≫ g ⟶ h) where + toFun γ := r ◁ γ ≫ (α_ _ _ _).inv ≫ adj.counit ▷ h ≫ (λ_ _).hom + invFun β := (λ_ _).inv ≫ adj.unit ▷ _ ≫ (α_ _ _ _).hom ≫ l ◁ β + left_inv γ := + calc + _ = 𝟙 _ ⊗≫ (adj.unit ▷ g ≫ (l ≫ r) ◁ γ) ⊗≫ l ◁ adj.counit ▷ h ⊗≫ 𝟙 _:= by + bicategory + _ = γ ⊗≫ leftZigzag adj.unit adj.counit ▷ h ⊗≫ 𝟙 _ := by + rw [← whisker_exchange] + bicategory + _ = γ := by + rw [adj.left_triangle] + bicategory + right_inv β := by + calc + _ = 𝟙 _ ⊗≫ r ◁ adj.unit ▷ g ⊗≫ ((r ≫ l) ◁ β ≫ adj.counit ▷ h) ⊗≫ 𝟙 _ := by + bicategory + _ = 𝟙 _ ⊗≫ rightZigzag adj.unit adj.counit ▷ g ⊗≫ β := by + rw [whisker_exchange] + bicategory + _ = β := by + rw [adj.right_triangle] + bicategory + +@[simps -isSimp] +def homEquiv₂ {g : a ⟶ b} {h : a ⟶ c} : (g ≫ l ⟶ h) ≃ (g ⟶ h ≫ r) where + toFun α := (ρ_ _).inv ≫ g ◁ adj.unit ≫ (α_ _ _ _).inv ≫ α ▷ r + invFun γ := γ ▷ l ≫ (α_ _ _ _ ).hom ≫ h ◁ adj.counit ≫ (ρ_ _).hom + left_inv α := + calc + _ = 𝟙 _ ⊗≫ g ◁ adj.unit ▷ l ⊗≫ (α ▷ (r ≫ l) ≫ h ◁ adj.counit) ⊗≫ 𝟙 _ := by + bicategory + _ = 𝟙 _ ⊗≫ g ◁ leftZigzag adj.unit adj.counit ⊗≫ α := by + rw [← whisker_exchange] + bicategory + _ = α := by + rw [adj.left_triangle] + bicategory + right_inv γ := + calc + _ = 𝟙 _ ⊗≫ (g ◁ adj.unit ≫ γ ▷ (l ≫ r)) ⊗≫ h ◁ adj.counit ▷ r ⊗≫ 𝟙 _ := by + bicategory + _ = 𝟙 _ ⊗≫ γ ⊗≫ h ◁ rightZigzag adj.unit adj.counit ⊗≫ 𝟙 _ := by + rw [whisker_exchange] + bicategory + _ = γ := by + rw [adj.right_triangle] + bicategory + +end Adjunction + section variable {a b c d : B} {l₁ : a ⟶ b} {r₁ : b ⟶ a} (adj₁ : l₁ ⊣ r₁) {l₂ : c ⟶ d} {r₂ : d ⟶ c} (adj₂ : l₂ ⊣ r₂) +lemma mateEquiv_eq_trans {g : a ⟶ c} {h : b ⟶ d} : + mateEquiv adj₁ adj₂ (g := g) (h := h) = + adj₂.homEquiv₂.trans + ((Iso.homCongr (Iso.refl _) (α_ _ _ _)).trans adj₁.homEquiv₁) := by + ext γ + dsimp [mateEquiv, Adjunction.homEquiv₁, Adjunction.homEquiv₂] + bicategory + lemma mateEquiv_eq_iff {g : a ⟶ c} {h : b ⟶ d} (α : g ≫ l₂ ⟶ l₁ ≫ h) (β : r₁ ≫ g ⟶ h ≫ r₂) : mateEquiv adj₁ adj₂ α = β ↔ (λ_ _).inv ≫ adj₁.unit ▷ _ ≫ (α_ _ _ _).hom ≫ l₁ ◁ β = (ρ_ _).inv ≫ g ◁ adj₂.unit ≫ (α_ _ _ _).inv ≫ α ▷ r₂ ≫ (α_ _ _ _).hom := by - let ψ (γ : r₁ ≫ g ⟶ h ≫ r₂) := - (λ_ _).inv ≫ adj₁.unit ▷ _ ≫ (α_ _ _ _).hom ≫ l₁ ◁ γ - have H : Function.Injective ψ := sorry - conv_lhs => rw [eq_comm, ← H.eq_iff'] + conv_lhs => rw [eq_comm, ← adj₁.homEquiv₁.symm.injective.eq_iff'] convert Iff.rfl using 2 - dsimp [ψ, mateEquiv, bicategoricalComp] - simp - sorry + rw [mateEquiv_eq_trans, Equiv.trans_apply, Equiv.trans_apply, Iso.homCongr_apply, + Iso.refl_inv, Category.id_comp, Equiv.symm_apply_apply, Adjunction.homEquiv₂_apply, + Category.assoc, Category.assoc, Category.assoc] variable {f : a ⟶ c} {g : b ⟶ d} From 3865cfd24006349ded7420db8ce0b78f65a47206 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=ABl=20Riou?= Date: Thu, 15 May 2025 23:34:30 +0200 Subject: [PATCH 080/118] cleaning up --- .../Bicategory/Adjunction/Adj.lean | 16 +++++----------- 1 file changed, 5 insertions(+), 11 deletions(-) diff --git a/Mathlib/CategoryTheory/Bicategory/Adjunction/Adj.lean b/Mathlib/CategoryTheory/Bicategory/Adjunction/Adj.lean index d7ac4cda6de378..47ca9d84b87d4d 100644 --- a/Mathlib/CategoryTheory/Bicategory/Adjunction/Adj.lean +++ b/Mathlib/CategoryTheory/Bicategory/Adjunction/Adj.lean @@ -108,14 +108,9 @@ lemma mateEquiv_eq_trans {g : a ⟶ c} {h : b ⟶ d} : lemma mateEquiv_eq_iff {g : a ⟶ c} {h : b ⟶ d} (α : g ≫ l₂ ⟶ l₁ ≫ h) (β : r₁ ≫ g ⟶ h ≫ r₂) : mateEquiv adj₁ adj₂ α = β ↔ - (λ_ _).inv ≫ adj₁.unit ▷ _ ≫ (α_ _ _ _).hom ≫ l₁ ◁ β = - (ρ_ _).inv ≫ g ◁ adj₂.unit ≫ - (α_ _ _ _).inv ≫ α ▷ r₂ ≫ (α_ _ _ _).hom := by + adj₁.homEquiv₁.symm β = adj₂.homEquiv₂ α ≫ (α_ _ _ _).hom := by conv_lhs => rw [eq_comm, ← adj₁.homEquiv₁.symm.injective.eq_iff'] - convert Iff.rfl using 2 - rw [mateEquiv_eq_trans, Equiv.trans_apply, Equiv.trans_apply, Iso.homCongr_apply, - Iso.refl_inv, Category.id_comp, Equiv.symm_apply_apply, Adjunction.homEquiv₂_apply, - Category.assoc, Category.assoc, Category.assoc] + simp [mateEquiv_eq_trans] variable {f : a ⟶ c} {g : b ⟶ d} @@ -218,10 +213,9 @@ variable {a b c d : B} {l₁ : a ⟶ b} {r₁ : b ⟶ a} (adj₁ : l₁ ⊣ r₁ lemma conjugateEquiv_associator_hom : conjugateEquiv (adj₁.comp (adj₂.comp adj₃)) ((adj₁.comp adj₂).comp adj₃) (α_ _ _ _).hom = (α_ _ _ _).hom := by - rw [← cancel_epi (ρ_ _).hom, ← cancel_mono (λ_ _).inv, conjugateEquiv_apply, - Iso.hom_inv_id_assoc, Category.assoc, Iso.hom_inv_id, Category.comp_id, - Category.assoc, mateEquiv_eq_iff] - simp + simp [← cancel_epi (ρ_ ((r₃ ≫ r₂) ≫ r₁)).hom, ← cancel_mono (λ_ (r₃ ≫ r₂ ≫ r₁)).inv, + conjugateEquiv_apply, mateEquiv_eq_iff, Adjunction.homEquiv₁_symm_apply, + Adjunction.homEquiv₂_apply] bicategory end From 86c07ba3630573bcbb00da291971a31d7dd4c859 Mon Sep 17 00:00:00 2001 From: Christian Merten Date: Thu, 15 May 2025 23:39:21 +0200 Subject: [PATCH 081/118] progress on descentascoalgebra --- .../Bicategory/Adjunction/BaseChange.lean | 604 +++++++++++++++--- .../Bicategory/Functor/Strict.lean | 35 + .../Sites/Descent/DescentDataAsCoalgebra.lean | 174 ++++- .../Sites/Descent/PullbackStruct.lean | 9 + 4 files changed, 720 insertions(+), 102 deletions(-) diff --git a/Mathlib/CategoryTheory/Bicategory/Adjunction/BaseChange.lean b/Mathlib/CategoryTheory/Bicategory/Adjunction/BaseChange.lean index 2040e62ce92702..b150d89ef2df83 100644 --- a/Mathlib/CategoryTheory/Bicategory/Adjunction/BaseChange.lean +++ b/Mathlib/CategoryTheory/Bicategory/Adjunction/BaseChange.lean @@ -29,20 +29,34 @@ end CommSq open Bicategory Limits Opposite -@[simps] -def Bicategory.Adjunction.toCategory {C D : Cat} {F : C ⟶ D} {G : D ⟶ C} - (adj : Bicategory.Adjunction F G) : - CategoryTheory.Adjunction F G where - unit := adj.unit - counit := adj.counit - left_triangle_components X := by - have := congr_app adj.left_triangle X - dsimp [leftZigzag, bicategoricalComp] at this - simpa [Cat.associator_hom_app, Cat.leftUnitor_hom_app, Cat.rightUnitor_inv_app] using this - right_triangle_components X := by - have := congr_app adj.right_triangle X - dsimp [rightZigzag, bicategoricalComp] at this - simpa [Cat.associator_inv_app, Cat.leftUnitor_inv_app] using this +namespace Bicategory + +variable {B : Type*} [Bicategory B] {c d e : B} + {l₁ : c ⟶ d} {r₁ : d ⟶ c} {l₂ : d ⟶ e} {r₂ : e ⟶ d} + +@[reassoc (attr := simp)] +lemma Adjuction.whiskerRight_unit_whiskerLeft_counit (adj₁ : Adjunction l₁ r₁) : + adj₁.unit ▷ l₁ ⊗≫ l₁ ◁ adj₁.counit = (λ_ l₁).hom ≫ (ρ_ l₁).inv := + adj₁.left_triangle + +@[reassoc (attr := simp)] +lemma Adjuction.whiskerRight_unit_associator_whiskerLeft_counit (adj₁ : Adjunction l₁ r₁) : + adj₁.unit ▷ l₁ ≫ (α_ _ _ _).hom ≫ l₁ ◁ adj₁.counit = (λ_ l₁).hom ≫ (ρ_ l₁).inv := by + rw [← adj₁.left_triangle] + bicategory + +lemma mateEquiv_id (adj₁ : Adjunction l₁ r₁) (adj₂ : Adjunction l₂ r₂) : + mateEquiv adj₁ adj₂ (𝟙 _) = adj₁.counit ≫ adj₂.unit := by + apply (mateEquiv adj₁ adj₂).symm.injective + simp only [Equiv.symm_apply_apply, mateEquiv_symm_apply, comp_whiskerRight, whiskerLeft_comp] + calc + _ = 𝟙 (l₁ ≫ l₂) ⊗≫ (adj₁.unit ▷ l₁ ⊗≫ l₁ ◁ adj₁.counit) ▷ l₂ ⊗≫ + l₁ ◁ (adj₂.unit ▷ l₂ ⊗≫ l₂ ◁ adj₂.counit) ⊗≫ + 𝟙 (l₁ ≫ l₂) := by simp; bicategory + _ = 𝟙 (l₁ ≫ l₂) ⊗≫ adj₁.unit ▷ l₁ ▷ l₂ ⊗≫ (l₁ ◁ adj₁.counit ▷ l₂ ≫ l₁ ◁ adj₂.unit ▷ l₂) ⊗≫ + l₁ ◁ l₂ ◁ adj₂.counit ⊗≫ 𝟙 (l₁ ≫ l₂) := by bicategory + +end Bicategory variable {C : Type*} [Category C] @@ -50,94 +64,79 @@ namespace Pseudofunctor variable (F : Pseudofunctor (LocallyDiscrete Cᵒᵖ) (Adj Cat)) {X S : C} (f : X ⟶ S) -/- -I was trying to provide some notation for `(F.map f.op.toLoc).f` (resp. `(F.map f.op.toLoc).g`) -with this we could write `f[F]^*` (resp. `f[F]_*`) for pullback (resp. pushforward). -I am not yet convinced though. --/ -notation f "[" F "]" " ^* " => - Adj.Hom.f <| - Prefunctor.map - (PrelaxFunctorStruct.toPrefunctor <| PrelaxFunctor.toPrelaxFunctorStruct <| - Pseudofunctor.toPrelaxFunctor F) - (Quiver.Hom.toLoc <| Opposite.op f) - -notation f "[" F "]" " _* " => - Adj.Hom.g <| - Prefunctor.map - (PrelaxFunctorStruct.toPrefunctor <| PrelaxFunctor.toPrelaxFunctorStruct <| - Pseudofunctor.toPrelaxFunctor F) - (Quiver.Hom.toLoc <| Opposite.op f) - -/-- Given a commutative square, this is the natural map `f_* ⋙ g^* ⟶ p₁^* ⋙ p₂_*` -/ -def baseChangeComparison {P X Y S : C} {p₁ : P ⟶ Y} {p₂ : P ⟶ X} {f : X ⟶ S} {g : Y ⟶ S} - (sq : CommSq p₁ p₂ g f) : - (F.map f.op.toLoc).g ⋙ (F.map g.op.toLoc).f ⟶ - (F.map p₂.op.toLoc).f ⋙ (F.map p₁.op.toLoc).g := - letI u : (F.map f.op.toLoc).g ⟶ - (F.map p₂.op.toLoc).f ⋙ (F.map p₂.op.toLoc).g ⋙ (F.map f.op.toLoc).g := - (Functor.leftUnitor _).inv ≫ - whiskerRight (F.map p₂.op.toLoc).adj.unit (F.map f.op.toLoc).g ≫ - (Functor.associator _ _ _).hom - letI v : (F.map p₂.op.toLoc).f ⋙ (F.map p₂.op.toLoc).g ⋙ (F.map f.op.toLoc).g ≅ - (F.map p₂.op.toLoc).f ⋙ (F.map p₁.op.toLoc).g ⋙ (F.map g.op.toLoc).g := - isoWhiskerLeft _ (Adj.forget₂.map₂Iso (F.isoMapOfCommSq sq.flip.op.toLoc).op) - whiskerRight u (F.map g.op.toLoc).f ≫ - whiskerRight v.hom (F.map g.op.toLoc).f ≫ - (Functor.associator _ _ _).hom ≫ - whiskerLeft ((F.map p₂.op.toLoc).f ⋙ (F.map p₁.op.toLoc).g) - (F.map g.op.toLoc).adj.counit ≫ - (Functor.rightUnitor _).hom - /- Let us think that `sq` is a square in `LocallyDiscrete B₀ᵒᵖ` that is dual to a square in `B₀` ``` - t b.unop - X₁ ⟶ Y₁ Y₂ ⟶ X₂ + t b.unop +X₁ ⟶ Y₁ Y₂ ⟶ X₂ l| |r dual of r.unop| | l.unop - v v v v - X₂ ⟶ Y₂ Y₁ ⟶ X₁ - b t.unop +v v v v +X₂ ⟶ Y₂ Y₁ ⟶ X₁ + b t.unop ``` This is the base change natural transformation `l_* ≫ t^* ⟶ b^* ≫ r_*` -/ -def baseChangeAlt - {B C : Type*} [Bicategory B] [Strict B] [Bicategory C] (F : Pseudofunctor B (Adj C)) - {X₁ X₂ Y₁ Y₂ : B} {t : X₁ ⟶ Y₁} {l : X₁ ⟶ X₂} - {r : Y₁ ⟶ Y₂} {b : X₂ ⟶ Y₂} (sq : CommSq t l r b) : - (F.map l).g ≫ (F.map t).f ⟶ (F.map b).f ≫ (F.map r).g := - Bicategory.mateEquiv (F.map l).adj (F.map r).adj (F.isoMapOfCommSq sq).hom.τf +def baseChange + {B C : Type*} [Bicategory B] [Strict B] [Bicategory C] (F : Pseudofunctor B (Adj C)) + {X₁ X₂ Y₁ Y₂ : B} {t : X₁ ⟶ Y₁} {l : X₁ ⟶ X₂} + {r : Y₁ ⟶ Y₂} {b : X₂ ⟶ Y₂} (sq : CommSq t l r b) : + (F.map l).g ≫ (F.map t).f ⟶ (F.map b).f ≫ (F.map r).g := +Bicategory.mateEquiv (F.map l).adj (F.map r).adj (F.isoMapOfCommSq sq).hom.τf -section Horizontal +variable {B C : Type*} [Bicategory B] [Strict B] [Bicategory C] (F : Pseudofunctor B (Adj C)) + {X₁ X₂ Y₁ Y₂ : B} {t : X₁ ⟶ Y₁} {l : X₁ ⟶ X₂} + {r : Y₁ ⟶ Y₂} {b : X₂ ⟶ Y₂} (sq : CommSq t l r b) -variable {X₁ X₂ Y₁ Y₂ Z₁ Z₂ : C} {t : X₁ ⟶ Y₁} {t' : Y₁ ⟶ Z₁} - {l : X₁ ⟶ X₂} {m : Y₁ ⟶ Y₂} {r : Z₁ ⟶ Z₂} - {b : X₂ ⟶ Y₂} {b' : Y₂ ⟶ Z₂} - (sq : CommSq t l m b) (sq' : CommSq t' m r b') - {t'' : X₁ ⟶ Z₁} {b'' : X₂ ⟶ Z₂} - (ht : t ≫ t' = t'') (hb : b ≫ b' = b'') - -lemma baseChangeComparision_horiz_comp' : - baseChangeComparison F (sq.horiz_comp' sq' ht hb) = - whiskerRight (Adj.forget₂.map₂ - (F.mapComp' b'.op.toLoc b.op.toLoc b''.op.toLoc - (by rw [← Quiver.Hom.comp_toLoc, ← op_comp, hb])).inv.op) _ ≫ - (Functor.associator _ _ _).hom ≫ - whiskerLeft _ (baseChangeComparison F sq') ≫ - (Functor.associator _ _ _).inv ≫ - whiskerRight (baseChangeComparison F sq) _ ≫ - (Functor.associator _ _ _).hom ≫ - whiskerLeft _ (Adj.forget₂.map₂ - (F.mapComp' t'.op.toLoc t.op.toLoc t''.op.toLoc - (by rw [← Quiver.Hom.comp_toLoc, ← op_comp, ht])).hom.op) := by +/-- +This is the base change natural transformation whiskered on the right with `r^*` and +composed with the counit of `r^*`, i.e. the composition +`l_* ≫ t^* ≫ r^* ⟶ b^* ≫ r_* ≫ r^* ⟶ b^*`. + +This is used to construct the morphism in `DescentData'` from a `DescentDataAsCoalgebra`. We +postpone descending to the level of objects as long as possible and hence +state all necessary compatibility properties for `whiskerBaseChange` instead. +-/ +def whiskerBaseChange : (F.map l).g ≫ (F.map t).f ≫ (F.map r).f ⟶ (F.map b).f := + (α_ _ _ _).inv ≫ F.baseChange sq ▷ (F.map r).f ≫ + (α_ _ _ _).hom ≫ (F.map b).f ◁ (F.map r).adj.counit ≫ (ρ_ _).hom + +-- is this true? +instance [IsIso (F.baseChange sq)] : Mono (F.whiskerBaseChange sq) := by + dsimp [whiskerBaseChange] sorry +section Horizontal + +variable {B C : Type*} [Bicategory B] [Strict B] [Bicategory C] +(F : Pseudofunctor B (Adj C)) + +variable {X₁ X₂ Y₁ Y₂ Z₁ Z₂ : B} {t : X₁ ⟶ Y₁} {t' : Y₁ ⟶ Z₁} +{l : X₁ ⟶ X₂} {m : Y₁ ⟶ Y₂} {r : Z₁ ⟶ Z₂} +{b : X₂ ⟶ Y₂} {b' : Y₂ ⟶ Z₂} +(sq : CommSq t l m b) (sq' : CommSq t' m r b') +{t'' : X₁ ⟶ Z₁} {b'' : X₂ ⟶ Z₂} +(ht : t ≫ t' = t'') (hb : b ≫ b' = b'') + +lemma baseChange_horiz_comp' : + baseChange F (sq.horiz_comp' sq' ht hb) = + (F.map l).g ◁ ((F.comp Adj.forget₁).mapComp' t t' t'' ht).hom ≫ + (α_ _ _ _).inv ≫ + baseChange F sq ▷ (F.map t').f ≫ + (α_ _ _ _).hom ≫ + (F.map b).f ◁ baseChange F sq' ≫ + (α_ _ _ _).inv ≫ + ((F.comp Adj.forget₁).mapComp' b b' b'' hb).inv ▷ (F.map r).g := +sorry + end Horizontal section Vertical -variable {X₁ X₂ X₃ Y₁ Y₂ Y₃ : C} +variable {B C : Type*} [Bicategory B] [Strict B] [Bicategory C] + (F : Pseudofunctor B (Adj C)) + +variable {X₁ X₂ X₃ Y₁ Y₂ Y₃ : B} {t : X₁ ⟶ Y₁} {m : X₂ ⟶ Y₂} {b : X₃ ⟶ Y₃} {l : X₁ ⟶ X₂} {l' : X₂ ⟶ X₃} {r : Y₁ ⟶ Y₂} {r' : Y₂ ⟶ Y₃} @@ -146,21 +145,432 @@ variable {X₁ X₂ X₃ Y₁ Y₂ Y₃ : C} {l'' : X₁ ⟶ X₃} {r'' : Y₁ ⟶ Y₃} (hl : l ≫ l' = l'') (hr : r ≫ r' = r'') -lemma baseChangeComparison_vert_comp : - baseChangeComparison F (sq.vert_comp' sq' hl hr) = - whiskerLeft _ (Adj.forget₁.map₂ - (F.mapComp' _ _ _ (by rw [← Quiver.Hom.comp_toLoc, ← op_comp, hr])).hom) ≫ - (Functor.associator _ _ _).inv ≫ - whiskerRight (baseChangeComparison F sq') _ ≫ - (Functor.associator _ _ _).hom ≫ - whiskerLeft _ (baseChangeComparison F sq) ≫ - (Functor.associator _ _ _).inv ≫ - whiskerRight (Adj.forget₁.map₂ - (F.mapComp' _ _ _ (by rw [← Quiver.Hom.comp_toLoc, ← op_comp, hl])).inv) _ := +lemma baseChange_vert_comp' : + baseChange F (sq.vert_comp' sq' hl hr) = + Adj.forget₂.map₂ (F.mapComp' l l' l'').inv.op ▷ (F.map t).f ≫ + (α_ _ _ _).hom ≫ + (F.map l').g ◁ baseChange F sq ≫ + (α_ _ _ _).inv ≫ + baseChange F sq' ▷ (F.map r).g ≫ + (α_ _ _ _).hom ≫ + _ ◁ Adj.forget₂.map₂ (F.mapComp' r r' r'').hom.op := by sorry end Vertical +section + +-- Never unfold the definition of `mateEquiv`, instead try to add general `mateEquiv` lemmas first. +attribute [-simp] Bicategory.mateEquiv_apply Bicategory.mateEquiv_symm_apply + +lemma baseChange_self_self {S X Y : B} (f : S ⟶ X) (g : X ⟶ Y) : + F.baseChange (l := f) (t := f) (b := g) (r := g) (by simp) = + (F.map f).adj.counit ≫ (F.map g).adj.unit := by + simp [baseChange, mateEquiv_id] + +lemma whiskerBaseChange_self_self {S X Y : B} (f : S ⟶ X) (g : X ⟶ Y) : + F.whiskerBaseChange (t := f) (l := f) (r := g) (b := g) ⟨by simp⟩ = + (α_ _ _ _).inv ≫ (F.map f).adj.counit ▷ _ ≫ (λ_ _).hom := by + simp [whiskerBaseChange, baseChange_self_self] + +variable {Z : B} (b' : X₂ ⟶ Z) (r' : Y₁ ⟶ Z) (d : Y₂ ⟶ Z) + (hbd : b ≫ d = b') (hrd : r ≫ d = r') + +lemma baseChange_id_comp : + F.baseChange (t := 𝟙 Y₁) (l := r) (r := r ≫ d) (b := d) (by simp) = + (F.map r).g ◁ ((F.comp Adj.forget₁).mapId _).hom ≫ + (ρ_ _).hom ≫ (λ_ _).inv ≫ + (F.map d).adj.unit ▷ _ ≫ + (α_ _ _ _).hom ≫ + (F.map d).f ◁ (Adj.forget₂.map₂ (F.mapComp r d).hom.op) := + sorry + +lemma baseChange_of_comp_eq : + F.baseChange (l := l) (t := t) (b := b') (r := r') ⟨by rw [← hrd, ← hbd, sq.w_assoc]⟩ = + F.baseChange sq ≫ (F.map b).f ◁ ((λ_ _).inv ≫ (F.map d).adj.unit ▷ _) ≫ + ((F.map b).f ◁ (α_ _ _ _).hom) ≫ (α_ _ _ _).inv ≫ + _ ◁ (Adj.forget₂.map₂ (F.mapComp' _ _ _ hrd).hom.op) ≫ + ((F.comp Adj.forget₁).mapComp' _ _ _ hbd).inv ▷ (F.map r').g := by + subst hbd hrd + let sq'' : CommSq t l (r ≫ d) (b ≫ d) := ⟨by rw [sq.w_assoc]⟩ + let sq' : CommSq (𝟙 _) r (r ≫ d) d := ⟨by simp⟩ + have : sq'' = sq.horiz_comp' sq' (by simp) rfl := rfl + show F.baseChange (sq.horiz_comp' sq' (by simp) rfl) = _ + rw [F.baseChange_horiz_comp' sq sq' (by simp) rfl] + simp only [Adj.forget₁_obj, Adj.forget₁_map, Adj.comp_f, comp_toPrelaxFunctor, + PrelaxFunctor.comp_toPrelaxFunctorStruct, PrelaxFunctorStruct.comp_toPrefunctor, + Prefunctor.comp_obj, Prefunctor.comp_map, Bicategory.whiskerLeft_comp, Adj.forget₂_map, + Quiver.Hom.unop_op', comp_whiskerLeft, Category.assoc, Iso.inv_hom_id_assoc] + rw [F.baseChange_id_comp] + simp only [comp_toPrelaxFunctor, PrelaxFunctor.comp_toPrelaxFunctorStruct, + PrelaxFunctorStruct.comp_toPrefunctor, Prefunctor.comp_obj, Adj.forget₁_obj, + Prefunctor.comp_map, Adj.forget₁_map, Adj.forget₂_map, Quiver.Hom.unop_op', comp_mapId, + Adj.id_f, Iso.trans_hom, Functor.mapIso_hom, PrelaxFunctor.mapFunctor_map, + Bicategory.whiskerLeft_comp, Category.assoc, whiskerLeft_rightUnitor] + simp_rw [← Category.assoc] + rw [mapComp'_eq_mapComp, mapComp'_eq_mapComp] + congr 6 + simp only [Category.assoc] + have : (Adj.forget₁.mapId (F.obj Y₁)).hom = 𝟙 _ := rfl + rw [this] + --have : (F.mapId Y₁).hom.f = 𝟙 _ := sorry + simp only [Adj.forget₁_obj, Adj.forget₁_map, Adj.id_f, Bicategory.whiskerLeft_id, + Category.id_comp] + rw [mapComp'_comp_id] + have : (Adj.forget₁.mapId (F.obj Y₁)).inv = 𝟙 _ := rfl + simp only [comp_toPrelaxFunctor, PrelaxFunctor.comp_toPrelaxFunctorStruct, + PrelaxFunctorStruct.comp_toPrefunctor, Prefunctor.comp_obj, Adj.forget₁_obj, + Prefunctor.comp_map, Adj.forget₁_map, comp_mapId, Adj.id_f, Iso.trans_symm, Iso.trans_hom, + Iso.symm_hom, whiskerLeftIso_hom, this, Functor.mapIso_inv, PrelaxFunctor.mapFunctor_map, + Category.id_comp, Bicategory.whiskerLeft_comp, whiskerLeft_rightUnitor_inv, Category.assoc] + rw [← comp_whiskerLeft_assoc, whisker_exchange_assoc, comp_whiskerLeft] + simp only [Bicategory.whiskerRight_id, Category.assoc, Iso.inv_hom_id_assoc] + simp [← Bicategory.whiskerLeft_comp_assoc, ← Bicategory.whiskerLeft_comp] + +lemma whiskerRight_whiskerBaseChange : + F.whiskerBaseChange sq ▷ (F.map d).f = + (α_ _ _ _).hom ≫ + (F.map l).g ◁ ((α_ _ _ _).hom ≫ (F.map t).f ◁ ((F.comp Adj.forget₁).mapComp' _ _ _ hrd).inv) ≫ + F.whiskerBaseChange (l := l) (t := t) (b := b') (r := r') ⟨by rw [← hrd, ← hbd, sq.w_assoc]⟩ ≫ + ((F.comp Adj.forget₁).mapComp' _ _ _ hbd).hom := by + dsimp + simp only [Bicategory.whiskerLeft_comp, Category.assoc] + simp only [whiskerBaseChange, comp_whiskerRight, whisker_assoc, Category.assoc, + triangle_assoc_comp_right] + rw [F.baseChange_of_comp_eq sq b' r' d hbd hrd] + simp + sorry + +end + +section Codiag + +variable {S X Y : B} (f : S ⟶ X) (r b : X ⟶ Y) (sq : CommSq f f r b) (d : Y ⟶ X) + (hrd : r ≫ d = 𝟙 _) (hbd : b ≫ d = 𝟙 _) + +lemma whiskerRight_whiskerBaseChange_self_self : + F.whiskerBaseChange sq ▷ (F.map d).f = + ((α_ _ _ _).inv ≫ (F.map f).adj.counit ▷ (F.map r).f ≫ (λ_ _).hom) ▷ (F.map d).f ≫ + ((F.comp Adj.forget₁).mapComp' r d (𝟙 X) hrd).inv ≫ + ((F.comp Adj.forget₁).mapComp' b d (𝟙 X) hbd).hom := by + rw [F.whiskerRight_whiskerBaseChange sq _ _ _ hbd hrd, whiskerBaseChange_self_self] + simp only [comp_toPrelaxFunctor, PrelaxFunctor.comp_toPrelaxFunctorStruct, + PrelaxFunctorStruct.comp_toPrefunctor, Prefunctor.comp_obj, Adj.forget₁_obj, + Prefunctor.comp_map, Adj.forget₁_map, Bicategory.whiskerLeft_comp, Category.assoc, + comp_whiskerRight, leftUnitor_whiskerRight] + sorry + +end Codiag + +section Triple + +variable {S X₁ X₂ X₃ : B} {f₁ : S ⟶ X₁} {f₂ : S ⟶ X₂} {f₃ : S ⟶ X₃} + {P₁₂ P₂₃ P₁₃ P₁₂₃ : B} {p₁ : X₁ ⟶ P₁₂₃} {p₂ : X₂ ⟶ P₁₂₃} {p₃ : X₃ ⟶ P₁₂₃} + {u₁₂ : X₁ ⟶ P₁₂} {u₂₁ : X₂ ⟶ P₁₂} {u₂₃ : X₂ ⟶ P₂₃} {u₃₂ : X₃ ⟶ P₂₃} + {u₁₃ : X₁ ⟶ P₁₃} {u₃₁ : X₃ ⟶ P₁₃} + {p₁₂ : P₁₂ ⟶ P₁₂₃} {p₂₃ : P₂₃ ⟶ P₁₂₃} {p₁₃ : P₁₃ ⟶ P₁₂₃} + (sq₁₂ : CommSq f₁ f₂ u₁₂ u₂₁) + (sq₂₃ : CommSq f₂ f₃ u₂₃ u₃₂) + (sq₁₃ : CommSq f₁ f₃ u₁₃ u₃₁) + (h₁₃₁₂ : CommSq u₁₃ u₁₂ p₁₃ p₁₂) + (h₂₁₂₃ : CommSq u₂₁ u₂₃ p₁₂ p₂₃) + (h₃₂₃₁ : CommSq u₃₂ u₃₁ p₂₃ p₁₃) + +lemma whiskerRight_whiskerBaseChange_triple : + F.whiskerBaseChange sq₁₃ ▷ (F.map p₁₃).f = + (α_ _ _ _).inv ▷ (F.map p₁₃).f ≫ + ((F.map f₃).g ◁ (λ_ _).inv) ▷ (F.map u₁₃).f ▷ (F.map p₁₃).f ≫ + ((F.map f₃).g ◁ ((F.map f₂).adj.unit ▷ (F.map f₁).f)) ▷ (F.map u₁₃).f ▷ (F.map p₁₃).f ≫ + (α_ _ _ _).hom ≫ + (α_ _ _ _).hom ≫ + (F.map f₃).g ◁ (α_ _ _ _).inv ≫ + (F.map f₃).g ◁ ((α_ _ _ _).hom ▷ (F.map p₁₃).f) ≫ + (F.map f₃).g ◁ ((α_ _ _ _).hom ▷ (F.map p₁₃).f) ≫ + (F.map f₃).g ◁ (α_ _ _ _).hom ≫ + (F.map f₃).g ◁ (F.map f₂).f ◁ (α_ _ _ _).hom ≫ + (F.map f₃).g ◁ (F.map f₂).f ◁ (F.map f₂).g ◁ (α_ _ _ _).hom ≫ + (F.map f₃).g ◁ (F.map f₂).f ◁ (F.map f₂).g ◁ (F.map f₁).f ◁ + ((F.comp Adj.forget₁).isoMapOfCommSq h₁₃₁₂).hom ≫ + (F.map f₃).g ◁ (F.map f₂).f ◁ (F.map f₂).g ◁ (α_ _ _ _).inv ≫ + (F.map f₃).g ◁ (F.map f₂).f ◁ (α_ _ _ _).inv ≫ + (F.map f₃).g ◁ (F.map f₂).f ◁ (F.whiskerBaseChange sq₁₂ ▷ (F.map p₁₂).f) ≫ + (F.map f₃).g ◁ (F.map f₂).f ◁ ((F.comp Adj.forget₁).isoMapOfCommSq h₂₁₂₃).hom ≫ + (F.map f₃).g ◁ (α_ _ _ _).inv ≫ + (α_ _ _ _).inv ≫ + (F.whiskerBaseChange sq₂₃) ▷ (F.map p₂₃).f ≫ + ((F.comp Adj.forget₁).isoMapOfCommSq h₃₂₃₁).hom := by + sorry + +end Triple + +section + +variable {B C : Type*} [Bicategory B] [Strict B] [Bicategory C] (F : Pseudofunctor B (Adj Cat)) + +variable {X₁ X₂ Y₁ Y₂ : B} {t : X₁ ⟶ Y₁} {l : X₁ ⟶ X₂} + {r : Y₁ ⟶ Y₂} {b : X₂ ⟶ Y₂} (sq : CommSq t l r b) + +/-- +Given a commutative square, +``` + t + X₁ ⟶ Y₁ +l| |r + v v + X₂ ⟶ Y₂ + b +``` +any morphism `M ⟶ t^* l_* N` induces a morphism `r^* M ⟶ b^* N`. This is the morphism +constructed from a `DescentDataAsCoalgebra` to form a `DescentData'`. +-/ +def coalgHom {M : (F.obj Y₁).obj} {N : (F.obj X₂).obj} + (a : M ⟶ (F.map t).f.obj ((F.map l).g.obj N)) : + (F.map r).f.obj M ⟶ (F.map b).f.obj N := + (F.map r).f.map a ≫ (F.whiskerBaseChange sq).app _ + +/-- If the base change morphism is an isomorphism, `coalgHom sq` is an equivalence. -/ +noncomputable +def coalgEquiv [IsIso (F.baseChange sq)] + (M : (F.obj Y₁).obj) (N : (F.obj X₂).obj) : + (M ⟶ (F.map t).f.obj ((F.map l).g.obj N)) ≃ ((F.map r).f.obj M ⟶ (F.map b).f.obj N) where + toFun a := (F.map r).f.map a ≫ (F.whiskerBaseChange sq).app N + invFun a := (F.map r).adj.unit.app _ ≫ (F.map r).g.map a ≫ inv ((F.baseChange sq).app _) + left_inv a := by + dsimp [whiskerBaseChange] + simp only [Functor.map_comp, Category.assoc] + simp only [Cat.associator_inv_app, Cat.comp_obj, eqToHom_refl, Functor.map_id, + Cat.associator_hom_app, Cat.rightUnitor_hom_app, Cat.id_obj, Category.id_comp] + rw [← Cat.comp_map, ← (F.map r).adj.unit.naturality_assoc] + simp only [Cat.id_obj, Cat.id_map, Cat.comp_obj] + rw [← Cat.comp_map, ← (F.map r).adj.unit.naturality_assoc] + have := congr($((F.map r).adj.right_triangle).app ((F.map b).f.obj N)) + dsimp only [Cat.comp_obj, Cat.id_obj, rightZigzag, bicategoricalComp, + BicategoricalCoherence.assoc'_iso, BicategoricalCoherence.whiskerRight_iso, + BicategoricalCoherence.refl_iso, Iso.trans_hom, whiskerRightIso_hom, Iso.refl_hom, + Iso.symm_hom, Cat.comp_app, Cat.whiskerLeft_app, Cat.whiskerRight_app, Cat.id_app, + Cat.comp_map, Cat.associator_inv_app, eqToHom_refl, Cat.rightUnitor_hom_app] at this + simp only [Functor.map_id, Category.comp_id, Category.id_comp, Cat.leftUnitor_inv_app, + Cat.comp_obj, Cat.id_obj, eqToHom_refl] at this + rw [reassoc_of% this] + simp + right_inv a := by + dsimp [whiskerBaseChange] + simp only [Cat.associator_inv_app, Cat.comp_obj, eqToHom_refl, Functor.map_id, + Cat.associator_hom_app, Cat.rightUnitor_hom_app, Cat.id_obj, Category.id_comp] + simp only [Functor.map_comp, Functor.map_inv, Category.comp_id, Category.assoc, + IsIso.inv_hom_id_assoc] + rw [← Cat.comp_map, (F.map r).adj.counit.naturality] + simp only [Cat.comp_obj, Cat.id_obj, Cat.id_map] + -- TODO: specialize the `left_triangle` and `right_triangle` conditions + -- for `Adj Cat` in `app`lied for + have := congr($((F.map r).adj.left_triangle).app M) + dsimp only [Cat.comp_obj, Cat.id_obj, leftZigzag, bicategoricalComp, + BicategoricalCoherence.assoc_iso, BicategoricalCoherence.whiskerRight_iso, + BicategoricalCoherence.refl_iso, Iso.trans_hom, whiskerRightIso_hom, Iso.refl_hom, + Cat.comp_app, Cat.whiskerRight_app, Cat.id_app, Cat.comp_map, Cat.whiskerLeft_app] at this + simp only [Cat.associator_hom_app, Cat.comp_obj, eqToHom_refl, Functor.map_id, Category.comp_id, + Category.id_comp, Cat.leftUnitor_hom_app, Cat.id_obj, Cat.rightUnitor_inv_app] at this + rw [reassoc_of% this] + +@[simp] +lemma coalgHom_coalgEquiv_symm [IsIso (F.baseChange sq)] {M} {N} + (a : (F.map r).f.obj M ⟶ (F.map b).f.obj N) : + F.coalgHom sq ((F.coalgEquiv sq _ _).symm a) = a := + (F.coalgEquiv sq _ _).apply_symm_apply _ + +@[simp] +lemma coalgEquiv_symm_coalgHom_apply [IsIso (F.baseChange sq)] {M} {N} + (a : M ⟶ (F.map t).f.obj ((F.map l).g.obj N)) : + (F.coalgEquiv sq M N).symm (F.coalgHom sq a) = a := + (F.coalgEquiv sq M N).symm_apply_apply _ + +section + +variable {S X Y : B} (f : S ⟶ X) (r b : X ⟶ Y) (sq : CommSq f f r b) (d : Y ⟶ X) + (hrd : r ≫ d = 𝟙 _) (hbd : b ≫ d = 𝟙 _) + +lemma map_coalgHom_of_comp_eq_id {M : (F.obj X).obj} + (a : M ⟶ (F.map f).f.obj ((F.map f).g.obj M)) : + (F.map d).f.map (F.coalgHom sq a) = + (F.map d).f.map ((F.map r).f.map (a ≫ (F.map f).adj.counit.app M)) ≫ + ((F.comp Adj.forget₁).mapComp' r d (𝟙 _) hrd).inv.app _ ≫ + ((F.comp Adj.forget₁).mapComp' b d (𝟙 _) hbd).hom.app _ := by + have := congr($(F.whiskerRight_whiskerBaseChange_self_self _ _ _ sq d hrd hbd).app M) + dsimp only [Cat.comp_obj, Cat.whiskerRight_app, comp_toPrelaxFunctor, + PrelaxFunctor.comp_toPrelaxFunctorStruct, PrelaxFunctorStruct.comp_toPrefunctor, + Prefunctor.comp_obj, Adj.forget₁_obj, Prefunctor.comp_map, Adj.forget₁_map, Cat.comp_app, + Cat.id_obj] at this + simp only [coalgHom, Functor.map_comp, comp_toPrelaxFunctor, + PrelaxFunctor.comp_toPrelaxFunctorStruct, PrelaxFunctorStruct.comp_toPrefunctor, + Prefunctor.comp_obj, Adj.forget₁_obj, + Prefunctor.comp_map, Adj.forget₁_map, Cat.comp_obj] + rw [this, Cat.associator_inv_app, Cat.leftUnitor_hom_app] + simp only [Cat.comp_obj, eqToHom_refl, Cat.id_obj, Category.comp_id, Category.id_comp] + simp_rw [← (F.map d).f.map_comp_assoc, ← (F.map r).f.map_comp] + simp + +lemma comp_counit_eq_id_iff {M : (F.obj X).obj} (a : M ⟶ (F.map f).f.obj ((F.map f).g.obj M)) : + a ≫ (F.map f).adj.counit.app M = 𝟙 M ↔ + (F.map d).f.map (F.coalgHom sq a) = + ((F.comp Adj.forget₁).mapComp' r d (𝟙 _) hrd).inv.app _ ≫ + ((F.comp Adj.forget₁).mapComp' b d (𝟙 _) hbd).hom.app _ := by + rw [F.map_coalgHom_of_comp_eq_id _ _ _ sq _ hrd hbd] + refine ⟨fun H ↦ ?_, fun H ↦ ?_⟩ + · simp [H] + · have : Functor.Faithful ((F.map r).f ≫ (F.map d).f) := by + have : Functor.Faithful (𝟙 ((F.comp Adj.forget₁).obj X)) := + inferInstanceAs <| (Functor.id _).Faithful + exact Functor.Faithful.of_iso + (((F.comp Adj.forget₁).mapId _).symm ≪≫ (F.comp Adj.forget₁).mapComp' r d (𝟙 _) hrd) + apply ((F.map r).f ≫ (F.map d).f).map_injective + simp only [Cat.comp_obj, Cat.id_obj, Cat.comp_map, Functor.map_comp, Functor.map_id] + rw [← cancel_mono + (((F.comp Adj.forget₁).mapComp' r d (𝟙 X) hrd).inv.app _ ≫ + ((F.comp Adj.forget₁).mapComp' b d (𝟙 X) hbd).hom.app _)] + simp only [Cat.id_obj, comp_toPrelaxFunctor, PrelaxFunctor.comp_toPrelaxFunctorStruct, + PrelaxFunctorStruct.comp_toPrefunctor, Prefunctor.comp_obj, Adj.forget₁_obj, + Prefunctor.comp_map, Adj.forget₁_map, Cat.comp_obj, Functor.map_comp, Category.assoc] at H + simp [H] + +end + +section + +variable {S X₁ X₂ X₃ : B} {f₁ : S ⟶ X₁} {f₂ : S ⟶ X₂} {f₃ : S ⟶ X₃} + {P₁₂ P₂₃ P₁₃ P₁₂₃ : B} {p₁ : X₁ ⟶ P₁₂₃} {p₂ : X₂ ⟶ P₁₂₃} {p₃ : X₃ ⟶ P₁₂₃} + {u₁₂ : X₁ ⟶ P₁₂} {u₂₁ : X₂ ⟶ P₁₂} {u₂₃ : X₂ ⟶ P₂₃} {u₃₂ : X₃ ⟶ P₂₃} + {u₁₃ : X₁ ⟶ P₁₃} {u₃₁ : X₃ ⟶ P₁₃} + {p₁₂ : P₁₂ ⟶ P₁₂₃} {p₂₃ : P₂₃ ⟶ P₁₂₃} {p₁₃ : P₁₃ ⟶ P₁₂₃} + (sq₁₂ : CommSq f₁ f₂ u₁₂ u₂₁) + (sq₂₃ : CommSq f₂ f₃ u₂₃ u₃₂) + (sq₁₃ : CommSq f₁ f₃ u₁₃ u₃₁) + (h₁₃₁₂ : CommSq u₁₃ u₁₂ p₁₃ p₁₂) + (h₂₁₂₃ : CommSq u₂₁ u₂₃ p₁₂ p₂₃) + (h₃₂₃₁ : CommSq u₃₂ u₃₁ p₂₃ p₁₃) + +@[reassoc] +lemma map_coalgHom_comp_map_coalgHom {A₁ : (F.obj X₁).obj} {A₂ : (F.obj X₂).obj} + {A₃ : (F.obj X₃).obj} + (a₁₂ : A₁ ⟶ (F.map f₁).f.obj ((F.map f₂).g.obj A₂)) + (a₂₃ : A₂ ⟶ (F.map f₂).f.obj ((F.map f₃).g.obj A₃)) : + (F.map p₁₂).f.map (F.coalgHom sq₁₂ a₁₂) ≫ + ((F.comp Adj.forget₁).isoMapOfCommSq h₂₁₂₃).hom.app _ ≫ + (F.map p₂₃).f.map (F.coalgHom sq₂₃ a₂₃) = + (F.map p₁₂).f.map ((F.map u₁₂).f.map a₁₂) ≫ + (F.map p₁₂).f.map ((F.map u₁₂).f.map ((F.map f₁).f.map ((F.map f₂).g.map a₂₃))) ≫ + (F.map p₁₂).f.map ((F.whiskerBaseChange sq₁₂).app _) ≫ + ((F.comp Adj.forget₁).isoMapOfCommSq h₂₁₂₃).hom.app _ ≫ + (F.map p₂₃).f.map ((F.whiskerBaseChange sq₂₃).app _) := by + dsimp [coalgHom] + simp only [Functor.map_comp, Category.assoc] + congr 1 + rw [← (F.map p₁₂).f.map_comp_assoc, ← Cat.comp_map _ (F.map u₁₂).f] + rw [← Cat.comp_map (F.map f₂).g, (F.whiskerBaseChange sq₁₂).naturality] + simp only [Cat.comp_obj, Functor.map_comp, Category.assoc] + congr 1 + rw [← Cat.comp_map _ (F.map p₁₂).f] + -- defeq abuse of `(F.map p₁₂).f` and `(F.comp Adj.forget₁).map p₁₂` + erw [((F.comp Adj.forget₁).isoMapOfCommSq h₂₁₂₃).hom.naturality_assoc] + simp + +include sq₁₂ sq₂₃ h₁₃₁₂ h₂₁₂₃ h₃₂₃₁ in +lemma coalgHom_eq_coalgHom_coalgHom' {A₁ : (F.obj X₁).obj} {A₃ : (F.obj X₃).obj} + (a₁₃ : A₁ ⟶ (F.map f₁).f.obj ((F.map f₃).g.obj A₃)) : + (F.map p₁₃).f.map (F.coalgHom sq₁₃ a₁₃) = + (F.map p₁₃).f.map ((F.map u₁₃).f.map a₁₃) ≫ + (F.map p₁₃).f.map ((F.map u₁₃).f.map ((F.map f₁).f.map ((F.map f₂).adj.unit.app _))) ≫ + ((F.comp Adj.forget₁).isoMapOfCommSq h₁₃₁₂).hom.app _ ≫ + (F.map p₁₂).f.map ((F.whiskerBaseChange sq₁₂).app _) ≫ + ((F.comp Adj.forget₁).isoMapOfCommSq h₂₁₂₃).hom.app _ ≫ + (F.map p₂₃).f.map ((F.whiskerBaseChange sq₂₃).app A₃) ≫ + ((F.comp Adj.forget₁).isoMapOfCommSq h₃₂₃₁).hom.app A₃ := by + dsimp [coalgHom] + simp only [Functor.map_comp] + have := congr($(F.whiskerRight_whiskerBaseChange_triple sq₁₂ sq₂₃ sq₁₃ h₁₃₁₂ h₂₁₂₃ h₃₂₃₁).app A₃) + dsimp at this + simp only [Cat.associator_inv_app, Cat.comp_obj, eqToHom_refl, Functor.map_id, + Cat.leftUnitor_inv_app, Cat.id_obj, Cat.associator_hom_app, Category.id_comp] at this + rw [this] + +variable {A₁ : (F.obj X₁).obj} {A₂ : (F.obj X₂).obj} + {A₃ : (F.obj X₃).obj} + (a₁₃ : A₁ ⟶ (F.map f₁).f.obj ((F.map f₃).g.obj A₃)) + (a₁₂ : A₁ ⟶ (F.map f₁).f.obj ((F.map f₂).g.obj A₂)) + (a₂₃ : A₂ ⟶ (F.map f₂).f.obj ((F.map f₃).g.obj A₃)) + +lemma coalgHom_eq_coalgHom_coalgHom + (H : a₁₂ ≫ (F.map f₁).f.map ((F.map f₂).g.map a₂₃) = + a₁₃ ≫ (F.map f₁).f.map ((F.map f₂).adj.unit.app _)) : + (F.map p₁₃).f.map (F.coalgHom sq₁₃ a₁₃) = + ((F.comp Adj.forget₁).isoMapOfCommSq h₁₃₁₂).hom.app _ ≫ + (F.map p₁₂).f.map (F.coalgHom sq₁₂ a₁₂) ≫ + ((F.comp Adj.forget₁).isoMapOfCommSq h₂₁₂₃).hom.app _ ≫ + (F.map p₂₃).f.map (F.coalgHom sq₂₃ a₂₃) ≫ + ((F.comp Adj.forget₁).isoMapOfCommSq h₃₂₃₁).hom.app _ := by + rw [F.coalgHom_eq_coalgHom_coalgHom' sq₁₂ sq₂₃ sq₁₃ h₁₃₁₂ h₂₁₂₃ h₃₂₃₁] + rw [map_coalgHom_comp_map_coalgHom_assoc] + rw [← (F.map p₁₃).f.map_comp_assoc, ← (F.map u₁₃).f.map_comp, ← H] + simp only [Cat.comp_obj, comp_toPrelaxFunctor, PrelaxFunctor.comp_toPrelaxFunctorStruct, + PrelaxFunctorStruct.comp_toPrefunctor, Prefunctor.comp_obj, Adj.forget₁_obj, + Prefunctor.comp_map, Adj.forget₁_map, Functor.map_comp, Category.assoc] + rw [← Cat.comp_map _ (F.map p₁₂).f] + erw [← ((F.comp Adj.forget₁).isoMapOfCommSq h₁₃₁₂).hom.naturality_assoc] + erw [← ((F.comp Adj.forget₁).isoMapOfCommSq h₁₃₁₂).hom.naturality_assoc] + simp + +lemma coalgHom_eq_coalgHom_coalgHom_iff : + a₁₂ ≫ (F.map f₁).f.map ((F.map f₂).g.map a₂₃) = + a₁₃ ≫ (F.map f₁).f.map ((F.map f₂).adj.unit.app _) ↔ + (F.map p₁₃).f.map (F.coalgHom sq₁₃ a₁₃) = + ((F.comp Adj.forget₁).isoMapOfCommSq h₁₃₁₂).hom.app _ ≫ + (F.map p₁₂).f.map (F.coalgHom sq₁₂ a₁₂) ≫ + ((F.comp Adj.forget₁).isoMapOfCommSq h₂₁₂₃).hom.app _ ≫ + (F.map p₂₃).f.map (F.coalgHom sq₂₃ a₂₃) ≫ + ((F.comp Adj.forget₁).isoMapOfCommSq h₃₂₃₁).hom.app _ := by + refine ⟨fun H ↦ F.coalgHom_eq_coalgHom_coalgHom _ _ _ _ _ _ _ _ _ H, fun H ↦ ?_⟩ + rw [F.coalgHom_eq_coalgHom_coalgHom' sq₁₂ sq₂₃ sq₁₃ h₁₃₁₂ h₂₁₂₃ h₃₂₃₁] at H + rw [map_coalgHom_comp_map_coalgHom_assoc] at H + simp_rw [← Category.assoc] at H + rw [cancel_mono] at H + simp_rw [Category.assoc] at H + dsimp at H + rw [← Cat.comp_map _ (F.map p₁₂).f] at H + erw [← ((F.comp Adj.forget₁).isoMapOfCommSq h₁₃₁₂).hom.naturality_assoc] at H + erw [← ((F.comp Adj.forget₁).isoMapOfCommSq h₁₃₁₂).hom.naturality_assoc] at H + dsimp at H + -- seems to need `(F.map u₁₃).f ≫ (F.map p₁₃).f` faithful and + -- `(F.whiskerBaseChange sq).app _` mono? + sorry + +end + +section Hom + +variable {M M' : (F.obj Y₁).obj} {N N' : (F.obj X₂).obj} + (a : M ⟶ (F.map t).f.obj ((F.map l).g.obj N)) + (a' : M' ⟶ (F.map t).f.obj ((F.map l).g.obj N')) + (u : M ⟶ M') (v : N ⟶ N') + +lemma map_comp_coalgHom_eq_coalgHom_map + (H : a ≫ (F.map t).f.map ((F.map l).g.map v) = u ≫ a') : + (((F.map r).f.map u ≫ F.coalgHom sq a' = F.coalgHom sq a ≫ (F.map b).f.map v)) := by + rw [coalgHom, ← (F.map r).f.map_comp_assoc, ← H, coalgHom] + simp [← (F.whiskerBaseChange sq).naturality] + +lemma iff_map_comp_coalgHom_eq_coalgHom_map [IsIso (F.baseChange sq)] : + a ≫ (F.map t).f.map ((F.map l).g.map v) = u ≫ a' ↔ + (((F.map r).f.map u ≫ F.coalgHom sq a' = F.coalgHom sq a ≫ (F.map b).f.map v)) := by + refine ⟨fun H ↦ F.map_comp_coalgHom_eq_coalgHom_map sq _ _ _ _ H, fun H ↦ ?_⟩ + rw [coalgHom, coalgHom, Category.assoc] at H + rw [← (F.whiskerBaseChange sq).naturality] at H + simp only [Cat.comp_obj, Cat.comp_map] at H + -- seems to need `(F.map r).f` faithful and `(F.whiskerBaseChange sq).app _` mono? + sorry + +end Hom + +end + end Pseudofunctor end CategoryTheory diff --git a/Mathlib/CategoryTheory/Bicategory/Functor/Strict.lean b/Mathlib/CategoryTheory/Bicategory/Functor/Strict.lean index 779cd4b5929a95..2c34536d2ab25e 100644 --- a/Mathlib/CategoryTheory/Bicategory/Functor/Strict.lean +++ b/Mathlib/CategoryTheory/Bicategory/Functor/Strict.lean @@ -149,14 +149,49 @@ lemma isoMapOfCommSq_eq (φ : X₁ ⟶ Y₂) (hφ : t ≫ r = φ) : subst hφ simp [isoMapOfCommSq, mapComp'_eq_mapComp] +lemma isoMapOfCommSq_hom_eq (φ : X₁ ⟶ Y₂) (hφ : t ≫ r = φ) : + (F.isoMapOfCommSq sq).hom = + (F.mapComp' t r φ (by rw [hφ])).inv ≫ + (F.mapComp' l b φ (by rw [← hφ, sq.w])).hom := by + simp [F.isoMapOfCommSq_eq sq _ hφ] + lemma isoMapOfCommSq_flip : F.isoMapOfCommSq sq.flip = (F.isoMapOfCommSq sq).symm := by rw [F.isoMapOfCommSq_eq sq.flip (t ≫ r) sq.w.symm, F.isoMapOfCommSq_eq sq (t ≫ r) rfl, Iso.trans_symm, Iso.symm_symm_eq] +lemma mapComp'_isoMapOfCommSq {tr'} (htr' : t ≫ r = tr') : + (F.mapComp' t r tr' htr') ≪≫ F.isoMapOfCommSq sq = + F.mapComp' l b tr' (by rw [← htr', sq.w]) := by + subst htr' + simp [F.isoMapOfCommSq_eq sq _ rfl] + +@[reassoc] +lemma mapComp'_hom_isoMapOfCommSq_hom {tr'} (htr' : t ≫ r = tr') : + (F.mapComp' t r tr' htr').hom ≫ (F.isoMapOfCommSq sq).hom = + (F.mapComp' l b tr' (by rw [← htr', sq.w])).hom := by + simp [← F.mapComp'_isoMapOfCommSq sq htr'] + +lemma isoMapOfCommSq_mapComp'_symm {tr'} (htr' : t ≫ r = tr') : + F.isoMapOfCommSq sq ≪≫ (F.mapComp' l b tr' (by rw [← htr', sq.w])).symm = + (F.mapComp' t r tr' htr').symm := by + subst htr' + simp [F.isoMapOfCommSq_eq sq _ rfl] + +@[reassoc] +lemma isoMapOfCommSq_hom_mapComp'_inv {tr'} (htr' : t ≫ r = tr') : + (F.isoMapOfCommSq sq).hom ≫ (F.mapComp' l b tr' (by rw [← htr', sq.w])).inv = + (F.mapComp' t r tr' htr').inv := by + simp [← F.mapComp'_isoMapOfCommSq sq htr'] + end +@[simp] +lemma isoMapOfCommSq_self_self (f : X₁ ⟶ X₂) (g : X₂ ⟶ X₃) : + F.isoMapOfCommSq (t := f) (l := f) (r := g) (b := g) ⟨rfl⟩ = Iso.refl _ := by + simp [isoMapOfCommSq, mapComp'] + /-- Equational lemma for `Pseudofunctor.isoMapOfCommSq` when both vertical maps of the square are the same and horizontal maps are identities. -/ lemma isoMapOfCommSq_horiz_id (f : X₁ ⟶ X₂) : diff --git a/Mathlib/CategoryTheory/Sites/Descent/DescentDataAsCoalgebra.lean b/Mathlib/CategoryTheory/Sites/Descent/DescentDataAsCoalgebra.lean index 58d469e8be4579..3bcfe623a2d557 100644 --- a/Mathlib/CategoryTheory/Sites/Descent/DescentDataAsCoalgebra.lean +++ b/Mathlib/CategoryTheory/Sites/Descent/DescentDataAsCoalgebra.lean @@ -6,6 +6,7 @@ Authors: Joël Riou import Mathlib.CategoryTheory.Sites.Descent.DescentDataPrime import Mathlib.CategoryTheory.Bicategory.Adjunction.Adj import Mathlib.CategoryTheory.Monad.Adjunction +import Mathlib.CategoryTheory.Bicategory.Adjunction.BaseChange /-! # Descent data as coalgebras... @@ -33,6 +34,45 @@ open Opposite Limits Bicategory namespace Pseudofunctor +/-- A slightly reformulated characterisation of the composition condition in `DescentData'`. -/ +lemma DescentData'.pullHom'_comp_pullHom'_eq_iff + {C : Type*} [Category C] (F : Pseudofunctor (LocallyDiscrete Cᵒᵖ) Cat) + {ι : Type*} {S : C} {X : ι → C} (f : ∀ i, X i ⟶ S) (sq : ∀ i j, ChosenPullback (f i) (f j)) + (sq₃ : (i₁ i₂ i₃ : ι) → ChosenPullback₃ (sq i₁ i₂) (sq i₂ i₃) (sq i₁ i₃)) + (obj : ∀ i, F.obj (.mk (op (X i)))) + (hom : ∀ i j, (F.map (sq i j).p₁.op.toLoc).obj (obj i) ⟶ + (F.map (sq i j).p₂.op.toLoc).obj (obj j)) + {i₁ i₂ i₃ : ι} : + DescentData'.pullHom' hom (sq₃ i₁ i₂ i₃).p (sq₃ i₁ i₂ i₃).p₁ (sq₃ i₁ i₂ i₃).p₂ + (by simp) (by simp) ≫ + DescentData'.pullHom' hom (sq₃ i₁ i₂ i₃).p (sq₃ i₁ i₂ i₃).p₂ (sq₃ i₁ i₂ i₃).p₃ + (by simp) (by simp) = + DescentData'.pullHom' hom (sq₃ i₁ i₂ i₃).p (sq₃ i₁ i₂ i₃).p₁ (sq₃ i₁ i₂ i₃).p₃ + (by simp) (by simp) ↔ + (F.isoMapOfCommSq ⟨by simp [← Quiver.Hom.comp_toLoc, ← op_comp]⟩).hom.app _ ≫ + (F.map ((sq i₁ i₂).isPullback.lift + (sq₃ i₁ i₂ i₃).p₁ (sq₃ i₁ i₂ i₃).p₂ (by simp)).op.toLoc).map (hom i₁ i₂) ≫ + (F.isoMapOfCommSq ⟨by simp [← Quiver.Hom.comp_toLoc, ← op_comp]⟩).hom.app _ ≫ + (F.map ((sq i₂ i₃).isPullback.lift + (sq₃ i₁ i₂ i₃).p₂ (sq₃ i₁ i₂ i₃).p₃ (by simp)).op.toLoc).map (hom i₂ i₃) ≫ + (F.isoMapOfCommSq ⟨by simp [← Quiver.Hom.comp_toLoc, ← op_comp]⟩).hom.app _ = + (F.map ((sq i₁ i₃).isPullback.lift + (sq₃ i₁ i₂ i₃).p₁ (sq₃ i₁ i₂ i₃).p₃ (by simp)).op.toLoc).map (hom i₁ i₃) := by + dsimp [DescentData'.pullHom', LocallyDiscreteOpToCat.pullHom] + simp only [Category.assoc] + rw [← cancel_epi ((F.mapComp' (sq i₁ i₃).p₁.op.toLoc _ _ _).inv.app (obj i₁))] + rw [Iso.inv_hom_id_app_assoc] + rw [← cancel_mono ((F.mapComp' (sq i₁ i₃).p₂.op.toLoc _ _ _).hom.app _)] + · simp_rw [Category.assoc] + rw [Iso.inv_hom_id_app] + simp only [Cat.comp_obj, Category.comp_id] + rw [isoMapOfCommSq_eq, isoMapOfCommSq_eq, isoMapOfCommSq_eq] + · simp only [Iso.trans_hom, Iso.symm_hom, Cat.comp_app, Cat.comp_obj, Category.assoc] + rfl + · simp [← Quiver.Hom.comp_toLoc, ← op_comp] + · simp [← Quiver.Hom.comp_toLoc, ← op_comp] + · simp [← Quiver.Hom.comp_toLoc, ← op_comp] + variable {C : Type*} [Category C] (F : Pseudofunctor (LocallyDiscrete Cᵒᵖ) (Adj Cat)) namespace LocallyDiscreteToAdjCat @@ -49,6 +89,7 @@ end LocallyDiscreteToAdjCat open LocallyDiscreteToAdjCat +@[ext] structure DescentDataAsCoalgebra {ι : Type*} {S : C} {X : ι → C} (f : ∀ i, X i ⟶ S) where obj (i : ι) : (F.obj (.mk (op (X i)))).obj hom (i₁ i₂ : ι) : obj i₁ ⟶ (f i₁) ^* (f i₂) _* (obj i₂) @@ -104,6 +145,19 @@ lemma id_hom (D : F.DescentDataAsCoalgebra f) (i : ι) : lemma comp_hom {D₁ D₂ D₃ : F.DescentDataAsCoalgebra f} (φ : D₁ ⟶ D₂) (φ' : D₂ ⟶ D₃) (i : ι) : (φ ≫ φ').hom i = φ.hom i ≫ φ'.hom i := rfl +@[simps] +def isoMk {D₁ D₂ : F.DescentDataAsCoalgebra f} (e : ∀ (i : ι), D₁.obj i ≅ D₂.obj i) + (comm : ∀ (i₁ i₂ : ι), D₁.hom i₁ i₂ ≫ + (F.map (f i₁).op.toLoc).f.map ((F.map (f i₂).op.toLoc).g.map (e i₂).hom) = + (e i₁).hom ≫ D₂.hom i₁ i₂ := by aesop_cat) : + D₁ ≅ D₂ where + hom.hom i := (e i).hom + hom.comm := comm + inv.hom i := (e i).inv + inv.comm i₁ i₂ := by + rw [← cancel_epi (e i₁).hom, ← reassoc_of% (comm i₁ i₂), ← Functor.map_comp, ← Functor.map_comp] + simp + end section Unit @@ -157,10 +211,120 @@ variable (F) {ι : Type*} {S : C} {X : ι → C} {f : ∀ i, X i ⟶ S} (sq : ∀ i j, ChosenPullback (f i) (f j)) (sq₃ : ∀ (i₁ i₂ i₃ : ι), ChosenPullback₃ (sq i₁ i₂) (sq i₂ i₃) (sq i₁ i₃)) +section + +variable {F} + +variable (A : F.DescentDataAsCoalgebra f) + +@[simps] +def descentData' : (F.comp Adj.forget₁).DescentData' sq sq₃ where + obj := A.obj + hom i j := F.coalgHom (sq i j).commSq.flip.op.toLoc (A.hom i j) + pullHom'_hom_self i := by + dsimp [DescentData'.pullHom', LocallyDiscreteOpToCat.pullHom] + rw [map_coalgHom_of_comp_eq_id] + · simp [A.counit] + · simp [← Quiver.Hom.comp_toLoc, ← op_comp] + · simp [← Quiver.Hom.comp_toLoc, ← op_comp] + pullHom'_hom_comp i₁ i₂ i₃ := by + rw [DescentData'.pullHom'_comp_pullHom'_eq_iff] + simp only [comp_toPrelaxFunctor, PrelaxFunctor.comp_toPrelaxFunctorStruct, + PrelaxFunctorStruct.comp_toPrefunctor, Prefunctor.comp_obj, Adj.forget₁_obj, + Prefunctor.comp_map, Adj.forget₁_map, Cat.comp_obj] + rw [coalgHom_eq_coalgHom_coalgHom (f₂ := (f i₂).op.toLoc) (A₂ := A.obj i₂) + (u₁₂ := (sq i₁ i₂).p₁.op.toLoc) (u₂₁ := (sq i₁ i₂).p₂.op.toLoc) + (u₂₃ := (sq i₂ i₃).p₁.op.toLoc) (u₃₂ := (sq i₂ i₃).p₂.op.toLoc) + (p₁₂ := ((sq i₁ i₂).isPullback.lift (sq₃ i₁ i₂ i₃).p₁ (sq₃ i₁ i₂ i₃).p₂ (by simp)).op.toLoc) + (p₂₃ := ((sq i₂ i₃).isPullback.lift (sq₃ i₁ i₂ i₃).p₂ (sq₃ i₁ i₂ i₃).p₃ (by simp)).op.toLoc) + (sq₁₂ := (sq i₁ i₂).commSq.flip.op.toLoc) (sq₂₃ := (sq i₂ i₃).commSq.flip.op.toLoc) + (sq₁₃ := (sq i₁ i₃).commSq.flip.op.toLoc) + (a₁₂ := (A.hom i₁ i₂)) (a₂₃ := (A.hom i₂ i₃))] + simp + +@[simps] +def Hom.descentData' {D E : F.DescentDataAsCoalgebra f} (b : D ⟶ E) : + D.descentData' sq sq₃ ⟶ E.descentData' sq sq₃ where + hom := b.hom + comm i₁ i₂ := by + apply map_comp_coalgHom_eq_coalgHom_map + exact b.comm i₁ i₂ + +@[simps] +def toDescentData' : F.DescentDataAsCoalgebra f ⥤ (F.comp Adj.forget₁).DescentData' sq sq₃ where + obj := descentData' sq sq₃ + map {D E} b := b.descentData' sq sq₃ + +@[simps] +noncomputable +def ofDescentData' [∀ i₁ i₂, IsIso (F.baseChange (sq i₁ i₂).commSq.flip.op.toLoc)] + (D : (F.comp Adj.forget₁).DescentData' sq sq₃) : F.DescentDataAsCoalgebra f where + obj := D.obj + hom i₁ i₂ := (F.coalgEquiv (sq i₁ i₂).commSq.flip.op.toLoc _ _).symm (D.hom i₁ i₂) + counit i := by + have := D.pullHom'_hom_self i + dsimp [DescentData'.pullHom', LocallyDiscreteOpToCat.pullHom] at this + rw [F.comp_counit_eq_id_iff _ _ _ (sq i i).commSq.flip.op.toLoc + (((sq i i).isPullback.lift (𝟙 (X i)) (𝟙 (X i)) (by simp)).op.toLoc)] + · simp only [comp_toPrelaxFunctor, PrelaxFunctor.comp_toPrelaxFunctorStruct, + PrelaxFunctorStruct.comp_toPrefunctor, Prefunctor.comp_obj, Adj.forget₁_obj, + Prefunctor.comp_map, Adj.forget₁_map, Cat.comp_obj] + rw [← cancel_epi (((F.comp Adj.forget₁).mapComp' (sq i i).p₁.op.toLoc _ (𝟙 _) _).hom.app _)] + · rw [← cancel_mono (((F.comp Adj.forget₁).mapComp' _ _ (𝟙 _) _).inv.app _)] + · simp only [comp_toPrelaxFunctor, PrelaxFunctor.comp_toPrelaxFunctorStruct, + PrelaxFunctorStruct.comp_toPrefunctor, Prefunctor.comp_obj, Adj.forget₁_obj, + Prefunctor.comp_map, Adj.forget₁_map, Cat.comp_obj, Category.assoc, + Iso.hom_inv_id_app_assoc, Iso.hom_inv_id_app] + convert this + apply (F.coalgEquiv _ (D.obj i) (D.obj i)).apply_symm_apply + · simp [← Quiver.Hom.comp_toLoc, ← op_comp] + · simp [← Quiver.Hom.comp_toLoc, ← op_comp] + coassoc i₁ i₂ i₃ := by + rw [F.coalgHom_eq_coalgHom_coalgHom_iff (sq i₁ i₂).commSq.flip.op.toLoc + (sq i₂ i₃).commSq.flip.op.toLoc (sq i₁ i₃).commSq.flip.op.toLoc + (p₁₂ := ((sq i₁ i₂).isPullback.lift (sq₃ i₁ i₂ i₃).p₁ (sq₃ i₁ i₂ i₃).p₂ (by simp)).op.toLoc) + (p₂₃ := ((sq i₂ i₃).isPullback.lift (sq₃ i₁ i₂ i₃).p₂ (sq₃ i₁ i₂ i₃).p₃ (by simp)).op.toLoc) + (p₁₃ := ((sq i₁ i₃).isPullback.lift (sq₃ i₁ i₂ i₃).p₁ (sq₃ i₁ i₂ i₃).p₃ (by simp)).op.toLoc)] + · have := D.pullHom'_hom_comp i₁ i₂ i₃ + rw [DescentData'.pullHom'_comp_pullHom'_eq_iff] at this + simp only [comp_toPrelaxFunctor, PrelaxFunctor.comp_toPrelaxFunctorStruct, + PrelaxFunctorStruct.comp_toPrefunctor, Prefunctor.comp_obj, Adj.forget₁_obj, + Prefunctor.comp_map, Adj.forget₁_map, Cat.comp_obj] at this + simp only [coalgHom_coalgEquiv_symm, comp_toPrelaxFunctor, + PrelaxFunctor.comp_toPrelaxFunctorStruct, PrelaxFunctorStruct.comp_toPrefunctor, + Prefunctor.comp_obj, Adj.forget₁_obj, Prefunctor.comp_map, Adj.forget₁_map, Cat.comp_obj] + exact this.symm + +lemma ofDescentData'_descentData' [∀ i₁ i₂, IsIso (F.baseChange (sq i₁ i₂).commSq.flip.op.toLoc)] + (A : F.DescentDataAsCoalgebra f) : + ofDescentData' sq sq₃ (descentData' sq sq₃ A) = A := by + ext + · simp + · simp only [ofDescentData'_obj, descentData'_obj, heq_eq_eq] + ext + simp + +@[simps] +noncomputable +def Hom.ofDescentData' [∀ i₁ i₂, IsIso (F.baseChange (sq i₁ i₂).commSq.flip.op.toLoc)] + {D E : (F.comp Adj.forget₁).DescentData' sq sq₃} (f : D ⟶ E) : + ofDescentData' sq sq₃ D ⟶ ofDescentData' sq sq₃ E where + hom := f.hom + comm i₁ i₂ := by + rw [F.iff_map_comp_coalgHom_eq_coalgHom_map (sq i₁ i₂).commSq.flip.op.toLoc] + simpa using f.comm i₁ i₂ + +end + -- needs "base change" assumptions -def descentData'Equivalence : - F.DescentDataAsCoalgebra f ≌ (F.comp Adj.forget₁).DescentData' sq sq₃ := by - sorry +noncomputable +def descentData'Equivalence [∀ i₁ i₂, IsIso (F.baseChange (sq i₁ i₂).commSq.flip.op.toLoc)] : + F.DescentDataAsCoalgebra f ≌ (F.comp Adj.forget₁).DescentData' sq sq₃ where + functor := toDescentData' sq sq₃ + inverse.obj D := .ofDescentData' sq sq₃ D + inverse.map f := .ofDescentData' sq sq₃ f + unitIso := NatIso.ofComponents (fun A ↦ isoMk (fun i ↦ Iso.refl _)) <| fun _ ↦ by ext; simp + counitIso := NatIso.ofComponents (fun A ↦ DescentData'.isoMk (fun i ↦ Iso.refl _)) end DescentDataAsCoalgebra @@ -169,7 +333,7 @@ namespace DescentData' variable {X S : C} {f : X ⟶ S} (sq : ChosenPullback f f) (sq₃ : ChosenPullback₃ sq sq sq) -- needs "base change" assumptions -noncomputable def equivalenceOfComonadicLeftAdjoint +noncomputable def equivalenceOfComonadicLeftAdjoint [IsIso (F.baseChange sq.commSq.flip.op.toLoc)] [(Comonad.comparison (F.map f.op.toLoc).adj.toCategory).IsEquivalence] : (F.obj (.mk (op S))).obj ≌ (F.comp Adj.forget₁).DescentData' (fun (_ : Unit) _ ↦ sq) (fun _ _ _ ↦ sq₃) := @@ -184,7 +348,7 @@ namespace DescentData variable {X S : C} (f : X ⟶ S) (sq : ChosenPullback f f) (sq₃ : ChosenPullback₃ sq sq sq) -- needs "base change" assumptions -noncomputable def equivalenceOfComonadicLeftAdjoint +noncomputable def equivalenceOfComonadicLeftAdjoint [IsIso (F.baseChange sq.commSq.flip.op.toLoc)] [(Comonad.comparison (F.map f.op.toLoc).adj.toCategory).IsEquivalence] : (F.obj (.mk (op S))).obj ≌ (F.comp Adj.forget₁).DescentData (fun (_ : Unit) ↦ f) := diff --git a/Mathlib/CategoryTheory/Sites/Descent/PullbackStruct.lean b/Mathlib/CategoryTheory/Sites/Descent/PullbackStruct.lean index b1241dd1203251..7e024b45018ca5 100644 --- a/Mathlib/CategoryTheory/Sites/Descent/PullbackStruct.lean +++ b/Mathlib/CategoryTheory/Sites/Descent/PullbackStruct.lean @@ -135,6 +135,15 @@ lemma p₂₃_p : h.p₂₃ ≫ h₂₃.p = h.p := by lemma p₁₃_p : h.p₁₃ ≫ h₁₃.p = h.p := by rw [← h₁₃.hp₁, p₁₃_p₁_assoc, w₁] +lemma p₁₂_eq_lift : h.p₁₂ = h₁₂.isPullback.lift h.p₁ h.p₂ (by simp) := by + apply h₁₂.isPullback.hom_ext <;> simp + +lemma p₂₃_eq_lift : h.p₂₃ = h₂₃.isPullback.lift h.p₂ h.p₃ (by simp) := by + apply h₂₃.isPullback.hom_ext <;> simp + +lemma p₁₃_eq_lift : h.p₁₃ = h₁₃.isPullback.lift h.p₁ h.p₃ (by simp) := by + apply h₁₃.isPullback.hom_ext <;> simp + lemma exists_lift {Y : C} (g₁ : Y ⟶ X₁) (g₂ : Y ⟶ X₂) (g₃ : Y ⟶ X₃) (b : Y ⟶ S) (hg₁ : g₁ ≫ f₁ = b) (hg₂ : g₂ ≫ f₂ = b) (hg₃ : g₃ ≫ f₃ = b) : ∃ (φ : Y ⟶ h.chosenPullback.pullback), φ ≫ h.p₁ = g₁ ∧ φ ≫ h.p₂ = g₂ ∧ φ ≫ h.p₃ = g₃ := by From 59e0bf1757794ad67938e54bcd20713ac9619aa2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=ABl=20Riou?= Date: Fri, 16 May 2025 01:23:29 +0200 Subject: [PATCH 082/118] pullback lemmas --- .../Sites/Descent/PullbackStruct.lean | 56 ++++++++++++++++++- 1 file changed, 55 insertions(+), 1 deletion(-) diff --git a/Mathlib/CategoryTheory/Sites/Descent/PullbackStruct.lean b/Mathlib/CategoryTheory/Sites/Descent/PullbackStruct.lean index 7e024b45018ca5..a836a4cffa99ed 100644 --- a/Mathlib/CategoryTheory/Sites/Descent/PullbackStruct.lean +++ b/Mathlib/CategoryTheory/Sites/Descent/PullbackStruct.lean @@ -16,6 +16,23 @@ namespace CategoryTheory variable {C : Type u} [Category.{v} C] +open Limits in +lemma IsPullback.mk' {P X Y Z : C} {fst : P ⟶ X} {snd : P ⟶ Y} {f : X ⟶ Z} {g : Y ⟶ Z} + (w : fst ≫ f = snd ≫ g) (hom_ext : ∀ ⦃T : C⦄ ⦃φ φ' : T ⟶ P⦄ (_ : φ ≫ fst = φ' ≫ fst) + (_ : φ ≫ snd = φ' ≫ snd), φ = φ') (exists_lift : ∀ ⦃T : C⦄ (a : T ⟶ X) (b : T ⟶ Y) + (_ : a ≫ f = b ≫ g), ∃ (l : T ⟶ P), l ≫ fst = a ∧ l ≫ snd = b) : + IsPullback fst snd f g where + w := w + isLimit' := by + let l (s : PullbackCone f g) : s.pt ⟶ P := (exists_lift _ _ s.condition).choose + exact ⟨Limits.PullbackCone.IsLimit.mk _ + (fun s ↦ (exists_lift _ _ s.condition).choose) + (fun s ↦ (exists_lift _ _ s.condition).choose_spec.1) + (fun s ↦ (exists_lift _ _ s.condition).choose_spec.2) + (fun s m h₁ h₂ ↦ hom_ext + (h₁.trans (exists_lift _ _ s.condition).choose_spec.1.symm) + (h₂.trans (exists_lift _ _ s.condition).choose_spec.2.symm))⟩ + namespace Limits structure ChosenPullback {X₁ X₂ S : C} (f₁ : X₁ ⟶ S) (f₂ : X₂ ⟶ S) where @@ -78,9 +95,9 @@ variable {X₁ X₂ X₃ S : C} {f₁ : X₁ ⟶ S} {f₂ : X₂ ⟶ S} {f₃ : structure ChosenPullback₃ where chosenPullback : ChosenPullback h₁₂.p₂ h₂₃.p₁ p : chosenPullback.pullback ⟶ S := chosenPullback.p₁ ≫ h₁₂.p - l : h₁₃.LiftStruct (chosenPullback.p₁ ≫ h₁₂.p₁) (chosenPullback.p₂ ≫ h₂₃.p₂) p p₁ : chosenPullback.pullback ⟶ X₁ := chosenPullback.p₁ ≫ h₁₂.p₁ p₃ : chosenPullback.pullback ⟶ X₃ := chosenPullback.p₂ ≫ h₂₃.p₂ + l : h₁₃.LiftStruct p₁ p₃ p hp₁ : chosenPullback.p₁ ≫ h₁₂.p₁ = p₁ := by aesop_cat hp₃ : chosenPullback.p₂ ≫ h₂₃.p₂ = p₃ := by aesop_cat @@ -155,6 +172,43 @@ lemma exists_lift {Y : C} (g₁ : Y ⟶ X₁) (g₂ : Y ⟶ X₂) (g₃ : Y ⟶ · rw [← w₂, ← w₁₂, Category.assoc, ← p₁₂, p₁₂_p₂] · rw [← w₃, ← w₂₃, Category.assoc, ← p₂₃, p₂₃_p₃] +lemma isPullback₂ : IsPullback h.p₁₂ h.p₂₃ h₁₂.p₂ h₂₃.p₁ := h.chosenPullback.isPullback + +lemma hom_ext {Y : C} {φ φ' : Y ⟶ h.chosenPullback.pullback} + (h₁ : φ ≫ h.p₁ = φ' ≫ h.p₁) (h₂ : φ ≫ h.p₂ = φ' ≫ h.p₂) + (h₃ : φ ≫ h.p₃ = φ' ≫ h.p₃) : φ = φ' := by + apply h.isPullback₂.hom_ext + · apply h₁₂.isPullback.hom_ext <;> simpa + · apply h₂₃.isPullback.hom_ext <;> simpa + +lemma isPullback₁ : IsPullback h.p₁₃ h.p₂₃ h₁₃.p₂ h₂₃.p₂ := + .mk' (by simp) (fun _ _ _ h₁ h₂ ↦ by + apply h.hom_ext + · simpa using h₁ =≫ h₁₃.p₁ + · simpa using h₂ =≫ h₂₃.p₁ + · simpa using h₁ =≫ h₁₃.p₂) + (fun _ a b w ↦ by + obtain ⟨φ, hφ₁, hφ₂, hφ₃⟩ := + h.exists_lift (a ≫ h₁₃.p₁) (b ≫ h₂₃.p₁) (a ≫ h₁₃.p₂) _ rfl + (by simpa using w.symm =≫ f₃) (by simp) + refine ⟨φ, ?_, ?_⟩ + · apply h₁₃.isPullback.hom_ext <;> simpa + · apply h₂₃.isPullback.hom_ext <;> aesop) + +lemma isPullback₃ : IsPullback h.p₁₂ h.p₁₃ h₁₂.p₁ h₁₃.p₁ := + .mk' (by simp) (fun _ _ _ h₁ h₂ ↦ by + apply h.hom_ext + · simpa using h₁ =≫ h₁₂.p₁ + · simpa using h₁ =≫ h₁₂.p₂ + · simpa using h₂ =≫ h₁₃.p₂) + (fun _ a b w ↦ by + obtain ⟨φ, hφ₁, hφ₂, hφ₃⟩ := + h.exists_lift (a ≫ h₁₂.p₁) (a ≫ h₁₂.p₂) (b ≫ h₁₃.p₂) _ rfl + (by simp) (by simpa using w.symm =≫ f₁) + refine ⟨φ, ?_, ?_⟩ + · apply h₁₂.isPullback.hom_ext <;> simpa + · apply h₁₃.isPullback.hom_ext <;> aesop) + end ChosenPullback₃ end Limits From 428f98fdedfeb9b9979b18405646f02e762b5049 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=ABl=20Riou?= Date: Fri, 16 May 2025 01:24:37 +0200 Subject: [PATCH 083/118] better numbering --- .../Sites/Descent/PullbackStruct.lean | 30 +++++++++---------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/Mathlib/CategoryTheory/Sites/Descent/PullbackStruct.lean b/Mathlib/CategoryTheory/Sites/Descent/PullbackStruct.lean index a836a4cffa99ed..a3c1bf4988d8cb 100644 --- a/Mathlib/CategoryTheory/Sites/Descent/PullbackStruct.lean +++ b/Mathlib/CategoryTheory/Sites/Descent/PullbackStruct.lean @@ -181,21 +181,7 @@ lemma hom_ext {Y : C} {φ φ' : Y ⟶ h.chosenPullback.pullback} · apply h₁₂.isPullback.hom_ext <;> simpa · apply h₂₃.isPullback.hom_ext <;> simpa -lemma isPullback₁ : IsPullback h.p₁₃ h.p₂₃ h₁₃.p₂ h₂₃.p₂ := - .mk' (by simp) (fun _ _ _ h₁ h₂ ↦ by - apply h.hom_ext - · simpa using h₁ =≫ h₁₃.p₁ - · simpa using h₂ =≫ h₂₃.p₁ - · simpa using h₁ =≫ h₁₃.p₂) - (fun _ a b w ↦ by - obtain ⟨φ, hφ₁, hφ₂, hφ₃⟩ := - h.exists_lift (a ≫ h₁₃.p₁) (b ≫ h₂₃.p₁) (a ≫ h₁₃.p₂) _ rfl - (by simpa using w.symm =≫ f₃) (by simp) - refine ⟨φ, ?_, ?_⟩ - · apply h₁₃.isPullback.hom_ext <;> simpa - · apply h₂₃.isPullback.hom_ext <;> aesop) - -lemma isPullback₃ : IsPullback h.p₁₂ h.p₁₃ h₁₂.p₁ h₁₃.p₁ := +lemma isPullback₁ : IsPullback h.p₁₂ h.p₁₃ h₁₂.p₁ h₁₃.p₁ := .mk' (by simp) (fun _ _ _ h₁ h₂ ↦ by apply h.hom_ext · simpa using h₁ =≫ h₁₂.p₁ @@ -209,6 +195,20 @@ lemma isPullback₃ : IsPullback h.p₁₂ h.p₁₃ h₁₂.p₁ h₁₃.p₁ : · apply h₁₂.isPullback.hom_ext <;> simpa · apply h₁₃.isPullback.hom_ext <;> aesop) +lemma isPullback₃ : IsPullback h.p₁₃ h.p₂₃ h₁₃.p₂ h₂₃.p₂ := + .mk' (by simp) (fun _ _ _ h₁ h₂ ↦ by + apply h.hom_ext + · simpa using h₁ =≫ h₁₃.p₁ + · simpa using h₂ =≫ h₂₃.p₁ + · simpa using h₁ =≫ h₁₃.p₂) + (fun _ a b w ↦ by + obtain ⟨φ, hφ₁, hφ₂, hφ₃⟩ := + h.exists_lift (a ≫ h₁₃.p₁) (b ≫ h₂₃.p₁) (a ≫ h₁₃.p₂) _ rfl + (by simpa using w.symm =≫ f₃) (by simp) + refine ⟨φ, ?_, ?_⟩ + · apply h₁₃.isPullback.hom_ext <;> simpa + · apply h₂₃.isPullback.hom_ext <;> aesop) + end ChosenPullback₃ end Limits From 34a2d68da1d5042443d5a027391dfafb8dbd0d71 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=ABl=20Riou?= Date: Fri, 16 May 2025 12:20:13 +0200 Subject: [PATCH 084/118] DescentDateDoublePrime --- Mathlib.lean | 1 + .../Bicategory/Adjunction/Adj.lean | 16 +++- .../Sites/Descent/DescentDataDoublePrime.lean | 83 +++++++++++++++++++ 3 files changed, 99 insertions(+), 1 deletion(-) create mode 100644 Mathlib/CategoryTheory/Sites/Descent/DescentDataDoublePrime.lean diff --git a/Mathlib.lean b/Mathlib.lean index 594eb7546ef665..3bc4838ed16bad 100644 --- a/Mathlib.lean +++ b/Mathlib.lean @@ -2470,6 +2470,7 @@ import Mathlib.CategoryTheory.Sites.DenseSubsite.InducedTopology import Mathlib.CategoryTheory.Sites.DenseSubsite.SheafEquiv import Mathlib.CategoryTheory.Sites.Descent.DescentData import Mathlib.CategoryTheory.Sites.Descent.DescentDataAsCoalgebra +import Mathlib.CategoryTheory.Sites.Descent.DescentDataDoublePrime import Mathlib.CategoryTheory.Sites.Descent.DescentDataPrime import Mathlib.CategoryTheory.Sites.Descent.IsPrestack import Mathlib.CategoryTheory.Sites.Descent.IsStack diff --git a/Mathlib/CategoryTheory/Bicategory/Adjunction/Adj.lean b/Mathlib/CategoryTheory/Bicategory/Adjunction/Adj.lean index 47ca9d84b87d4d..1d4a77f94263e4 100644 --- a/Mathlib/CategoryTheory/Bicategory/Adjunction/Adj.lean +++ b/Mathlib/CategoryTheory/Bicategory/Adjunction/Adj.lean @@ -305,7 +305,7 @@ section variable {α β γ : a ⟶ b} @[simp, reassoc] lemma comp_τf (x : α ⟶ β) (y : β ⟶ γ) : (x ≫ y).τf = x.τf ≫ y.τf := rfl -@[simp, reassoc] lemma comp_τg (x : α ⟶ β) (y : β ⟶ γ) : (x ≫ y).τf = x.τf ≫ y.τf := rfl +@[simp, reassoc] lemma comp_τg (x : α ⟶ β) (y : β ⟶ γ) : (x ≫ y).τg = y.τg ≫ x.τg := rfl end @@ -395,6 +395,20 @@ def forget₂ : Pseudofunctor (Adj B)ᵒᵖ B where mapId _ := Iso.refl _ mapComp _ _ := Iso.refl _ +@[simps] +def fIso {a b : Adj B} {adj₁ adj₂ : a ⟶ b} (e : adj₁ ≅ adj₂) : adj₁.f ≅ adj₂.f where + hom := e.hom.τf + inv := e.inv.τf + hom_inv_id := by rw [← comp_τf, e.hom_inv_id, id_τf] + inv_hom_id := by rw [← comp_τf, e.inv_hom_id, id_τf] + +@[simps] +def gIso {a b : Adj B} {adj₁ adj₂ : a ⟶ b} (e : adj₁ ≅ adj₂) : adj₁.g ≅ adj₂.g where + hom := e.inv.τg + inv := e.hom.τg + hom_inv_id := by rw [← comp_τg, e.hom_inv_id, id_τg] + inv_hom_id := by rw [← comp_τg, e.inv_hom_id, id_τg] + end Adj end Bicategory diff --git a/Mathlib/CategoryTheory/Sites/Descent/DescentDataDoublePrime.lean b/Mathlib/CategoryTheory/Sites/Descent/DescentDataDoublePrime.lean new file mode 100644 index 00000000000000..ad5e273f0f8116 --- /dev/null +++ b/Mathlib/CategoryTheory/Sites/Descent/DescentDataDoublePrime.lean @@ -0,0 +1,83 @@ +/- +Copyright (c) 2025 Joël Riou. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Joël Riou, Christian Merten +-/ +import Mathlib.CategoryTheory.Sites.Descent.DescentDataPrime +import Mathlib.CategoryTheory.Sites.Descent.DescentDataAsCoalgebra +import Mathlib.CategoryTheory.Bicategory.Adjunction.Adj + +/-! +# Descent data ... + +-/ + +namespace CategoryTheory + +open Opposite Limits Bicategory + +namespace Pseudofunctor + +open LocallyDiscreteOpToCat + +variable {C : Type*} [Category C] (F : Pseudofunctor (LocallyDiscrete Cᵒᵖ) (Adj Cat)) + {ι : Type*} {S : C} {X : ι → C} {f : ∀ i, X i ⟶ S} + (sq : ∀ i j, ChosenPullback (f i) (f j)) + (sq₃ : ∀ (i₁ i₂ i₃ : ι), ChosenPullback₃ (sq i₁ i₂) (sq i₂ i₃) (sq i₁ i₃)) + +namespace DescentData'' + +variable {F sq} +section + +variable {obj : ∀ (i : ι), (F.obj (.mk (op (X i)))).obj} + (hom : ∀ (i₁ i₂ : ι), obj i₁ ⟶ (F.map (sq i₁ i₂).p₁.op.toLoc).g.obj + ((F.map (sq i₁ i₂).p₂.op.toLoc).f.obj (obj i₂))) + +def homComp (i₁ i₂ i₃ : ι) : obj i₁ ⟶ (F.map (sq₃ i₁ i₂ i₃).p₁.op.toLoc).g.obj + ((F.map (sq₃ i₁ i₂ i₃).p₃.op.toLoc).f.obj (obj i₃)) := + hom i₁ i₂ ≫ (F.map (sq i₁ i₂).p₁.op.toLoc).g.map + ((F.map (sq i₁ i₂).p₂.op.toLoc).f.map (hom i₂ i₃)) ≫ + (F.map (sq i₁ i₂).p₁.op.toLoc).g.map + ((F.baseChange (sq₃ i₁ i₂ i₃).isPullback₂.toCommSq.flip.op.toLoc).app _) ≫ + (Adj.gIso (F.mapComp' (sq i₁ i₂).p₁.op.toLoc (sq₃ i₁ i₂ i₃).p₁₂.op.toLoc + (sq₃ i₁ i₂ i₃).p₁.op.toLoc (by aesoptoloc))).inv.app _ ≫ + (F.map (sq₃ i₁ i₂ i₃).p₁.op.toLoc).g.map + ((Adj.fIso (F.mapComp' (sq i₂ i₃).p₂.op.toLoc (sq₃ i₁ i₂ i₃).p₂₃.op.toLoc + (sq₃ i₁ i₂ i₃).p₃.op.toLoc (by aesoptoloc))).inv.app _) + +end + +section + +variable {X₁₂ X₁ X₂ : C} + {obj₁ : (F.obj (.mk (op X₁))).obj} {obj₂ : (F.obj (.mk (op X₂))).obj} + {p₁ : X₁₂ ⟶ X₁} {p₂ : X₁₂ ⟶ X₂} + (hom : obj₁ ⟶ (F.map p₁.op.toLoc).g.obj ((F.map p₂.op.toLoc).f.obj obj₂)) + +def pullHom'' ⦃Y₁₂ : C⦄ (p₁₂ : Y₁₂ ⟶ X₁₂) (q₁ : Y₁₂ ⟶ X₁) (q₂ : Y₁₂ ⟶ X₂) + (hq₁ : p₁₂ ≫ p₁ = q₁ := by aesop_cat) (hq₂ : p₁₂ ≫ p₂ = q₂ := by aesop_cat) : + obj₁ ⟶ (F.map q₁.op.toLoc).g.obj ((F.map q₂.op.toLoc).f.obj obj₂) := + hom ≫ (F.map p₁.op.toLoc).g.map ((F.map p₁₂.op.toLoc).adj.unit.app _) ≫ + (Adj.gIso (F.mapComp' p₁.op.toLoc p₁₂.op.toLoc q₁.op.toLoc (by aesoptoloc))).inv.app _ ≫ + (F.map q₁.op.toLoc).g.map + ((Adj.fIso (F.mapComp' p₂.op.toLoc p₁₂.op.toLoc q₂.op.toLoc (by aesoptoloc))).inv.app _) + +end + +end DescentData'' + +open DescentData'' in +structure DescentData'' where + obj (i : ι) : (F.obj (.mk (op (X i)))).obj + hom (i₁ i₂ : ι) : obj i₁ ⟶ + (F.map (sq i₁ i₂).p₁.op.toLoc).g.obj + ((F.map (sq i₁ i₂).p₂.op.toLoc).f.obj (obj i₂)) + hom_self (i : ι) (δ : (sq i i).Diagonal) : + pullHom'' (hom i i) δ.f (𝟙 _) (𝟙 _) = (F.map (𝟙 (.mk (op (X i))))).adj.unit.app _ + hom_comp (i₁ i₂ i₃ : ι) : + homComp sq₃ hom i₁ i₂ i₃ = pullHom'' (hom i₁ i₃) (sq₃ i₁ i₂ i₃).p₁₃ _ _ + +end Pseudofunctor + +end CategoryTheory From 01e72e5f115dbd7d7b3bf1a822ac155c0b829041 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=ABl=20Riou?= Date: Fri, 16 May 2025 13:10:16 +0200 Subject: [PATCH 085/118] phrased four iff lemmas --- .../Sites/Descent/DescentDataDoublePrime.lean | 74 +++++++++++++++++++ 1 file changed, 74 insertions(+) diff --git a/Mathlib/CategoryTheory/Sites/Descent/DescentDataDoublePrime.lean b/Mathlib/CategoryTheory/Sites/Descent/DescentDataDoublePrime.lean index ad5e273f0f8116..eb74b0adce17ad 100644 --- a/Mathlib/CategoryTheory/Sites/Descent/DescentDataDoublePrime.lean +++ b/Mathlib/CategoryTheory/Sites/Descent/DescentDataDoublePrime.lean @@ -78,6 +78,80 @@ structure DescentData'' where hom_comp (i₁ i₂ i₃ : ι) : homComp sq₃ hom i₁ i₂ i₃ = pullHom'' (hom i₁ i₃) (sq₃ i₁ i₂ i₃).p₁₃ _ _ +namespace DescentData'' + +variable {F} {sq} {obj : ∀ (i : ι), (F.obj (.mk (op (X i)))).obj} + (hom : ∀ i₁ i₂, obj i₁ ⟶ (F.map (sq i₁ i₂).p₁.op.toLoc).g.obj + ((F.map (sq i₁ i₂).p₂.op.toLoc).f.obj (obj i₂))) + +section + +def dataEquivDescentData' : + (∀ i₁ i₂, obj i₁ ⟶ (F.map (sq i₁ i₂).p₁.op.toLoc).g.obj + ((F.map (sq i₁ i₂).p₂.op.toLoc).f.obj (obj i₂))) ≃ + (∀ i₁ i₂, (F.map (sq i₁ i₂).p₁.op.toLoc).f.obj (obj i₁) ⟶ + (F.map (sq i₁ i₂).p₂.op.toLoc).f.obj (obj i₂)) := + Equiv.piCongrRight (fun i₁ ↦ Equiv.piCongrRight (fun i₂ ↦ + (((F.map (sq i₁ i₂).p₁.op.toLoc).adj.toCategory).homEquiv _ _).symm)) + +lemma hom_self_iff_dataEquivDescentData' : + (∀ (i : ι) (δ : (sq i i).Diagonal), + pullHom'' (hom i i) δ.f (𝟙 _) (𝟙 _) = (F.map (𝟙 (.mk (op (X i))))).adj.unit.app _) ↔ + ∀ (i : ι), DescentData'.pullHom' (F := F.comp Adj.forget₁) + (dataEquivDescentData' hom) (f i) (𝟙 (X i)) (𝟙 (X i)) = 𝟙 _ := by + refine forall_congr' (fun i ↦ ?_) + sorry + +lemma hom_comp_iff_dataEquivDescentData' : + (∀ i₁ i₂ i₃, homComp sq₃ hom i₁ i₂ i₃ = pullHom'' (hom i₁ i₃) (sq₃ i₁ i₂ i₃).p₁₃ _ _) ↔ + ∀ (i₁ i₂ i₃ : ι), + DescentData'.pullHom' (F := F.comp Adj.forget₁) + (dataEquivDescentData' hom) (sq₃ i₁ i₂ i₃).p (sq₃ i₁ i₂ i₃).p₁ (sq₃ i₁ i₂ i₃).p₂ ≫ + DescentData'.pullHom' + (dataEquivDescentData' hom) (sq₃ i₁ i₂ i₃).p (sq₃ i₁ i₂ i₃).p₂ (sq₃ i₁ i₂ i₃).p₃ = + DescentData'.pullHom' + (dataEquivDescentData' hom) (sq₃ i₁ i₂ i₃).p (sq₃ i₁ i₂ i₃).p₁ (sq₃ i₁ i₂ i₃).p₃ := by + refine forall_congr' (fun i₁ ↦ forall_congr' (fun i₂ ↦ forall_congr' (fun i₃ ↦ ?_))) + sorry + +end + +section + +variable [∀ i₁ i₂, IsIso (F.baseChange (sq i₁ i₂).isPullback.toCommSq.flip.op.toLoc)] +-- should require the same for `(sq₃ i₁ i₂ i₃).isPullback₂`. + +noncomputable def dataEquivCoalgebra + [∀ i₁ i₂, IsIso (F.baseChange (sq i₁ i₂).isPullback.toCommSq.flip.op.toLoc)] : + (∀ i₁ i₂, obj i₁ ⟶ (F.map (sq i₁ i₂).p₁.op.toLoc).g.obj + ((F.map (sq i₁ i₂).p₂.op.toLoc).f.obj (obj i₂))) ≃ + (∀ i₁ i₂, obj i₁ ⟶ (F.map (f i₁).op.toLoc).f.obj ((F.map (f i₂).op.toLoc).g.obj (obj i₂))) := + Equiv.piCongrRight (fun i₁ ↦ Equiv.piCongrRight (fun i₂ ↦ + Iso.homCongr (Iso.refl _) + ((asIso (F.baseChange (sq i₁ i₂).isPullback.toCommSq.flip.op.toLoc)).symm.app _))) + +lemma hom_self_iff_dataEquivCoalgebra : + (∀ (i : ι) (δ : (sq i i).Diagonal), + pullHom'' (hom i i) δ.f (𝟙 _) (𝟙 _) = (F.map (𝟙 (.mk (op (X i))))).adj.unit.app _) ↔ + ∀ i, dataEquivCoalgebra hom i i ≫ (F.map (f i).op.toLoc).adj.counit.app _ = 𝟙 _ := by + refine forall_congr' (fun i ↦ ?_) + sorry + +lemma hom_comp_iff_dataEquivCoalgebra : + (∀ i₁ i₂ i₃, homComp sq₃ hom i₁ i₂ i₃ = pullHom'' (hom i₁ i₃) (sq₃ i₁ i₂ i₃).p₁₃ _ _) ↔ + ∀ (i₁ i₂ i₃ : ι), + dataEquivCoalgebra hom i₁ i₂ ≫ (F.map (f i₁).op.toLoc).f.map + ((F.map (f i₂).op.toLoc).g.map (dataEquivCoalgebra hom i₂ i₃)) = + dataEquivCoalgebra hom i₁ i₃ ≫ + (F.map (f i₁).op.toLoc).f.map ((F.map (f i₂).op.toLoc).adj.unit.app _) := by + refine forall_congr' (fun i₁ ↦ forall_congr' (fun i₂ ↦ forall_congr' (fun i₃ ↦ ?_))) + sorry + + +end + +end DescentData'' + end Pseudofunctor end CategoryTheory From 845462268d8a81b0fd45ecaa310a8666cf13b605 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=ABl=20Riou?= Date: Fri, 16 May 2025 14:16:35 +0200 Subject: [PATCH 086/118] reduced a sorry to a compatibility lemma --- .../Sites/Descent/DescentDataDoublePrime.lean | 31 ++++++++++++++++++- .../Sites/Descent/PullbackStruct.lean | 22 +++++++++++++ 2 files changed, 52 insertions(+), 1 deletion(-) diff --git a/Mathlib/CategoryTheory/Sites/Descent/DescentDataDoublePrime.lean b/Mathlib/CategoryTheory/Sites/Descent/DescentDataDoublePrime.lean index eb74b0adce17ad..a6b1a5f54e9ba3 100644 --- a/Mathlib/CategoryTheory/Sites/Descent/DescentDataDoublePrime.lean +++ b/Mathlib/CategoryTheory/Sites/Descent/DescentDataDoublePrime.lean @@ -65,6 +65,18 @@ def pullHom'' ⦃Y₁₂ : C⦄ (p₁₂ : Y₁₂ ⟶ X₁₂) (q₁ : Y₁₂ end +lemma homEquiv_symm_pullHom' ⦃X₁ X₂ : C⦄ + ⦃obj₁ : (F.obj (.mk (op X₁))).obj⦄ ⦃obj₂ : (F.obj (.mk (op X₂))).obj⦄ + ⦃X₁₂ : C⦄ ⦃p₁ : X₁₂ ⟶ X₁⦄ ⦃p₂ : X₁₂ ⟶ X₂⦄ + (hom : obj₁ ⟶ (F.map p₁.op.toLoc).g.obj ((F.map p₂.op.toLoc).f.obj obj₂)) + ⦃Y₁₂ : C⦄ (g : Y₁₂ ⟶ X₁₂) (gp₁ : Y₁₂ ⟶ X₁) (gp₂ : Y₁₂ ⟶ X₂) + (hgp₁ : g ≫ p₁ = gp₁) (hgp₂ : g ≫ p₂ = gp₂) : + ((F.map gp₁.op.toLoc).adj.toCategory.homEquiv _ _ ).symm + (pullHom'' hom g gp₁ gp₂ hgp₁ hgp₂) = + pullHom (F := F.comp Adj.forget₁) + ((((F.map p₁.op.toLoc).adj.toCategory).homEquiv _ _ ).symm hom) g gp₁ gp₂ hgp₁ hgp₂ := by + sorry + end DescentData'' open DescentData'' in @@ -94,13 +106,30 @@ def dataEquivDescentData' : Equiv.piCongrRight (fun i₁ ↦ Equiv.piCongrRight (fun i₂ ↦ (((F.map (sq i₁ i₂).p₁.op.toLoc).adj.toCategory).homEquiv _ _).symm)) + lemma hom_self_iff_dataEquivDescentData' : (∀ (i : ι) (δ : (sq i i).Diagonal), pullHom'' (hom i i) δ.f (𝟙 _) (𝟙 _) = (F.map (𝟙 (.mk (op (X i))))).adj.unit.app _) ↔ ∀ (i : ι), DescentData'.pullHom' (F := F.comp Adj.forget₁) (dataEquivDescentData' hom) (f i) (𝟙 (X i)) (𝟙 (X i)) = 𝟙 _ := by refine forall_congr' (fun i ↦ ?_) - sorry + have δ : (sq i i).Diagonal := Classical.arbitrary _ + trans ((F.map (𝟙 (.mk (op (X i))))).adj.toCategory.homEquiv _ _).symm + (pullHom'' (hom i i) δ.f (𝟙 (X i)) (𝟙 (X i))) = 𝟙 _ + · dsimp + rw [← Adjunction.toCategory_unit, ← Adjunction.homEquiv_id, + Equiv.apply_eq_iff_eq_symm_apply] + constructor + · intro h + rw [h, Equiv.symm_symm] + · intro h δ' + obtain rfl := Subsingleton.elim δ δ' + exact h + · convert Iff.rfl using 2 + have := homEquiv_symm_pullHom' (hom _ _) δ.f (𝟙 _) (𝟙 _) (by simp) (by simp) + dsimp at this ⊢ + rw [this] + apply DescentData'.pullHom'_eq_pullHom <;> simp lemma hom_comp_iff_dataEquivDescentData' : (∀ i₁ i₂ i₃, homComp sq₃ hom i₁ i₂ i₃ = pullHom'' (hom i₁ i₃) (sq₃ i₁ i₂ i₃).p₁₃ _ _) ↔ diff --git a/Mathlib/CategoryTheory/Sites/Descent/PullbackStruct.lean b/Mathlib/CategoryTheory/Sites/Descent/PullbackStruct.lean index a3c1bf4988d8cb..0021a99c6b2a78 100644 --- a/Mathlib/CategoryTheory/Sites/Descent/PullbackStruct.lean +++ b/Mathlib/CategoryTheory/Sites/Descent/PullbackStruct.lean @@ -79,6 +79,26 @@ include l in lemma w : g₁ ≫ f₁ = g₂ ≫ f₂ := by simp only [← l.f_p₁, ← l.f_p₂, Category.assoc, h.w] +instance : Subsingleton (h.LiftStruct g₁ g₂ b) where + allEq := by + rintro ⟨f, f_p₁, f_p₂, _⟩ ⟨f', f'_p₁, f'_p₂, _⟩ + obtain rfl : f = f' := by + apply h.isPullback.hom_ext + · rw [f_p₁, f'_p₁] + · rw [f_p₂, f'_p₂] + rfl + +lemma nonempty (w : g₁ ≫ f₁ = g₂ ≫ f₂) (hf₁ : g₁ ≫ f₁ = b) : + Nonempty (h.LiftStruct g₁ g₂ b) := by + obtain ⟨l, h₁, h₂⟩ := h.isPullback.exists_lift g₁ g₂ w + exact ⟨{ + f := l + f_p₁ := h₁ + f_p₂ := h₂ + f_p := by + rw [← h.hp₁, ← hf₁, reassoc_of% h₁] + }⟩ + end LiftStruct end @@ -87,6 +107,8 @@ variable {X S : C} {f : X ⟶ S} (h : ChosenPullback f f) abbrev Diagonal := h.LiftStruct (𝟙 X) (𝟙 X) f +instance : Nonempty h.Diagonal := by apply LiftStruct.nonempty <;> aesop + end ChosenPullback variable {X₁ X₂ X₃ S : C} {f₁ : X₁ ⟶ S} {f₂ : X₂ ⟶ S} {f₃ : X₃ ⟶ S} From aa806e0bba2b971962e68851d3f394535a9e801e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=ABl=20Riou?= Date: Fri, 16 May 2025 14:17:10 +0200 Subject: [PATCH 087/118] whitespace --- .../Sites/Descent/DescentDataDoublePrime.lean | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/Mathlib/CategoryTheory/Sites/Descent/DescentDataDoublePrime.lean b/Mathlib/CategoryTheory/Sites/Descent/DescentDataDoublePrime.lean index a6b1a5f54e9ba3..c26a63487e674a 100644 --- a/Mathlib/CategoryTheory/Sites/Descent/DescentDataDoublePrime.lean +++ b/Mathlib/CategoryTheory/Sites/Descent/DescentDataDoublePrime.lean @@ -71,10 +71,9 @@ lemma homEquiv_symm_pullHom' ⦃X₁ X₂ : C⦄ (hom : obj₁ ⟶ (F.map p₁.op.toLoc).g.obj ((F.map p₂.op.toLoc).f.obj obj₂)) ⦃Y₁₂ : C⦄ (g : Y₁₂ ⟶ X₁₂) (gp₁ : Y₁₂ ⟶ X₁) (gp₂ : Y₁₂ ⟶ X₂) (hgp₁ : g ≫ p₁ = gp₁) (hgp₂ : g ≫ p₂ = gp₂) : - ((F.map gp₁.op.toLoc).adj.toCategory.homEquiv _ _ ).symm - (pullHom'' hom g gp₁ gp₂ hgp₁ hgp₂) = - pullHom (F := F.comp Adj.forget₁) - ((((F.map p₁.op.toLoc).adj.toCategory).homEquiv _ _ ).symm hom) g gp₁ gp₂ hgp₁ hgp₂ := by + ((F.map gp₁.op.toLoc).adj.toCategory.homEquiv _ _ ).symm (pullHom'' hom g gp₁ gp₂ hgp₁ hgp₂) = + pullHom (F := F.comp Adj.forget₁) + ((((F.map p₁.op.toLoc).adj.toCategory).homEquiv _ _ ).symm hom) g gp₁ gp₂ hgp₁ hgp₂ := by sorry end DescentData'' From cd098d0e2db89b83b7e838616b8f7ec6a75db053 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=ABl=20Riou?= Date: Fri, 16 May 2025 14:50:51 +0200 Subject: [PATCH 088/118] wip --- .../CategoryTheory/Sites/Descent/DescentDataDoublePrime.lean | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Mathlib/CategoryTheory/Sites/Descent/DescentDataDoublePrime.lean b/Mathlib/CategoryTheory/Sites/Descent/DescentDataDoublePrime.lean index c26a63487e674a..201ea36bedc739 100644 --- a/Mathlib/CategoryTheory/Sites/Descent/DescentDataDoublePrime.lean +++ b/Mathlib/CategoryTheory/Sites/Descent/DescentDataDoublePrime.lean @@ -74,6 +74,10 @@ lemma homEquiv_symm_pullHom' ⦃X₁ X₂ : C⦄ ((F.map gp₁.op.toLoc).adj.toCategory.homEquiv _ _ ).symm (pullHom'' hom g gp₁ gp₂ hgp₁ hgp₂) = pullHom (F := F.comp Adj.forget₁) ((((F.map p₁.op.toLoc).adj.toCategory).homEquiv _ _ ).symm hom) g gp₁ gp₂ hgp₁ hgp₂ := by + rw [Adjunction.homEquiv_counit, Adjunction.homEquiv_counit] + dsimp [pullHom'', pullHom] + simp only [Functor.map_comp, Category.assoc] + -- needs simp lemma for `((F.comp Adj.forget₁).mapComp' _ _ _).hom/inv.app`. sorry end DescentData'' From 44747093792cb13f412134ee8b05f95916de804e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=ABl=20Riou?= Date: Fri, 16 May 2025 16:51:50 +0200 Subject: [PATCH 089/118] better syntax --- .../Sites/Descent/DescentDataDoublePrime.lean | 59 +++++++------------ 1 file changed, 21 insertions(+), 38 deletions(-) diff --git a/Mathlib/CategoryTheory/Sites/Descent/DescentDataDoublePrime.lean b/Mathlib/CategoryTheory/Sites/Descent/DescentDataDoublePrime.lean index 201ea36bedc739..66f73c1f89d830 100644 --- a/Mathlib/CategoryTheory/Sites/Descent/DescentDataDoublePrime.lean +++ b/Mathlib/CategoryTheory/Sites/Descent/DescentDataDoublePrime.lean @@ -109,41 +109,29 @@ def dataEquivDescentData' : Equiv.piCongrRight (fun i₁ ↦ Equiv.piCongrRight (fun i₂ ↦ (((F.map (sq i₁ i₂).p₁.op.toLoc).adj.toCategory).homEquiv _ _).symm)) - -lemma hom_self_iff_dataEquivDescentData' : - (∀ (i : ι) (δ : (sq i i).Diagonal), - pullHom'' (hom i i) δ.f (𝟙 _) (𝟙 _) = (F.map (𝟙 (.mk (op (X i))))).adj.unit.app _) ↔ - ∀ (i : ι), DescentData'.pullHom' (F := F.comp Adj.forget₁) +lemma hom_self_iff_dataEquivDescentData' ⦃i : ι⦄ (δ : (sq i i).Diagonal) : + pullHom'' (hom i i) δ.f (𝟙 _) (𝟙 _) = (F.map (𝟙 (.mk (op (X i))))).adj.unit.app _ ↔ + DescentData'.pullHom' (F := F.comp Adj.forget₁) (dataEquivDescentData' hom) (f i) (𝟙 (X i)) (𝟙 (X i)) = 𝟙 _ := by - refine forall_congr' (fun i ↦ ?_) - have δ : (sq i i).Diagonal := Classical.arbitrary _ trans ((F.map (𝟙 (.mk (op (X i))))).adj.toCategory.homEquiv _ _).symm (pullHom'' (hom i i) δ.f (𝟙 (X i)) (𝟙 (X i))) = 𝟙 _ · dsimp rw [← Adjunction.toCategory_unit, ← Adjunction.homEquiv_id, - Equiv.apply_eq_iff_eq_symm_apply] - constructor - · intro h - rw [h, Equiv.symm_symm] - · intro h δ' - obtain rfl := Subsingleton.elim δ δ' - exact h + Equiv.apply_eq_iff_eq_symm_apply, Equiv.symm_symm] · convert Iff.rfl using 2 have := homEquiv_symm_pullHom' (hom _ _) δ.f (𝟙 _) (𝟙 _) (by simp) (by simp) dsimp at this ⊢ rw [this] apply DescentData'.pullHom'_eq_pullHom <;> simp -lemma hom_comp_iff_dataEquivDescentData' : - (∀ i₁ i₂ i₃, homComp sq₃ hom i₁ i₂ i₃ = pullHom'' (hom i₁ i₃) (sq₃ i₁ i₂ i₃).p₁₃ _ _) ↔ - ∀ (i₁ i₂ i₃ : ι), - DescentData'.pullHom' (F := F.comp Adj.forget₁) - (dataEquivDescentData' hom) (sq₃ i₁ i₂ i₃).p (sq₃ i₁ i₂ i₃).p₁ (sq₃ i₁ i₂ i₃).p₂ ≫ - DescentData'.pullHom' - (dataEquivDescentData' hom) (sq₃ i₁ i₂ i₃).p (sq₃ i₁ i₂ i₃).p₂ (sq₃ i₁ i₂ i₃).p₃ = - DescentData'.pullHom' - (dataEquivDescentData' hom) (sq₃ i₁ i₂ i₃).p (sq₃ i₁ i₂ i₃).p₁ (sq₃ i₁ i₂ i₃).p₃ := by - refine forall_congr' (fun i₁ ↦ forall_congr' (fun i₂ ↦ forall_congr' (fun i₃ ↦ ?_))) +lemma hom_comp_iff_dataEquivDescentData' (i₁ i₂ i₃ : ι) : + homComp sq₃ hom i₁ i₂ i₃ = pullHom'' (hom i₁ i₃) (sq₃ i₁ i₂ i₃).p₁₃ _ _ ↔ + DescentData'.pullHom' (F := F.comp Adj.forget₁) + (dataEquivDescentData' hom) (sq₃ i₁ i₂ i₃).p (sq₃ i₁ i₂ i₃).p₁ (sq₃ i₁ i₂ i₃).p₂ ≫ + DescentData'.pullHom' + (dataEquivDescentData' hom) (sq₃ i₁ i₂ i₃).p (sq₃ i₁ i₂ i₃).p₂ (sq₃ i₁ i₂ i₃).p₃ = + DescentData'.pullHom' + (dataEquivDescentData' hom) (sq₃ i₁ i₂ i₃).p (sq₃ i₁ i₂ i₃).p₁ (sq₃ i₁ i₂ i₃).p₃ := by sorry end @@ -162,24 +150,19 @@ noncomputable def dataEquivCoalgebra Iso.homCongr (Iso.refl _) ((asIso (F.baseChange (sq i₁ i₂).isPullback.toCommSq.flip.op.toLoc)).symm.app _))) -lemma hom_self_iff_dataEquivCoalgebra : - (∀ (i : ι) (δ : (sq i i).Diagonal), - pullHom'' (hom i i) δ.f (𝟙 _) (𝟙 _) = (F.map (𝟙 (.mk (op (X i))))).adj.unit.app _) ↔ - ∀ i, dataEquivCoalgebra hom i i ≫ (F.map (f i).op.toLoc).adj.counit.app _ = 𝟙 _ := by - refine forall_congr' (fun i ↦ ?_) +lemma hom_self_iff_dataEquivCoalgebra ⦃i : ι⦄ (δ : (sq i i).Diagonal): + pullHom'' (hom i i) δ.f (𝟙 _) (𝟙 _) = (F.map (𝟙 (.mk (op (X i))))).adj.unit.app _ ↔ + dataEquivCoalgebra hom i i ≫ (F.map (f i).op.toLoc).adj.counit.app _ = 𝟙 _ := by sorry -lemma hom_comp_iff_dataEquivCoalgebra : - (∀ i₁ i₂ i₃, homComp sq₃ hom i₁ i₂ i₃ = pullHom'' (hom i₁ i₃) (sq₃ i₁ i₂ i₃).p₁₃ _ _) ↔ - ∀ (i₁ i₂ i₃ : ι), - dataEquivCoalgebra hom i₁ i₂ ≫ (F.map (f i₁).op.toLoc).f.map - ((F.map (f i₂).op.toLoc).g.map (dataEquivCoalgebra hom i₂ i₃)) = - dataEquivCoalgebra hom i₁ i₃ ≫ - (F.map (f i₁).op.toLoc).f.map ((F.map (f i₂).op.toLoc).adj.unit.app _) := by - refine forall_congr' (fun i₁ ↦ forall_congr' (fun i₂ ↦ forall_congr' (fun i₃ ↦ ?_))) +lemma hom_comp_iff_dataEquivCoalgebra (i₁ i₂ i₃ : ι) : + homComp sq₃ hom i₁ i₂ i₃ = pullHom'' (hom i₁ i₃) (sq₃ i₁ i₂ i₃).p₁₃ _ _ ↔ + dataEquivCoalgebra hom i₁ i₂ ≫ (F.map (f i₁).op.toLoc).f.map + ((F.map (f i₂).op.toLoc).g.map (dataEquivCoalgebra hom i₂ i₃)) = + dataEquivCoalgebra hom i₁ i₃ ≫ + (F.map (f i₁).op.toLoc).f.map ((F.map (f i₂).op.toLoc).adj.unit.app _) := by sorry - end end DescentData'' From 0acc5cf70ad82471356f1fbf7824bc7b844acc9a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=ABl=20Riou?= Date: Fri, 16 May 2025 19:13:42 +0200 Subject: [PATCH 090/118] little progress --- .../Bicategory/Adjunction/Adj.lean | 8 ++++ .../Sites/Descent/DescentDataDoublePrime.lean | 46 ++++++++++++++++--- 2 files changed, 48 insertions(+), 6 deletions(-) diff --git a/Mathlib/CategoryTheory/Bicategory/Adjunction/Adj.lean b/Mathlib/CategoryTheory/Bicategory/Adjunction/Adj.lean index 1d4a77f94263e4..8aa2f6cd517d22 100644 --- a/Mathlib/CategoryTheory/Bicategory/Adjunction/Adj.lean +++ b/Mathlib/CategoryTheory/Bicategory/Adjunction/Adj.lean @@ -6,6 +6,7 @@ Authors: Joël Riou import Mathlib.CategoryTheory.Bicategory.Adjunction.Mate import Mathlib.CategoryTheory.Bicategory.Functor.Pseudofunctor import Mathlib.CategoryTheory.Bicategory.Opposite +import Mathlib.CategoryTheory.Bicategory.Functor.Strict /-! # The bicategory of adjunctions in a bicategory @@ -409,6 +410,13 @@ def gIso {a b : Adj B} {adj₁ adj₂ : a ⟶ b} (e : adj₁ ≅ adj₂) : adj hom_inv_id := by rw [← comp_τg, e.hom_inv_id, id_τg] inv_hom_id := by rw [← comp_τg, e.inv_hom_id, id_τg] +lemma comp_forget₁_mapComp' {B : Type*} [Bicategory B] (F : Pseudofunctor B (Adj Cat)) + {a b c : B} (f : a ⟶ b) (g : b ⟶ c) (fg : a ⟶ c) (hfg : f ≫ g = fg) : + (F.comp forget₁).mapComp' f g fg hfg = fIso (F.mapComp' f g fg hfg) := by + subst hfg + ext + simp [Pseudofunctor.mapComp'_eq_mapComp, forget₁] + end Adj end Bicategory diff --git a/Mathlib/CategoryTheory/Sites/Descent/DescentDataDoublePrime.lean b/Mathlib/CategoryTheory/Sites/Descent/DescentDataDoublePrime.lean index 66f73c1f89d830..50d840ac0bf64e 100644 --- a/Mathlib/CategoryTheory/Sites/Descent/DescentDataDoublePrime.lean +++ b/Mathlib/CategoryTheory/Sites/Descent/DescentDataDoublePrime.lean @@ -5,6 +5,7 @@ Authors: Joël Riou, Christian Merten -/ import Mathlib.CategoryTheory.Sites.Descent.DescentDataPrime import Mathlib.CategoryTheory.Sites.Descent.DescentDataAsCoalgebra +import Mathlib.CategoryTheory.Sites.Descent.IsStack import Mathlib.CategoryTheory.Bicategory.Adjunction.Adj /-! @@ -21,7 +22,19 @@ namespace Pseudofunctor open LocallyDiscreteOpToCat variable {C : Type*} [Category C] (F : Pseudofunctor (LocallyDiscrete Cᵒᵖ) (Adj Cat)) - {ι : Type*} {S : C} {X : ι → C} {f : ∀ i, X i ⟶ S} + +instance {X Y : C} (f : X ⟶ Y) [IsIso f] (F : Pseudofunctor (LocallyDiscrete C) (Adj Cat)) : + (F.map (.toLoc f)).f.IsEquivalence := by + change ((F.comp Adj.forget₁).map f.toLoc).IsEquivalence + infer_instance + +instance (X : LocallyDiscrete C) (F : Pseudofunctor (LocallyDiscrete C) (Adj Cat)) : + (F.map (𝟙 X)).f.IsEquivalence := by + obtain ⟨X⟩ := X + change (F.map (𝟙 X).toLoc).f.IsEquivalence + infer_instance + +variable {ι : Type*} {S : C} {X : ι → C} {f : ∀ i, X i ⟶ S} (sq : ∀ i j, ChosenPullback (f i) (f j)) (sq₃ : ∀ (i₁ i₂ i₃ : ι), ChosenPullback₃ (sq i₁ i₂) (sq i₂ i₃) (sq i₁ i₃)) @@ -65,7 +78,7 @@ def pullHom'' ⦃Y₁₂ : C⦄ (p₁₂ : Y₁₂ ⟶ X₁₂) (q₁ : Y₁₂ end -lemma homEquiv_symm_pullHom' ⦃X₁ X₂ : C⦄ +lemma homEquiv_symm_pullHom'' ⦃X₁ X₂ : C⦄ ⦃obj₁ : (F.obj (.mk (op X₁))).obj⦄ ⦃obj₂ : (F.obj (.mk (op X₂))).obj⦄ ⦃X₁₂ : C⦄ ⦃p₁ : X₁₂ ⟶ X₁⦄ ⦃p₂ : X₁₂ ⟶ X₂⦄ (hom : obj₁ ⟶ (F.map p₁.op.toLoc).g.obj ((F.map p₂.op.toLoc).f.obj obj₂)) @@ -76,8 +89,10 @@ lemma homEquiv_symm_pullHom' ⦃X₁ X₂ : C⦄ ((((F.map p₁.op.toLoc).adj.toCategory).homEquiv _ _ ).symm hom) g gp₁ gp₂ hgp₁ hgp₂ := by rw [Adjunction.homEquiv_counit, Adjunction.homEquiv_counit] dsimp [pullHom'', pullHom] - simp only [Functor.map_comp, Category.assoc] - -- needs simp lemma for `((F.comp Adj.forget₁).mapComp' _ _ _).hom/inv.app`. + simp only [Functor.map_comp, Category.assoc, Adj.comp_forget₁_mapComp', Adj.fIso_hom, + Adj.fIso_inv] + erw [← NatTrans.naturality_assoc] + congr 1 sorry end DescentData'' @@ -119,7 +134,7 @@ lemma hom_self_iff_dataEquivDescentData' ⦃i : ι⦄ (δ : (sq i i).Diagonal) : rw [← Adjunction.toCategory_unit, ← Adjunction.homEquiv_id, Equiv.apply_eq_iff_eq_symm_apply, Equiv.symm_symm] · convert Iff.rfl using 2 - have := homEquiv_symm_pullHom' (hom _ _) δ.f (𝟙 _) (𝟙 _) (by simp) (by simp) + have := homEquiv_symm_pullHom'' (hom _ _) δ.f (𝟙 _) (𝟙 _) (by simp) (by simp) dsimp at this ⊢ rw [this] apply DescentData'.pullHom'_eq_pullHom <;> simp @@ -153,7 +168,26 @@ noncomputable def dataEquivCoalgebra lemma hom_self_iff_dataEquivCoalgebra ⦃i : ι⦄ (δ : (sq i i).Diagonal): pullHom'' (hom i i) δ.f (𝟙 _) (𝟙 _) = (F.map (𝟙 (.mk (op (X i))))).adj.unit.app _ ↔ dataEquivCoalgebra hom i i ≫ (F.map (f i).op.toLoc).adj.counit.app _ = 𝟙 _ := by - sorry + obtain ⟨hom, rfl⟩ := dataEquivCoalgebra.symm.surjective hom + rw [Equiv.apply_symm_apply] + dsimp [dataEquivCoalgebra] + rw [Category.id_comp, + ← ((F.map (𝟙 (X i)).op.toLoc).adj.toCategory.homEquiv _ _ ).symm.injective.eq_iff, + homEquiv_symm_pullHom''] + dsimp + rw [← Adjunction.toCategory_unit, ← Adjunction.homEquiv_id, Equiv.symm_apply_apply] + trans (F.map (𝟙 { as := op (X i) })).f.map + (hom i i ≫ (F.map (f i).op.toLoc).adj.counit.app (obj i)) = 𝟙 _ ; swap + · rw [← Functor.map_id] + have : Functor.Faithful (F.map (𝟙 { as := op (X i) })).f := inferInstance + rw [Functor.map_injective_iff] + · convert Iff.rfl using 2 + dsimp [pullHom] + simp [Adjunction.homEquiv_counit] + erw [← NatTrans.naturality_assoc] + congr 1 + -- the equality no longer involves `hom` + sorry lemma hom_comp_iff_dataEquivCoalgebra (i₁ i₂ i₃ : ι) : homComp sq₃ hom i₁ i₂ i₃ = pullHom'' (hom i₁ i₃) (sq₃ i₁ i₂ i₃).p₁₃ _ _ ↔ From c57a15ef8bd7aa5558e49b705fd2cd5fa84502e4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=ABl=20Riou?= Date: Sat, 17 May 2025 11:43:21 +0200 Subject: [PATCH 091/118] little progress --- .../Sites/Descent/DescentDataDoublePrime.lean | 49 ++++++++++++++++++- 1 file changed, 47 insertions(+), 2 deletions(-) diff --git a/Mathlib/CategoryTheory/Sites/Descent/DescentDataDoublePrime.lean b/Mathlib/CategoryTheory/Sites/Descent/DescentDataDoublePrime.lean index 50d840ac0bf64e..121270a3bbc4e4 100644 --- a/Mathlib/CategoryTheory/Sites/Descent/DescentDataDoublePrime.lean +++ b/Mathlib/CategoryTheory/Sites/Descent/DescentDataDoublePrime.lean @@ -95,6 +95,48 @@ lemma homEquiv_symm_pullHom'' ⦃X₁ X₂ : C⦄ congr 1 sorry +section + +variable + ⦃X₁₂ X X S : C⦄ ⦃p₁ : X₁₂ ⟶ X⦄ ⦃p₂ : X₁₂ ⟶ X⦄ ⦃f : X ⟶ S⦄ + (sq : CommSq p₁ p₂ f f) (obj : (F.obj (.mk (op X))).obj) + +/-@[reassoc] +lemma map_baseChange_comp_counit' ⦃Y₁₂ : C⦄ (g : Y₁₂ ⟶ X₁₂) (gp : Y₁₂ ⟶ X) + (hgp₁ : g ≫ p₁ = gp) (hgp₂ : g ≫ p₂ = gp) : + (F.map g.op.toLoc).f.map + ((F.map p₁.op.toLoc).f.map ((F.baseChange sq.flip.op.toLoc).app obj)) ≫ + (F.map g.op.toLoc).f.map + ((F.map p₁.op.toLoc).adj.counit.app _) = + (F.mapComp' p₁.op.toLoc g.op.toLoc (gp.op.toLoc) (by aesoptoloc)).inv.τf.app + ((F.map f.op.toLoc).f.obj ((F.map f.op.toLoc).g.obj obj)) ≫ + (F.map gp.op.toLoc).f.map ((F.map f.op.toLoc).adj.counit.app _) ≫ + (F.mapComp' p₂.op.toLoc g.op.toLoc (gp.op.toLoc) (by aesoptoloc)).hom.τf.app obj := by + dsimp + sorry-/ + +@[reassoc] +lemma map_baseChange_comp_counit (g : X ⟶ X₁₂) (hg₁ : g ≫ p₁ = 𝟙 X) (hg₂ : g ≫ p₂ = 𝟙 X) : + (F.map g.op.toLoc).f.map + ((F.map p₁.op.toLoc).f.map ((F.baseChange sq.flip.op.toLoc).app obj)) ≫ + (F.map g.op.toLoc).f.map + ((F.map p₁.op.toLoc).adj.counit.app _) = + (F.mapComp' p₁.op.toLoc g.op.toLoc (𝟙 _) (by aesoptoloc)).inv.τf.app + ((F.map f.op.toLoc).f.obj ((F.map f.op.toLoc).g.obj obj)) ≫ + (F.map (𝟙 _)).f.map ((F.map f.op.toLoc).adj.counit.app _) ≫ + (F.mapComp' p₂.op.toLoc g.op.toLoc (𝟙 _) (by aesoptoloc)).hom.τf.app obj := by + have := NatTrans.congr_app + (F.whiskerRight_whiskerBaseChange_self_self _ _ _ sq.flip.op.toLoc g.op.toLoc (by aesoptoloc) + (by aesoptoloc)) obj + simp [Cat.associator_inv_app, Cat.associator_hom_app, Cat.leftUnitor_hom_app, + Adj.comp_forget₁_mapComp', whiskerBaseChange] at this + rw [this] + erw [← NatTrans.naturality_assoc] + rfl + +end + + end DescentData'' open DescentData'' in @@ -186,8 +228,11 @@ lemma hom_self_iff_dataEquivCoalgebra ⦃i : ι⦄ (δ : (sq i i).Diagonal): simp [Adjunction.homEquiv_counit] erw [← NatTrans.naturality_assoc] congr 1 - -- the equality no longer involves `hom` - sorry + simp [Adj.comp_forget₁_mapComp'] + rw [map_baseChange_comp_counit_assoc (sq i i).commSq (obj i) δ.f (by simp) (by simp)] + dsimp + rw [← Adj.fIso_hom, ← Adj.fIso_inv, Iso.hom_inv_id_app_assoc, + ← Adj.fIso_hom, ← Adj.fIso_inv, Iso.hom_inv_id_app, Category.comp_id] lemma hom_comp_iff_dataEquivCoalgebra (i₁ i₂ i₃ : ι) : homComp sq₃ hom i₁ i₂ i₃ = pullHom'' (hom i₁ i₃) (sq₃ i₁ i₂ i₃).p₁₃ _ _ ↔ From 4f6e4095ed4a0a04471e162152255aabb0202bf2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=ABl=20Riou?= Date: Sat, 17 May 2025 12:25:55 +0200 Subject: [PATCH 092/118] fixed a sorry --- .../Bicategory/Adjunction/BaseChange.lean | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/Mathlib/CategoryTheory/Bicategory/Adjunction/BaseChange.lean b/Mathlib/CategoryTheory/Bicategory/Adjunction/BaseChange.lean index b150d89ef2df83..d7b05c36eb00a6 100644 --- a/Mathlib/CategoryTheory/Bicategory/Adjunction/BaseChange.lean +++ b/Mathlib/CategoryTheory/Bicategory/Adjunction/BaseChange.lean @@ -258,7 +258,17 @@ lemma whiskerRight_whiskerBaseChange_self_self : PrelaxFunctorStruct.comp_toPrefunctor, Prefunctor.comp_obj, Adj.forget₁_obj, Prefunctor.comp_map, Adj.forget₁_map, Bicategory.whiskerLeft_comp, Category.assoc, comp_whiskerRight, leftUnitor_whiskerRight] - sorry + simp only [← Category.assoc]; congr 1; simp only [Category.assoc] + let a := ((F.map f).g ≫ (F.map f).f) ◁ ((F.comp Adj.forget₁).mapComp' r d (𝟙 X) hrd).inv ≫ + (F.map f).adj.counit ▷ _ + dsimp at a + trans 𝟙 _ ⊗≫ a ⊗≫ 𝟙 _ + · dsimp [a] + simp + simp [bicategoricalComp] -- why does not `bicategory` work?! + · dsimp [a] + rw [whisker_exchange] + simp [bicategoricalComp] end Codiag From 7d40313f80676a3e58faa115570522ff24944ba3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=ABl=20Riou?= Date: Sat, 17 May 2025 12:36:14 +0200 Subject: [PATCH 093/118] cleaning up --- .../Bicategory/Adjunction/BaseChange.lean | 20 +++++-------------- 1 file changed, 5 insertions(+), 15 deletions(-) diff --git a/Mathlib/CategoryTheory/Bicategory/Adjunction/BaseChange.lean b/Mathlib/CategoryTheory/Bicategory/Adjunction/BaseChange.lean index d7b05c36eb00a6..7fdd2dd14885c5 100644 --- a/Mathlib/CategoryTheory/Bicategory/Adjunction/BaseChange.lean +++ b/Mathlib/CategoryTheory/Bicategory/Adjunction/BaseChange.lean @@ -160,9 +160,6 @@ end Vertical section --- Never unfold the definition of `mateEquiv`, instead try to add general `mateEquiv` lemmas first. -attribute [-simp] Bicategory.mateEquiv_apply Bicategory.mateEquiv_symm_apply - lemma baseChange_self_self {S X Y : B} (f : S ⟶ X) (g : X ⟶ Y) : F.baseChange (l := f) (t := f) (b := g) (r := g) (by simp) = (F.map f).adj.counit ≫ (F.map g).adj.unit := by @@ -254,20 +251,13 @@ lemma whiskerRight_whiskerBaseChange_self_self : ((F.comp Adj.forget₁).mapComp' r d (𝟙 X) hrd).inv ≫ ((F.comp Adj.forget₁).mapComp' b d (𝟙 X) hbd).hom := by rw [F.whiskerRight_whiskerBaseChange sq _ _ _ hbd hrd, whiskerBaseChange_self_self] - simp only [comp_toPrelaxFunctor, PrelaxFunctor.comp_toPrelaxFunctorStruct, - PrelaxFunctorStruct.comp_toPrefunctor, Prefunctor.comp_obj, Adj.forget₁_obj, - Prefunctor.comp_map, Adj.forget₁_map, Bicategory.whiskerLeft_comp, Category.assoc, - comp_whiskerRight, leftUnitor_whiskerRight] - simp only [← Category.assoc]; congr 1; simp only [Category.assoc] let a := ((F.map f).g ≫ (F.map f).f) ◁ ((F.comp Adj.forget₁).mapComp' r d (𝟙 X) hrd).inv ≫ (F.map f).adj.counit ▷ _ - dsimp at a - trans 𝟙 _ ⊗≫ a ⊗≫ 𝟙 _ - · dsimp [a] - simp - simp [bicategoricalComp] -- why does not `bicategory` work?! - · dsimp [a] - rw [whisker_exchange] + let b := ((F.comp Adj.forget₁).mapComp' b d (𝟙 X) hbd).hom + dsimp at a b ⊢ + trans 𝟙 _ ⊗≫ a ⊗≫ b ⊗≫ 𝟙 _ <;> dsimp [a, b] + · simp [bicategoricalComp] -- why does not `bicategory` work?! + · rw [whisker_exchange] simp [bicategoricalComp] end Codiag From 7dfa42e9d8d9c5831ad3100c09cc0bee7119ea24 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=ABl=20Riou?= Date: Sat, 17 May 2025 14:58:48 +0200 Subject: [PATCH 094/118] commented unnecessary instance --- .../CategoryTheory/Bicategory/Adjunction/BaseChange.lean | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Mathlib/CategoryTheory/Bicategory/Adjunction/BaseChange.lean b/Mathlib/CategoryTheory/Bicategory/Adjunction/BaseChange.lean index 7fdd2dd14885c5..01dc24ffd51fd4 100644 --- a/Mathlib/CategoryTheory/Bicategory/Adjunction/BaseChange.lean +++ b/Mathlib/CategoryTheory/Bicategory/Adjunction/BaseChange.lean @@ -102,9 +102,9 @@ def whiskerBaseChange : (F.map l).g ≫ (F.map t).f ≫ (F.map r).f ⟶ (F.map b (α_ _ _ _).hom ≫ (F.map b).f ◁ (F.map r).adj.counit ≫ (ρ_ _).hom -- is this true? -instance [IsIso (F.baseChange sq)] : Mono (F.whiskerBaseChange sq) := by - dsimp [whiskerBaseChange] - sorry +--instance [IsIso (F.baseChange sq)] : Mono (F.whiskerBaseChange sq) := by +-- dsimp [whiskerBaseChange] +-- sorry section Horizontal From 29e7876995dc76d96b9c72f1ced6566c3e03740a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=ABl=20Riou?= Date: Sun, 18 May 2025 00:20:50 +0200 Subject: [PATCH 095/118] refactor(CategogyTheory/Bicategory/Adjunction): definition of mates --- .../Bicategory/Adjunction/Mate.lean | 169 +++++++++++------- 1 file changed, 105 insertions(+), 64 deletions(-) diff --git a/Mathlib/CategoryTheory/Bicategory/Adjunction/Mate.lean b/Mathlib/CategoryTheory/Bicategory/Adjunction/Mate.lean index 2484df94193291..21895be549c66d 100644 --- a/Mathlib/CategoryTheory/Bicategory/Adjunction/Mate.lean +++ b/Mathlib/CategoryTheory/Bicategory/Adjunction/Mate.lean @@ -1,7 +1,7 @@ /- Copyright (c) 2025 Yuma Mizuno. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. -Authors: Yuma Mizuno +Authors: Yuma Mizuno, Joël Riou -/ import Mathlib.CategoryTheory.Bicategory.Adjunction.Basic import Mathlib.CategoryTheory.HomCongr @@ -25,6 +25,16 @@ For the bicategory `Cat`, the definitions in this file are provided in `Mathlib/CategoryTheory/Adjunction/Mates.lean`, where you can find more detailed documentation about mates. + +## Implementation + +The correspondence between mates is obtained by combining +bijections of the form `(g ⟶ l ≫ h) ≃ (r ≫ g ⟶ h)` +and `(g ≫ l ⟶ h) ≃ (g ⟶ h ≫ r)` when `l ⊣ r` is an adjunction. +Indeed, `g ≫ l₂ ⟶ l₁ ≫ h` identifies to `g ⟶ (l₁ ≫ h) ≫ r₂` by using the +second bijection applied to `l₂ ⊣ r₂`, and this identifies to `r₁ ≫ g ⟶ h ≫ r₂` +by using the first bijection applied to `l₁ ⊣ r₁`. + ## Remarks To be precise, the definitions in `Mathlib/CategoryTheory/Adjunction/Mates.lean` are universe @@ -42,6 +52,66 @@ open Bicategory variable {B : Type u} [Bicategory.{w, v} B] +namespace Adjunction + +variable {a b c d : B} {l : b ⟶ c} {r : c ⟶ b} (adj : l ⊣ r) + +/-- The bijection `(g ⟶ l ≫ h) ≃ (r ≫ g ⟶ h)` induced by an adjunction +`l ⊣ r` in a bicategory. -/ +@[simps -isSimp] +def homEquiv₁ {g : b ⟶ d} {h : c ⟶ d} : (g ⟶ l ≫ h) ≃ (r ≫ g ⟶ h) where + toFun γ := r ◁ γ ≫ (α_ _ _ _).inv ≫ adj.counit ▷ h ≫ (λ_ _).hom + invFun β := (λ_ _).inv ≫ adj.unit ▷ _ ≫ (α_ _ _ _).hom ≫ l ◁ β + left_inv γ := + calc + _ = 𝟙 _ ⊗≫ (adj.unit ▷ g ≫ (l ≫ r) ◁ γ) ⊗≫ l ◁ adj.counit ▷ h ⊗≫ 𝟙 _:= by + bicategory + _ = γ ⊗≫ leftZigzag adj.unit adj.counit ▷ h ⊗≫ 𝟙 _ := by + rw [← whisker_exchange] + bicategory + _ = γ := by + rw [adj.left_triangle] + bicategory + right_inv β := by + calc + _ = 𝟙 _ ⊗≫ r ◁ adj.unit ▷ g ⊗≫ ((r ≫ l) ◁ β ≫ adj.counit ▷ h) ⊗≫ 𝟙 _ := by + bicategory + _ = 𝟙 _ ⊗≫ rightZigzag adj.unit adj.counit ▷ g ⊗≫ β := by + rw [whisker_exchange] + bicategory + _ = β := by + rw [adj.right_triangle] + bicategory + +/-- The bijection `(g ≫ l ⟶ h) ≃ (g ⟶ h ≫ r)` induced by an adjunction +`l ⊣ r` in a bicategory. -/ +@[simps -isSimp] +def homEquiv₂ {g : a ⟶ b} {h : a ⟶ c} : (g ≫ l ⟶ h) ≃ (g ⟶ h ≫ r) where + toFun α := (ρ_ _).inv ≫ g ◁ adj.unit ≫ (α_ _ _ _).inv ≫ α ▷ r + invFun γ := γ ▷ l ≫ (α_ _ _ _ ).hom ≫ h ◁ adj.counit ≫ (ρ_ _).hom + left_inv α := + calc + _ = 𝟙 _ ⊗≫ g ◁ adj.unit ▷ l ⊗≫ (α ▷ (r ≫ l) ≫ h ◁ adj.counit) ⊗≫ 𝟙 _ := by + bicategory + _ = 𝟙 _ ⊗≫ g ◁ leftZigzag adj.unit adj.counit ⊗≫ α := by + rw [← whisker_exchange] + bicategory + _ = α := by + rw [adj.left_triangle] + bicategory + right_inv γ := + calc + _ = 𝟙 _ ⊗≫ (g ◁ adj.unit ≫ γ ▷ (l ≫ r)) ⊗≫ h ◁ adj.counit ▷ r ⊗≫ 𝟙 _ := by + bicategory + _ = 𝟙 _ ⊗≫ γ ⊗≫ h ◁ rightZigzag adj.unit adj.counit ⊗≫ 𝟙 _ := by + rw [whisker_exchange] + bicategory + _ = γ := by + rw [adj.right_triangle] + bicategory + +end Adjunction + section mateEquiv variable {c d e f : B} {g : c ⟶ e} {h : d ⟶ f} {l₁ : c ⟶ d} {r₁ : d ⟶ c} {l₂ : e ⟶ f} {r₂ : f ⟶ e} @@ -65,58 +135,15 @@ Then we have a bijection between natural transformations `g ≫ l₂ ⟶ l₁ Note that if one of the transformations is an iso, it does not imply the other is an iso. -/ -@[simps] -def mateEquiv : (g ≫ l₂ ⟶ l₁ ≫ h) ≃ (r₁ ≫ g ⟶ h ≫ r₂) where - toFun α := 𝟙 _ ⊗≫ r₁ ◁ g ◁ adj₂.unit ⊗≫ r₁ ◁ α ▷ r₂ ⊗≫ adj₁.counit ▷ h ▷ r₂ ⊗≫ 𝟙 _ - invFun β := 𝟙 _ ⊗≫ adj₁.unit ▷ g ▷ l₂ ⊗≫ l₁ ◁ β ▷ l₂ ⊗≫ l₁ ◁ h ◁ adj₂.counit ⊗≫ 𝟙 _ - left_inv α := - calc - _ = 𝟙 _ ⊗≫ (adj₁.unit ▷ (g ≫ 𝟙 e) ≫ (l₁ ≫ r₁) ◁ g ◁ adj₂.unit) ▷ l₂ ⊗≫ - l₁ ◁ r₁ ◁ α ▷ r₂ ▷ l₂ ⊗≫ - l₁ ◁ (adj₁.counit ▷ h ▷ (r₂ ≫ l₂) ≫ (𝟙 d ≫ h) ◁ adj₂.counit) ⊗≫ 𝟙 _ := by - bicategory - _ = 𝟙 _ ⊗≫ g ◁ adj₂.unit ▷ l₂ ⊗≫ - (adj₁.unit ▷ (g ≫ l₂) ≫ (l₁ ≫ r₁) ◁ α) ▷ (r₂ ≫ l₂) ⊗≫ - l₁ ◁ (((r₁ ≫ l₁) ≫ h) ◁ adj₂.counit ≫ adj₁.counit ▷ h ▷ 𝟙 f) ⊗≫ 𝟙 _ := by - rw [← whisker_exchange, ← whisker_exchange] - bicategory - _ = 𝟙 _ ⊗≫ g ◁ adj₂.unit ▷ l₂ ⊗≫ α ▷ r₂ ▷ l₂ ⊗≫ - leftZigzag adj₁.unit adj₁.counit ▷ h ▷ r₂ ▷ l₂ ⊗≫ l₁ ◁ h ◁ adj₂.counit ⊗≫ 𝟙 _ := by - rw [← whisker_exchange, whisker_exchange _ adj₂.counit] - bicategory - _ = 𝟙 _ ⊗≫ g ◁ adj₂.unit ▷ l₂ ⊗≫ (α ▷ (r₂ ≫ l₂) ≫ (l₁ ≫ h) ◁ adj₂.counit) ⊗≫ 𝟙 _ := by - rw [adj₁.left_triangle] - bicategory - _ = 𝟙 _ ⊗≫ g ◁ (leftZigzag adj₂.unit adj₂.counit) ⊗≫ α ⊗≫ 𝟙 _ := by - rw [← whisker_exchange] - bicategory - _ = α := by - rw [adj₂.left_triangle] - bicategory - right_inv β := - calc - _ = 𝟙 _ ⊗≫ r₁ ◁ ((𝟙 c ≫ g) ◁ adj₂.unit ≫ adj₁.unit ▷ g ▷ (l₂ ≫ r₂)) ⊗≫ - r₁ ◁ l₁ ◁ β ▷ l₂ ▷ r₂ ⊗≫ - ((r₁ ≫ l₁) ◁ h ◁ adj₂.counit ≫ adj₁.counit ▷ (h ≫ 𝟙 f)) ▷ r₂ ⊗≫ 𝟙 _ := by - bicategory - _ = 𝟙 _ ⊗≫ r₁ ◁ (adj₁.unit ▷ g ▷ 𝟙 e ≫ ((l₁ ≫ r₁) ≫ g) ◁ adj₂.unit) ⊗≫ - ((r₁ ≫ l₁) ◁ β ≫ adj₁.counit ▷ (h ≫ r₂)) ▷ l₂ ▷ r₂ ⊗≫ - h ◁ adj₂.counit ▷ r₂ ⊗≫ 𝟙 _ := by - rw [whisker_exchange, whisker_exchange] - bicategory - _ = 𝟙 _ ⊗≫ r₁ ◁ g ◁ adj₂.unit ⊗≫ rightZigzag adj₁.unit adj₁.counit ▷ g ▷ l₂ ▷ r₂ ⊗≫ - β ▷ l₂ ▷ r₂ ⊗≫ h ◁ adj₂.counit ▷ r₂ ⊗≫ 𝟙 _ := by - rw [whisker_exchange, ← whisker_exchange _ adj₂.unit] - bicategory - _ = 𝟙 _ ⊗≫ ((r₁ ≫ g) ◁ adj₂.unit ≫ β ▷ (l₂ ≫ r₂)) ⊗≫ h ◁ adj₂.counit ▷ r₂ ⊗≫ 𝟙 _ := by - rw [adj₁.right_triangle] - bicategory - _ = 𝟙 _ ⊗≫ β ⊗≫ h ◁ rightZigzag adj₂.unit adj₂.counit ⊗≫ 𝟙 _ := by - rw [whisker_exchange] - bicategory - _ = β := by - rw [adj₂.right_triangle] - bicategory +@[simps! -isSimp] +def mateEquiv : (g ≫ l₂ ⟶ l₁ ≫ h) ≃ (r₁ ≫ g ⟶ h ≫ r₂) := + adj₂.homEquiv₂.trans ((Iso.homCongr (Iso.refl _) (α_ _ _ _)).trans adj₁.homEquiv₁) + +lemma mateEquiv_eq_iff (α : g ≫ l₂ ⟶ l₁ ≫ h) (β : r₁ ≫ g ⟶ h ≫ r₂) : + mateEquiv adj₁ adj₂ α = β ↔ + adj₁.homEquiv₁.symm β = adj₂.homEquiv₂ α ≫ (α_ _ _ _).hom := by + conv_lhs => rw [eq_comm, ← adj₁.homEquiv₁.symm.injective.eq_iff'] + rw [mateEquiv_apply, Equiv.symm_apply_apply] end mateEquiv @@ -140,7 +167,8 @@ def rightAdjointSquare.vcomp (α : r₁ ≫ g₁ ⟶ h₁ ≫ r₂) (β : r₂ theorem mateEquiv_vcomp (α : g₁ ≫ l₂ ⟶ l₁ ≫ h₁) (β : g₂ ≫ l₃ ⟶ l₂ ≫ h₂) : mateEquiv adj₁ adj₃ (leftAdjointSquare.vcomp α β) = rightAdjointSquare.vcomp (mateEquiv adj₁ adj₂ α) (mateEquiv adj₂ adj₃ β) := by - dsimp only [leftAdjointSquare.vcomp, mateEquiv_apply, rightAdjointSquare.vcomp] + simp only [leftAdjointSquare.vcomp, mateEquiv_apply, rightAdjointSquare.vcomp, + Adjunction.homEquiv₁_apply, Adjunction.homEquiv₂_apply] symm calc _ = 𝟙 _ ⊗≫ r₁ ◁ g₁ ◁ adj₂.unit ▷ g₂ ⊗≫ r₁ ◁ α ▷ r₂ ▷ g₂ ⊗≫ @@ -197,7 +225,8 @@ def rightAdjointSquare.hcomp (α : r₁ ≫ g ⟶ h ≫ r₂) (β : r₃ ≫ h theorem mateEquiv_hcomp (α : g ≫ l₂ ⟶ l₁ ≫ h) (β : h ≫ l₄ ⟶ l₃ ≫ k) : (mateEquiv (adj₁.comp adj₃) (adj₂.comp adj₄)) (leftAdjointSquare.hcomp α β) = rightAdjointSquare.hcomp (mateEquiv adj₁ adj₂ α) (mateEquiv adj₃ adj₄ β) := by - dsimp [mateEquiv, leftAdjointSquare.hcomp, rightAdjointSquare.hcomp] + dsimp [mateEquiv, leftAdjointSquare.hcomp, rightAdjointSquare.hcomp, + Adjunction.homEquiv₁_apply, Adjunction.homEquiv₂_apply] calc _ = 𝟙 _ ⊗≫ r₃ ◁ r₁ ◁ g ◁ adj₂.unit ⊗≫ r₃ ◁ r₁ ◁ ((g ≫ l₂) ◁ adj₄.unit ≫ α ▷ (l₄ ≫ r₄)) ▷ r₂ ⊗≫ @@ -328,7 +357,8 @@ theorem conjugateEquiv_apply' (α : l₂ ⟶ l₁) : conjugateEquiv adj₁ adj₂ α = (ρ_ _).inv ≫ r₁ ◁ adj₂.unit ≫ r₁ ◁ α ▷ r₂ ≫ (α_ _ _ _).inv ≫ adj₁.counit ▷ r₂ ≫ (λ_ _).hom := by - rw [conjugateEquiv_apply, mateEquiv_apply] + rw [conjugateEquiv_apply, mateEquiv_apply, + Adjunction.homEquiv₁_apply, Adjunction.homEquiv₂_apply] bicategory theorem conjugateEquiv_symm_apply (α : r₁ ⟶ r₂) : @@ -340,12 +370,14 @@ theorem conjugateEquiv_symm_apply' (α : r₁ ⟶ r₂) : (conjugateEquiv adj₁ adj₂).symm α = (λ_ _).inv ≫ adj₁.unit ▷ l₂ ≫ (α_ _ _ _).hom ≫ l₁ ◁ α ▷ l₂ ≫ l₁ ◁ adj₂.counit ≫ (ρ_ _).hom := by - rw [conjugateEquiv_symm_apply, mateEquiv_symm_apply] + rw [conjugateEquiv_symm_apply, mateEquiv_symm_apply, + Adjunction.homEquiv₁_symm_apply, Adjunction.homEquiv₂_symm_apply] bicategory @[simp] theorem conjugateEquiv_id : conjugateEquiv adj₁ adj₁ (𝟙 _) = 𝟙 _ := by - rw [conjugateEquiv_apply, mateEquiv_apply] + rw [conjugateEquiv_apply, mateEquiv_apply, Adjunction.homEquiv₁_apply, + Adjunction.homEquiv₂_apply] calc _ = 𝟙 _ ⊗≫ rightZigzag adj₁.unit adj₁.counit ⊗≫ 𝟙 _ := by bicategory @@ -359,12 +391,14 @@ theorem conjugateEquiv_symm_id : (conjugateEquiv adj₁ adj₁).symm (𝟙 _) = theorem conjugateEquiv_adjunction_id {l r : c ⟶ c} (adj : l ⊣ r) (α : 𝟙 c ⟶ l) : (conjugateEquiv adj (Adjunction.id c) α) = (ρ_ _).inv ≫ r ◁ α ≫ adj.counit := by - dsimp [conjugateEquiv, mateEquiv, Adjunction.id] + dsimp [conjugateEquiv, mateEquiv, Adjunction.id, Adjunction.homEquiv₁_apply, + Adjunction.homEquiv₂_apply] bicategory theorem conjugateEquiv_adjunction_id_symm {l r : c ⟶ c} (adj : l ⊣ r) (α : r ⟶ 𝟙 c) : (conjugateEquiv adj (Adjunction.id c)).symm α = adj.unit ≫ l ◁ α ≫ (ρ_ _).hom := by - dsimp [conjugateEquiv, mateEquiv, Adjunction.id] + dsimp [conjugateEquiv, mateEquiv, Adjunction.id, Adjunction.homEquiv₁_symm_apply, + Adjunction.homEquiv₂_symm_apply] bicategory end conjugateEquiv @@ -388,7 +422,8 @@ theorem conjugateEquiv_comp (α : l₂ ⟶ l₁) (β : l₃ ⟶ l₂) : bicategory _ = _ := by rw [← mateEquiv_vcomp] - dsimp only [leftAdjointSquare.vcomp, mateEquiv_apply] + simp only [leftAdjointSquare.vcomp, mateEquiv_apply, + Adjunction.homEquiv₁_apply, Adjunction.homEquiv₂_apply] bicategory @[simp] @@ -494,7 +529,9 @@ isomorphism if and only if the original 2-morphism is. This explains why some Be theorem iterated_mateEquiv_conjugateEquiv (α : f₁ ≫ l₂ ⟶ l₁ ≫ f₂) : mateEquiv adj₄ adj₃ (mateEquiv adj₁ adj₂ α) = conjugateEquiv (adj₁.comp adj₄) (adj₃.comp adj₂) α := by - dsimp [conjugateEquiv, mateEquiv, Adjunction.comp] + simp only [conjugateEquiv, mateEquiv, Adjunction.comp, Adjunction.homEquiv₁, + Adjunction.homEquiv₂] + dsimp bicategory theorem iterated_mateEquiv_conjugateEquiv_symm (α : u₂ ≫ r₁ ⟶ r₂ ≫ u₁) : @@ -538,7 +575,9 @@ theorem mateEquiv_conjugateEquiv_vcomp bicategory _ = _ := by rw [← mateEquiv_vcomp] - dsimp only [leftAdjointSquare.vcomp, mateEquiv_apply, leftAdjointSquareConjugate.vcomp] + simp only [leftAdjointSquare.vcomp, mateEquiv_apply, leftAdjointSquareConjugate.vcomp, + Adjunction.homEquiv₁, Adjunction.homEquiv₂] + dsimp bicategory end mateEquiv_conjugateEquiv_vcomp @@ -575,7 +614,9 @@ theorem conjugateEquiv_mateEquiv_vcomp bicategory _ = _ := by rw [← mateEquiv_vcomp] - dsimp only [leftAdjointSquare.vcomp, mateEquiv_apply, leftAdjointConjugateSquare.vcomp] + simp only [leftAdjointSquare.vcomp, mateEquiv_apply, leftAdjointConjugateSquare.vcomp, + Adjunction.homEquiv₁, Adjunction.homEquiv₂] + dsimp bicategory end conjugateEquiv_mateEquiv_vcomp From 58e6a4fd18cfcb9d3aa3f631dbe7c30bcbf8a70e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=ABl=20Riou?= Date: Sun, 18 May 2025 11:58:07 +0200 Subject: [PATCH 096/118] removed sorries --- .../Bicategory/Adjunction/Adj.lean | 268 ++++++++++++++---- 1 file changed, 209 insertions(+), 59 deletions(-) diff --git a/Mathlib/CategoryTheory/Bicategory/Adjunction/Adj.lean b/Mathlib/CategoryTheory/Bicategory/Adjunction/Adj.lean index d12167fc17b212..54140e52b95ae4 100644 --- a/Mathlib/CategoryTheory/Bicategory/Adjunction/Adj.lean +++ b/Mathlib/CategoryTheory/Bicategory/Adjunction/Adj.lean @@ -1,5 +1,5 @@ /- -Copyright (c) 2024 Joël Riou. All rights reserved. +Copyright (c) 2025 Joël Riou. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: Joël Riou -/ @@ -10,13 +10,14 @@ import Mathlib.CategoryTheory.Bicategory.Functor.Pseudofunctor # The bicategory of adjunctions in a bicategory Given a bicategory `B`, we construct a bicategory `Adj B` that has the same -objects but whose `1`-morphisms are adjunctions, and `2`-morphisms are tuples -of mate maps between the left and right adjoints (where the map between right +objects but whose `1`-morphisms are adjunctions (in the same direction +as the left adjoints), and `2`-morphisms are tuples of mate maps between +the left and right adjoints (where the map between right adjoints is in the opposite direction). Certain pseudofunctors to the bicategory `Adj Cat` are analogous to bifibered categories: in various contexts, this may be used in order to formalize the properties of -both pushforward and pullback functors. +both pullback and pushforward functors. ## References @@ -32,19 +33,138 @@ namespace CategoryTheory namespace Bicategory -variable (B : Type u) [Bicategory.{w, v} B] +variable {B : Type u} [Bicategory.{w, v} B] +section + +variable {a b c d : B} {l₁ : a ⟶ b} {r₁ : b ⟶ a} (adj₁ : l₁ ⊣ r₁) + {l₂ : c ⟶ d} {r₂ : d ⟶ c} (adj₂ : l₂ ⊣ r₂) + +variable {f : a ⟶ c} {g : b ⟶ d} + +lemma mateEquiv_id_comp_right (φ : f ≫ 𝟙 _ ≫ l₂ ⟶ l₁ ≫ g) : + mateEquiv adj₁ ((Adjunction.id _).comp adj₂) φ = + mateEquiv adj₁ adj₂ (f ◁ (λ_ l₂).inv ≫ φ) ≫ (ρ_ _).inv ≫ (α_ _ _ _).hom := by + simp only [mateEquiv_apply, Adjunction.homEquiv₁_apply, Adjunction.homEquiv₂_apply, + Adjunction.id] + dsimp + bicategory + +lemma mateEquiv_comp_id_right (φ : f ≫ l₂ ≫ 𝟙 d ⟶ l₁ ≫ g) : + mateEquiv adj₁ (adj₂.comp (Adjunction.id _)) φ = + mateEquiv adj₁ adj₂ ((ρ_ _).inv ≫ (α_ _ _ _).hom ≫ φ) ≫ g ◁ (λ_ r₂).inv := by + simp only [mateEquiv_apply, Adjunction.homEquiv₁_apply, Adjunction.homEquiv₂_apply, + Adjunction.id] + dsimp + bicategory + +end + +section + +variable {a b : B} {l : a ⟶ b} {r : b ⟶ a} (adj : l ⊣ r) + {l' : a ⟶ b} {r' : b ⟶ a} (adj' : l' ⊣ r') (φ : l' ⟶ l) + +lemma conjugateEquiv_id_comp_right_apply : + conjugateEquiv adj ((Adjunction.id _).comp adj') ((λ_ _).hom ≫ φ) = + conjugateEquiv adj adj' φ ≫ (ρ_ _).inv := by + simp only [conjugateEquiv_apply, mateEquiv_id_comp_right, + id_whiskerLeft, Category.assoc, Iso.inv_hom_id_assoc] + bicategory + +lemma conjugateEquiv_comp_id_right_apply : + conjugateEquiv adj (adj'.comp (Adjunction.id _)) ((ρ_ _).hom ≫ φ) = + conjugateEquiv adj adj' φ ≫ (λ_ _).inv := by + simp only [conjugateEquiv_apply, Category.assoc, mateEquiv_comp_id_right, id_whiskerLeft, + Iso.inv_hom_id, Category.comp_id, Iso.hom_inv_id, Iso.cancel_iso_inv_left, + EmbeddingLike.apply_eq_iff_eq] + bicategory + +end + +section + +variable {a b : B} {l : a ⟶ b} {r : b ⟶ a} (adj : l ⊣ r) + +@[simp] +lemma mateEquiv_leftUnitor_hom_rightUnitor_inv : + mateEquiv adj adj ((λ_ _).hom ≫ (ρ_ _).inv) = (ρ_ _).hom ≫ (λ_ _).inv := by + simp only [← cancel_mono (λ_ r).hom, ← cancel_epi (ρ_ r).inv, + Category.assoc, Iso.inv_hom_id_assoc, Iso.inv_hom_id, + ← conjugateEquiv_id adj, conjugateEquiv_apply, Category.id_comp] + +end + +section + +variable {a b c : B} {l₁ : a ⟶ b} {r₁ : b ⟶ a} (adj₁ : l₁ ⊣ r₁) + {l₂ : b ⟶ c} {r₂ : c ⟶ b} (adj₂ : l₂ ⊣ r₂) + {l₂' : b ⟶ c} {r₂' : c ⟶ b} (adj₂' : l₂' ⊣ r₂') + +lemma conjugateEquiv_whiskerLeft (φ : l₂' ⟶ l₂) : + conjugateEquiv (adj₁.comp adj₂) (adj₁.comp adj₂') (l₁ ◁ φ) = + conjugateEquiv adj₂ adj₂' φ ▷ r₁ := by + have := mateEquiv_hcomp adj₁ adj₁ adj₂ adj₂' ((λ_ _).hom ≫ (ρ_ _).inv) + ((λ_ _).hom ≫ φ ≫ (ρ_ _).inv) + dsimp [leftAdjointSquare.hcomp, rightAdjointSquare.hcomp] at this + simp only [comp_whiskerRight, leftUnitor_whiskerRight, Category.assoc, whiskerLeft_comp, + whiskerLeft_rightUnitor_inv, Iso.hom_inv_id, Category.comp_id, triangle_assoc, + inv_hom_whiskerRight_assoc, Iso.inv_hom_id_assoc, mateEquiv_leftUnitor_hom_rightUnitor_inv, + whiskerLeft_rightUnitor, triangle_assoc_comp_left_inv_assoc, Iso.hom_inv_id_assoc] at this + simp [conjugateEquiv_apply, this] + +end + +section + +variable {a b c : B} {l₁ : a ⟶ b} {r₁ : b ⟶ a} (adj₁ : l₁ ⊣ r₁) + {l₁' : a ⟶ b} {r₁' : b ⟶ a} (adj₁' : l₁' ⊣ r₁') + {l₂ : b ⟶ c} {r₂ : c ⟶ b} (adj₂ : l₂ ⊣ r₂) + {l₂' : b ⟶ c} {r₂' : c ⟶ b} (adj₂' : l₂' ⊣ r₂') + +lemma conjugateEquiv_whiskerRight (φ : l₁' ⟶ l₁) : + conjugateEquiv (adj₁.comp adj₂) (adj₁'.comp adj₂) (φ ▷ l₂) = + r₂ ◁ conjugateEquiv adj₁ adj₁' φ := by + have := mateEquiv_hcomp adj₁ adj₁' adj₂ adj₂ + ((λ_ _).hom ≫ φ ≫ (ρ_ _).inv) ((λ_ _).hom ≫ (ρ_ _).inv) + dsimp [leftAdjointSquare.hcomp, rightAdjointSquare.hcomp] at this + simp only [comp_whiskerRight, leftUnitor_whiskerRight, Category.assoc, whiskerLeft_comp, + whiskerLeft_rightUnitor_inv, Iso.hom_inv_id, Category.comp_id, triangle_assoc, + inv_hom_whiskerRight_assoc, Iso.inv_hom_id_assoc, mateEquiv_leftUnitor_hom_rightUnitor_inv, + leftUnitor_inv_whiskerRight, Iso.inv_hom_id, triangle_assoc_comp_right_assoc] at this + simp [conjugateEquiv_apply, this] + +end + +section + +variable {a b c d : B} {l₁ : a ⟶ b} {r₁ : b ⟶ a} (adj₁ : l₁ ⊣ r₁) + {l₂ : b ⟶ c} {r₂ : c ⟶ b} (adj₂ : l₂ ⊣ r₂) + {l₃ : c ⟶ d} {r₃ : d ⟶ c} (adj₃ : l₃ ⊣ r₃) + +lemma conjugateEquiv_associator_hom : + conjugateEquiv (adj₁.comp (adj₂.comp adj₃)) + ((adj₁.comp adj₂).comp adj₃) (α_ _ _ _).hom = (α_ _ _ _).hom := by + simp [← cancel_epi (ρ_ ((r₃ ≫ r₂) ≫ r₁)).hom, ← cancel_mono (λ_ (r₃ ≫ r₂ ≫ r₁)).inv, + conjugateEquiv_apply, mateEquiv_eq_iff, Adjunction.homEquiv₁_symm_apply, + Adjunction.homEquiv₂_apply] + bicategory + +end + + +variable (B) in /-- The bicategory that has the same objects as a bicategory `B`, in which `1`-morphisms -are adjunctions, and `2`-morphisms are tuples of mate maps between the left and right +are adjunctions (in the same direction as the left adjoints), +and `2`-morphisms are tuples of mate maps between the left and right adjoints (where the map between right adjoints is in the opposite direction). -/ def Adj : Type u := B namespace Adj -variable {B} - +/-- If `a : Adj B`, `a.obj : B` is the underlying object of `B`. -/ abbrev obj (a : Adj B) : B := a variable (a b c d : B) @@ -55,16 +175,18 @@ this is the type of adjunctions between `a` and `b`. -/ structure Hom where /-- the left adjoint -/ - f : a ⟶ b + l : a ⟶ b /-- the right adjoint -/ - g : b ⟶ a + r : b ⟶ a /-- the adjunction -/ - adj : f ⊣ g + adj : l ⊣ r variable {a b} in -def Hom.mk' {f : a ⟶ b} {g : b ⟶ a} (adj : f ⊣ g) : Hom a b where - f := f - g := g +/-- Constructor for `1`-morphisms in the bicategory `Adj B`. -/ +@[simps] +def Hom.mk' {l : a ⟶ b} {r : b ⟶ a} (adj : l ⊣ r) : Hom a b where + l := l + r := r adj := adj instance : CategoryStruct (Adj B) where @@ -72,54 +194,53 @@ instance : CategoryStruct (Adj B) where id (a : B) := .mk' (Adjunction.id a) comp f g := .mk' (f.adj.comp g.adj) -@[simp] lemma id_f (a : Adj B) : Hom.f (𝟙 a) = 𝟙 a.obj := rfl -@[simp] lemma id_g (a : Adj B) : Hom.g (𝟙 a) = 𝟙 a.obj := rfl +@[simp] lemma id_l (a : Adj B) : Hom.l (𝟙 a) = 𝟙 a.obj := rfl +@[simp] lemma id_r (a : Adj B) : Hom.r (𝟙 a) = 𝟙 a.obj := rfl @[simp] lemma id_adj (a : Adj B) : Hom.adj (𝟙 a) = Adjunction.id a.obj := rfl variable {a b c d : Adj B} -@[simp] lemma comp_f (α : a ⟶ b) (β : b ⟶ c) : (α ≫ β).f = α.f ≫ β.f := rfl -@[simp] lemma comp_g (α : a ⟶ b) (β : b ⟶ c) : (α ≫ β).g = β.g ≫ α.g := rfl +@[simp] lemma comp_l (α : a ⟶ b) (β : b ⟶ c) : (α ≫ β).l = α.l ≫ β.l := rfl +@[simp] lemma comp_r (α : a ⟶ b) (β : b ⟶ c) : (α ≫ β).r = β.r ≫ α.r := rfl @[simp] lemma comp_adj (α : a ⟶ b) (β : b ⟶ c) : (α ≫ β).adj = α.adj.comp β.adj := rfl /-- A morphism between two adjunctions consists of a tuple of mate maps. -/ @[ext] structure Hom₂ (α β : a ⟶ b) where /-- the morphism between left adjoints -/ - τf : α.f ⟶ β.f + τl : α.l ⟶ β.l /-- the morphism in the opposite direction between right adjoints -/ - τg : β.g ⟶ α.g - conjugateEquiv_τf : conjugateEquiv β.adj α.adj τf = τg := by aesop_cat + τr : β.r ⟶ α.r + conjugateEquiv_τl : conjugateEquiv β.adj α.adj τl = τr := by aesop_cat lemma Hom₂.conjugateEquiv_symm_τg {α β : a ⟶ b} (p : Hom₂ α β) : - (conjugateEquiv β.adj α.adj).symm p.τg = p.τf := by - rw [← Hom₂.conjugateEquiv_τf, Equiv.symm_apply_apply] + (conjugateEquiv β.adj α.adj).symm p.τr = p.τl := by + rw [← Hom₂.conjugateEquiv_τl, Equiv.symm_apply_apply] instance : CategoryStruct (a ⟶ b) where Hom α β := Hom₂ α β id α := - { τf := 𝟙 _ - τg := 𝟙 _ } + { τl := 𝟙 _ + τr := 𝟙 _ } comp {a b c} x y := - { τf := x.τf ≫ y.τf - τg := y.τg ≫ x.τg - conjugateEquiv_τf := by simp [← conjugateEquiv_comp c.adj b.adj a.adj y.τf x.τf, - Hom₂.conjugateEquiv_τf] } + { τl := x.τl ≫ y.τl + τr := y.τr ≫ x.τr + conjugateEquiv_τl := by simp [← conjugateEquiv_comp c.adj b.adj a.adj y.τl x.τl, + Hom₂.conjugateEquiv_τl] } @[ext] -lemma hom₂_ext {α β : a ⟶ b} {x y : α ⟶ β} (hf : x.τf = y.τf) : x = y := by - apply Hom₂.ext hf - simp only [← Hom₂.conjugateEquiv_τf, hf] +lemma hom₂_ext {α β : a ⟶ b} {x y : α ⟶ β} (hl : x.τl = y.τl) : x = y := + Hom₂.ext hl (by simp only [← Hom₂.conjugateEquiv_τl, hl]) -@[simp] lemma id_τf (α : a ⟶ b) : Hom₂.τf (𝟙 α) = 𝟙 α.f := rfl -@[simp] lemma id_τg (α : a ⟶ b) : Hom₂.τg (𝟙 α) = 𝟙 α.g := rfl +@[simp] lemma id_τl (α : a ⟶ b) : Hom₂.τl (𝟙 α) = 𝟙 α.l := rfl +@[simp] lemma id_τr (α : a ⟶ b) : Hom₂.τr (𝟙 α) = 𝟙 α.r := rfl section variable {α β γ : a ⟶ b} -@[simp, reassoc] lemma comp_τf (x : α ⟶ β) (y : β ⟶ γ) : (x ≫ y).τf = x.τf ≫ y.τf := rfl -@[simp, reassoc] lemma comp_τg (x : α ⟶ β) (y : β ⟶ γ) : (x ≫ y).τf = x.τf ≫ y.τf := rfl +@[simp, reassoc] lemma comp_τl (x : α ⟶ β) (y : β ⟶ γ) : (x ≫ y).τl = x.τl ≫ y.τl := rfl +@[simp, reassoc] lemma comp_τr (x : α ⟶ β) (y : β ⟶ γ) : (x ≫ y).τr = y.τr ≫ x.τr := rfl end @@ -127,50 +248,54 @@ instance : Category (a ⟶ b) where /-- Constructor for isomorphisms between 1-morphisms in the bicategory `Adj B`. -/ @[simps] -def iso₂Mk {α β : a ⟶ b} (ef : α.f ≅ β.f) (eg : β.g ≅ α.g) - (h : conjugateEquiv β.adj α.adj ef.hom = eg.hom) : +def iso₂Mk {α β : a ⟶ b} (el : α.l ≅ β.l) (er : β.r ≅ α.r) + (h : conjugateEquiv β.adj α.adj el.hom = er.hom) : α ≅ β where hom := - { τf := ef.hom - τg := eg.hom - conjugateEquiv_τf := h } + { τl := el.hom + τr := er.hom + conjugateEquiv_τl := h } inv := - { τf := ef.inv - τg := eg.inv - conjugateEquiv_τf := sorry } + { τl := el.inv + τr := er.inv + conjugateEquiv_τl := by + rw [← cancel_mono er.hom, Iso.inv_hom_id, ← h, + conjugateEquiv_comp, Iso.hom_inv_id, conjugateEquiv_id] } /-- The associator in the bicategory `Adj B`. -/ @[simps!] def associator (α : a ⟶ b) (β : b ⟶ c) (γ : c ⟶ d) : (α ≫ β) ≫ γ ≅ α ≫ β ≫ γ := - iso₂Mk (α_ _ _ _) (α_ _ _ _) sorry + iso₂Mk (α_ _ _ _) (α_ _ _ _) (conjugateEquiv_associator_hom _ _ _) /-- The left unitor in the bicategory `Adj B`. -/ @[simps!] def leftUnitor (α : a ⟶ b) : 𝟙 a ≫ α ≅ α := - iso₂Mk (λ_ _) (ρ_ _).symm sorry + iso₂Mk (λ_ _) (ρ_ _).symm + (by simpa using conjugateEquiv_id_comp_right_apply α.adj α.adj (𝟙 _)) /-- The right unitor in the bicategory `Adj B`. -/ @[simps!] def rightUnitor (α : a ⟶ b) : α ≫ 𝟙 b ≅ α := - iso₂Mk (ρ_ _) (λ_ _).symm sorry + iso₂Mk (ρ_ _) (λ_ _).symm + (by simpa using conjugateEquiv_comp_id_right_apply α.adj α.adj (𝟙 _) ) /-- The left whiskering in the bicategory `Adj B`. -/ @[simps] def whiskerLeft (α : a ⟶ b) {β β' : b ⟶ c} (y : β ⟶ β') : α ≫ β ⟶ α ≫ β' where - τf := _ ◁ y.τf - τg := y.τg ▷ _ - conjugateEquiv_τf := by + τl := _ ◁ y.τl + τr := y.τr ▷ _ + conjugateEquiv_τl := by dsimp - rw [← iterated_mateEquiv_conjugateEquiv] - rw [← Hom₂.conjugateEquiv_τf] - sorry + simp only [conjugateEquiv_whiskerLeft, Hom₂.conjugateEquiv_τl] /-- The right whiskering in the bicategory `Adj B`. -/ @[simps] def whiskerRight {α α' : a ⟶ b} (x : α ⟶ α') (β : b ⟶ c) : α ≫ β ⟶ α' ≫ β where - τf := x.τf ▷ _ - τg := _ ◁ x.τg - conjugateEquiv_τf := sorry + τl := x.τl ▷ _ + τr := _ ◁ x.τr + conjugateEquiv_τl := by + dsimp + simp only [conjugateEquiv_whiskerRight, Hom₂.conjugateEquiv_τl] attribute [local simp] whisker_exchange @@ -181,14 +306,39 @@ instance : Bicategory (Adj B) where leftUnitor := leftUnitor rightUnitor := rightUnitor --- this forgets the right adjoints +@[simp] lemma whiskerRight_τr' {α α' : a ⟶ b} (x : α ⟶ α') (β : b ⟶ c) : + (x ▷ β).τr = β.r ◁ x.τr := rfl + +@[simp] lemma whiskerRight_τl' {α α' : a ⟶ b} (x : α ⟶ α') (β : b ⟶ c) : + (x ▷ β).τl = x.τl ▷ β.l := rfl + +/-- The forget pseudofunctor from `Adj B` to `B`. -/ +@[simps] def forget₁ : Pseudofunctor (Adj B) B where obj a := a.obj - map x := x.f - map₂ α := α.τf + map x := x.l + map₂ α := α.τl mapId _ := Iso.refl _ mapComp _ _ := Iso.refl _ +/-- Given an isomorphism between two 1-morphisms in `Adj B`, this is the +underlying isomorphisms between the left adjoints. -/ +@[simps] +def lIso {a b : Adj B} {adj₁ adj₂ : a ⟶ b} (e : adj₁ ≅ adj₂) : adj₁.l ≅ adj₂.l where + hom := e.hom.τl + inv := e.inv.τl + hom_inv_id := by rw [← comp_τl, e.hom_inv_id, id_τl] + inv_hom_id := by rw [← comp_τl, e.inv_hom_id, id_τl] + +/-- Given an isomorphism between two 1-morphisms in `Adj B`, this is the +underlying isomorphisms between the right adjoints. -/ +@[simps] +def rIso {a b : Adj B} {adj₁ adj₂ : a ⟶ b} (e : adj₁ ≅ adj₂) : adj₁.r ≅ adj₂.r where + hom := e.inv.τr + inv := e.hom.τr + hom_inv_id := by rw [← comp_τr, e.hom_inv_id, id_τr] + inv_hom_id := by rw [← comp_τr, e.inv_hom_id, id_τr] + end Adj end Bicategory From 7a0371cf96be8879967459a2114fe960aaad8be8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=ABl=20Riou?= Date: Mon, 19 May 2025 15:58:45 +0200 Subject: [PATCH 097/118] little clean up --- .../Bicategory/Adjunction/Adj.lean | 6 ++-- .../Bicategory/Adjunction/BaseChange.lean | 32 +++++++++++++++---- .../Bicategory/Adjunction/Mate.lean | 6 ++++ .../Sites/Descent/DescentDataDoublePrime.lean | 17 ++-------- 4 files changed, 37 insertions(+), 24 deletions(-) diff --git a/Mathlib/CategoryTheory/Bicategory/Adjunction/Adj.lean b/Mathlib/CategoryTheory/Bicategory/Adjunction/Adj.lean index 98f129e746f769..342f95e9fd8cc0 100644 --- a/Mathlib/CategoryTheory/Bicategory/Adjunction/Adj.lean +++ b/Mathlib/CategoryTheory/Bicategory/Adjunction/Adj.lean @@ -324,7 +324,8 @@ def forget₁ : Pseudofunctor (Adj B) B where mapComp _ _ := Iso.refl _ -- this forgets the left adjoints -@[simps obj map, simps -isSimp map₂ mapId mapComp] +--@[simps obj map, simps -isSimp map₂ mapId mapComp] +@[simps obj map map₂ mapId mapComp] def forget₂ : Pseudofunctor (Adj B)ᵒᵖ B where obj a := a.unop.obj map x := x.unop.r @@ -370,7 +371,8 @@ lemma inv_hom_τr {a b : Adj B} {adj₁ adj₂ : a ⟶ b} (e : adj₁ ≅ adj₂ e.inv.τr ≫ e.hom.τr = 𝟙 _ := (rIso e).hom_inv_id -lemma comp_forget₁_mapComp' {B : Type*} [Bicategory B] (F : Pseudofunctor B (Adj Cat)) +lemma comp_forget₁_mapComp' {B C : Type*} [Bicategory B] [Bicategory C] + (F : Pseudofunctor B (Adj C)) {a b c : B} (f : a ⟶ b) (g : b ⟶ c) (fg : a ⟶ c) (hfg : f ≫ g = fg) : (F.comp forget₁).mapComp' f g fg hfg = lIso (F.mapComp' f g fg hfg) := by subst hfg diff --git a/Mathlib/CategoryTheory/Bicategory/Adjunction/BaseChange.lean b/Mathlib/CategoryTheory/Bicategory/Adjunction/BaseChange.lean index e835efb0292aea..60e2b0c9e3668f 100644 --- a/Mathlib/CategoryTheory/Bicategory/Adjunction/BaseChange.lean +++ b/Mathlib/CategoryTheory/Bicategory/Adjunction/BaseChange.lean @@ -96,8 +96,23 @@ postpone descending to the level of objects as long as possible and hence state all necessary compatibility properties for `whiskerBaseChange` instead. -/ def whiskerBaseChange : (F.map l).r ≫ (F.map t).l ≫ (F.map r).l ⟶ (F.map b).l := - (α_ _ _ _).inv ≫ F.baseChange sq ▷ (F.map r).l ≫ - (α_ _ _ _).hom ≫ (F.map b).l ◁ (F.map r).adj.counit ≫ (ρ_ _).hom + (F.map l).adj.homEquiv₁ (F.isoMapOfCommSq sq).hom.τl + +lemma whiskerBaseChange_eq : F.whiskerBaseChange sq = + (F.map l).adj.homEquiv₁ (F.isoMapOfCommSq sq).hom.τl := rfl + +lemma whiskerBaseChange_eq' : F.whiskerBaseChange sq = + (α_ _ _ _).inv ≫ (F.map r).adj.homEquiv₂.symm (F.baseChange sq) := by + dsimp only [baseChange] + rw [mateEquiv_apply', Equiv.symm_apply_apply, Iso.inv_hom_id_assoc, + whiskerBaseChange] + +/-lemma whiskerBaseChange_eq' : + F.whiskerBaseChange sq = + (α_ _ _ _).inv ≫ F.baseChange sq ▷ (F.map r).l ≫ + (α_ _ _ _).hom ≫ (F.map b).l ◁ (F.map r).adj.counit ≫ (ρ_ _).hom := by + rw [whiskerBaseChange_eq, Adjunction.homEquiv₂_symm_apply]-/ + -- is this true? --instance [IsIso (F.baseChange sq)] : Mono (F.whiskerBaseChange sq) := by @@ -166,7 +181,7 @@ lemma baseChange_self_self {S X Y : B} (f : S ⟶ X) (g : X ⟶ Y) : lemma whiskerBaseChange_self_self {S X Y : B} (f : S ⟶ X) (g : X ⟶ Y) : F.whiskerBaseChange (t := f) (l := f) (r := g) (b := g) ⟨by simp⟩ = (α_ _ _ _).inv ≫ (F.map f).adj.counit ▷ _ ≫ (λ_ _).hom := by - simp [whiskerBaseChange, baseChange_self_self] + simp [whiskerBaseChange_eq, Adjunction.homEquiv₁_apply, baseChange_self_self] variable {Z : B} (b' : X₂ ⟶ Z) (r' : Y₁ ⟶ Z) (d : Y₂ ⟶ Z) (hbd : b ≫ d = b') (hrd : r ≫ d = r') @@ -230,10 +245,11 @@ lemma whiskerRight_whiskerBaseChange : ((F.comp Adj.forget₁).mapComp' _ _ _ hbd).hom := by dsimp simp only [Bicategory.whiskerLeft_comp, Category.assoc] - simp only [whiskerBaseChange, comp_whiskerRight, whisker_assoc, Category.assoc, + simp only [whiskerBaseChange_eq', Adjunction.homEquiv₂_symm_apply, + comp_whiskerRight, whisker_assoc, Category.assoc, triangle_assoc_comp_right] rw [F.baseChange_of_comp_eq sq b' r' d hbd hrd] - simp + simp [Adj.comp_forget₁_mapComp'] sorry end @@ -334,7 +350,8 @@ def coalgEquiv [IsIso (F.baseChange sq)] toFun a := (F.map r).l.map a ≫ (F.whiskerBaseChange sq).app N invFun a := (F.map r).adj.unit.app _ ≫ (F.map r).r.map a ≫ inv ((F.baseChange sq).app _) left_inv a := by - dsimp [whiskerBaseChange] + simp only [whiskerBaseChange_eq', Adjunction.homEquiv₂_symm_apply] + dsimp simp only [Functor.map_comp, Category.assoc] simp only [Cat.associator_inv_app, Cat.comp_obj, eqToHom_refl, Functor.map_id, Cat.associator_hom_app, Cat.rightUnitor_hom_app, Cat.id_obj, Category.id_comp] @@ -352,7 +369,8 @@ def coalgEquiv [IsIso (F.baseChange sq)] rw [reassoc_of% this] simp right_inv a := by - dsimp [whiskerBaseChange] + simp only [whiskerBaseChange_eq', Adjunction.homEquiv₂_symm_apply] + dsimp simp only [Cat.associator_inv_app, Cat.comp_obj, eqToHom_refl, Functor.map_id, Cat.associator_hom_app, Cat.rightUnitor_hom_app, Cat.id_obj, Category.id_comp] simp only [Functor.map_comp, Functor.map_inv, Category.comp_id, Category.assoc, diff --git a/Mathlib/CategoryTheory/Bicategory/Adjunction/Mate.lean b/Mathlib/CategoryTheory/Bicategory/Adjunction/Mate.lean index 21895be549c66d..bb1158485370b4 100644 --- a/Mathlib/CategoryTheory/Bicategory/Adjunction/Mate.lean +++ b/Mathlib/CategoryTheory/Bicategory/Adjunction/Mate.lean @@ -139,6 +139,12 @@ Note that if one of the transformations is an iso, it does not imply the other i def mateEquiv : (g ≫ l₂ ⟶ l₁ ≫ h) ≃ (r₁ ≫ g ⟶ h ≫ r₂) := adj₂.homEquiv₂.trans ((Iso.homCongr (Iso.refl _) (α_ _ _ _)).trans adj₁.homEquiv₁) +lemma mateEquiv_apply' (α : g ≫ l₂ ⟶ l₁ ≫ h) : + mateEquiv adj₁ adj₂ α = + adj₂.homEquiv₂ ((α_ _ _ _).hom ≫ adj₁.homEquiv₁ α) := by + simp [mateEquiv_apply, Adjunction.homEquiv₁_apply, + Adjunction.homEquiv₂_apply] + lemma mateEquiv_eq_iff (α : g ≫ l₂ ⟶ l₁ ≫ h) (β : r₁ ≫ g ⟶ h ≫ r₂) : mateEquiv adj₁ adj₂ α = β ↔ adj₁.homEquiv₁.symm β = adj₂.homEquiv₂ α ≫ (α_ _ _ _).hom := by diff --git a/Mathlib/CategoryTheory/Sites/Descent/DescentDataDoublePrime.lean b/Mathlib/CategoryTheory/Sites/Descent/DescentDataDoublePrime.lean index 5e28922d0b601b..f75a3e6258bb2f 100644 --- a/Mathlib/CategoryTheory/Sites/Descent/DescentDataDoublePrime.lean +++ b/Mathlib/CategoryTheory/Sites/Descent/DescentDataDoublePrime.lean @@ -101,20 +101,6 @@ variable ⦃X₁₂ X X S : C⦄ ⦃p₁ : X₁₂ ⟶ X⦄ ⦃p₂ : X₁₂ ⟶ X⦄ ⦃f : X ⟶ S⦄ (sq : CommSq p₁ p₂ f f) (obj : (F.obj (.mk (op X))).obj) -/-@[reassoc] -lemma map_baseChange_comp_counit' ⦃Y₁₂ : C⦄ (g : Y₁₂ ⟶ X₁₂) (gp : Y₁₂ ⟶ X) - (hgp₁ : g ≫ p₁ = gp) (hgp₂ : g ≫ p₂ = gp) : - (F.map g.op.toLoc).f.map - ((F.map p₁.op.toLoc).f.map ((F.baseChange sq.flip.op.toLoc).app obj)) ≫ - (F.map g.op.toLoc).f.map - ((F.map p₁.op.toLoc).adj.counit.app _) = - (F.mapComp' p₁.op.toLoc g.op.toLoc (gp.op.toLoc) (by aesoptoloc)).inv.τf.app - ((F.map f.op.toLoc).f.obj ((F.map f.op.toLoc).r.obj obj)) ≫ - (F.map gp.op.toLoc).f.map ((F.map f.op.toLoc).adj.counit.app _) ≫ - (F.mapComp' p₂.op.toLoc g.op.toLoc (gp.op.toLoc) (by aesoptoloc)).hom.τf.app obj := by - dsimp - sorry-/ - @[reassoc] lemma map_baseChange_comp_counit (g : X ⟶ X₁₂) (hg₁ : g ≫ p₁ = 𝟙 X) (hg₂ : g ≫ p₂ = 𝟙 X) : (F.map g.op.toLoc).l.map @@ -129,7 +115,8 @@ lemma map_baseChange_comp_counit (g : X ⟶ X₁₂) (hg₁ : g ≫ p₁ = 𝟙 (F.whiskerRight_whiskerBaseChange_self_self _ _ _ sq.flip.op.toLoc g.op.toLoc (by aesoptoloc) (by aesoptoloc)) obj simp [Cat.associator_inv_app, Cat.associator_hom_app, Cat.leftUnitor_hom_app, - Adj.comp_forget₁_mapComp', whiskerBaseChange] at this + Adj.comp_forget₁_mapComp', whiskerBaseChange_eq', + Adjunction.homEquiv₂_symm_apply] at this rw [this] erw [← NatTrans.naturality_assoc] rfl From 6fde06a8ccdbf753929277af193ebda2807c4e1e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=ABl=20Riou?= Date: Mon, 19 May 2025 16:18:30 +0200 Subject: [PATCH 098/118] little progress --- .../Sites/Descent/DescentDataDoublePrime.lean | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Mathlib/CategoryTheory/Sites/Descent/DescentDataDoublePrime.lean b/Mathlib/CategoryTheory/Sites/Descent/DescentDataDoublePrime.lean index f75a3e6258bb2f..8070d49476ea7f 100644 --- a/Mathlib/CategoryTheory/Sites/Descent/DescentDataDoublePrime.lean +++ b/Mathlib/CategoryTheory/Sites/Descent/DescentDataDoublePrime.lean @@ -92,7 +92,13 @@ lemma homEquiv_symm_pullHom'' ⦃X₁ X₂ : C⦄ simp only [Functor.map_comp, Category.assoc, Adj.comp_forget₁_mapComp', Adj.lIso_hom, Adj.lIso_inv] erw [← NatTrans.naturality_assoc] + dsimp congr 1 + have := (F.map gp₁.op.toLoc).adj.toCategory.counit.naturality + ((F.mapComp' p₂.op.toLoc g.op.toLoc gp₂.op.toLoc (by aesoptoloc)).inv.τl.app obj₂) + dsimp at this + rw [this]; clear this + simp only [← Category.assoc]; congr 1; simp only [Category.assoc] sorry section From 0b43df1931e50acc3b12963878d1f6bb9c268853 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=ABl=20Riou?= Date: Mon, 19 May 2025 16:37:14 +0200 Subject: [PATCH 099/118] little progress --- .../Sites/Descent/DescentDataDoublePrime.lean | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/Mathlib/CategoryTheory/Sites/Descent/DescentDataDoublePrime.lean b/Mathlib/CategoryTheory/Sites/Descent/DescentDataDoublePrime.lean index 8070d49476ea7f..33891d190d1811 100644 --- a/Mathlib/CategoryTheory/Sites/Descent/DescentDataDoublePrime.lean +++ b/Mathlib/CategoryTheory/Sites/Descent/DescentDataDoublePrime.lean @@ -78,6 +78,20 @@ def pullHom'' ⦃Y₁₂ : C⦄ (p₁₂ : Y₁₂ ⟶ X₁₂) (q₁ : Y₁₂ end +@[reassoc] +lemma mapComp'_τl_τr_compatibility + ⦃X Y Z : C⦄ (f : X ⟶ Y) (g : Y ⟶ Z) (fg : X ⟶ Z) (hfg : f ≫ g = fg) + (obj : (F.obj (.mk (op Y))).obj) : + (F.map fg.op.toLoc).l.map + ((F.map g.op.toLoc).r.map ((F.map f.op.toLoc).adj.unit.app obj)) ≫ + (F.map fg.op.toLoc).l.map + ((F.mapComp' g.op.toLoc f.op.toLoc fg.op.toLoc (by aesoptoloc)).hom.τr.app + (((F.map f.op.toLoc).l.obj obj))) ≫ + (F.map fg.op.toLoc).adj.counit.app ((F.map f.op.toLoc).l.obj obj) = + (F.mapComp' g.op.toLoc f.op.toLoc fg.op.toLoc (by aesoptoloc)).hom.τl.app _ ≫ + (F.map f.op.toLoc).l.map ((F.map g.op.toLoc).adj.counit.app obj) := by + sorry + lemma homEquiv_symm_pullHom'' ⦃X₁ X₂ : C⦄ ⦃obj₁ : (F.obj (.mk (op X₁))).obj⦄ ⦃obj₂ : (F.obj (.mk (op X₂))).obj⦄ ⦃X₁₂ : C⦄ ⦃p₁ : X₁₂ ⟶ X₁⦄ ⦃p₂ : X₁₂ ⟶ X₂⦄ @@ -97,9 +111,7 @@ lemma homEquiv_symm_pullHom'' ⦃X₁ X₂ : C⦄ have := (F.map gp₁.op.toLoc).adj.toCategory.counit.naturality ((F.mapComp' p₂.op.toLoc g.op.toLoc gp₂.op.toLoc (by aesoptoloc)).inv.τl.app obj₂) dsimp at this - rw [this]; clear this - simp only [← Category.assoc]; congr 1; simp only [Category.assoc] - sorry + rw [this, mapComp'_τl_τr_compatibility_assoc _ _ _ hgp₁] section From 28d4d24895810413da0a3e12936d7e041c9d6e48 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=ABl=20Riou?= Date: Mon, 19 May 2025 17:15:38 +0200 Subject: [PATCH 100/118] removed a sorry --- .../Bicategory/Adjunction/Basic.lean | 4 +++- .../Sites/Descent/DescentDataDoublePrime.lean | 23 ++++++++++++++++++- 2 files changed, 25 insertions(+), 2 deletions(-) diff --git a/Mathlib/CategoryTheory/Bicategory/Adjunction/Basic.lean b/Mathlib/CategoryTheory/Bicategory/Adjunction/Basic.lean index a9c4d30c13e6e1..fad1110c2a1772 100644 --- a/Mathlib/CategoryTheory/Bicategory/Adjunction/Basic.lean +++ b/Mathlib/CategoryTheory/Bicategory/Adjunction/Basic.lean @@ -109,7 +109,9 @@ variable {f₁ : a ⟶ b} {g₁ : b ⟶ a} {f₂ : b ⟶ c} {g₂ : c ⟶ b} /-- Auxiliary definition for `adjunction.comp`. -/ @[simp] def compUnit (adj₁ : f₁ ⊣ g₁) (adj₂ : f₂ ⊣ g₂) : 𝟙 a ⟶ (f₁ ≫ f₂) ≫ g₂ ≫ g₁ := - adj₁.unit ⊗≫ f₁ ◁ adj₂.unit ▷ g₁ ⊗≫ 𝟙 _ + adj₁.unit ≫ f₁ ◁ ((λ_ _).inv ≫ adj₂.unit ▷ g₁ ≫ (α_ _ _ _).hom) ≫ + (α_ _ _ _).inv + --adj₁.unit ⊗≫ f₁ ◁ adj₂.unit ▷ g₁ ⊗≫ 𝟙 _ /-- Auxiliary definition for `adjunction.comp`. -/ @[simp] diff --git a/Mathlib/CategoryTheory/Sites/Descent/DescentDataDoublePrime.lean b/Mathlib/CategoryTheory/Sites/Descent/DescentDataDoublePrime.lean index 33891d190d1811..9751d8892eea27 100644 --- a/Mathlib/CategoryTheory/Sites/Descent/DescentDataDoublePrime.lean +++ b/Mathlib/CategoryTheory/Sites/Descent/DescentDataDoublePrime.lean @@ -90,7 +90,28 @@ lemma mapComp'_τl_τr_compatibility (F.map fg.op.toLoc).adj.counit.app ((F.map f.op.toLoc).l.obj obj) = (F.mapComp' g.op.toLoc f.op.toLoc fg.op.toLoc (by aesoptoloc)).hom.τl.app _ ≫ (F.map f.op.toLoc).l.map ((F.map g.op.toLoc).adj.counit.app obj) := by - sorry + rw [← Adj.Hom₂.conjugateEquiv_symm_τg, + Bicategory.conjugateEquiv_symm_apply, Bicategory.mateEquiv_symm_apply, + Adjunction.homEquiv₂_symm_apply, Adjunction.homEquiv₁_symm_apply] + dsimp [Cat.associator_hom_app, Cat.associator_inv_app, + Cat.leftUnitor_inv_app, Cat.rightUnitor_hom_app] + simp only [Category.comp_id, Category.id_comp, Category.assoc, Functor.map_comp] + erw [← NatTrans.naturality] + dsimp + simp only [← Category.assoc]; congr 1; simp only [Category.assoc] + simp only [← Functor.map_comp_assoc, ← Functor.map_comp] + have h₁ := (F.mapComp' g.op.toLoc f.op.toLoc fg.op.toLoc (by aesoptoloc)).hom.τr.naturality + ((F.map f.op.toLoc).l.map ((F.map g.op.toLoc).adj.counit.app obj)) + dsimp at h₁ + rw [← h₁] + simp only [← Category.assoc]; congr 2; simp only [Category.assoc] + have h₂ := (F.map f.op.toLoc).adj.unit.naturality + ((F.map g.op.toLoc).adj.counit.app obj) + dsimp at h₂ + rw [← Functor.map_comp, ← h₂] + have h₃ := (F.map g.op.toLoc).adj.toCategory.right_triangle_components obj + dsimp at h₃ + rw [Functor.map_comp, reassoc_of% h₃] lemma homEquiv_symm_pullHom'' ⦃X₁ X₂ : C⦄ ⦃obj₁ : (F.obj (.mk (op X₁))).obj⦄ ⦃obj₂ : (F.obj (.mk (op X₂))).obj⦄ From 59b2a293573f8c57bf9dca198d78c9467b92fa84 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=ABl=20Riou?= Date: Mon, 19 May 2025 18:48:08 +0200 Subject: [PATCH 101/118] wip --- .../Bicategory/Adjunction/Adj.lean | 23 ++++++++++++++++--- .../Bicategory/Adjunction/Mate.lean | 6 +++++ .../Sites/Descent/DescentDataDoublePrime.lean | 9 ++++++-- 3 files changed, 33 insertions(+), 5 deletions(-) diff --git a/Mathlib/CategoryTheory/Bicategory/Adjunction/Adj.lean b/Mathlib/CategoryTheory/Bicategory/Adjunction/Adj.lean index 342f95e9fd8cc0..17c68a98bb516b 100644 --- a/Mathlib/CategoryTheory/Bicategory/Adjunction/Adj.lean +++ b/Mathlib/CategoryTheory/Bicategory/Adjunction/Adj.lean @@ -371,14 +371,31 @@ lemma inv_hom_τr {a b : Adj B} {adj₁ adj₂ : a ⟶ b} (e : adj₁ ≅ adj₂ e.inv.τr ≫ e.hom.τr = 𝟙 _ := (rIso e).hom_inv_id -lemma comp_forget₁_mapComp' {B C : Type*} [Bicategory B] [Bicategory C] - (F : Pseudofunctor B (Adj C)) - {a b c : B} (f : a ⟶ b) (g : b ⟶ c) (fg : a ⟶ c) (hfg : f ≫ g = fg) : +section + +variable {C : Type*} [Bicategory C] (F : Pseudofunctor B (Adj C)) + {a b c : B} (f : a ⟶ b) (g : b ⟶ c) (fg : a ⟶ c) (hfg : f ≫ g = fg) + +lemma comp_forget₁_mapComp' : (F.comp forget₁).mapComp' f g fg hfg = lIso (F.mapComp' f g fg hfg) := by subst hfg ext simp [Pseudofunctor.mapComp'_eq_mapComp, forget₁] +@[reassoc] +lemma unit_comp_mapComp'_hom_τr_comp_counit : + (F.map g).adj.unit ▷ (F.map f).r ▷ (F.map fg).l ≫ + (α_ _ _ _).hom ▷ _ ≫ (α_ _ _ _).hom ≫ + (F.map g).l ◁ (F.mapComp' f g fg hfg).hom.τr ▷ (F.map fg).l ≫ + (F.map g).l ◁ (F.map fg).adj.counit = + (α_ _ _ _).hom ≫ (λ_ _).hom ≫ (F.map f).r ◁ (F.mapComp' f g fg hfg).hom.τl ≫ + (α_ _ _ _).inv ≫ (F.map f).adj.counit ▷ _ ≫ (λ_ _).hom ≫ (ρ_ _).inv := by + simp only [← Hom₂.conjugateEquiv_symm_τg, Bicategory.conjugateEquiv_symm_apply, + mateEquiv_symm_apply', Adjunction.homEquiv₁_symm_apply, Adjunction.homEquiv₂_symm_apply] + sorry + +end + end Adj end Bicategory diff --git a/Mathlib/CategoryTheory/Bicategory/Adjunction/Mate.lean b/Mathlib/CategoryTheory/Bicategory/Adjunction/Mate.lean index bb1158485370b4..f3345326667950 100644 --- a/Mathlib/CategoryTheory/Bicategory/Adjunction/Mate.lean +++ b/Mathlib/CategoryTheory/Bicategory/Adjunction/Mate.lean @@ -145,6 +145,12 @@ lemma mateEquiv_apply' (α : g ≫ l₂ ⟶ l₁ ≫ h) : simp [mateEquiv_apply, Adjunction.homEquiv₁_apply, Adjunction.homEquiv₂_apply] +lemma mateEquiv_symm_apply' (β : r₁ ≫ g ⟶ h ≫ r₂) : + (mateEquiv adj₁ adj₂).symm β = + adj₁.homEquiv₁.symm ((α_ _ _ _).inv ≫ adj₂.homEquiv₂.symm β) := by + simp [mateEquiv_symm_apply, Adjunction.homEquiv₁_symm_apply, + Adjunction.homEquiv₂_symm_apply] + lemma mateEquiv_eq_iff (α : g ≫ l₂ ⟶ l₁ ≫ h) (β : r₁ ≫ g ⟶ h ≫ r₂) : mateEquiv adj₁ adj₂ α = β ↔ adj₁.homEquiv₁.symm β = adj₂.homEquiv₂ α ≫ (α_ _ _ _).hom := by diff --git a/Mathlib/CategoryTheory/Sites/Descent/DescentDataDoublePrime.lean b/Mathlib/CategoryTheory/Sites/Descent/DescentDataDoublePrime.lean index 9751d8892eea27..deef873dd99ada 100644 --- a/Mathlib/CategoryTheory/Sites/Descent/DescentDataDoublePrime.lean +++ b/Mathlib/CategoryTheory/Sites/Descent/DescentDataDoublePrime.lean @@ -90,7 +90,12 @@ lemma mapComp'_τl_τr_compatibility (F.map fg.op.toLoc).adj.counit.app ((F.map f.op.toLoc).l.obj obj) = (F.mapComp' g.op.toLoc f.op.toLoc fg.op.toLoc (by aesoptoloc)).hom.τl.app _ ≫ (F.map f.op.toLoc).l.map ((F.map g.op.toLoc).adj.counit.app obj) := by - rw [← Adj.Hom₂.conjugateEquiv_symm_τg, + simpa [Cat.associator_hom_app, Cat.associator_inv_app, Cat.rightUnitor_inv_app, + Cat.leftUnitor_hom_app] using + NatTrans.congr_app + (Adj.unit_comp_mapComp'_hom_τr_comp_counit F g.op.toLoc f.op.toLoc fg.op.toLoc + (by aesoptoloc)) obj + /-rw [← Adj.Hom₂.conjugateEquiv_symm_τg, Bicategory.conjugateEquiv_symm_apply, Bicategory.mateEquiv_symm_apply, Adjunction.homEquiv₂_symm_apply, Adjunction.homEquiv₁_symm_apply] dsimp [Cat.associator_hom_app, Cat.associator_inv_app, @@ -111,7 +116,7 @@ lemma mapComp'_τl_τr_compatibility rw [← Functor.map_comp, ← h₂] have h₃ := (F.map g.op.toLoc).adj.toCategory.right_triangle_components obj dsimp at h₃ - rw [Functor.map_comp, reassoc_of% h₃] + rw [Functor.map_comp, reassoc_of% h₃]-/ lemma homEquiv_symm_pullHom'' ⦃X₁ X₂ : C⦄ ⦃obj₁ : (F.obj (.mk (op X₁))).obj⦄ ⦃obj₂ : (F.obj (.mk (op X₂))).obj⦄ From c00248b4c71b9a6077629f4cc00c33f1ae8634a9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=ABl=20Riou?= Date: Mon, 19 May 2025 19:56:54 +0200 Subject: [PATCH 102/118] little progress --- .../Bicategory/Adjunction/Adj.lean | 51 +++++++++++++++++-- .../Bicategory/Adjunction/Basic.lean | 3 +- .../Bicategory/Adjunction/Mate.lean | 6 +++ .../Sites/Descent/DescentDataDoublePrime.lean | 22 -------- 4 files changed, 55 insertions(+), 27 deletions(-) diff --git a/Mathlib/CategoryTheory/Bicategory/Adjunction/Adj.lean b/Mathlib/CategoryTheory/Bicategory/Adjunction/Adj.lean index 17c68a98bb516b..fe285ee304c306 100644 --- a/Mathlib/CategoryTheory/Bicategory/Adjunction/Adj.lean +++ b/Mathlib/CategoryTheory/Bicategory/Adjunction/Adj.lean @@ -215,10 +215,32 @@ structure Hom₂ (α β : a ⟶ b) where τr : β.r ⟶ α.r conjugateEquiv_τl : conjugateEquiv β.adj α.adj τl = τr := by aesop_cat -lemma Hom₂.conjugateEquiv_symm_τg {α β : a ⟶ b} (p : Hom₂ α β) : +namespace Hom₂ + +variable {α β : a ⟶ b} (p : Hom₂ α β) + +lemma conjugateEquiv_symm_τg : (conjugateEquiv β.adj α.adj).symm p.τr = p.τl := by rw [← Hom₂.conjugateEquiv_τl, Equiv.symm_apply_apply] +lemma homEquiv₂_τl_eq : + α.adj.homEquiv₂ ((λ_ _).hom ≫ p.τl ≫ (ρ_ _).inv) = + β.adj.homEquiv₁.symm ((ρ_ _).hom ≫ p.τr ≫ (λ_ _).inv) ≫ (α_ _ _ _).inv := by + symm + rw [← cancel_mono (α_ _ _ _).hom, Category.assoc, Iso.inv_hom_id, + Category.comp_id, ← mateEquiv_eq_iff, ← p.conjugateEquiv_τl, + conjugateEquiv_apply, Category.assoc, Category.assoc, Iso.hom_inv_id_assoc, + Iso.hom_inv_id, Category.comp_id] + +lemma homEquiv₁_τl_eq : + β.adj.homEquiv₁ ((λ_ α.l).hom ≫ p.τl ≫ (ρ_ β.l).inv) = + (α_ _ _ _).inv ≫ α.adj.homEquiv₂.symm ((ρ_ _).hom ≫ p.τr ≫ (λ_ _).inv) := by + symm + rw [← cancel_epi (α_ _ _ _).hom, Iso.hom_inv_id_assoc, ← mateEquiv_eq_iff', + mateEquiv_eq_iff, homEquiv₂_τl_eq, Category.assoc, Iso.inv_hom_id, Category.comp_id] + +end Hom₂ + instance : CategoryStruct (a ⟶ b) where Hom α β := Hom₂ α β id α := @@ -390,9 +412,30 @@ lemma unit_comp_mapComp'_hom_τr_comp_counit : (F.map g).l ◁ (F.map fg).adj.counit = (α_ _ _ _).hom ≫ (λ_ _).hom ≫ (F.map f).r ◁ (F.mapComp' f g fg hfg).hom.τl ≫ (α_ _ _ _).inv ≫ (F.map f).adj.counit ▷ _ ≫ (λ_ _).hom ≫ (ρ_ _).inv := by - simp only [← Hom₂.conjugateEquiv_symm_τg, Bicategory.conjugateEquiv_symm_apply, - mateEquiv_symm_apply', Adjunction.homEquiv₁_symm_apply, Adjunction.homEquiv₂_symm_apply] - sorry + -- this proof needs some improvements... + rw [← cancel_mono (ρ_ _).hom, ← cancel_epi (α_ _ _ _).inv, ← cancel_epi (λ_ _).inv] + apply (F.map f).adj.homEquiv₁.symm.injective + simp only [Adjunction.homEquiv₁_symm_apply] + trans (F.mapComp' f g fg hfg).hom.τl + · simp only [comp_r, Category.assoc, whiskerLeft_comp, whiskerLeft_rightUnitor, + ← Hom₂.conjugateEquiv_symm_τg, comp_l, comp_adj, conjugateEquiv_symm_apply', + Adjunction.comp_unit, Adjunction.compUnit, comp_whiskerRight, whisker_assoc, + leftUnitor_inv_whiskerRight, Iso.inv_hom_id_assoc, comp_whiskerLeft, + pentagon_inv_hom_hom_hom_hom_assoc] + · simp only [comp_l, Category.assoc, Iso.inv_hom_id, Category.comp_id, Iso.inv_hom_id_assoc, + whiskerLeft_comp] + trans (λ_ _).inv ≫ ((F.map f).adj.unit ▷ (F.map fg).l ≫ + ((F.map f).l ≫ (F.map f).r) ◁ (F.mapComp' f g fg hfg).hom.τl) ≫ + ((α_ _ _ _ ).hom ≫ _ ◁ (α_ _ _ _).inv) ≫ + ((F.map f).l ◁ (F.map f).adj.counit ▷ (F.map g).l) ≫ _ ◁ (λ_ _).hom + · rw [← whisker_exchange, id_whiskerLeft, Category.assoc, Category.assoc, + Category.assoc, Category.assoc, Iso.inv_hom_id_assoc] + trans (F.mapComp' f g fg hfg).hom.τl ≫ (λ_ _).inv ▷ _ ≫ + leftZigzag (F.map f).adj.unit (F.map f).adj.counit ▷ (F.map g).l ≫ (ρ_ _).hom ▷ _ + · simp + · dsimp only [leftZigzag] + simp [-Adjunction.left_triangle, bicategoricalComp] + · simp end diff --git a/Mathlib/CategoryTheory/Bicategory/Adjunction/Basic.lean b/Mathlib/CategoryTheory/Bicategory/Adjunction/Basic.lean index fad1110c2a1772..703cc46f9f7cb6 100644 --- a/Mathlib/CategoryTheory/Bicategory/Adjunction/Basic.lean +++ b/Mathlib/CategoryTheory/Bicategory/Adjunction/Basic.lean @@ -116,7 +116,8 @@ def compUnit (adj₁ : f₁ ⊣ g₁) (adj₂ : f₂ ⊣ g₂) : 𝟙 a ⟶ (f /-- Auxiliary definition for `adjunction.comp`. -/ @[simp] def compCounit (adj₁ : f₁ ⊣ g₁) (adj₂ : f₂ ⊣ g₂) : (g₂ ≫ g₁) ≫ f₁ ≫ f₂ ⟶ 𝟙 c := - 𝟙 _ ⊗≫ g₂ ◁ adj₁.counit ▷ f₂ ⊗≫ adj₂.counit + (α_ _ _ _).hom ≫ _ ◁ (α_ _ _ _).inv ≫ g₂ ◁ (adj₁.counit ▷ f₂ ≫ (λ_ _).hom) ≫ adj₂.counit + --𝟙 _ ⊗≫ g₂ ◁ adj₁.counit ▷ f₂ ⊗≫ adj₂.counit theorem comp_left_triangle_aux (adj₁ : f₁ ⊣ g₁) (adj₂ : f₂ ⊣ g₂) : leftZigzag (compUnit adj₁ adj₂) (compCounit adj₁ adj₂) = (λ_ _).hom ≫ (ρ_ _).inv := by diff --git a/Mathlib/CategoryTheory/Bicategory/Adjunction/Mate.lean b/Mathlib/CategoryTheory/Bicategory/Adjunction/Mate.lean index f3345326667950..d4ec295ff24563 100644 --- a/Mathlib/CategoryTheory/Bicategory/Adjunction/Mate.lean +++ b/Mathlib/CategoryTheory/Bicategory/Adjunction/Mate.lean @@ -157,6 +157,12 @@ lemma mateEquiv_eq_iff (α : g ≫ l₂ ⟶ l₁ ≫ h) (β : r₁ ≫ g ⟶ h conv_lhs => rw [eq_comm, ← adj₁.homEquiv₁.symm.injective.eq_iff'] rw [mateEquiv_apply, Equiv.symm_apply_apply] +lemma mateEquiv_eq_iff' (α : g ≫ l₂ ⟶ l₁ ≫ h) (β : r₁ ≫ g ⟶ h ≫ r₂) : + mateEquiv adj₁ adj₂ α = β ↔ + adj₂.homEquiv₂.symm β = (α_ _ _ _).hom ≫ adj₁.homEquiv₁ α := by + rw [eq_comm, mateEquiv_apply', ← adj₂.homEquiv₂.symm.injective.eq_iff'] + rw [Equiv.symm_apply_apply] + end mateEquiv section mateEquivVComp diff --git a/Mathlib/CategoryTheory/Sites/Descent/DescentDataDoublePrime.lean b/Mathlib/CategoryTheory/Sites/Descent/DescentDataDoublePrime.lean index deef873dd99ada..e24db39125953d 100644 --- a/Mathlib/CategoryTheory/Sites/Descent/DescentDataDoublePrime.lean +++ b/Mathlib/CategoryTheory/Sites/Descent/DescentDataDoublePrime.lean @@ -95,28 +95,6 @@ lemma mapComp'_τl_τr_compatibility NatTrans.congr_app (Adj.unit_comp_mapComp'_hom_τr_comp_counit F g.op.toLoc f.op.toLoc fg.op.toLoc (by aesoptoloc)) obj - /-rw [← Adj.Hom₂.conjugateEquiv_symm_τg, - Bicategory.conjugateEquiv_symm_apply, Bicategory.mateEquiv_symm_apply, - Adjunction.homEquiv₂_symm_apply, Adjunction.homEquiv₁_symm_apply] - dsimp [Cat.associator_hom_app, Cat.associator_inv_app, - Cat.leftUnitor_inv_app, Cat.rightUnitor_hom_app] - simp only [Category.comp_id, Category.id_comp, Category.assoc, Functor.map_comp] - erw [← NatTrans.naturality] - dsimp - simp only [← Category.assoc]; congr 1; simp only [Category.assoc] - simp only [← Functor.map_comp_assoc, ← Functor.map_comp] - have h₁ := (F.mapComp' g.op.toLoc f.op.toLoc fg.op.toLoc (by aesoptoloc)).hom.τr.naturality - ((F.map f.op.toLoc).l.map ((F.map g.op.toLoc).adj.counit.app obj)) - dsimp at h₁ - rw [← h₁] - simp only [← Category.assoc]; congr 2; simp only [Category.assoc] - have h₂ := (F.map f.op.toLoc).adj.unit.naturality - ((F.map g.op.toLoc).adj.counit.app obj) - dsimp at h₂ - rw [← Functor.map_comp, ← h₂] - have h₃ := (F.map g.op.toLoc).adj.toCategory.right_triangle_components obj - dsimp at h₃ - rw [Functor.map_comp, reassoc_of% h₃]-/ lemma homEquiv_symm_pullHom'' ⦃X₁ X₂ : C⦄ ⦃obj₁ : (F.obj (.mk (op X₁))).obj⦄ ⦃obj₂ : (F.obj (.mk (op X₂))).obj⦄ From 2900bfa487c274a99236fb0a56cce08aeb226abb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=ABl=20Riou?= Date: Mon, 19 May 2025 22:46:02 +0200 Subject: [PATCH 103/118] little progress --- .../Bicategory/Adjunction/Adj.lean | 33 +++++++++++++--- .../Bicategory/Adjunction/BaseChange.lean | 38 +++++++++++++++++++ 2 files changed, 65 insertions(+), 6 deletions(-) diff --git a/Mathlib/CategoryTheory/Bicategory/Adjunction/Adj.lean b/Mathlib/CategoryTheory/Bicategory/Adjunction/Adj.lean index fe285ee304c306..8a06588dbdb432 100644 --- a/Mathlib/CategoryTheory/Bicategory/Adjunction/Adj.lean +++ b/Mathlib/CategoryTheory/Bicategory/Adjunction/Adj.lean @@ -239,6 +239,17 @@ lemma homEquiv₁_τl_eq : rw [← cancel_epi (α_ _ _ _).hom, Iso.hom_inv_id_assoc, ← mateEquiv_eq_iff', mateEquiv_eq_iff, homEquiv₂_τl_eq, Category.assoc, Iso.inv_hom_id, Category.comp_id] +@[reassoc] +lemma τr_whiskerRight_comp_counit : + p.τr ▷ α.l ≫ α.adj.counit = β.r ◁ p.τl ≫ β.adj.counit := by + simpa [Adjunction.homEquiv₁_apply, Adjunction.homEquiv₂_symm_apply, + ← cancel_epi (β.r ◁ (λ_ _).inv)] using p.homEquiv₁_τl_eq.symm + +@[reassoc] +lemma unit_comp_τl_whiskerRIght : α.adj.unit ≫ p.τl ▷ α.r = β.adj.unit ≫ β.l ◁ p.τr := by + simpa [Adjunction.homEquiv₁_symm_apply, Adjunction.homEquiv₂_apply, + ← cancel_mono ((ρ_ _).hom ▷ α.r)] using p.homEquiv₂_τl_eq + end Hom₂ instance : CategoryStruct (a ⟶ b) where @@ -355,44 +366,54 @@ def forget₂ : Pseudofunctor (Adj B)ᵒᵖ B where mapId _ := Iso.refl _ mapComp _ _ := Iso.refl _ +section + +variable {a b : Adj B} {adj₁ adj₂ : a ⟶ b} (e : adj₁ ≅ adj₂) + /-- Given an isomorphism between two 1-morphisms in `Adj B`, this is the underlying isomorphisms between the left adjoints. -/ @[simps] -def lIso {a b : Adj B} {adj₁ adj₂ : a ⟶ b} (e : adj₁ ≅ adj₂) : adj₁.l ≅ adj₂.l where +def lIso : adj₁.l ≅ adj₂.l where hom := e.hom.τl inv := e.inv.τl hom_inv_id := by rw [← comp_τl, e.hom_inv_id, id_τl] inv_hom_id := by rw [← comp_τl, e.inv_hom_id, id_τl] @[reassoc (attr := simp)] -lemma hom_inv_τl {a b : Adj B} {adj₁ adj₂ : a ⟶ b} (e : adj₁ ≅ adj₂) : +lemma hom_inv_id_τl : e.hom.τl ≫ e.inv.τl = 𝟙 _ := (lIso e).hom_inv_id @[reassoc (attr := simp)] -lemma inv_hom_τl {a b : Adj B} {adj₁ adj₂ : a ⟶ b} (e : adj₁ ≅ adj₂) : +lemma inv_hom_id_τl : e.inv.τl ≫ e.hom.τl = 𝟙 _ := (lIso e).inv_hom_id /-- Given an isomorphism between two 1-morphisms in `Adj B`, this is the underlying isomorphisms between the right adjoints. -/ @[simps] -def rIso {a b : Adj B} {adj₁ adj₂ : a ⟶ b} (e : adj₁ ≅ adj₂) : adj₁.r ≅ adj₂.r where +def rIso : adj₁.r ≅ adj₂.r where hom := e.inv.τr inv := e.hom.τr hom_inv_id := by rw [← comp_τr, e.hom_inv_id, id_τr] inv_hom_id := by rw [← comp_τr, e.inv_hom_id, id_τr] @[reassoc (attr := simp)] -lemma hom_inv_τr {a b : Adj B} {adj₁ adj₂ : a ⟶ b} (e : adj₁ ≅ adj₂) : +lemma hom_inv_id_τr : e.hom.τr ≫ e.inv.τr = 𝟙 _ := (rIso e).inv_hom_id @[reassoc (attr := simp)] -lemma inv_hom_τr {a b : Adj B} {adj₁ adj₂ : a ⟶ b} (e : adj₁ ≅ adj₂) : +lemma inv_hom_id_τr : e.inv.τr ≫ e.hom.τr = 𝟙 _ := (rIso e).hom_inv_id + +instance (φ : adj₁ ⟶ adj₂) [IsIso φ] : IsIso φ.τl := (lIso (asIso φ)).isIso_hom +instance (φ : adj₁ ⟶ adj₂) [IsIso φ] : IsIso φ.τr := (rIso (asIso φ)).isIso_inv + +end + section variable {C : Type*} [Bicategory C] (F : Pseudofunctor B (Adj C)) diff --git a/Mathlib/CategoryTheory/Bicategory/Adjunction/BaseChange.lean b/Mathlib/CategoryTheory/Bicategory/Adjunction/BaseChange.lean index 60e2b0c9e3668f..9fc16d008428fb 100644 --- a/Mathlib/CategoryTheory/Bicategory/Adjunction/BaseChange.lean +++ b/Mathlib/CategoryTheory/Bicategory/Adjunction/BaseChange.lean @@ -237,6 +237,8 @@ lemma baseChange_of_comp_eq : simp only [Bicategory.whiskerRight_id, Category.assoc] simp [← Bicategory.whiskerLeft_comp_assoc, ← Bicategory.whiskerLeft_comp] +--set_option maxHeartbeats 400000 in +-- this is slow lemma whiskerRight_whiskerBaseChange : F.whiskerBaseChange sq ▷ (F.map d).l = (α_ _ _ _).hom ≫ @@ -250,6 +252,42 @@ lemma whiskerRight_whiskerBaseChange : triangle_assoc_comp_right] rw [F.baseChange_of_comp_eq sq b' r' d hbd hrd] simp [Adj.comp_forget₁_mapComp'] + rw [Bicategory.associator_inv_naturality_right_assoc, + whisker_exchange_assoc] + simp only [Bicategory.whiskerRight_comp, comp_whiskerLeft, Category.assoc, Iso.inv_hom_id_assoc, + pentagon_hom_inv_inv_inv_inv_assoc, Iso.hom_inv_id_assoc] + congr 2 + dsimp + rw [← Bicategory.associator_inv_naturality_left_assoc, + Iso.inv_hom_id_assoc, ← whisker_exchange_assoc, + Bicategory.whiskerRight_id_assoc, Iso.inv_hom_id_assoc, + Adj.inv_hom_id_τl] + dsimp + rw [Category.comp_id, comp_whiskerLeft_assoc, Iso.inv_hom_id_assoc] + simp only [← Bicategory.whiskerLeft_comp_assoc, + Category.assoc] + rw [← Bicategory.associator_inv_naturality_left_assoc, + leftUnitor_comp_inv_assoc, whisker_exchange_assoc] + rw [Bicategory.comp_whiskerLeft_assoc, Iso.inv_hom_id_assoc] + rw [whisker_exchange_assoc] + rw [Bicategory.whiskerRight_comp_assoc] + rw [pentagon_inv_hom_hom_hom_inv_assoc] + rw [comp_whiskerLeft_assoc] + rw [Iso.inv_hom_id_assoc] + rw [← Bicategory.whiskerLeft_comp_assoc] + rw [← Bicategory.whiskerLeft_comp_assoc] + rw [← Bicategory.whiskerLeft_comp (F.map d).l] + rw [Category.assoc, Category.assoc] + rw [associator_inv_naturality_right_assoc] + have : ((F.map d).r ≫ (F.map r).r) ◁ (F.mapComp' r d r' hrd).inv.τl ≫ + (F.mapComp' r d r' hrd).hom.τr ▷ (F.map r').l ≫ (F.map r').adj.counit = + (F.map r ≫ F.map d).adj.counit := by + dsimp + sorry + rw [this] + dsimp + rw [Iso.inv_hom_id_assoc] + rw [← Bicategory.whiskerLeft_comp_assoc] sorry end From 454bea835af07b6bcfeb4c5322b6cff15db323f3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=ABl=20Riou?= Date: Tue, 20 May 2025 10:38:56 +0200 Subject: [PATCH 104/118] removed a sorry --- .../Bicategory/Adjunction/BaseChange.lean | 29 +++---------------- 1 file changed, 4 insertions(+), 25 deletions(-) diff --git a/Mathlib/CategoryTheory/Bicategory/Adjunction/BaseChange.lean b/Mathlib/CategoryTheory/Bicategory/Adjunction/BaseChange.lean index 9fc16d008428fb..00d36705ebac6a 100644 --- a/Mathlib/CategoryTheory/Bicategory/Adjunction/BaseChange.lean +++ b/Mathlib/CategoryTheory/Bicategory/Adjunction/BaseChange.lean @@ -237,8 +237,6 @@ lemma baseChange_of_comp_eq : simp only [Bicategory.whiskerRight_id, Category.assoc] simp [← Bicategory.whiskerLeft_comp_assoc, ← Bicategory.whiskerLeft_comp] ---set_option maxHeartbeats 400000 in --- this is slow lemma whiskerRight_whiskerBaseChange : F.whiskerBaseChange sq ▷ (F.map d).l = (α_ _ _ _).hom ≫ @@ -266,29 +264,10 @@ lemma whiskerRight_whiskerBaseChange : rw [Category.comp_id, comp_whiskerLeft_assoc, Iso.inv_hom_id_assoc] simp only [← Bicategory.whiskerLeft_comp_assoc, Category.assoc] - rw [← Bicategory.associator_inv_naturality_left_assoc, - leftUnitor_comp_inv_assoc, whisker_exchange_assoc] - rw [Bicategory.comp_whiskerLeft_assoc, Iso.inv_hom_id_assoc] - rw [whisker_exchange_assoc] - rw [Bicategory.whiskerRight_comp_assoc] - rw [pentagon_inv_hom_hom_hom_inv_assoc] - rw [comp_whiskerLeft_assoc] - rw [Iso.inv_hom_id_assoc] - rw [← Bicategory.whiskerLeft_comp_assoc] - rw [← Bicategory.whiskerLeft_comp_assoc] - rw [← Bicategory.whiskerLeft_comp (F.map d).l] - rw [Category.assoc, Category.assoc] - rw [associator_inv_naturality_right_assoc] - have : ((F.map d).r ≫ (F.map r).r) ◁ (F.mapComp' r d r' hrd).inv.τl ≫ - (F.mapComp' r d r' hrd).hom.τr ▷ (F.map r').l ≫ (F.map r').adj.counit = - (F.map r ≫ F.map d).adj.counit := by - dsimp - sorry - rw [this] - dsimp - rw [Iso.inv_hom_id_assoc] - rw [← Bicategory.whiskerLeft_comp_assoc] - sorry + rw [Adj.unit_comp_mapComp'_hom_τr_comp_counit F r d r' hrd, + Iso.inv_hom_id_assoc, Iso.inv_hom_id_assoc, ← Bicategory.whiskerLeft_comp_assoc, + Adj.inv_hom_id_τl] + simp end From 69ccc8fd20e3381ed0b7f599c17fe1750d982564 Mon Sep 17 00:00:00 2001 From: Christian Merten Date: Tue, 27 May 2025 23:52:37 +0200 Subject: [PATCH 105/118] some progress --- .../Bicategory/Adjunction/Adj.lean | 11 ++ .../Bicategory/Adjunction/BaseChange.lean | 20 ++- .../Sites/Descent/DescentDataDoublePrime.lean | 138 +++++++++++++++++- .../Sites/Descent/DescentDataPrime.lean | 18 +++ 4 files changed, 180 insertions(+), 7 deletions(-) diff --git a/Mathlib/CategoryTheory/Bicategory/Adjunction/Adj.lean b/Mathlib/CategoryTheory/Bicategory/Adjunction/Adj.lean index 8a06588dbdb432..4c5a1ecc02de5c 100644 --- a/Mathlib/CategoryTheory/Bicategory/Adjunction/Adj.lean +++ b/Mathlib/CategoryTheory/Bicategory/Adjunction/Adj.lean @@ -458,6 +458,17 @@ lemma unit_comp_mapComp'_hom_τr_comp_counit : simp [-Adjunction.left_triangle, bicategoricalComp] · simp +lemma counit_map_of_comp : + (F.map fg).adj.counit = + (F.mapComp' f g fg hfg).inv.τr ▷ _ ≫ + _ ◁ (F.mapComp' f g fg hfg).hom.τl ≫ + (α_ _ _ _).inv ≫ + (α_ _ _ _).hom ▷ (F.map g).l ≫ + (_ ◁ (F.map f).adj.counit) ▷ (F.map g).l ≫ + (ρ_ _).hom ▷ (F.map g).l ≫ + (F.map g).adj.counit := by + sorry + end end Adj diff --git a/Mathlib/CategoryTheory/Bicategory/Adjunction/BaseChange.lean b/Mathlib/CategoryTheory/Bicategory/Adjunction/BaseChange.lean index 00d36705ebac6a..8290ae7aec1f46 100644 --- a/Mathlib/CategoryTheory/Bicategory/Adjunction/BaseChange.lean +++ b/Mathlib/CategoryTheory/Bicategory/Adjunction/BaseChange.lean @@ -107,18 +107,26 @@ lemma whiskerBaseChange_eq' : F.whiskerBaseChange sq = rw [mateEquiv_apply', Equiv.symm_apply_apply, Iso.inv_hom_id_assoc, whiskerBaseChange] +lemma whiskerBaseChange_eq_whiskerLeft_isoMapOfCommSq : + F.whiskerBaseChange sq = + (F.map l).r ◁ (F.isoMapOfCommSq sq).hom.τl ≫ + (α_ _ _ _).inv ≫ + (F.map l).adj.counit ▷ _ ≫ + (λ_ _).hom := + rfl + +lemma whiskerBaseChange_eq_whiskerRight_baseChange : + F.whiskerBaseChange sq = + (α_ _ _ _).inv ≫ F.baseChange sq ▷ (F.map r).l ≫ + (α_ _ _ _).hom ≫ (F.map b).l ◁ (F.map r).adj.counit ≫ (ρ_ _).hom := + sorry + /-lemma whiskerBaseChange_eq' : F.whiskerBaseChange sq = (α_ _ _ _).inv ≫ F.baseChange sq ▷ (F.map r).l ≫ (α_ _ _ _).hom ≫ (F.map b).l ◁ (F.map r).adj.counit ≫ (ρ_ _).hom := by rw [whiskerBaseChange_eq, Adjunction.homEquiv₂_symm_apply]-/ - --- is this true? ---instance [IsIso (F.baseChange sq)] : Mono (F.whiskerBaseChange sq) := by --- dsimp [whiskerBaseChange] --- sorry - section Horizontal variable {B C : Type*} [Bicategory B] [Strict B] [Bicategory C] diff --git a/Mathlib/CategoryTheory/Sites/Descent/DescentDataDoublePrime.lean b/Mathlib/CategoryTheory/Sites/Descent/DescentDataDoublePrime.lean index e24db39125953d..a44a1988df2881 100644 --- a/Mathlib/CategoryTheory/Sites/Descent/DescentDataDoublePrime.lean +++ b/Mathlib/CategoryTheory/Sites/Descent/DescentDataDoublePrime.lean @@ -34,6 +34,28 @@ instance (X : LocallyDiscrete C) (F : Pseudofunctor (LocallyDiscrete C) (Adj Ca change (F.map (𝟙 X).toLoc).l.IsEquivalence infer_instance +-- TODO: add `Pseudofunctor.comp_mapComp'` +lemma mapComp'_comp_forget₁_hom {C : Type*} [Bicategory C] [Strict C] + (F : Pseudofunctor C (Adj Cat)) + {X Y Z : C} (f : X ⟶ Y) (g : Y ⟶ Z) (fg : X ⟶ Z) (hfg : f ≫ g = fg) : + ((F.comp Adj.forget₁).mapComp' f g fg hfg).hom = + (F.mapComp' f g fg hfg).hom.τl := by + simp [Adj.comp_forget₁_mapComp'] + +lemma mapComp'_comp_forget₁_inv {C : Type*} [Bicategory C] [Strict C] + (F : Pseudofunctor C (Adj Cat)) + {X Y Z : C} (f : X ⟶ Y) (g : Y ⟶ Z) (fg : X ⟶ Z) (hfg : f ≫ g = fg) : + ((F.comp Adj.forget₁).mapComp' f g fg hfg).inv = + (F.mapComp' f g fg hfg).inv.τl := by + simp [Adj.comp_forget₁_mapComp'] + +section + +variable {C B : Type*} [Bicategory C] [Strict C] [Bicategory B] + (F : Pseudofunctor C (Adj B)) + +end + variable {ι : Type*} {S : C} {X : ι → C} {f : ∀ i, X i ⟶ S} (sq : ∀ i j, ChosenPullback (f i) (f j)) (sq₃ : ∀ (i₁ i₂ i₃ : ι), ChosenPullback₃ (sq i₁ i₂) (sq i₂ i₃) (sq i₁ i₃)) @@ -190,6 +212,119 @@ lemma hom_self_iff_dataEquivDescentData' ⦃i : ι⦄ (δ : (sq i i).Diagonal) : rw [this] apply DescentData'.pullHom'_eq_pullHom <;> simp +lemma homEquiv_symm_pullHom''_eq_pullHom'_dataEquivDescentData' (i₁ i₂ i₃ : ι) : + (((F.map (sq₃ i₁ i₂ i₃).p₁.op.toLoc).adj.toCategory).homEquiv _ _).symm + (pullHom'' (hom i₁ i₃) (sq₃ i₁ i₂ i₃).p₁₃ _ _) = + DescentData'.pullHom' (F := F.comp Adj.forget₁) + (dataEquivDescentData' hom) (sq₃ i₁ i₂ i₃).p (sq₃ i₁ i₂ i₃).p₁ (sq₃ i₁ i₂ i₃).p₃ := by + rw [homEquiv_symm_pullHom'', dataEquivDescentData'] + simp only [comp_toPrelaxFunctor, PrelaxFunctor.comp_toPrelaxFunctorStruct, + PrelaxFunctorStruct.comp_toPrefunctor, Prefunctor.comp_obj, Adj.forget₁_obj, + Prefunctor.comp_map, Adj.forget₁_map] + rw [DescentData'.pullHom'_eq_pullHom _ (sq₃ i₁ i₂ i₃).p _ _ _ _ (sq₃ i₁ i₂ i₃).p₁₃] + · rfl + · simp + · simp + +variable (i₁ i₂ i₃ : ι) + +@[reassoc] +lemma map_p₁₂_baseChange_comp_counit (i₁ i₂ i₃ : ι) (M) : + (F.map (sq₃ i₁ i₂ i₃).p₁₂.op.toLoc).l.map + ((F.baseChange (sq₃ i₁ i₂ i₃).isPullback₂.toCommSq.flip.op.toLoc).app M) ≫ + (F.map (sq₃ i₁ i₂ i₃).p₁₂.op.toLoc).adj.counit.app _ = + (F.mapComp' (sq i₁ i₂).p₂.op.toLoc (sq₃ i₁ i₂ i₃).p₁₂.op.toLoc + (sq₃ i₁ i₂ i₃).p₂.op.toLoc (by aesoptoloc)).inv.τl.app _ ≫ + (F.mapComp' (sq i₂ i₃).p₁.op.toLoc (sq₃ i₁ i₂ i₃).p₂₃.op.toLoc + (sq₃ i₁ i₂ i₃).p₂.op.toLoc (by aesoptoloc)).hom.τl.app _ ≫ + (F.map (sq₃ i₁ i₂ i₃).p₂₃.op.toLoc).l.map + ((F.map (sq i₂ i₃).p₁.op.toLoc).adj.counit.app _) ≫ + (by dsimp; exact eqToHom rfl) := by + have h1 := congr($(F.whiskerBaseChange_eq_whiskerRight_baseChange + (sq₃ i₁ i₂ i₃).isPullback₂.toCommSq.flip.op.toLoc).app M) + have h2 := congr($(F.whiskerBaseChange_eq_whiskerLeft_isoMapOfCommSq + (sq₃ i₁ i₂ i₃).isPullback₂.toCommSq.flip.op.toLoc).app M) + dsimp at h1 h2 + rw [h2] at h1 + simp [Cat.associator_hom_app, Cat.associator_inv_app, Cat.rightUnitor_inv_app, + Cat.leftUnitor_hom_app, Cat.rightUnitor_hom_app] at h1 + rw [← h1] + simp only [Cat.comp_obj, Cat.id_obj, Adj.comp_l, eqToHom_refl, id_eq, Category.comp_id] + rw [F.isoMapOfCommSq_eq _ (sq₃ i₁ i₂ i₃).p₂.op.toLoc (by aesoptoloc)] + simp + +-- TODO: fix the name, this has nothing to do with `baseChange`, could maybe even be inlined by +-- adding some more lemmas +@[reassoc] +lemma baseChange_eq'' (i₁ i₂ i₃ : ι) (M) + (f : (F.map (sq i₁ i₂).p₂.op.toLoc).l.obj ((F.map (sq i₂ i₃).p₁.op.toLoc).r.obj M) ⟶ + (F.map (sq₃ i₁ i₂ i₃).p₁₂.op.toLoc).r.obj ((F.map (sq₃ i₁ i₂ i₃).p₂₃.op.toLoc).l.obj M)) : + (F.map (sq₃ i₁ i₂ i₃).p₁.op.toLoc).l.map + ((F.map (sq i₁ i₂).p₁.op.toLoc).r.map f) ≫ + (F.map (sq₃ i₁ i₂ i₃).p₁.op.toLoc).l.map + ((F.mapComp' _ _ (sq₃ i₁ i₂ i₃).p₁.op.toLoc (by aesoptoloc)).hom.τr.app _) ≫ + (F.map (sq₃ i₁ i₂ i₃).p₁.op.toLoc).adj.counit.app _ = + ((F.mapComp' (sq i₁ i₂).p₁.op.toLoc (sq₃ i₁ i₂ i₃).p₁₂.op.toLoc + (sq₃ i₁ i₂ i₃).p₁.op.toLoc (by aesoptoloc)).hom.τl.app _) ≫ + (F.map (sq₃ i₁ i₂ i₃).p₁₂.op.toLoc).l.map + ((F.map (sq i₁ i₂).p₁.op.toLoc).adj.counit.app _) ≫ + (F.map (sq₃ i₁ i₂ i₃).p₁₂.op.toLoc).l.map f ≫ + (F.map (sq₃ i₁ i₂ i₃).p₁₂.op.toLoc).adj.counit.app _ := by + have := Adj.counit_map_of_comp F (sq i₁ i₂).p₁.op.toLoc (sq₃ i₁ i₂ i₃).p₁₂.op.toLoc + (sq₃ i₁ i₂ i₃).p₁.op.toLoc (by aesoptoloc) + rw [this] + simp [Cat.associator_hom_app, Cat.associator_inv_app, Cat.rightUnitor_inv_app, + Cat.leftUnitor_hom_app] + congr 1 + rw [← (F.map (sq₃ i₁ i₂ i₃).p₁₂.op.toLoc).l.map_comp_assoc] + rw [← (F.map (sq₃ i₁ i₂ i₃).p₁₂.op.toLoc).l.map_comp_assoc] + rw [Category.assoc] + rw [← (F.map (sq i₁ i₂).p₁.op.toLoc).l.map_comp] + rw [← NatTrans.comp_app] + rw [Adj.hom_inv_id_τr] + simp only [Adj.comp_r, Cat.id_app, Cat.comp_obj, Functor.map_id, Category.comp_id] + rw [← (F.map (sq₃ i₁ i₂ i₃).p₁₂.op.toLoc).l.map_comp_assoc] + erw [(F.map (sq i₁ i₂).p₁.op.toLoc).adj.counit.naturality] + simp + +-- TODO: clean this up, it's an `erw`-massacre +lemma homEquiv_symm_homComp (i₁ i₂ i₃ : ι) : + (((F.map (sq₃ i₁ i₂ i₃).p₁.op.toLoc).adj.toCategory).homEquiv _ _).symm + (homComp sq₃ hom i₁ i₂ i₃) = + DescentData'.pullHom' (F := F.comp Adj.forget₁) + (dataEquivDescentData' hom) (sq₃ i₁ i₂ i₃).p (sq₃ i₁ i₂ i₃).p₁ (sq₃ i₁ i₂ i₃).p₂ ≫ + DescentData'.pullHom' + (dataEquivDescentData' hom) (sq₃ i₁ i₂ i₃).p (sq₃ i₁ i₂ i₃).p₂ (sq₃ i₁ i₂ i₃).p₃ := by + rw [DescentData'.pullHom'₁₂_eq_pullHom_of_chosenPullback₃] + rw [DescentData'.pullHom'₂₃_eq_pullHom_of_chosenPullback₃] + rw [dataEquivDescentData'] + dsimp only [comp_toPrelaxFunctor, PrelaxFunctor.comp_toPrelaxFunctorStruct, + PrelaxFunctorStruct.comp_toPrefunctor, Prefunctor.comp_obj, Adj.forget₁_obj, + Prefunctor.comp_map, Adj.forget₁_map, Equiv.piCongrRight_apply, Pi.map_apply] + simp_rw [Adjunction.homEquiv_counit] + dsimp only [Adjunction.toCategory_counit] + rw [homComp] + simp only [Cat.comp_obj, Adj.comp_r, Adj.rIso_inv, Adj.comp_l, Adj.lIso_inv, Functor.map_comp, + Category.assoc, pullHom, comp_toPrelaxFunctor, PrelaxFunctor.comp_toPrelaxFunctorStruct, + PrelaxFunctorStruct.comp_toPrefunctor, Prefunctor.comp_obj, Adj.forget₁_obj, + Prefunctor.comp_map, Adj.forget₁_map] + erw [(F.map (sq₃ i₁ i₂ i₃).p₁.op.toLoc).adj.counit.naturality] + dsimp only [Cat.comp_obj, Cat.id_obj, Cat.id_map] + rw [baseChange_eq''_assoc] + rw [map_p₁₂_baseChange_comp_counit_assoc] + simp only [Cat.comp_obj, Adj.comp_l, Cat.id_obj, eqToHom_refl, id_eq, Category.id_comp, + NatTrans.naturality_assoc, Cat.comp_map] + rw [mapComp'_comp_forget₁_hom] + rw [mapComp'_comp_forget₁_hom] + rw [mapComp'_comp_forget₁_inv] + rw [mapComp'_comp_forget₁_inv] + congr 2 + rw [← (F.map (sq₃ i₁ i₂ i₃).p₁₂.op.toLoc).l.map_comp_assoc] + erw [(F.map (sq i₁ i₂).p₁.op.toLoc).adj.counit.naturality] + simp only [Cat.comp_obj, Cat.id_obj, Cat.id_map, Functor.map_comp, Category.assoc] + erw [(F.mapComp' _ _ _ _).inv.τl.naturality_assoc] + simp + lemma hom_comp_iff_dataEquivDescentData' (i₁ i₂ i₃ : ι) : homComp sq₃ hom i₁ i₂ i₃ = pullHom'' (hom i₁ i₃) (sq₃ i₁ i₂ i₃).p₁₃ _ _ ↔ DescentData'.pullHom' (F := F.comp Adj.forget₁) @@ -198,7 +333,8 @@ lemma hom_comp_iff_dataEquivDescentData' (i₁ i₂ i₃ : ι) : (dataEquivDescentData' hom) (sq₃ i₁ i₂ i₃).p (sq₃ i₁ i₂ i₃).p₂ (sq₃ i₁ i₂ i₃).p₃ = DescentData'.pullHom' (dataEquivDescentData' hom) (sq₃ i₁ i₂ i₃).p (sq₃ i₁ i₂ i₃).p₁ (sq₃ i₁ i₂ i₃).p₃ := by - sorry + rw [← homEquiv_symm_pullHom''_eq_pullHom'_dataEquivDescentData', ← homEquiv_symm_homComp] + simp end diff --git a/Mathlib/CategoryTheory/Sites/Descent/DescentDataPrime.lean b/Mathlib/CategoryTheory/Sites/Descent/DescentDataPrime.lean index 7606462232e032..9f155b34a7403d 100644 --- a/Mathlib/CategoryTheory/Sites/Descent/DescentDataPrime.lean +++ b/Mathlib/CategoryTheory/Sites/Descent/DescentDataPrime.lean @@ -48,6 +48,24 @@ lemma pullHom'_eq_pullHom ⦃Y : C⦄ (q : Y ⟶ S) ⦃i₁ i₂ : ι⦄ (f₁ : apply (sq i₁ i₂).isPullback.hom_ext <;> aesop rfl +@[reassoc] +lemma pullHom'₁₂_eq_pullHom_of_chosenPullback₃ (i₁ i₂ i₃ : ι) : + pullHom' hom (sq₃ i₁ i₂ i₃).p (sq₃ i₁ i₂ i₃).p₁ (sq₃ i₁ i₂ i₃).p₂ = + pullHom (hom i₁ i₂) (sq₃ i₁ i₂ i₃).p₁₂ _ _ := + pullHom'_eq_pullHom _ _ _ _ _ _ _ (by simp) (by simp) + +@[reassoc] +lemma pullHom'₁₃_eq_pullHom_of_chosenPullback₃ (i₁ i₂ i₃ : ι) : + pullHom' hom (sq₃ i₁ i₂ i₃).p (sq₃ i₁ i₂ i₃).p₁ (sq₃ i₁ i₂ i₃).p₃ = + pullHom (hom i₁ i₃) (sq₃ i₁ i₂ i₃).p₁₃ _ _ := + pullHom'_eq_pullHom _ _ _ _ _ _ _ (by simp) (by simp) + +@[reassoc] +lemma pullHom'₂₃_eq_pullHom_of_chosenPullback₃ (i₁ i₂ i₃ : ι) : + pullHom' hom (sq₃ i₁ i₂ i₃).p (sq₃ i₁ i₂ i₃).p₂ (sq₃ i₁ i₂ i₃).p₃ = + pullHom (hom i₂ i₃) (sq₃ i₁ i₂ i₃).p₂₃ _ _ := + pullHom'_eq_pullHom _ _ _ _ _ _ _ (by simp) (by simp) + @[reassoc] lemma pullHom_pullHom' ⦃Y Y' : C⦄ (g : Y' ⟶ Y) (q : Y ⟶ S) (q' : Y' ⟶ S) (hq : g ≫ q = q') ⦃i₁ i₂ : ι⦄ (f₁ : Y ⟶ X i₁) (f₂ : Y ⟶ X i₂) (hf₁ : f₁ ≫ f i₁ = q) (hf₂ : f₂ ≫ f i₂ = q) From 027748a3caa32630d444922a620dc54c080c2363 Mon Sep 17 00:00:00 2001 From: Christian Merten Date: Wed, 4 Jun 2025 17:44:37 +0200 Subject: [PATCH 106/118] fill a sorry --- .../CategoryTheory/Bicategory/Adjunction/Adj.lean | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/Mathlib/CategoryTheory/Bicategory/Adjunction/Adj.lean b/Mathlib/CategoryTheory/Bicategory/Adjunction/Adj.lean index 4c5a1ecc02de5c..f75bd8c7c155b2 100644 --- a/Mathlib/CategoryTheory/Bicategory/Adjunction/Adj.lean +++ b/Mathlib/CategoryTheory/Bicategory/Adjunction/Adj.lean @@ -464,10 +464,19 @@ lemma counit_map_of_comp : _ ◁ (F.mapComp' f g fg hfg).hom.τl ≫ (α_ _ _ _).inv ≫ (α_ _ _ _).hom ▷ (F.map g).l ≫ - (_ ◁ (F.map f).adj.counit) ▷ (F.map g).l ≫ + ((F.map g).r ◁ (F.map f).adj.counit) ▷ (F.map g).l ≫ (ρ_ _).hom ▷ (F.map g).l ≫ (F.map g).adj.counit := by - sorry + rw [← cancel_epi ((F.mapComp' f g fg hfg).hom.τr ▷ (F.map fg).l), ← cancel_epi (α_ _ _ _).inv] + apply (F.map g).adj.homEquiv₁.symm.injective + rw [Adjunction.homEquiv₁_symm_apply] + simp only [whiskerRight_comp, comp_r, whiskerLeft_comp, Category.assoc, + pentagon_hom_hom_inv_hom_hom_assoc, comp_l, comp_whiskerLeft, whisker_assoc, + triangle_assoc_comp_right_assoc, pentagon_inv_hom_hom_hom_inv_assoc, Iso.inv_hom_id_assoc, + Iso.cancel_iso_inv_left, unit_comp_mapComp'_hom_τr_comp_counit] + apply (F.map g).adj.homEquiv₁.injective + rw [Adjunction.homEquiv₁_apply, ← comp_whiskerRight_assoc] + simp end From e04b1228275ed72bb118ac50dde643a8037e012a Mon Sep 17 00:00:00 2001 From: Christian Merten Date: Thu, 5 Jun 2025 12:06:31 +0200 Subject: [PATCH 107/118] some progress --- .../Bicategory/Adjunction/Adj.lean | 5 ++ .../Sites/Descent/DescentDataDoublePrime.lean | 69 ++++++++++++++++++- 2 files changed, 73 insertions(+), 1 deletion(-) diff --git a/Mathlib/CategoryTheory/Bicategory/Adjunction/Adj.lean b/Mathlib/CategoryTheory/Bicategory/Adjunction/Adj.lean index f75bd8c7c155b2..ceee64e17c95c7 100644 --- a/Mathlib/CategoryTheory/Bicategory/Adjunction/Adj.lean +++ b/Mathlib/CategoryTheory/Bicategory/Adjunction/Adj.lean @@ -389,6 +389,9 @@ lemma inv_hom_id_τl : e.inv.τl ≫ e.hom.τl = 𝟙 _ := (lIso e).inv_hom_id +instance : IsIso e.hom.τl := ⟨e.inv.τl, by simp⟩ +instance : IsIso e.inv.τl := ⟨e.hom.τl, by simp⟩ + /-- Given an isomorphism between two 1-morphisms in `Adj B`, this is the underlying isomorphisms between the right adjoints. -/ @[simps] @@ -408,6 +411,8 @@ lemma inv_hom_id_τr : e.inv.τr ≫ e.hom.τr = 𝟙 _ := (rIso e).hom_inv_id +instance : IsIso e.hom.τr := ⟨e.inv.τr, by simp⟩ +instance : IsIso e.inv.τr := ⟨e.hom.τr, by simp⟩ instance (φ : adj₁ ⟶ adj₂) [IsIso φ] : IsIso φ.τl := (lIso (asIso φ)).isIso_hom instance (φ : adj₁ ⟶ adj₂) [IsIso φ] : IsIso φ.τr := (rIso (asIso φ)).isIso_inv diff --git a/Mathlib/CategoryTheory/Sites/Descent/DescentDataDoublePrime.lean b/Mathlib/CategoryTheory/Sites/Descent/DescentDataDoublePrime.lean index a44a1988df2881..32f128d2d4550c 100644 --- a/Mathlib/CategoryTheory/Sites/Descent/DescentDataDoublePrime.lean +++ b/Mathlib/CategoryTheory/Sites/Descent/DescentDataDoublePrime.lean @@ -341,6 +341,7 @@ end section variable [∀ i₁ i₂, IsIso (F.baseChange (sq i₁ i₂).isPullback.toCommSq.flip.op.toLoc)] + [∀ i₁ i₂ i₃, IsIso (F.baseChange (sq₃ i₁ i₂ i₃).isPullback₂.toCommSq.flip.op.toLoc)] -- should require the same for `(sq₃ i₁ i₂ i₃).isPullback₂`. noncomputable def dataEquivCoalgebra @@ -379,13 +380,79 @@ lemma hom_self_iff_dataEquivCoalgebra ⦃i : ι⦄ (δ : (sq i i).Diagonal): rw [← Adj.lIso_hom, ← Adj.lIso_inv, Iso.hom_inv_id_app_assoc, ← Adj.lIso_hom, ← Adj.lIso_inv, Iso.hom_inv_id_app, Category.comp_id] +variable (obj) in +private noncomputable def correction (i₁ i₂ i₃ : ι) : + (F.map (sq₃ i₁ i₂ i₃).p₁.op.toLoc).r.obj + ((F.map (sq₃ i₁ i₂ i₃).p₃.op.toLoc).l.obj (obj i₃)) ⟶ + (F.map (f i₁).op.toLoc).l.obj + ((F.map (f i₂).op.toLoc).r.obj + ((F.map (f i₂).op.toLoc).l.obj + ((F.map (f i₃).op.toLoc).r.obj (obj i₃)))) := + (F.map (sq₃ i₁ i₂ i₃).p₁.op.toLoc).r.map + ((F.mapComp' (sq i₂ i₃).p₂.op.toLoc (sq₃ i₁ i₂ i₃).p₂₃.op.toLoc + (sq₃ i₁ i₂ i₃).p₃.op.toLoc (by aesoptoloc)).hom.τl.app _) ≫ + (F.mapComp' (sq i₁ i₂).p₁.op.toLoc (sq₃ i₁ i₂ i₃).p₁₂.op.toLoc + (sq₃ i₁ i₂ i₃).p₁.op.toLoc (by aesoptoloc)).inv.τr.app _ ≫ + (F.map (sq i₁ i₂).p₁.op.toLoc).r.map + (inv ((F.baseChange (sq₃ i₁ i₂ i₃).isPullback₂.toCommSq.flip.op.toLoc).app _)) ≫ + (inv (F.baseChange (sq i₁ i₂).isPullback.toCommSq.flip.op.toLoc)).app _ ≫ + (F.map (f i₁).op.toLoc).l.map ((F.map (f i₂).op.toLoc).r.map + (inv ((F.baseChange (sq i₂ i₃).isPullback.toCommSq.flip.op.toLoc).app _))) + +private instance (i₁ i₂ i₃ : ι) : IsIso (correction sq₃ obj i₁ i₂ i₃) := by + dsimp [correction] + -- TODO: does not work without these auxiliary instances + have : IsIso (F.mapComp' (sq i₁ i₂).p₁.op.toLoc (sq₃ i₁ i₂ i₃).p₁₂.op.toLoc + (sq₃ i₁ i₂ i₃).p₁.op.toLoc (by aesoptoloc)).inv.τr := inferInstance + have : IsIso (F.mapComp' (sq i₂ i₃).p₂.op.toLoc (sq₃ i₁ i₂ i₃).p₂₃.op.toLoc + (sq₃ i₁ i₂ i₃).p₃.op.toLoc (by aesoptoloc)).hom.τl := inferInstance + infer_instance + +private lemma homComp_correction (i₁ i₂ i₃ : ι) : + homComp sq₃ hom i₁ i₂ i₃ ≫ correction sq₃ obj i₁ i₂ i₃ = dataEquivCoalgebra hom i₁ i₂ ≫ + (F.map (f i₁).op.toLoc).l.map + ((F.map (f i₂).op.toLoc).r.map (dataEquivCoalgebra hom i₂ i₃)) := by + simp only [homComp, Cat.comp_obj, Adj.comp_r, Adj.rIso_inv, Adj.comp_l, Adj.lIso_inv, + NatTrans.naturality_assoc, Cat.comp_map, Category.assoc, correction] + rw [← NatTrans.comp_app_assoc] + rw [Adj.hom_inv_id_τr] + simp only [Cat.comp_obj, Adj.comp_r, Cat.id_app, Category.id_comp] + nth_rw 3 [← (F.map (sq i₁ i₂).p₁.op.toLoc).r.map_comp_assoc] + rw [← (F.map (sq₃ i₁ i₂ i₃).p₁₂.op.toLoc).r.map_comp] + rw [← NatTrans.comp_app] + rw [Adj.inv_hom_id_τl] + simp only [Adj.comp_l, Cat.id_app, Cat.comp_obj, Functor.map_id, Category.id_comp] + nth_rw 2 [← (F.map (sq i₁ i₂).p₁.op.toLoc).r.map_comp_assoc] + simp only [IsIso.hom_inv_id, Functor.map_id, Functor.map_inv, Category.id_comp] + dsimp [dataEquivCoalgebra] + simp only [NatIso.isIso_inv_app, Cat.comp_obj, Category.id_comp, Functor.map_comp, + Functor.map_inv, Category.assoc] + congr 1 + simp_rw [← Category.assoc] + congr 1 + rw [← NatIso.isIso_inv_app] + exact (inv (F.baseChange (sq i₁ i₂).isPullback.toCommSq.flip.op.toLoc)).naturality _ + +private lemma pullHom''_correction (i₁ i₂ i₃ : ι) : + pullHom'' (hom i₁ i₃) (sq₃ i₁ i₂ i₃).p₁₃ (sq₃ i₁ i₂ i₃).p₁ (sq₃ i₁ i₂ i₃).p₃ ≫ + correction sq₃ obj i₁ i₂ i₃ = + dataEquivCoalgebra hom i₁ i₃ ≫ + (F.map (f i₁).op.toLoc).l.map ((F.map (f i₂).op.toLoc).adj.unit.app + ((F.map (f i₃).op.toLoc).r.toPrefunctor.1 (obj i₃))) := by + dsimp [dataEquivCoalgebra, pullHom''] + simp only [Category.assoc, NatIso.isIso_inv_app, Cat.comp_obj, Category.id_comp] + congr 1 + simp + sorry + lemma hom_comp_iff_dataEquivCoalgebra (i₁ i₂ i₃ : ι) : homComp sq₃ hom i₁ i₂ i₃ = pullHom'' (hom i₁ i₃) (sq₃ i₁ i₂ i₃).p₁₃ _ _ ↔ dataEquivCoalgebra hom i₁ i₂ ≫ (F.map (f i₁).op.toLoc).l.map ((F.map (f i₂).op.toLoc).r.map (dataEquivCoalgebra hom i₂ i₃)) = dataEquivCoalgebra hom i₁ i₃ ≫ (F.map (f i₁).op.toLoc).l.map ((F.map (f i₂).op.toLoc).adj.unit.app _) := by - sorry + conv_lhs => rw [← cancel_mono (correction sq₃ obj i₁ i₂ i₃)] + rw [homComp_correction, pullHom''_correction] end From 1803605b543b61d96752f9b6cb5ee53ae3f4603d Mon Sep 17 00:00:00 2001 From: Christian Merten Date: Thu, 5 Jun 2025 16:22:00 +0200 Subject: [PATCH 108/118] reduce to general base change lemma --- .../Bicategory/Adjunction/BaseChange.lean | 29 +++++++-- .../Sites/Descent/DescentDataDoublePrime.lean | 60 ++++++++++++++++++- 2 files changed, 82 insertions(+), 7 deletions(-) diff --git a/Mathlib/CategoryTheory/Bicategory/Adjunction/BaseChange.lean b/Mathlib/CategoryTheory/Bicategory/Adjunction/BaseChange.lean index 8290ae7aec1f46..3cbae305eac271 100644 --- a/Mathlib/CategoryTheory/Bicategory/Adjunction/BaseChange.lean +++ b/Mathlib/CategoryTheory/Bicategory/Adjunction/BaseChange.lean @@ -133,11 +133,11 @@ variable {B C : Type*} [Bicategory B] [Strict B] [Bicategory C] (F : Pseudofunctor B (Adj C)) variable {X₁ X₂ Y₁ Y₂ Z₁ Z₂ : B} {t : X₁ ⟶ Y₁} {t' : Y₁ ⟶ Z₁} -{l : X₁ ⟶ X₂} {m : Y₁ ⟶ Y₂} {r : Z₁ ⟶ Z₂} -{b : X₂ ⟶ Y₂} {b' : Y₂ ⟶ Z₂} -(sq : CommSq t l m b) (sq' : CommSq t' m r b') -{t'' : X₁ ⟶ Z₁} {b'' : X₂ ⟶ Z₂} -(ht : t ≫ t' = t'') (hb : b ≫ b' = b'') + {l : X₁ ⟶ X₂} {m : Y₁ ⟶ Y₂} {r : Z₁ ⟶ Z₂} + {b : X₂ ⟶ Y₂} {b' : Y₂ ⟶ Z₂} + (sq : CommSq t l m b) (sq' : CommSq t' m r b') + {t'' : X₁ ⟶ Z₁} {b'' : X₂ ⟶ Z₂} + (ht : t ≫ t' = t'') (hb : b ≫ b' = b'') lemma baseChange_horiz_comp' : baseChange F (sq.horiz_comp' sq' ht hb) = @@ -340,6 +340,25 @@ lemma whiskerRight_whiskerBaseChange_triple : ((F.comp Adj.forget₁).isoMapOfCommSq h₃₂₃₁).hom := by sorry +lemma baseChange_triple : + F.baseChange sq₁₃ ≫ + (F.map u₃₁).l ◁ (λ_ _).inv ≫ (F.map u₃₁).l ◁ ((F.map p₁₃).adj.unit ▷ (F.map u₁₃).r) ≫ + (F.map u₃₁).l ◁ (α_ _ _ _).hom = + (F.map f₃).r ◁ (λ_ _).inv ≫ (F.map f₃).r ◁ ((F.map f₂).adj.unit ▷ (F.map f₁).l) ≫ + (F.map f₃).r ◁ (α_ _ _ _).hom ≫ + (F.map f₃).r ◁ (F.map f₂).l ◁ F.baseChange sq₁₂ ≫ + (α_ _ _ _).inv ≫ + (F.baseChange sq₂₃) ▷ ((F.map u₂₁).l ≫ (F.map u₁₂).r) ≫ + (α_ _ _ _).hom ≫ + (F.map u₃₂).l ◁ (α_ _ _ _).inv ≫ + (F.map u₃₂).l ◁ (F.baseChange h₂₁₂₃ ▷ (F.map u₁₂).r) ≫ + (F.map u₃₂).l ◁ (α_ _ _ _).hom ≫ + (α_ _ _ _).inv ≫ + (F.isoMapOfCommSq h₃₂₃₁).hom.τl ▷ _ ≫ + (α_ _ _ _).hom ≫ + _ ◁ _ ◁ (F.isoMapOfCommSq h₁₃₁₂).hom.τr := + sorry + end Triple section diff --git a/Mathlib/CategoryTheory/Sites/Descent/DescentDataDoublePrime.lean b/Mathlib/CategoryTheory/Sites/Descent/DescentDataDoublePrime.lean index 32f128d2d4550c..269c9a5c7f1b18 100644 --- a/Mathlib/CategoryTheory/Sites/Descent/DescentDataDoublePrime.lean +++ b/Mathlib/CategoryTheory/Sites/Descent/DescentDataDoublePrime.lean @@ -17,6 +17,30 @@ namespace CategoryTheory open Opposite Limits Bicategory +@[reassoc (attr := simp)] +lemma Bicategory.Adj.hom_inv_id_τl_app {C D : Adj Cat} {f g : C ⟶ D} (u : f ≅ g) (M) : + u.hom.τl.app M ≫ u.inv.τl.app M = 𝟙 _ := by + rw [← NatTrans.comp_app, Adj.hom_inv_id_τl] + simp + +@[reassoc (attr := simp)] +lemma Bicategory.Adj.inv_hom_id_τl_app {C D : Adj Cat} {f g : C ⟶ D} (u : f ≅ g) (M) : + u.inv.τl.app M ≫ u.hom.τl.app M = 𝟙 _ := by + rw [← NatTrans.comp_app, Adj.inv_hom_id_τl] + simp + +@[reassoc (attr := simp)] +lemma Bicategory.Adj.hom_inv_id_τr_app {C D : Adj Cat} {f g : C ⟶ D} (u : f ≅ g) (M) : + u.hom.τr.app M ≫ u.inv.τr.app M = 𝟙 _ := by + rw [← NatTrans.comp_app, Adj.hom_inv_id_τr] + simp + +@[reassoc (attr := simp)] +lemma Bicategory.Adj.inv_hom_id_τr_app {C D : Adj Cat} {f g : C ⟶ D} (u : f ≅ g) (M) : + u.inv.τr.app M ≫ u.hom.τr.app M = 𝟙 _ := by + rw [← NatTrans.comp_app, Adj.inv_hom_id_τr] + simp + namespace Pseudofunctor open LocallyDiscreteOpToCat @@ -433,17 +457,49 @@ private lemma homComp_correction (i₁ i₂ i₃ : ι) : rw [← NatIso.isIso_inv_app] exact (inv (F.baseChange (sq i₁ i₂).isPullback.toCommSq.flip.op.toLoc)).naturality _ +set_option maxHeartbeats 202000 in +-- TODO: this proof needs improvement private lemma pullHom''_correction (i₁ i₂ i₃ : ι) : pullHom'' (hom i₁ i₃) (sq₃ i₁ i₂ i₃).p₁₃ (sq₃ i₁ i₂ i₃).p₁ (sq₃ i₁ i₂ i₃).p₃ ≫ correction sq₃ obj i₁ i₂ i₃ = dataEquivCoalgebra hom i₁ i₃ ≫ (F.map (f i₁).op.toLoc).l.map ((F.map (f i₂).op.toLoc).adj.unit.app ((F.map (f i₃).op.toLoc).r.toPrefunctor.1 (obj i₃))) := by - dsimp [dataEquivCoalgebra, pullHom''] + dsimp only [pullHom'', Cat.comp_obj, Adj.comp_r, Adj.rIso_inv, Adj.comp_l, Adj.lIso_inv, + dataEquivCoalgebra, Equiv.piCongrRight_apply, Pi.map_apply, Iso.homCongr_apply, Iso.refl_inv, + Iso.app_hom, Iso.symm_hom, asIso_inv] simp only [Category.assoc, NatIso.isIso_inv_app, Cat.comp_obj, Category.id_comp] congr 1 + simp only [correction, Adj.comp_l, Cat.comp_obj, Adj.comp_r, Functor.map_inv, + NatTrans.naturality_assoc, Cat.comp_map, IsIso.eq_inv_comp] + have h := F.baseChange_triple (sq i₁ i₂).isPullback.toCommSq.flip.op.toLoc + (sq i₂ i₃).isPullback.toCommSq.flip.op.toLoc + (sq i₁ i₃).isPullback.toCommSq.flip.op.toLoc + (sq₃ i₁ i₂ i₃).isPullback₁.op.toLoc + (sq₃ i₁ i₂ i₃).isPullback₂.flip.op.toLoc + (sq₃ i₁ i₂ i₃).isPullback₃.op.toLoc + have h' := congr($(h).app (obj i₃)) + simp only [Cat.comp_obj, Cat.comp_app, Cat.id_obj, Cat.whiskerLeft_app, Cat.leftUnitor_inv_app, + eqToHom_refl, Cat.whiskerRight_app, Cat.associator_hom_app, Category.comp_id, Category.id_comp, + Adj.comp_r, Bicategory.whiskerRight_comp, Adj.comp_l, Category.assoc, + pentagon_hom_inv_inv_inv_inv_assoc, pentagon_hom_hom_inv_hom_hom_assoc, Cat.associator_inv_app, + Functor.map_id] at h' + rw [reassoc_of% h', F.isoMapOfCommSq_eq _ (sq₃ i₁ i₂ i₃).p₁.op.toLoc (by aesoptoloc), + F.isoMapOfCommSq_eq _ (sq₃ i₁ i₂ i₃).p₃.op.toLoc (by aesoptoloc)] + simp only [Iso.trans_hom, Iso.symm_hom, Adj.comp_τl, Adj.comp_l, Cat.comp_app, Cat.comp_obj, + Functor.map_comp, Adj.comp_τr, Adj.comp_r, Category.assoc, Adj.inv_hom_id_τr_app_assoc, + Adj.hom_inv_id_τr_app_assoc] + nth_rw 4 [← (F.map (sq i₁ i₂).p₁.op.toLoc).r.map_comp_assoc] + rw [← (F.map (sq₃ i₁ i₂ i₃).p₁₂.op.toLoc).r.map_comp] + simp only [Adj.hom_inv_id_τl_app, Functor.map_id, Category.id_comp] + nth_rw 3 [← (F.map (sq i₁ i₂).p₁.op.toLoc).r.map_comp_assoc] + rw [← (F.map (sq₃ i₁ i₂ i₃).p₁₂.op.toLoc).r.map_comp] + simp only [Adj.inv_hom_id_τl_app, Functor.map_id, Category.comp_id] + simp only [Adj.comp_l, Cat.comp_obj, Functor.map_id, Category.id_comp, IsIso.hom_inv_id_assoc] + erw [← NatTrans.naturality_assoc] + simp only [Cat.comp_obj, Cat.comp_map] + rw [CategoryTheory.NatIso.isIso_inv_app] simp - sorry lemma hom_comp_iff_dataEquivCoalgebra (i₁ i₂ i₃ : ι) : homComp sq₃ hom i₁ i₂ i₃ = pullHom'' (hom i₁ i₃) (sq₃ i₁ i₂ i₃).p₁₃ _ _ ↔ From f8515505fce44926447cbf3d64047ca8f4a30dc5 Mon Sep 17 00:00:00 2001 From: Christian Merten Date: Thu, 5 Jun 2025 17:29:49 +0200 Subject: [PATCH 109/118] add categories and equivalences --- .../Sites/Descent/DescentDataDoublePrime.lean | 188 +++++++++++++++++- 1 file changed, 187 insertions(+), 1 deletion(-) diff --git a/Mathlib/CategoryTheory/Sites/Descent/DescentDataDoublePrime.lean b/Mathlib/CategoryTheory/Sites/Descent/DescentDataDoublePrime.lean index 269c9a5c7f1b18..b0d65129cb93b2 100644 --- a/Mathlib/CategoryTheory/Sites/Descent/DescentDataDoublePrime.lean +++ b/Mathlib/CategoryTheory/Sites/Descent/DescentDataDoublePrime.lean @@ -207,6 +207,64 @@ structure DescentData'' where namespace DescentData'' +section Category + +variable {F sq sq₃} + +@[ext] +structure Hom (D₁ D₂ : F.DescentData'' sq sq₃) where + hom (i : ι) : D₁.obj i ⟶ D₂.obj i + comm (i₁ i₂ : ι) : + D₁.hom i₁ i₂ ≫ (F.map (sq i₁ i₂).p₁.op.toLoc).r.map + ((F.map (sq i₁ i₂).p₂.op.toLoc).l.map (hom i₂)) = hom i₁ ≫ D₂.hom i₁ i₂ := by aesop_cat + +attribute [reassoc (attr := simp)] Hom.comm + +@[simps] +def Hom.id (D : F.DescentData'' sq sq₃) : Hom D D where + hom _ := 𝟙 _ + +@[simps] +def Hom.comp {D₁ D₂ D₃ : F.DescentData'' sq sq₃} (f : Hom D₁ D₂) (g : Hom D₂ D₃) : Hom D₁ D₃ where + hom i := f.hom i ≫ g.hom i + +instance : Category (F.DescentData'' sq sq₃) where + Hom := Hom + id := Hom.id + comp := Hom.comp + +@[ext] +lemma hom_ext {D₁ D₂ : F.DescentData'' sq sq₃} {f g : D₁ ⟶ D₂} + (h : ∀ i, f.hom i = g.hom i) : f = g := + Hom.ext (funext h) + +@[reassoc, simp] +lemma comp_hom {D₁ D₂ D₃ : F.DescentData'' sq sq₃} (f : D₁ ⟶ D₂) (g : D₂ ⟶ D₃) (i : ι) : + (f ≫ g).hom i = f.hom i ≫ g.hom i := + rfl + +@[simp] +lemma id_hom (D : F.DescentData'' sq sq₃) (i : ι) : + Hom.hom (𝟙 D) i = 𝟙 _ := + rfl + +@[simps] +def isoMk {D₁ D₂ : F.DescentData'' sq sq₃} (e : ∀ (i : ι), D₁.obj i ≅ D₂.obj i) + (comm : ∀ (i₁ i₂ : ι), D₁.hom i₁ i₂ ≫ (F.map (sq i₁ i₂).p₁.op.toLoc).r.map + ((F.map (sq i₁ i₂).p₂.op.toLoc).l.map (e i₂).hom) = + (e i₁).hom ≫ D₂.hom i₁ i₂ := by aesop_cat) : + D₁ ≅ D₂ where + hom := + { hom i := (e i).hom + comm := comm } + inv := + { hom i := (e i).inv + comm i₁ i₂ := by + rw [← cancel_epi (e i₁).hom, ← reassoc_of% comm i₁ i₂] + simp [← Functor.map_comp] } + +end Category + variable {F} {sq} {obj : ∀ (i : ι), (F.obj (.mk (op (X i)))).obj} (hom : ∀ i₁ i₂, obj i₁ ⟶ (F.map (sq i₁ i₂).p₁.op.toLoc).r.obj ((F.map (sq i₁ i₂).p₂.op.toLoc).l.obj (obj i₂))) @@ -360,13 +418,76 @@ lemma hom_comp_iff_dataEquivDescentData' (i₁ i₂ i₃ : ι) : rw [← homEquiv_symm_pullHom''_eq_pullHom'_dataEquivDescentData', ← homEquiv_symm_homComp] simp +variable + (obj₁ obj₂ : (i : ι) → (F.obj { as := op (X i) }).obj) + (hom₁ : (i₁ i₂ : ι) → obj₁ i₁ ⟶ + (F.map (sq i₁ i₂).p₁.op.toLoc).r.obj ((F.map (sq i₁ i₂).p₂.op.toLoc).l.obj (obj₁ i₂))) + (hom₂ : (i₁ i₂ : ι) → obj₂ i₁ ⟶ + (F.map (sq i₁ i₂).p₁.op.toLoc).r.obj ((F.map (sq i₁ i₂).p₂.op.toLoc).l.obj (obj₂ i₂))) + (hom : (i : ι) → obj₁ i ⟶ obj₂ i) + +lemma hom_comm_iff_dataEquivDescentData' (i₁ i₂ : ι) : + hom₁ i₁ i₂ ≫ (F.map (sq i₁ i₂).p₁.op.toLoc).r.map + ((F.map (sq i₁ i₂).p₂.op.toLoc).l.map (hom i₂)) = hom i₁ ≫ hom₂ i₁ i₂ ↔ + (F.map (sq i₁ i₂).p₁.op.toLoc).l.map (hom i₁) ≫ dataEquivDescentData' hom₂ i₁ i₂ = + dataEquivDescentData' hom₁ i₁ i₂ ≫ (F.map (sq i₁ i₂).p₂.op.toLoc).l.map (hom i₂) := + sorry + +@[simps] +def toDescentData' : F.DescentData'' sq sq₃ ⥤ (F.comp Adj.forget₁).DescentData' sq sq₃ where + obj D := + { obj := D.obj + hom := dataEquivDescentData' D.hom + pullHom'_hom_self i := by + obtain ⟨δ⟩ := inferInstanceAs (Nonempty (sq i i).Diagonal) + rw [← hom_self_iff_dataEquivDescentData'] + exact D.hom_self i δ + pullHom'_hom_comp i₁ i₂ i₃ := by + rw [← hom_comp_iff_dataEquivDescentData'] + exact D.hom_comp i₁ i₂ i₃ } + map {D₁ D₂} f := + { hom i := f.hom i + comm i₁ i₂ := by + dsimp + rw [← hom_comm_iff_dataEquivDescentData'] + exact f.comm i₁ i₂ } + +@[simps] +def fromDescentData' : (F.comp Adj.forget₁).DescentData' sq sq₃ ⥤ F.DescentData'' sq sq₃ where + obj D := + { obj := D.obj + hom := dataEquivDescentData'.symm D.hom + hom_self i δ := by + rw [hom_self_iff_dataEquivDescentData'] + simp + hom_comp i₁ i₂ i₃ := by + rw [hom_comp_iff_dataEquivDescentData'] + simp } + map {D₁ D₂} f := + { hom i := f.hom i + comm i₁ i₂ := by + dsimp + rw [hom_comm_iff_dataEquivDescentData'] + simpa using f.comm i₁ i₂ } + +set_option maxHeartbeats 240000 in +-- TODO: automation is slow here +@[simps] +def equivDescentData' : + F.DescentData'' sq sq₃ ≌ (F.comp Adj.forget₁).DescentData' sq sq₃ where + functor := toDescentData' sq₃ + inverse := fromDescentData' sq₃ + unitIso := NatIso.ofComponents + (fun D ↦ isoMk (fun i ↦ Iso.refl _) (fun i₁ i₂ ↦ by simp [toDescentData'])) + counitIso := NatIso.ofComponents + (fun D ↦ DescentData'.isoMk (fun i ↦ Iso.refl _) (fun i₁ i₂ ↦ by simp [fromDescentData'])) + end section variable [∀ i₁ i₂, IsIso (F.baseChange (sq i₁ i₂).isPullback.toCommSq.flip.op.toLoc)] [∀ i₁ i₂ i₃, IsIso (F.baseChange (sq₃ i₁ i₂ i₃).isPullback₂.toCommSq.flip.op.toLoc)] --- should require the same for `(sq₃ i₁ i₂ i₃).isPullback₂`. noncomputable def dataEquivCoalgebra [∀ i₁ i₂, IsIso (F.baseChange (sq i₁ i₂).isPullback.toCommSq.flip.op.toLoc)] : @@ -510,6 +631,71 @@ lemma hom_comp_iff_dataEquivCoalgebra (i₁ i₂ i₃ : ι) : conv_lhs => rw [← cancel_mono (correction sq₃ obj i₁ i₂ i₃)] rw [homComp_correction, pullHom''_correction] +variable + (obj₁ obj₂ : (i : ι) → (F.obj { as := op (X i) }).obj) + (hom₁ : (i₁ i₂ : ι) → obj₁ i₁ ⟶ + (F.map (sq i₁ i₂).p₁.op.toLoc).r.obj ((F.map (sq i₁ i₂).p₂.op.toLoc).l.obj (obj₁ i₂))) + (hom₂ : (i₁ i₂ : ι) → obj₂ i₁ ⟶ + (F.map (sq i₁ i₂).p₁.op.toLoc).r.obj ((F.map (sq i₁ i₂).p₂.op.toLoc).l.obj (obj₂ i₂))) + (hom : (i : ι) → obj₁ i ⟶ obj₂ i) + +lemma hom_comm_iff_dataEquivCoalgebra (i₁ i₂ : ι) : + hom₁ i₁ i₂ ≫ (F.map (sq i₁ i₂).p₁.op.toLoc).r.map + ((F.map (sq i₁ i₂).p₂.op.toLoc).l.map (hom i₂)) = hom i₁ ≫ hom₂ i₁ i₂ ↔ + dataEquivCoalgebra hom₁ i₁ i₂ ≫ + (F.map (f i₁).op.toLoc).l.map ((F.map (f i₂).op.toLoc).r.map (hom i₂)) = + hom i₁ ≫ dataEquivCoalgebra hom₂ i₁ i₂ := + sorry + +@[simps] +noncomputable +def toDescentDataAsCoalgebra : F.DescentData'' sq sq₃ ⥤ F.DescentDataAsCoalgebra f where + obj D := + { obj := D.obj + hom := dataEquivCoalgebra D.hom + counit i := by + obtain ⟨δ⟩ := inferInstanceAs (Nonempty (sq i i).Diagonal) + rw [← hom_self_iff_dataEquivCoalgebra _ δ] + exact D.hom_self i δ + coassoc i₁ i₂ i₃ := by + rw [← hom_comp_iff_dataEquivCoalgebra sq₃] + exact D.hom_comp i₁ i₂ i₃ } + map {D₁ D₂} g := + { hom := g.hom + comm i₁ i₂ := by + rw [← hom_comm_iff_dataEquivCoalgebra] + exact g.comm i₁ i₂ } + +set_option maxHeartbeats 400000 in +-- TODO: automation is slow here +@[simps] +noncomputable +def fromDescentDataAsCoalgebra : F.DescentDataAsCoalgebra f ⥤ F.DescentData'' sq sq₃ where + obj D := + { obj := D.obj + hom := dataEquivCoalgebra.symm D.hom + hom_self i δ := by + rw [hom_self_iff_dataEquivCoalgebra _ δ] + simp + hom_comp i₁ i₂ i₃ := by + rw [hom_comp_iff_dataEquivCoalgebra sq₃] + simp } + map {D₁ D₂} g := + { hom := g.hom + comm i₁ i₂ := by + rw [hom_comm_iff_dataEquivCoalgebra] + simp } + +noncomputable +def equivDescentDataAsCoalgebra : F.DescentData'' sq sq₃ ≌ F.DescentDataAsCoalgebra f where + functor := toDescentDataAsCoalgebra sq₃ + inverse := fromDescentDataAsCoalgebra sq₃ + unitIso := NatIso.ofComponents + (fun D ↦ isoMk (fun i ↦ Iso.refl _) (fun i₁ i₂ ↦ by simp [toDescentDataAsCoalgebra])) + counitIso := NatIso.ofComponents + (fun D ↦ DescentDataAsCoalgebra.isoMk (fun i ↦ Iso.refl _) + (fun i₁ i₂ ↦ by simp [fromDescentDataAsCoalgebra])) + end end DescentData'' From 10f5ba917f00c2132fcf5b85c280498223da0fe8 Mon Sep 17 00:00:00 2001 From: Christian Merten Date: Thu, 5 Jun 2025 23:17:47 +0200 Subject: [PATCH 110/118] fill some sorries --- .../Sites/Descent/DescentDataDoublePrime.lean | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/Mathlib/CategoryTheory/Sites/Descent/DescentDataDoublePrime.lean b/Mathlib/CategoryTheory/Sites/Descent/DescentDataDoublePrime.lean index b0d65129cb93b2..36d29020f623a0 100644 --- a/Mathlib/CategoryTheory/Sites/Descent/DescentDataDoublePrime.lean +++ b/Mathlib/CategoryTheory/Sites/Descent/DescentDataDoublePrime.lean @@ -430,8 +430,16 @@ lemma hom_comm_iff_dataEquivDescentData' (i₁ i₂ : ι) : hom₁ i₁ i₂ ≫ (F.map (sq i₁ i₂).p₁.op.toLoc).r.map ((F.map (sq i₁ i₂).p₂.op.toLoc).l.map (hom i₂)) = hom i₁ ≫ hom₂ i₁ i₂ ↔ (F.map (sq i₁ i₂).p₁.op.toLoc).l.map (hom i₁) ≫ dataEquivDescentData' hom₂ i₁ i₂ = - dataEquivDescentData' hom₁ i₁ i₂ ≫ (F.map (sq i₁ i₂).p₂.op.toLoc).l.map (hom i₂) := - sorry + dataEquivDescentData' hom₁ i₁ i₂ ≫ (F.map (sq i₁ i₂).p₂.op.toLoc).l.map (hom i₂) := by + conv_lhs => + rw [← Equiv.apply_eq_iff_eq + (((F.map (sq i₁ i₂).p₁.op.toLoc).adj.toCategory).homEquiv (obj₁ i₁) _).symm, Eq.comm] + congr! + · simp [dataEquivDescentData', Adjunction.homEquiv_symm_apply] + · simp only [Adjunction.homEquiv_symm_apply, Functor.map_comp, Adjunction.toCategory_counit, + Category.assoc, dataEquivDescentData', Equiv.piCongrRight_apply, Pi.map_apply] + congr 1 + apply (F.map (sq i₁ i₂).p₁.op.toLoc).adj.counit.naturality @[simps] def toDescentData' : F.DescentData'' sq sq₃ ⥤ (F.comp Adj.forget₁).DescentData' sq sq₃ where @@ -644,8 +652,18 @@ lemma hom_comm_iff_dataEquivCoalgebra (i₁ i₂ : ι) : ((F.map (sq i₁ i₂).p₂.op.toLoc).l.map (hom i₂)) = hom i₁ ≫ hom₂ i₁ i₂ ↔ dataEquivCoalgebra hom₁ i₁ i₂ ≫ (F.map (f i₁).op.toLoc).l.map ((F.map (f i₂).op.toLoc).r.map (hom i₂)) = - hom i₁ ≫ dataEquivCoalgebra hom₂ i₁ i₂ := - sorry + hom i₁ ≫ dataEquivCoalgebra hom₂ i₁ i₂ := by + obtain ⟨hom₁, rfl⟩ := dataEquivCoalgebra.symm.surjective hom₁ + obtain ⟨hom₂, rfl⟩ := dataEquivCoalgebra.symm.surjective hom₂ + simp only [dataEquivCoalgebra, Equiv.piCongrRight_symm_apply, Pi.map_apply, Iso.homCongr_symm, + Iso.refl_symm, Iso.homCongr_apply, Iso.refl_inv, Iso.symm_hom, Iso.app_inv, Iso.symm_inv, + asIso_hom, Category.id_comp, Category.assoc, Equiv.piCongrRight_apply, Iso.app_hom, asIso_inv, + NatIso.isIso_inv_app, Cat.comp_obj, IsIso.hom_inv_id, Category.comp_id] + conv_rhs => + rw [← cancel_mono ((F.baseChange (sq i₁ i₂).isPullback.toCommSq.flip.op.toLoc).app (obj₂ i₂))] + simp_rw [Category.assoc] + congr! 2 + exact ((F.baseChange (sq i₁ i₂).isPullback.toCommSq.flip.op.toLoc).naturality _).symm @[simps] noncomputable From d39bbce519560739625c0e3b5144ba9e0f1a8bc3 Mon Sep 17 00:00:00 2001 From: Christian Merten Date: Thu, 5 Jun 2025 23:55:40 +0200 Subject: [PATCH 111/118] reorganize and cleanup --- .../Sites/Descent/DescentDataAsCoalgebra.lean | 208 +++++------------- .../Sites/Descent/DescentDataDoublePrime.lean | 67 ++---- 2 files changed, 71 insertions(+), 204 deletions(-) diff --git a/Mathlib/CategoryTheory/Sites/Descent/DescentDataAsCoalgebra.lean b/Mathlib/CategoryTheory/Sites/Descent/DescentDataAsCoalgebra.lean index 94a5189db6e65a..780156795df06f 100644 --- a/Mathlib/CategoryTheory/Sites/Descent/DescentDataAsCoalgebra.lean +++ b/Mathlib/CategoryTheory/Sites/Descent/DescentDataAsCoalgebra.lean @@ -3,7 +3,7 @@ Copyright (c) 2025 Joël Riou. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: Joël Riou -/ -import Mathlib.CategoryTheory.Sites.Descent.DescentDataPrime +import Mathlib.CategoryTheory.Sites.Descent.DescentDataDoublePrime import Mathlib.CategoryTheory.Bicategory.Adjunction.Adj import Mathlib.CategoryTheory.Monad.Adjunction import Mathlib.CategoryTheory.Bicategory.Adjunction.BaseChange @@ -15,64 +15,10 @@ import Mathlib.CategoryTheory.Bicategory.Adjunction.BaseChange namespace CategoryTheory -@[simps] -def Bicategory.Adjunction.toCategory {C D : Cat} {F : C ⟶ D} {G : D ⟶ C} - (adj : Bicategory.Adjunction F G) : - CategoryTheory.Adjunction F G where - unit := adj.unit - counit := adj.counit - left_triangle_components X := by - have := congr_app adj.left_triangle X - dsimp [leftZigzag, bicategoricalComp] at this - simpa [Cat.associator_hom_app, Cat.leftUnitor_hom_app, Cat.rightUnitor_inv_app] using this - right_triangle_components X := by - have := congr_app adj.right_triangle X - dsimp [rightZigzag, bicategoricalComp] at this - simpa [Cat.associator_inv_app, Cat.leftUnitor_inv_app] using this - open Opposite Limits Bicategory namespace Pseudofunctor -/-- A slightly reformulated characterisation of the composition condition in `DescentData'`. -/ -lemma DescentData'.pullHom'_comp_pullHom'_eq_iff - {C : Type*} [Category C] (F : Pseudofunctor (LocallyDiscrete Cᵒᵖ) Cat) - {ι : Type*} {S : C} {X : ι → C} (f : ∀ i, X i ⟶ S) (sq : ∀ i j, ChosenPullback (f i) (f j)) - (sq₃ : (i₁ i₂ i₃ : ι) → ChosenPullback₃ (sq i₁ i₂) (sq i₂ i₃) (sq i₁ i₃)) - (obj : ∀ i, F.obj (.mk (op (X i)))) - (hom : ∀ i j, (F.map (sq i j).p₁.op.toLoc).obj (obj i) ⟶ - (F.map (sq i j).p₂.op.toLoc).obj (obj j)) - {i₁ i₂ i₃ : ι} : - DescentData'.pullHom' hom (sq₃ i₁ i₂ i₃).p (sq₃ i₁ i₂ i₃).p₁ (sq₃ i₁ i₂ i₃).p₂ - (by simp) (by simp) ≫ - DescentData'.pullHom' hom (sq₃ i₁ i₂ i₃).p (sq₃ i₁ i₂ i₃).p₂ (sq₃ i₁ i₂ i₃).p₃ - (by simp) (by simp) = - DescentData'.pullHom' hom (sq₃ i₁ i₂ i₃).p (sq₃ i₁ i₂ i₃).p₁ (sq₃ i₁ i₂ i₃).p₃ - (by simp) (by simp) ↔ - (F.isoMapOfCommSq ⟨by simp [← Quiver.Hom.comp_toLoc, ← op_comp]⟩).hom.app _ ≫ - (F.map ((sq i₁ i₂).isPullback.lift - (sq₃ i₁ i₂ i₃).p₁ (sq₃ i₁ i₂ i₃).p₂ (by simp)).op.toLoc).map (hom i₁ i₂) ≫ - (F.isoMapOfCommSq ⟨by simp [← Quiver.Hom.comp_toLoc, ← op_comp]⟩).hom.app _ ≫ - (F.map ((sq i₂ i₃).isPullback.lift - (sq₃ i₁ i₂ i₃).p₂ (sq₃ i₁ i₂ i₃).p₃ (by simp)).op.toLoc).map (hom i₂ i₃) ≫ - (F.isoMapOfCommSq ⟨by simp [← Quiver.Hom.comp_toLoc, ← op_comp]⟩).hom.app _ = - (F.map ((sq i₁ i₃).isPullback.lift - (sq₃ i₁ i₂ i₃).p₁ (sq₃ i₁ i₂ i₃).p₃ (by simp)).op.toLoc).map (hom i₁ i₃) := by - dsimp [DescentData'.pullHom', LocallyDiscreteOpToCat.pullHom] - simp only [Category.assoc] - rw [← cancel_epi ((F.mapComp' (sq i₁ i₃).p₁.op.toLoc _ _ _).inv.app (obj i₁))] - rw [Iso.inv_hom_id_app_assoc] - rw [← cancel_mono ((F.mapComp' (sq i₁ i₃).p₂.op.toLoc _ _ _).hom.app _)] - · simp_rw [Category.assoc] - rw [Iso.inv_hom_id_app] - simp only [Cat.comp_obj, Category.comp_id] - rw [isoMapOfCommSq_eq, isoMapOfCommSq_eq, isoMapOfCommSq_eq] - · simp only [Iso.trans_hom, Iso.symm_hom, Cat.comp_app, Cat.comp_obj, Category.assoc] - rfl - · simp [← Quiver.Hom.comp_toLoc, ← op_comp] - · simp [← Quiver.Hom.comp_toLoc, ← op_comp] - · simp [← Quiver.Hom.comp_toLoc, ← op_comp] - variable {C : Type*} [Category C] (F : Pseudofunctor (LocallyDiscrete Cᵒᵖ) (Adj Cat)) namespace LocallyDiscreteToAdjCat @@ -217,114 +163,68 @@ variable {F} variable (A : F.DescentDataAsCoalgebra f) -@[simps] -def descentData' : (F.comp Adj.forget₁).DescentData' sq sq₃ where - obj := A.obj - hom i j := F.coalgHom (sq i j).commSq.flip.op.toLoc (A.hom i j) - pullHom'_hom_self i := by - dsimp [DescentData'.pullHom', LocallyDiscreteOpToCat.pullHom] - rw [map_coalgHom_of_comp_eq_id] - · simp [A.counit] - · simp [← Quiver.Hom.comp_toLoc, ← op_comp] - · simp [← Quiver.Hom.comp_toLoc, ← op_comp] - pullHom'_hom_comp i₁ i₂ i₃ := by - rw [DescentData'.pullHom'_comp_pullHom'_eq_iff] - simp only [comp_toPrelaxFunctor, PrelaxFunctor.comp_toPrelaxFunctorStruct, - PrelaxFunctorStruct.comp_toPrefunctor, Prefunctor.comp_obj, Adj.forget₁_obj, - Prefunctor.comp_map, Adj.forget₁_map, Cat.comp_obj] - rw [coalgHom_eq_coalgHom_coalgHom (f₂ := (f i₂).op.toLoc) (A₂ := A.obj i₂) - (u₁₂ := (sq i₁ i₂).p₁.op.toLoc) (u₂₁ := (sq i₁ i₂).p₂.op.toLoc) - (u₂₃ := (sq i₂ i₃).p₁.op.toLoc) (u₃₂ := (sq i₂ i₃).p₂.op.toLoc) - (p₁₂ := ((sq i₁ i₂).isPullback.lift (sq₃ i₁ i₂ i₃).p₁ (sq₃ i₁ i₂ i₃).p₂ (by simp)).op.toLoc) - (p₂₃ := ((sq i₂ i₃).isPullback.lift (sq₃ i₁ i₂ i₃).p₂ (sq₃ i₁ i₂ i₃).p₃ (by simp)).op.toLoc) - (sq₁₂ := (sq i₁ i₂).commSq.flip.op.toLoc) (sq₂₃ := (sq i₂ i₃).commSq.flip.op.toLoc) - (sq₁₃ := (sq i₁ i₃).commSq.flip.op.toLoc) - (a₁₂ := (A.hom i₁ i₂)) (a₂₃ := (A.hom i₂ i₃))] - simp +open DescentData'' -@[simps] -def Hom.descentData' {D E : F.DescentDataAsCoalgebra f} (b : D ⟶ E) : - D.descentData' sq sq₃ ⟶ E.descentData' sq sq₃ where - hom := b.hom - comm i₁ i₂ := by - apply map_comp_coalgHom_eq_coalgHom_map - exact b.comm i₁ i₂ +variable [∀ i₁ i₂, IsIso (F.baseChange (sq i₁ i₂).isPullback.toCommSq.flip.op.toLoc)] + [∀ i₁ i₂ i₃, IsIso (F.baseChange (sq₃ i₁ i₂ i₃).isPullback₂.toCommSq.flip.op.toLoc)] @[simps] -def toDescentData' : F.DescentDataAsCoalgebra f ⥤ (F.comp Adj.forget₁).DescentData' sq sq₃ where - obj := descentData' sq sq₃ - map {D E} b := b.descentData' sq sq₃ - +noncomputable +def toDescentDataAsCoalgebra : F.DescentData'' sq sq₃ ⥤ F.DescentDataAsCoalgebra f where + obj D := + { obj := D.obj + hom := dataEquivCoalgebra D.hom + counit i := by + obtain ⟨δ⟩ := inferInstanceAs (Nonempty (sq i i).Diagonal) + rw [← hom_self_iff_dataEquivCoalgebra _ δ] + exact D.hom_self i δ + coassoc i₁ i₂ i₃ := by + rw [← hom_comp_iff_dataEquivCoalgebra sq₃] + exact D.hom_comp i₁ i₂ i₃ } + map {D₁ D₂} g := + { hom := g.hom + comm i₁ i₂ := by + rw [← hom_comm_iff_dataEquivCoalgebra] + exact g.comm i₁ i₂ } + +set_option maxHeartbeats 400000 in +-- TODO: automation is slow here @[simps] noncomputable -def ofDescentData' [∀ i₁ i₂, IsIso (F.baseChange (sq i₁ i₂).commSq.flip.op.toLoc)] - (D : (F.comp Adj.forget₁).DescentData' sq sq₃) : F.DescentDataAsCoalgebra f where - obj := D.obj - hom i₁ i₂ := (F.coalgEquiv (sq i₁ i₂).commSq.flip.op.toLoc _ _).symm (D.hom i₁ i₂) - counit i := by - have := D.pullHom'_hom_self i - dsimp [DescentData'.pullHom', LocallyDiscreteOpToCat.pullHom] at this - rw [F.comp_counit_eq_id_iff _ _ _ (sq i i).commSq.flip.op.toLoc - (((sq i i).isPullback.lift (𝟙 (X i)) (𝟙 (X i)) (by simp)).op.toLoc)] - · simp only [comp_toPrelaxFunctor, PrelaxFunctor.comp_toPrelaxFunctorStruct, - PrelaxFunctorStruct.comp_toPrefunctor, Prefunctor.comp_obj, Adj.forget₁_obj, - Prefunctor.comp_map, Adj.forget₁_map, Cat.comp_obj] - rw [← cancel_epi (((F.comp Adj.forget₁).mapComp' (sq i i).p₁.op.toLoc _ (𝟙 _) _).hom.app _)] - · rw [← cancel_mono (((F.comp Adj.forget₁).mapComp' _ _ (𝟙 _) _).inv.app _)] - · simp only [comp_toPrelaxFunctor, PrelaxFunctor.comp_toPrelaxFunctorStruct, - PrelaxFunctorStruct.comp_toPrefunctor, Prefunctor.comp_obj, Adj.forget₁_obj, - Prefunctor.comp_map, Adj.forget₁_map, Cat.comp_obj, Category.assoc, - Iso.hom_inv_id_app_assoc, Iso.hom_inv_id_app] - convert this - apply (F.coalgEquiv _ (D.obj i) (D.obj i)).apply_symm_apply - · simp [← Quiver.Hom.comp_toLoc, ← op_comp] - · simp [← Quiver.Hom.comp_toLoc, ← op_comp] - coassoc i₁ i₂ i₃ := by - rw [F.coalgHom_eq_coalgHom_coalgHom_iff (sq i₁ i₂).commSq.flip.op.toLoc - (sq i₂ i₃).commSq.flip.op.toLoc (sq i₁ i₃).commSq.flip.op.toLoc - (p₁₂ := ((sq i₁ i₂).isPullback.lift (sq₃ i₁ i₂ i₃).p₁ (sq₃ i₁ i₂ i₃).p₂ (by simp)).op.toLoc) - (p₂₃ := ((sq i₂ i₃).isPullback.lift (sq₃ i₁ i₂ i₃).p₂ (sq₃ i₁ i₂ i₃).p₃ (by simp)).op.toLoc) - (p₁₃ := ((sq i₁ i₃).isPullback.lift (sq₃ i₁ i₂ i₃).p₁ (sq₃ i₁ i₂ i₃).p₃ (by simp)).op.toLoc)] - · have := D.pullHom'_hom_comp i₁ i₂ i₃ - rw [DescentData'.pullHom'_comp_pullHom'_eq_iff] at this - simp only [comp_toPrelaxFunctor, PrelaxFunctor.comp_toPrelaxFunctorStruct, - PrelaxFunctorStruct.comp_toPrefunctor, Prefunctor.comp_obj, Adj.forget₁_obj, - Prefunctor.comp_map, Adj.forget₁_map, Cat.comp_obj] at this - simp only [coalgHom_coalgEquiv_symm, comp_toPrelaxFunctor, - PrelaxFunctor.comp_toPrelaxFunctorStruct, PrelaxFunctorStruct.comp_toPrefunctor, - Prefunctor.comp_obj, Adj.forget₁_obj, Prefunctor.comp_map, Adj.forget₁_map, Cat.comp_obj] - exact this.symm - -lemma ofDescentData'_descentData' [∀ i₁ i₂, IsIso (F.baseChange (sq i₁ i₂).commSq.flip.op.toLoc)] - (A : F.DescentDataAsCoalgebra f) : - ofDescentData' sq sq₃ (descentData' sq sq₃ A) = A := by - ext - · simp - · simp only [ofDescentData'_obj, descentData'_obj, heq_eq_eq] - ext - simp +def fromDescentDataAsCoalgebra : F.DescentDataAsCoalgebra f ⥤ F.DescentData'' sq sq₃ where + obj D := + { obj := D.obj + hom := dataEquivCoalgebra.symm D.hom + hom_self i δ := by + rw [hom_self_iff_dataEquivCoalgebra _ δ] + simp + hom_comp i₁ i₂ i₃ := by + rw [hom_comp_iff_dataEquivCoalgebra sq₃] + simp } + map {D₁ D₂} g := + { hom := g.hom + comm i₁ i₂ := by + rw [hom_comm_iff_dataEquivCoalgebra] + simp } -@[simps] noncomputable -def Hom.ofDescentData' [∀ i₁ i₂, IsIso (F.baseChange (sq i₁ i₂).commSq.flip.op.toLoc)] - {D E : (F.comp Adj.forget₁).DescentData' sq sq₃} (f : D ⟶ E) : - ofDescentData' sq sq₃ D ⟶ ofDescentData' sq sq₃ E where - hom := f.hom - comm i₁ i₂ := by - rw [F.iff_map_comp_coalgHom_eq_coalgHom_map (sq i₁ i₂).commSq.flip.op.toLoc] - simpa using f.comm i₁ i₂ +def equivDescentData'' : F.DescentDataAsCoalgebra f ≌ F.DescentData'' sq sq₃ where + functor := fromDescentDataAsCoalgebra sq sq₃ + inverse := toDescentDataAsCoalgebra sq sq₃ + unitIso := NatIso.ofComponents + (fun D ↦ isoMk (fun i ↦ Iso.refl _) + (fun i₁ i₂ ↦ by simp [fromDescentDataAsCoalgebra])) + counitIso := NatIso.ofComponents + (fun D ↦ DescentData''.isoMk (fun i ↦ Iso.refl _) + (fun i₁ i₂ ↦ by simp [toDescentDataAsCoalgebra])) end --- needs "base change" assumptions noncomputable -def descentData'Equivalence [∀ i₁ i₂, IsIso (F.baseChange (sq i₁ i₂).commSq.flip.op.toLoc)] : - F.DescentDataAsCoalgebra f ≌ (F.comp Adj.forget₁).DescentData' sq sq₃ where - functor := toDescentData' sq sq₃ - inverse.obj D := .ofDescentData' sq sq₃ D - inverse.map f := .ofDescentData' sq sq₃ f - unitIso := NatIso.ofComponents (fun A ↦ isoMk (fun i ↦ Iso.refl _)) <| fun _ ↦ by ext; simp - counitIso := NatIso.ofComponents (fun A ↦ DescentData'.isoMk (fun i ↦ Iso.refl _)) +def descentData'Equivalence [∀ i₁ i₂, IsIso (F.baseChange (sq i₁ i₂).commSq.flip.op.toLoc)] + [∀ i₁ i₂ i₃, IsIso (F.baseChange (sq₃ i₁ i₂ i₃).isPullback₂.toCommSq.flip.op.toLoc)] : + F.DescentDataAsCoalgebra f ≌ (F.comp Adj.forget₁).DescentData' sq sq₃ := + (equivDescentData'' sq sq₃).trans (DescentData''.equivDescentData' sq₃) end DescentDataAsCoalgebra @@ -332,8 +232,8 @@ namespace DescentData' variable {X S : C} {f : X ⟶ S} (sq : ChosenPullback f f) (sq₃ : ChosenPullback₃ sq sq sq) --- needs "base change" assumptions noncomputable def equivalenceOfComonadicLeftAdjoint [IsIso (F.baseChange sq.commSq.flip.op.toLoc)] + [IsIso (F.baseChange sq₃.isPullback₂.toCommSq.flip.op.toLoc)] [(Comonad.comparison (F.map f.op.toLoc).adj.toCategory).IsEquivalence] : (F.obj (.mk (op S))).obj ≌ (F.comp Adj.forget₁).DescentData' (fun (_ : Unit) _ ↦ sq) (fun _ _ _ ↦ sq₃) := @@ -347,8 +247,8 @@ namespace DescentData variable {X S : C} (f : X ⟶ S) (sq : ChosenPullback f f) (sq₃ : ChosenPullback₃ sq sq sq) --- needs "base change" assumptions noncomputable def equivalenceOfComonadicLeftAdjoint [IsIso (F.baseChange sq.commSq.flip.op.toLoc)] + [IsIso (F.baseChange sq₃.isPullback₂.toCommSq.flip.op.toLoc)] [(Comonad.comparison (F.map f.op.toLoc).adj.toCategory).IsEquivalence] : (F.obj (.mk (op S))).obj ≌ (F.comp Adj.forget₁).DescentData (fun (_ : Unit) ↦ f) := diff --git a/Mathlib/CategoryTheory/Sites/Descent/DescentDataDoublePrime.lean b/Mathlib/CategoryTheory/Sites/Descent/DescentDataDoublePrime.lean index 36d29020f623a0..59bc0b09e1a154 100644 --- a/Mathlib/CategoryTheory/Sites/Descent/DescentDataDoublePrime.lean +++ b/Mathlib/CategoryTheory/Sites/Descent/DescentDataDoublePrime.lean @@ -4,9 +4,10 @@ Released under Apache 2.0 license as described in the file LICENSE. Authors: Joël Riou, Christian Merten -/ import Mathlib.CategoryTheory.Sites.Descent.DescentDataPrime -import Mathlib.CategoryTheory.Sites.Descent.DescentDataAsCoalgebra +--import Mathlib.CategoryTheory.Sites.Descent.DescentDataAsCoalgebra import Mathlib.CategoryTheory.Sites.Descent.IsStack import Mathlib.CategoryTheory.Bicategory.Adjunction.Adj +import Mathlib.CategoryTheory.Bicategory.Adjunction.BaseChange /-! # Descent data ... @@ -15,6 +16,21 @@ import Mathlib.CategoryTheory.Bicategory.Adjunction.Adj namespace CategoryTheory +@[simps] +def Bicategory.Adjunction.toCategory {C D : Cat} {F : C ⟶ D} {G : D ⟶ C} + (adj : Bicategory.Adjunction F G) : + CategoryTheory.Adjunction F G where + unit := adj.unit + counit := adj.counit + left_triangle_components X := by + have := congr_app adj.left_triangle X + dsimp [leftZigzag, bicategoricalComp] at this + simpa [Cat.associator_hom_app, Cat.leftUnitor_hom_app, Cat.rightUnitor_inv_app] using this + right_triangle_components X := by + have := congr_app adj.right_triangle X + dsimp [rightZigzag, bicategoricalComp] at this + simpa [Cat.associator_inv_app, Cat.leftUnitor_inv_app] using this + open Opposite Limits Bicategory @[reassoc (attr := simp)] @@ -665,55 +681,6 @@ lemma hom_comm_iff_dataEquivCoalgebra (i₁ i₂ : ι) : congr! 2 exact ((F.baseChange (sq i₁ i₂).isPullback.toCommSq.flip.op.toLoc).naturality _).symm -@[simps] -noncomputable -def toDescentDataAsCoalgebra : F.DescentData'' sq sq₃ ⥤ F.DescentDataAsCoalgebra f where - obj D := - { obj := D.obj - hom := dataEquivCoalgebra D.hom - counit i := by - obtain ⟨δ⟩ := inferInstanceAs (Nonempty (sq i i).Diagonal) - rw [← hom_self_iff_dataEquivCoalgebra _ δ] - exact D.hom_self i δ - coassoc i₁ i₂ i₃ := by - rw [← hom_comp_iff_dataEquivCoalgebra sq₃] - exact D.hom_comp i₁ i₂ i₃ } - map {D₁ D₂} g := - { hom := g.hom - comm i₁ i₂ := by - rw [← hom_comm_iff_dataEquivCoalgebra] - exact g.comm i₁ i₂ } - -set_option maxHeartbeats 400000 in --- TODO: automation is slow here -@[simps] -noncomputable -def fromDescentDataAsCoalgebra : F.DescentDataAsCoalgebra f ⥤ F.DescentData'' sq sq₃ where - obj D := - { obj := D.obj - hom := dataEquivCoalgebra.symm D.hom - hom_self i δ := by - rw [hom_self_iff_dataEquivCoalgebra _ δ] - simp - hom_comp i₁ i₂ i₃ := by - rw [hom_comp_iff_dataEquivCoalgebra sq₃] - simp } - map {D₁ D₂} g := - { hom := g.hom - comm i₁ i₂ := by - rw [hom_comm_iff_dataEquivCoalgebra] - simp } - -noncomputable -def equivDescentDataAsCoalgebra : F.DescentData'' sq sq₃ ≌ F.DescentDataAsCoalgebra f where - functor := toDescentDataAsCoalgebra sq₃ - inverse := fromDescentDataAsCoalgebra sq₃ - unitIso := NatIso.ofComponents - (fun D ↦ isoMk (fun i ↦ Iso.refl _) (fun i₁ i₂ ↦ by simp [toDescentDataAsCoalgebra])) - counitIso := NatIso.ofComponents - (fun D ↦ DescentDataAsCoalgebra.isoMk (fun i ↦ Iso.refl _) - (fun i₁ i₂ ↦ by simp [fromDescentDataAsCoalgebra])) - end end DescentData'' From e025a4d166b1c570ebb857ebbf02a4a9930a104d Mon Sep 17 00:00:00 2001 From: Christian Merten Date: Fri, 6 Jun 2025 19:33:36 +0200 Subject: [PATCH 112/118] fill triple sorries --- .../Bicategory/Adjunction/Adj.lean | 6 + .../Bicategory/Adjunction/BaseChange.lean | 253 +++++++++++++++++- 2 files changed, 256 insertions(+), 3 deletions(-) diff --git a/Mathlib/CategoryTheory/Bicategory/Adjunction/Adj.lean b/Mathlib/CategoryTheory/Bicategory/Adjunction/Adj.lean index ceee64e17c95c7..6e4aaf3f4ee73d 100644 --- a/Mathlib/CategoryTheory/Bicategory/Adjunction/Adj.lean +++ b/Mathlib/CategoryTheory/Bicategory/Adjunction/Adj.lean @@ -347,6 +347,12 @@ instance : Bicategory (Adj B) where @[simp] lemma whiskerRight_τl' {α α' : a ⟶ b} (x : α ⟶ α') (β : b ⟶ c) : (x ▷ β).τl = x.τl ▷ β.l := rfl +@[simp] lemma whiskerLeft_τl' (α : a ⟶ b) {β β' : b ⟶ c} (y : β ⟶ β') : + (α ◁ y).τl = α.l ◁ y.τl := rfl + +@[simp] lemma whiskerLeft_τr' (α : a ⟶ b) {β β' : b ⟶ c} (y : β ⟶ β') : + (α ◁ y).τr = y.τr ▷ α.r := rfl + /-- The forget pseudofunctor from `Adj B` to `B`. -/ @[simps obj map map₂ mapId mapComp] def forget₁ : Pseudofunctor (Adj B) B where diff --git a/Mathlib/CategoryTheory/Bicategory/Adjunction/BaseChange.lean b/Mathlib/CategoryTheory/Bicategory/Adjunction/BaseChange.lean index 3cbae305eac271..c6b705118917cb 100644 --- a/Mathlib/CategoryTheory/Bicategory/Adjunction/BaseChange.lean +++ b/Mathlib/CategoryTheory/Bicategory/Adjunction/BaseChange.lean @@ -127,6 +127,26 @@ lemma whiskerBaseChange_eq_whiskerRight_baseChange : (α_ _ _ _).hom ≫ (F.map b).l ◁ (F.map r).adj.counit ≫ (ρ_ _).hom := by rw [whiskerBaseChange_eq, Adjunction.homEquiv₂_symm_apply]-/ +section Unit + +variable {B C : Type*} [Bicategory B] [Strict B] [Bicategory C] + (F : Pseudofunctor B (Adj C)) + +variable {X Y : B} (f : X ⟶ Y) + +lemma baseChange_id_id_eq_unit : + F.baseChange (t := 𝟙 X) (l := 𝟙 X) (b := f) (r := f) ⟨rfl⟩ = + (F.map (𝟙 X)).r ◁ (F.mapId _).hom.τl ≫ + (ρ_ _).hom ≫ + (F.mapId _).inv.τr ≫ + (F.map f).adj.unit := by + rw [baseChange] + simp only [isoMapOfCommSq_self_self, Iso.refl_hom, Adj.id_τl, Adj.comp_l, Adj.id_l, Adj.id_r] + rw [mateEquiv_id] + sorry + +end Unit + section Horizontal variable {B C : Type*} [Bicategory B] [Strict B] [Bicategory C] @@ -179,6 +199,54 @@ lemma baseChange_vert_comp' : end Vertical +section Square + +variable {B C : Type*} [Bicategory B] [Strict B] [Bicategory C] + (F : Pseudofunctor B (Adj C)) + +-- 3 by 3 square from left to right `X` -> `Y` -> `Z` and from +-- top to bottom `_₁` -> `_₂` -> `_₃` +variable {X₁ X₂ X₃ Y₁ Y₂ Y₃ Z₁ Z₂ Z₃ : B} + {tl : X₁ ⟶ Y₁} {tr : Y₁ ⟶ Z₁} + {ml : X₂ ⟶ Y₂} {mr : Y₂ ⟶ Z₂} + {bl : X₃ ⟶ Y₃} {br : Y₃ ⟶ Z₃} + {lt : X₁ ⟶ X₂} {lb : X₂ ⟶ X₃} + {mt : Y₁ ⟶ Y₂} {mb : Y₂ ⟶ Y₃} + {rt : Z₁ ⟶ Z₂} {rb : Z₂ ⟶ Z₃} + {t : X₁ ⟶ Z₁} {l : X₁ ⟶ X₃} {r : Z₁ ⟶ Z₃} {b : X₃ ⟶ Z₃} + (sqtl : CommSq tl lt mt ml) + (sqtr : CommSq tr mt rt mr) + (sqbl : CommSq ml lb mb bl) + (sqbr : CommSq mr mb rb br) + (sq : CommSq t l r b) + (ht : tl ≫ tr = t) + (hl : lt ≫ lb = l) + (hr : rt ≫ rb = r) + (hb : bl ≫ br = b) + +lemma baseChange_square : + F.baseChange sq = + (F.mapComp' lt lb l hl).inv.τr ▷ _ ≫ + (α_ _ _ _).hom ≫ + (F.map lb).r ◁ _ ◁ (F.mapComp' tl tr t ht).hom.τl ≫ + (F.map lb).r ◁ (α_ _ _ _).inv ≫ + (F.map lb).r ◁ F.baseChange sqtl ▷ _ ≫ + (F.map lb).r ◁ (α_ _ _ _).hom ≫ + (F.map lb).r ◁ (F.map ml).l ◁ F.baseChange sqtr ≫ + (α_ _ _ _).inv ≫ + (α_ _ _ _).inv ≫ + F.baseChange sqbl ▷ (F.map mr).l ▷ (F.map rt).r ≫ + (α_ _ _ _).hom ▷ (F.map rt).r ≫ + (α_ _ _ _).hom ≫ + (F.map bl).l ◁ F.baseChange sqbr ▷ (F.map rt).r ≫ + (F.map bl).l ◁ (α_ _ _ _).hom ≫ + (F.map bl).l ◁ (F.map br).l ◁ (F.mapComp' rt rb r hr).hom.τr ≫ + (α_ _ _ _).inv ≫ + (F.mapComp' bl br b hb).inv.τl ▷ (F.map r).r := by + sorry + +end Square + section lemma baseChange_self_self {S X Y : B} (f : S ⟶ X) (g : X ⟶ Y) : @@ -194,6 +262,16 @@ lemma whiskerBaseChange_self_self {S X Y : B} (f : S ⟶ X) (g : X ⟶ Y) : variable {Z : B} (b' : X₂ ⟶ Z) (r' : Y₁ ⟶ Z) (d : Y₂ ⟶ Z) (hbd : b ≫ d = b') (hrd : r ≫ d = r') +lemma baseChange_id_left (b' : X₁ ⟶ Y₂) (hlb : l ≫ b = b') : + F.baseChange (t := t) (l := 𝟙 _) (r := r) (b := b') ⟨by simpa [hlb] using sq.1⟩ = + (F.mapId _).inv.τr ▷ _ ≫ + (F.map l).adj.unit ▷ _ ≫ + (α_ _ _ _).hom ≫ + _ ◁ F.baseChange sq ≫ + (α_ _ _ _).inv ≫ + (F.mapComp' l b b' hlb).inv.τl ▷ _ := + sorry + lemma baseChange_id_comp : F.baseChange (t := 𝟙 Y₁) (l := r) (r := r ≫ d) (b := d) (by simp) = (F.map r).r ◁ ((F.comp Adj.forget₁).mapId _).hom ≫ @@ -304,7 +382,7 @@ end Codiag section Triple variable {S X₁ X₂ X₃ : B} {f₁ : S ⟶ X₁} {f₂ : S ⟶ X₂} {f₃ : S ⟶ X₃} - {P₁₂ P₂₃ P₁₃ P₁₂₃ : B} {p₁ : X₁ ⟶ P₁₂₃} {p₂ : X₂ ⟶ P₁₂₃} {p₃ : X₃ ⟶ P₁₂₃} + {P₁₂ P₂₃ P₁₃ P₁₂₃ : B} {u₁₂ : X₁ ⟶ P₁₂} {u₂₁ : X₂ ⟶ P₁₂} {u₂₃ : X₂ ⟶ P₂₃} {u₃₂ : X₃ ⟶ P₂₃} {u₁₃ : X₁ ⟶ P₁₃} {u₃₁ : X₃ ⟶ P₁₃} {p₁₂ : P₁₂ ⟶ P₁₂₃} {p₂₃ : P₂₃ ⟶ P₁₂₃} {p₁₃ : P₁₃ ⟶ P₁₂₃} @@ -314,6 +392,10 @@ variable {S X₁ X₂ X₃ : B} {f₁ : S ⟶ X₁} {f₂ : S ⟶ X₂} {f₃ : (h₁₃₁₂ : CommSq u₁₃ u₁₂ p₁₃ p₁₂) (h₂₁₂₃ : CommSq u₂₁ u₂₃ p₁₂ p₂₃) (h₃₂₃₁ : CommSq u₃₂ u₃₁ p₂₃ p₁₃) + (p₁ : X₁ ⟶ P₁₂₃) (p₂ : X₂ ⟶ P₁₂₃) (p₃ : X₃ ⟶ P₁₂₃) + (hp₁ : u₁₂ ≫ p₁₂ = p₁) + (hp₂ : u₂₃ ≫ p₂₃ = p₂) + (hp₃ : u₃₂ ≫ p₂₃ = p₃) lemma whiskerRight_whiskerBaseChange_triple : F.whiskerBaseChange sq₁₃ ▷ (F.map p₁₃).l = @@ -340,6 +422,100 @@ lemma whiskerRight_whiskerBaseChange_triple : ((F.comp Adj.forget₁).isoMapOfCommSq h₃₂₃₁).hom := by sorry +-- TODO: this lemma should not be needed, but `bicategory` can't prove this +omit [Strict B] in +@[reassoc] +private lemma aux (x : (F.map f₃).r ≫ (F.map f₁).l ⟶ (F.map u₃₁).l ≫ (F.map u₁₃).r) : + (ρ_ (F.map f₃)).hom.τr ▷ (F.map f₁).l ≫ + (F.map f₃ ◁ (F.mapId X₃).hom).τr ▷ (F.map f₁).l ≫ + (α_ (F.map (𝟙 X₃)).r (F.map f₃).r (F.map f₁).l).hom ≫ + (F.map (𝟙 X₃)).r ◁ x = x ≫ (λ_ _).inv ≫ + (F.mapId _).hom.τr ▷ _ := by + have : (ρ_ (F.map f₃)).hom.τr = (λ_ _).inv := rfl + rw [this] + dsimp + simp only [Bicategory.whiskerRight_comp] + rw [← cancel_mono (α_ (F.map (𝟙 X₃)).r (F.map u₃₁).l (F.map u₁₃).r).inv] + simp only [Category.assoc, Iso.hom_inv_id, Category.comp_id] + rw [whiskerRight_comp_symm] + simp_rw [Category.assoc] + rw [Iso.inv_hom_id_assoc, whiskerRight_comp_symm, Iso.inv_hom_id_assoc, ← whisker_exchange_assoc] + simp + +lemma baseChange_triple' : + F.baseChange sq₁₃ ≫ + (F.map u₃₁).l ◁ (λ_ _).inv ≫ (F.map u₃₁).l ◁ ((F.map p₁₃).adj.unit ▷ (F.map u₁₃).r) ≫ + (F.map u₃₁).l ◁ (α_ _ _ _).hom ≫ + (α_ _ _ _).inv ≫ + (F.mapComp' u₃₁ p₁₃ p₃ (hp₃ ▸ h₃₂₃₁.1.symm)).inv.τl ▷ _ ≫ + _ ◁ (F.mapComp' u₁₃ p₁₃ p₁ (hp₁ ▸ h₁₃₁₂.1)).hom.τr = + (F.map f₃).r ◁ (λ_ _).inv ≫ (F.map f₃).r ◁ ((F.map f₂).adj.unit ▷ (F.map f₁).l) ≫ + (F.map f₃).r ◁ (α_ _ _ _).hom ≫ + (F.map f₃).r ◁ (F.map f₂).l ◁ F.baseChange sq₁₂ ≫ + (α_ _ _ _).inv ≫ + (F.baseChange sq₂₃) ▷ ((F.map u₂₁).l ≫ (F.map u₁₂).r) ≫ + (α_ _ _ _).hom ≫ + (F.map u₃₂).l ◁ (α_ _ _ _).inv ≫ + (F.map u₃₂).l ◁ (F.baseChange h₂₁₂₃ ▷ (F.map u₁₂).r) ≫ + (F.map u₃₂).l ◁ (α_ _ _ _).hom ≫ + (F.map u₃₂).l ◁ (F.map p₂₃).l ◁ (F.mapComp' u₁₂ p₁₂ p₁ hp₁).hom.τr ≫ + (α_ _ _ _).inv ≫ + (F.mapComp' u₃₂ p₂₃ p₃ hp₃).inv.τl ▷ (F.map p₁).r := by + let sq₃₁₃ : CommSq u₃₁ (𝟙 X₃) p₁₃ p₃ := ⟨by simp [← hp₃, h₃₂₃₁.1]⟩ + let bigsq : CommSq f₁ f₃ p₁ p₃ := sq₁₃.vert_comp' sq₃₁₃ (by simp) (by simp [← hp₁, h₁₃₁₂.1]) + trans F.baseChange bigsq + · rw [F.baseChange_vert_comp' (sq := sq₁₃) (sq' := sq₃₁₃) (l'' := f₃) (r'' := p₁) (by simp) + (by simp [← hp₁, h₁₃₁₂.1])] + simp only [Adj.forget₂_obj, Adj.forget₂_map, Quiver.Hom.unop_op', Adj.comp_r, Adj.forget₂_map₂, + Quiver.Hom.unop_op] + rw [mapComp'_comp_id] + simp only [Iso.trans_inv, whiskerLeftIso_inv, Iso.symm_inv, Adj.comp_τr, Adj.comp_r, Adj.id_r, + comp_whiskerRight, Category.assoc] + rw [F.baseChange_id_left (t := u₃₁) (b' := p₃) (r := p₁₃) (l := u₃₁) (b := p₁₃) (by simp) + (by simp [← hp₃, h₃₂₃₁.1])] + rw [F.baseChange_self_self] + simp only [Adj.comp_l, Bicategory.whiskerRight_comp, Category.assoc, + pentagon_hom_inv_inv_inv_inv_assoc, Adj.id_r, Bicategory.whiskerLeft_comp, + Adjunction.whiskerRight_unit_associator_whiskerLeft_counit_assoc, comp_whiskerRight, + leftUnitor_whiskerRight, whisker_assoc, triangle_assoc_comp_right_inv_assoc] + rw [aux_assoc] + simp [← comp_whiskerRight_assoc, ← comp_whiskerRight] + · let sqtl : CommSq (𝟙 _) (𝟙 _) f₂ f₂ := ⟨rfl⟩ + have := F.baseChange_square sqtl sq₁₂ sq₂₃ h₂₁₂₃ bigsq (by simp) (by simp) hp₁ hp₃ + rw [this] + rw [baseChange_id_id_eq_unit] + simp only [Adj.comp_r, mapComp'_id_comp, Iso.trans_inv, whiskerRightIso_inv, Iso.symm_inv, + Adj.comp_τr, Adj.id_r, Adj.whiskerRight_τr', comp_whiskerRight, whisker_assoc, Adj.comp_l, + Iso.trans_hom, Iso.symm_hom, whiskerRightIso_hom, Adj.comp_τl, Adj.id_l, Adj.whiskerRight_τl', + Bicategory.whiskerLeft_comp, Category.assoc, triangle_assoc_comp_right_assoc, + whiskerLeft_inv_hom_assoc, Iso.inv_hom_id_assoc, Bicategory.whiskerRight_comp, + pentagon_hom_inv_inv_inv_inv_assoc, pentagon_hom_hom_inv_hom_hom_assoc] + have : + (λ_ (F.map f₃)).hom.τr ▷ (F.map f₁).l ≫ + (α_ (F.map f₃).r (𝟙 (F.obj S).obj) (F.map f₁).l).hom ≫ + (F.map f₃).r ◁ (F.mapId S).hom.τr ▷ (F.map f₁).l ≫ + (F.map f₃).r ◁ (F.map (𝟙 S)).r ◁ (λ_ (F.map f₁)).inv.τl ≫ + (F.map f₃).r ◁ (F.map (𝟙 S)).r ◁ (F.mapId S).inv.τl ▷ (F.map f₁).l ≫ + (F.map f₃).r ◁ (F.map (𝟙 S)).r ◁ (F.mapId S).hom.τl ▷ (F.map f₁).l ≫ + (F.map f₃).r ◁ (F.map (𝟙 S)).r ◁ (λ_ (F.map f₁).l).hom ≫ + (F.map f₃).r ◁ (F.mapId S).inv.τr ▷ (F.map f₁).l = + (F.map f₃).r ◁ (λ_ (F.map f₁).l).inv := by + nth_rw 3 [← Bicategory.whiskerLeft_comp_assoc (F.map f₃).r] + rw [← Bicategory.whiskerLeft_comp (F.map (𝟙 S)).r] + rw [← Bicategory.comp_whiskerRight, Adj.inv_hom_id_τl] + have : (λ_ (F.map f₁)).inv.τl = (λ_ _).inv := rfl + simp only [Adj.id_r, Adj.comp_r, Adj.comp_l, Adj.id_l, this, id_whiskerRight, + Bicategory.whiskerLeft_id, Category.id_comp] + nth_rw 2 [← Bicategory.whiskerLeft_comp_assoc (F.map f₃).r] + rw [← Bicategory.whiskerLeft_comp (F.map (𝟙 S)).r] + simp only [Iso.inv_hom_id, Bicategory.whiskerLeft_id, Category.id_comp] + nth_rw 1 [← Bicategory.whiskerLeft_comp (F.map f₃).r] + rw [← Bicategory.comp_whiskerRight] + have : (λ_ (F.map f₃)).hom.τr = (ρ_ _).inv := rfl + simp [this] + rw [reassoc_of% this] + +-- TODO: improve this, intentionally ungolfed for now lemma baseChange_triple : F.baseChange sq₁₃ ≫ (F.map u₃₁).l ◁ (λ_ _).inv ≫ (F.map u₃₁).l ◁ ((F.map p₁₃).adj.unit ▷ (F.map u₁₃).r) ≫ @@ -356,8 +532,79 @@ lemma baseChange_triple : (α_ _ _ _).inv ≫ (F.isoMapOfCommSq h₃₂₃₁).hom.τl ▷ _ ≫ (α_ _ _ _).hom ≫ - _ ◁ _ ◁ (F.isoMapOfCommSq h₁₃₁₂).hom.τr := - sorry + _ ◁ _ ◁ (F.isoMapOfCommSq h₁₃₁₂).hom.τr := by + let p₁ : X₁ ⟶ P₁₂₃ := u₁₂ ≫ p₁₂ + let p₃ : X₃ ⟶ P₁₂₃ := u₃₂ ≫ p₂₃ + rw [← cancel_mono (α_ _ _ _).inv, ← cancel_mono ((F.mapComp' _ _ p₃ (h₃₂₃₁.1.symm)).inv.τl ▷ _)] + rw [← cancel_mono (_ ◁ (F.mapComp' _ _ p₁ (h₁₃₁₂.1)).hom.τr)] + simp_rw [Category.assoc] + rw [F.baseChange_triple' sq₁₂ sq₂₃ sq₁₃ h₁₃₁₂ h₂₁₂₃ h₃₂₃₁ p₁ p₃ rfl rfl] + rw [isoMapOfCommSq_eq _ _ p₁ h₁₃₁₂.1] + rw [isoMapOfCommSq_eq _ _ p₃ rfl] + simp only [Bicategory.whiskerRight_comp, Adj.comp_l, Category.assoc, + pentagon_hom_hom_inv_hom_hom_assoc, Iso.trans_hom, Iso.symm_hom, Adj.comp_τl, comp_whiskerRight, + Adj.comp_r, Adj.comp_τr, Bicategory.whiskerLeft_comp, pentagon_hom_inv_inv_inv_inv_assoc] + congr 10 + rw [← pentagon_inv_assoc] + rw [← pentagon_assoc] + have : + (F.map u₃₁).l ◁ (F.map p₁₃).l ◁ (F.mapComp' u₁₃ p₁₃ p₁ h₁₃₁₂.1).inv.τr ≫ + (α_ (F.map u₃₁).l (F.map p₁₃).l ((F.map p₁₃).r ≫ (F.map u₁₃).r)).inv ≫ + (α_ ((F.map u₃₁).l ≫ (F.map p₁₃).l) (F.map p₁₃).r (F.map u₁₃).r).inv ≫ + (F.mapComp' u₃₁ p₁₃ p₃ (h₃₂₃₁.1.symm)).inv.τl ▷ (F.map p₁₃).r ▷ (F.map u₁₃).r = + (α_ _ _ _).inv ≫ + (F.mapComp' u₃₁ p₁₃ p₃ (h₃₂₃₁.1.symm)).inv.τl ▷ (F.map p₁).r ≫ + (F.map p₃).l ◁ (F.mapComp' u₁₃ p₁₃ p₁ h₁₃₁₂.1).inv.τr ≫ + (α_ _ _ _).inv := by + rw [← whisker_exchange_assoc] + simp + have : (F.mapComp' u₃₁ p₁₃ p₃ (h₃₂₃₁.1.symm)).hom.τl ▷ (F.map p₁₂).r ▷ (F.map u₁₂).r ≫ + (α_ (F.map u₃₁).l (F.map p₁₃).l (F.map p₁₂).r).hom ▷ (F.map u₁₂).r ≫ + (α_ (F.map u₃₁).l ((F.map p₁₃).l ≫ (F.map p₁₂).r) (F.map u₁₂).r).hom ≫ + (F.map u₃₁).l ◁ (α_ (F.map p₁₃).l (F.map p₁₂).r (F.map u₁₂).r).hom ≫ + (F.map u₃₁).l ◁ (F.map p₁₃).l ◁ (F.mapComp' u₁₂ p₁₂ p₁ rfl).hom.τr ≫ + (F.map u₃₁).l ◁ (F.map p₁₃).l ◁ (F.mapComp' u₁₃ p₁₃ p₁ h₁₃₁₂.1).inv.τr ≫ + (F.map u₃₁).l ◁ (α_ (F.map p₁₃).l (F.map p₁₃).r (F.map u₁₃).r).inv ≫ + (α_ (F.map u₃₁).l ((F.map p₁₃).l ≫ (F.map p₁₃).r) (F.map u₁₃).r).inv ≫ + (α_ (F.map u₃₁).l (F.map p₁₃).l (F.map p₁₃).r).inv ▷ (F.map u₁₃).r ≫ + (F.mapComp' u₃₁ p₁₃ p₃ (h₃₂₃₁.1.symm)).inv.τl ▷ (F.map p₁₃).r ▷ (F.map u₁₃).r = + (F.mapComp' u₃₁ p₁₃ p₃ (h₃₂₃₁.1.symm)).hom.τl ▷ (F.map p₁₂).r ▷ (F.map u₁₂).r ≫ + (F.mapComp' u₃₁ p₁₃ p₃ (h₃₂₃₁.1.symm)).inv.τl ▷ _ ▷ _ ≫ + (α_ _ _ _).hom ≫ + (F.map p₃).l ◁ (F.mapComp' u₁₂ p₁₂ p₁ rfl).hom.τr ≫ + (F.map p₃).l ◁ (F.mapComp' u₁₃ p₁₃ p₁ h₁₃₁₂.1).inv.τr ≫ + (α_ _ _ _).inv := by + congr 1 + simp only [Adj.comp_l, Adj.comp_r, pentagon_inv_assoc, pentagon_assoc] + rw [this] + have : + (F.map u₃₁).l ◁ (F.map p₁₃).l ◁ (F.mapComp' u₁₂ p₁₂ p₁ rfl).hom.τr ≫ + (α_ _ _ _).inv ≫ + (F.mapComp' u₃₁ p₁₃ p₃ h₃₂₃₁.1.symm).inv.τl ▷ (F.map p₁).r = + (α_ _ _ _).inv ≫ + (F.mapComp' u₃₁ p₁₃ p₃ h₃₂₃₁.1.symm).inv.τl ▷ _ ≫ + _ ◁ (F.mapComp' u₁₂ p₁₂ p₁ rfl).hom.τr := by + rw [← whisker_exchange] + simp + rw [reassoc_of% this] + simp + rw [reassoc_of% this] + nth_rw 3 [← Bicategory.comp_whiskerRight_assoc] + rw [← Bicategory.comp_whiskerRight] + simp only [Adj.comp_l, Adj.hom_inv_id_τl, id_whiskerRight, Adj.comp_r, Iso.inv_hom_id_assoc, + Category.id_comp] + rw [← Bicategory.whiskerLeft_comp] + simp only [Adj.inv_hom_id_τr, Bicategory.whiskerLeft_id, Category.comp_id] + have : + (F.mapComp' u₃₂ p₂₃ p₃ rfl).inv.τl ▷ (F.map p₁₂).r ▷ (F.map u₁₂).r ≫ + (α_ (F.map p₃).l (F.map p₁₂).r (F.map u₁₂).r).hom ≫ + (F.map p₃).l ◁ (F.mapComp' u₁₂ p₁₂ p₁ rfl).hom.τr = + (α_ _ _ _).hom ≫ + (F.map u₃₂ ≫ F.map p₂₃).l ◁ (F.mapComp' u₁₂ p₁₂ p₁ rfl).hom.τr ≫ + (F.mapComp' u₃₂ p₂₃ p₃ rfl).inv.τl ▷ (F.map p₁).r := by + rw [whisker_exchange] + simp + simp [this] end Triple From a1972481622b17934071057f42afe0a08e1acc88 Mon Sep 17 00:00:00 2001 From: Christian Merten Date: Fri, 6 Jun 2025 20:07:23 +0200 Subject: [PATCH 113/118] fill square sorry --- .../Bicategory/Adjunction/BaseChange.lean | 42 ++++++++++++++++++- 1 file changed, 40 insertions(+), 2 deletions(-) diff --git a/Mathlib/CategoryTheory/Bicategory/Adjunction/BaseChange.lean b/Mathlib/CategoryTheory/Bicategory/Adjunction/BaseChange.lean index c6b705118917cb..e8770d43c76fa2 100644 --- a/Mathlib/CategoryTheory/Bicategory/Adjunction/BaseChange.lean +++ b/Mathlib/CategoryTheory/Bicategory/Adjunction/BaseChange.lean @@ -168,7 +168,7 @@ lemma baseChange_horiz_comp' : (F.map b).l ◁ baseChange F sq' ≫ (α_ _ _ _).inv ≫ ((F.comp Adj.forget₁).mapComp' b b' b'' hb).inv ▷ (F.map r).r := -sorry + sorry end Horizontal @@ -224,6 +224,27 @@ variable {X₁ X₂ X₃ Y₁ Y₂ Y₃ Z₁ Z₂ Z₃ : B} (hr : rt ≫ rb = r) (hb : bl ≫ br = b) +lemma mapComp'_comp_adjForget₁_hom {a b c : B} (f : a ⟶ b) (g : b ⟶ c) (fg : a ⟶ c) + (hfg : f ≫ g = fg := by aesop_cat) : + ((F.comp Adj.forget₁).mapComp' f g fg hfg).hom = (F.mapComp' f g fg hfg).hom.τl := + sorry + +lemma mapComp'_comp_adjForget₁_inv {a b c : B} (f : a ⟶ b) (g : b ⟶ c) (fg : a ⟶ c) + (hfg : f ≫ g = fg := by aesop_cat) : + ((F.comp Adj.forget₁).mapComp' f g fg hfg).inv = (F.mapComp' f g fg hfg).inv.τl := + sorry + +@[reassoc] +lemma _root_.CategoryTheory.Bicategory.whiskerLeft_whiskerLeft_associator_whiskerRight + {x y z u v : C} (f : x ⟶ y) (g : y ⟶ z) (h : x ⟶ z) + (g' : z ⟶ u) (f' : u ⟶ v) (h' : z ⟶ v) + (α : f ≫ g ⟶ h) (β : g' ≫ f' ⟶ h') : + f ◁ g ◁ β ≫ (α_ _ _ _).inv ≫ α ▷ _ = + (α_ _ _ _).inv ≫ + α ▷ _ ≫ _ ◁ β := by + rw [← whisker_exchange] + simp + lemma baseChange_square : F.baseChange sq = (F.mapComp' lt lb l hl).inv.τr ▷ _ ≫ @@ -243,7 +264,24 @@ lemma baseChange_square : (F.map bl).l ◁ (F.map br).l ◁ (F.mapComp' rt rb r hr).hom.τr ≫ (α_ _ _ _).inv ≫ (F.mapComp' bl br b hb).inv.τl ▷ (F.map r).r := by - sorry + let sqt : CommSq t lt rt (ml ≫ mr) := ⟨by simp [← ht, sqtr.1, reassoc_of% sqtl.1]⟩ + let sqb : CommSq (ml ≫ mr) lb rb b := ⟨by simp [← hb, sqbr.1, reassoc_of% sqbl.1]⟩ + rw [F.baseChange_vert_comp' sqt sqb hl hr] + rw [F.baseChange_horiz_comp' sqtl sqtr ht rfl] + rw [F.baseChange_horiz_comp' sqbl sqbr rfl hb] + simp only [Adj.forget₂_obj, Adj.forget₂_map, Quiver.Hom.unop_op', Adj.comp_r, Adj.forget₂_map₂, + Quiver.Hom.unop_op, comp_toPrelaxFunctor, PrelaxFunctor.comp_toPrelaxFunctorStruct, + PrelaxFunctorStruct.comp_toPrefunctor, Prefunctor.comp_obj, Adj.forget₁_obj, + Prefunctor.comp_map, Adj.forget₁_map, mapComp'_comp_adjForget₁_hom, + mapComp'_comp_adjForget₁_inv, Bicategory.whiskerLeft_comp, comp_whiskerRight, whisker_assoc, + Category.assoc, Iso.inv_hom_id_assoc, Adj.comp_l] + congr 7 + slice_lhs 2 3 => + rw [← Bicategory.whiskerLeft_comp, ← Bicategory.comp_whiskerRight] + simp only [Adj.inv_hom_id_τl, Adj.comp_l, id_whiskerRight, Bicategory.whiskerLeft_id] + simp only [Category.id_comp, Category.assoc, pentagon_inv_assoc, Iso.cancel_iso_inv_left] + congr 4 + simp [whiskerLeft_whiskerLeft_associator_whiskerRight] end Square From 486fa86b44c8353269ee5011a790cecd1864b32b Mon Sep 17 00:00:00 2001 From: Christian Merten Date: Sat, 7 Jun 2025 14:16:04 +0200 Subject: [PATCH 114/118] fill more sorries --- .../Bicategory/Adjunction/Adj.lean | 27 ++++++ .../Bicategory/Adjunction/BaseChange.lean | 95 ++++++++++++------- 2 files changed, 86 insertions(+), 36 deletions(-) diff --git a/Mathlib/CategoryTheory/Bicategory/Adjunction/Adj.lean b/Mathlib/CategoryTheory/Bicategory/Adjunction/Adj.lean index 6e4aaf3f4ee73d..132dc0e74cbbd3 100644 --- a/Mathlib/CategoryTheory/Bicategory/Adjunction/Adj.lean +++ b/Mathlib/CategoryTheory/Bicategory/Adjunction/Adj.lean @@ -436,6 +436,33 @@ lemma comp_forget₁_mapComp' : ext simp [Pseudofunctor.mapComp'_eq_mapComp, forget₁] +lemma mapComp'_comp_adjForget₁_hom : + ((F.comp Adj.forget₁).mapComp' f g fg hfg).hom = (F.mapComp' f g fg hfg).hom.τl := by + simp [comp_forget₁_mapComp'] + +lemma mapComp'_comp_adjForget₁_inv : + ((F.comp Adj.forget₁).mapComp' f g fg hfg).inv = (F.mapComp' f g fg hfg).inv.τl := by + simp [comp_forget₁_mapComp'] + +lemma mapId_comp_adjForget₁ (x : B) : + (F.comp forget₁).mapId x = lIso (F.mapId x) := by + ext + simp + +lemma mapId_comp_adjForget₁_hom (x : B) : + ((F.comp forget₁).mapId x).hom = (F.mapId x).hom.τl := by + simp [mapId_comp_adjForget₁] + +lemma mapId_comp_adjForget₁_inv (x : B) : + ((F.comp forget₁).mapId x).inv = (F.mapId x).inv.τl := by + simp [mapId_comp_adjForget₁] + +lemma counit_map_id : + (F.map (𝟙 a)).adj.counit = + (F.mapId a).inv.τr ▷ _ ≫ _ ◁ (F.mapId a).hom.τl ≫ (λ_ _).hom := by + rw [← whisker_exchange_assoc, ← (F.mapId a).inv.conjugateEquiv_τl, conjugateEquiv_apply'] + simp [Adjunction.id, ← whiskerLeft_comp_assoc] + @[reassoc] lemma unit_comp_mapComp'_hom_τr_comp_counit : (F.map g).adj.unit ▷ (F.map f).r ▷ (F.map fg).l ≫ diff --git a/Mathlib/CategoryTheory/Bicategory/Adjunction/BaseChange.lean b/Mathlib/CategoryTheory/Bicategory/Adjunction/BaseChange.lean index e8770d43c76fa2..b5e310a24c3f2a 100644 --- a/Mathlib/CategoryTheory/Bicategory/Adjunction/BaseChange.lean +++ b/Mathlib/CategoryTheory/Bicategory/Adjunction/BaseChange.lean @@ -54,6 +54,29 @@ lemma mateEquiv_id (adj₁ : Adjunction l₁ r₁) (adj₂ : Adjunction l₂ r · rw [whisker_exchange] bicategory +lemma Adjunction.homEquiv₁_symm_whiskerRight {b c d e : B} {l : b ⟶ c} + {r : c ⟶ b} (adj : l ⊣ r) {g : b ⟶ d} {h : c ⟶ d} (β : r ≫ g ⟶ h) (u : d ⟶ e) : + adj.homEquiv₁.symm ((α_ _ _ _).inv ≫ β ▷ u) = + adj.homEquiv₁.symm β ▷ u ≫ (α_ _ _ _).hom := by + simp [homEquiv₁_symm_apply] + +lemma Adjunction.homEquiv₁_symm_comp {b c d : B} {l : b ⟶ c} + {r : c ⟶ b} (adj : l ⊣ r) {g : b ⟶ d} {h h' : c ⟶ d} (β : r ≫ g ⟶ h) (α : h ⟶ h') : + adj.homEquiv₁.symm (β ≫ α) = + adj.homEquiv₁.symm β ≫ l ◁ α := by + simp [homEquiv₁_symm_apply] + +@[reassoc] +lemma whiskerLeft_whiskerLeft_associator_whiskerRight + {x y z u v : B} (f : x ⟶ y) (g : y ⟶ z) (h : x ⟶ z) + (g' : z ⟶ u) (f' : u ⟶ v) (h' : z ⟶ v) + (α : f ≫ g ⟶ h) (β : g' ≫ f' ⟶ h') : + f ◁ g ◁ β ≫ (α_ _ _ _).inv ≫ α ▷ _ = + (α_ _ _ _).inv ≫ + α ▷ _ ≫ _ ◁ β := by + rw [← whisker_exchange] + simp + end Bicategory variable {C : Type*} [Category C] @@ -118,14 +141,37 @@ lemma whiskerBaseChange_eq_whiskerLeft_isoMapOfCommSq : lemma whiskerBaseChange_eq_whiskerRight_baseChange : F.whiskerBaseChange sq = (α_ _ _ _).inv ≫ F.baseChange sq ▷ (F.map r).l ≫ - (α_ _ _ _).hom ≫ (F.map b).l ◁ (F.map r).adj.counit ≫ (ρ_ _).hom := - sorry - -/-lemma whiskerBaseChange_eq' : - F.whiskerBaseChange sq = - (α_ _ _ _).inv ≫ F.baseChange sq ▷ (F.map r).l ≫ (α_ _ _ _).hom ≫ (F.map b).l ◁ (F.map r).adj.counit ≫ (ρ_ _).hom := by - rw [whiskerBaseChange_eq, Adjunction.homEquiv₂_symm_apply]-/ + apply (F.map l).adj.homEquiv₁.symm.injective + rw [whiskerBaseChange] + simp only [Equiv.symm_apply_apply] + rw [← Category.assoc] + rw [Adjunction.homEquiv₁_symm_comp] + rw [Adjunction.homEquiv₁_symm_whiskerRight] + rw [baseChange, Bicategory.mateEquiv_apply] + simp only [Equiv.symm_apply_apply, comp_whiskerRight, Category.assoc, Bicategory.whiskerLeft_comp, + whiskerLeft_rightUnitor, pentagon_assoc] + rw [Adjunction.homEquiv₂_apply] + simp only [comp_whiskerRight, whisker_assoc, Category.assoc, triangle_assoc_comp_right_inv_assoc] + have : + (F.isoMapOfCommSq sq).hom.τl ▷ (F.map r).r ▷ (F.map r).l ≫ + (α_ ((F.map l).l ≫ (F.map b).l) (F.map r).r (F.map r).l).hom ≫ + (α_ (F.map l).l (F.map b).l ((F.map r).r ≫ (F.map r).l)).hom ≫ + (F.map l).l ◁ (F.map b).l ◁ (F.map r).adj.counit = + (α_ _ _ _).hom ≫ + _ ◁ (F.map r).adj.counit ≫ + (F.isoMapOfCommSq sq).hom.τl ▷ _ ≫ + (α_ _ _ _).hom := by + rw [whisker_exchange_assoc] + simp + rw [reassoc_of% this] + simp only [Adj.comp_l, comp_whiskerLeft, Bicategory.whiskerRight_id, Iso.hom_inv_id_assoc, + Category.assoc, Iso.inv_hom_id, Category.comp_id, pentagon_inv_hom_hom_hom_hom_assoc, + Iso.inv_hom_id_assoc] + nth_rw 2 [← Bicategory.whiskerLeft_comp_assoc] + nth_rw 2 [← Bicategory.whiskerLeft_comp_assoc] + rw [Category.assoc] + simp section Unit @@ -140,10 +186,9 @@ lemma baseChange_id_id_eq_unit : (ρ_ _).hom ≫ (F.mapId _).inv.τr ≫ (F.map f).adj.unit := by - rw [baseChange] - simp only [isoMapOfCommSq_self_self, Iso.refl_hom, Adj.id_τl, Adj.comp_l, Adj.id_l, Adj.id_r] - rw [mateEquiv_id] - sorry + simp only [baseChange, isoMapOfCommSq_self_self, Iso.refl_hom, Adj.id_τl, Adj.comp_l] + rw [mateEquiv_id, Adj.counit_map_id, ← whisker_exchange_assoc] + simp end Unit @@ -167,7 +212,7 @@ lemma baseChange_horiz_comp' : (α_ _ _ _).hom ≫ (F.map b).l ◁ baseChange F sq' ≫ (α_ _ _ _).inv ≫ - ((F.comp Adj.forget₁).mapComp' b b' b'' hb).inv ▷ (F.map r).r := + ((F.comp Adj.forget₁).mapComp' b b' b'' hb).inv ▷ (F.map r).r := by sorry end Horizontal @@ -224,27 +269,6 @@ variable {X₁ X₂ X₃ Y₁ Y₂ Y₃ Z₁ Z₂ Z₃ : B} (hr : rt ≫ rb = r) (hb : bl ≫ br = b) -lemma mapComp'_comp_adjForget₁_hom {a b c : B} (f : a ⟶ b) (g : b ⟶ c) (fg : a ⟶ c) - (hfg : f ≫ g = fg := by aesop_cat) : - ((F.comp Adj.forget₁).mapComp' f g fg hfg).hom = (F.mapComp' f g fg hfg).hom.τl := - sorry - -lemma mapComp'_comp_adjForget₁_inv {a b c : B} (f : a ⟶ b) (g : b ⟶ c) (fg : a ⟶ c) - (hfg : f ≫ g = fg := by aesop_cat) : - ((F.comp Adj.forget₁).mapComp' f g fg hfg).inv = (F.mapComp' f g fg hfg).inv.τl := - sorry - -@[reassoc] -lemma _root_.CategoryTheory.Bicategory.whiskerLeft_whiskerLeft_associator_whiskerRight - {x y z u v : C} (f : x ⟶ y) (g : y ⟶ z) (h : x ⟶ z) - (g' : z ⟶ u) (f' : u ⟶ v) (h' : z ⟶ v) - (α : f ≫ g ⟶ h) (β : g' ≫ f' ⟶ h') : - f ◁ g ◁ β ≫ (α_ _ _ _).inv ≫ α ▷ _ = - (α_ _ _ _).inv ≫ - α ▷ _ ≫ _ ◁ β := by - rw [← whisker_exchange] - simp - lemma baseChange_square : F.baseChange sq = (F.mapComp' lt lb l hl).inv.τr ▷ _ ≫ @@ -272,8 +296,8 @@ lemma baseChange_square : simp only [Adj.forget₂_obj, Adj.forget₂_map, Quiver.Hom.unop_op', Adj.comp_r, Adj.forget₂_map₂, Quiver.Hom.unop_op, comp_toPrelaxFunctor, PrelaxFunctor.comp_toPrelaxFunctorStruct, PrelaxFunctorStruct.comp_toPrefunctor, Prefunctor.comp_obj, Adj.forget₁_obj, - Prefunctor.comp_map, Adj.forget₁_map, mapComp'_comp_adjForget₁_hom, - mapComp'_comp_adjForget₁_inv, Bicategory.whiskerLeft_comp, comp_whiskerRight, whisker_assoc, + Prefunctor.comp_map, Adj.forget₁_map, Adj.mapComp'_comp_adjForget₁_hom, + Adj.mapComp'_comp_adjForget₁_inv, Bicategory.whiskerLeft_comp, comp_whiskerRight, whisker_assoc, Category.assoc, Iso.inv_hom_id_assoc, Adj.comp_l] congr 7 slice_lhs 2 3 => @@ -347,7 +371,6 @@ lemma baseChange_of_comp_eq : simp only [Category.assoc] have : (Adj.forget₁.mapId (F.obj Y₁)).hom = 𝟙 _ := rfl rw [this] - --have : (F.mapId Y₁).hom.l = 𝟙 _ := sorry simp only [Adj.forget₁_obj, Adj.forget₁_map, Adj.id_l, Bicategory.whiskerLeft_id, Category.id_comp] rw [mapComp'_comp_id] From e6ab6ef77b5ff67dfcc11a318605a7b5a8fab0db Mon Sep 17 00:00:00 2001 From: Christian Merten Date: Sat, 7 Jun 2025 14:20:57 +0200 Subject: [PATCH 115/118] cleanup --- .../Bicategory/Adjunction/BaseChange.lean | 295 ------------------ .../Sites/Descent/DescentDataDoublePrime.lean | 1 - 2 files changed, 296 deletions(-) diff --git a/Mathlib/CategoryTheory/Bicategory/Adjunction/BaseChange.lean b/Mathlib/CategoryTheory/Bicategory/Adjunction/BaseChange.lean index b5e310a24c3f2a..27b21ea8ac33a1 100644 --- a/Mathlib/CategoryTheory/Bicategory/Adjunction/BaseChange.lean +++ b/Mathlib/CategoryTheory/Bicategory/Adjunction/BaseChange.lean @@ -458,31 +458,6 @@ variable {S X₁ X₂ X₃ : B} {f₁ : S ⟶ X₁} {f₂ : S ⟶ X₂} {f₃ : (hp₂ : u₂₃ ≫ p₂₃ = p₂) (hp₃ : u₃₂ ≫ p₂₃ = p₃) -lemma whiskerRight_whiskerBaseChange_triple : - F.whiskerBaseChange sq₁₃ ▷ (F.map p₁₃).l = - (α_ _ _ _).inv ▷ (F.map p₁₃).l ≫ - ((F.map f₃).r ◁ (λ_ _).inv) ▷ (F.map u₁₃).l ▷ (F.map p₁₃).l ≫ - ((F.map f₃).r ◁ ((F.map f₂).adj.unit ▷ (F.map f₁).l)) ▷ (F.map u₁₃).l ▷ (F.map p₁₃).l ≫ - (α_ _ _ _).hom ≫ - (α_ _ _ _).hom ≫ - (F.map f₃).r ◁ (α_ _ _ _).inv ≫ - (F.map f₃).r ◁ ((α_ _ _ _).hom ▷ (F.map p₁₃).l) ≫ - (F.map f₃).r ◁ ((α_ _ _ _).hom ▷ (F.map p₁₃).l) ≫ - (F.map f₃).r ◁ (α_ _ _ _).hom ≫ - (F.map f₃).r ◁ (F.map f₂).l ◁ (α_ _ _ _).hom ≫ - (F.map f₃).r ◁ (F.map f₂).l ◁ (F.map f₂).r ◁ (α_ _ _ _).hom ≫ - (F.map f₃).r ◁ (F.map f₂).l ◁ (F.map f₂).r ◁ (F.map f₁).l ◁ - ((F.comp Adj.forget₁).isoMapOfCommSq h₁₃₁₂).hom ≫ - (F.map f₃).r ◁ (F.map f₂).l ◁ (F.map f₂).r ◁ (α_ _ _ _).inv ≫ - (F.map f₃).r ◁ (F.map f₂).l ◁ (α_ _ _ _).inv ≫ - (F.map f₃).r ◁ (F.map f₂).l ◁ (F.whiskerBaseChange sq₁₂ ▷ (F.map p₁₂).l) ≫ - (F.map f₃).r ◁ (F.map f₂).l ◁ ((F.comp Adj.forget₁).isoMapOfCommSq h₂₁₂₃).hom ≫ - (F.map f₃).r ◁ (α_ _ _ _).inv ≫ - (α_ _ _ _).inv ≫ - (F.whiskerBaseChange sq₂₃) ▷ (F.map p₂₃).l ≫ - ((F.comp Adj.forget₁).isoMapOfCommSq h₃₂₃₁).hom := by - sorry - -- TODO: this lemma should not be needed, but `bicategory` can't prove this omit [Strict B] in @[reassoc] @@ -669,276 +644,6 @@ lemma baseChange_triple : end Triple -section - -variable {B C : Type*} [Bicategory B] [Strict B] [Bicategory C] (F : Pseudofunctor B (Adj Cat)) - -variable {X₁ X₂ Y₁ Y₂ : B} {t : X₁ ⟶ Y₁} {l : X₁ ⟶ X₂} - {r : Y₁ ⟶ Y₂} {b : X₂ ⟶ Y₂} (sq : CommSq t l r b) - -/-- -Given a commutative square, -``` - t - X₁ ⟶ Y₁ -l| |r - v v - X₂ ⟶ Y₂ - b -``` -any morphism `M ⟶ t^* l_* N` induces a morphism `r^* M ⟶ b^* N`. This is the morphism -constructed from a `DescentDataAsCoalgebra` to form a `DescentData'`. --/ -def coalgHom {M : (F.obj Y₁).obj} {N : (F.obj X₂).obj} - (a : M ⟶ (F.map t).l.obj ((F.map l).r.obj N)) : - (F.map r).l.obj M ⟶ (F.map b).l.obj N := - (F.map r).l.map a ≫ (F.whiskerBaseChange sq).app _ - -/-- If the base change morphism is an isomorphism, `coalgHom sq` is an equivalence. -/ -noncomputable -def coalgEquiv [IsIso (F.baseChange sq)] - (M : (F.obj Y₁).obj) (N : (F.obj X₂).obj) : - (M ⟶ (F.map t).l.obj ((F.map l).r.obj N)) ≃ ((F.map r).l.obj M ⟶ (F.map b).l.obj N) where - toFun a := (F.map r).l.map a ≫ (F.whiskerBaseChange sq).app N - invFun a := (F.map r).adj.unit.app _ ≫ (F.map r).r.map a ≫ inv ((F.baseChange sq).app _) - left_inv a := by - simp only [whiskerBaseChange_eq', Adjunction.homEquiv₂_symm_apply] - dsimp - simp only [Functor.map_comp, Category.assoc] - simp only [Cat.associator_inv_app, Cat.comp_obj, eqToHom_refl, Functor.map_id, - Cat.associator_hom_app, Cat.rightUnitor_hom_app, Cat.id_obj, Category.id_comp] - rw [← Cat.comp_map, ← (F.map r).adj.unit.naturality_assoc] - simp only [Cat.id_obj, Cat.id_map, Cat.comp_obj] - rw [← Cat.comp_map, ← (F.map r).adj.unit.naturality_assoc] - have := congr($((F.map r).adj.right_triangle).app ((F.map b).l.obj N)) - dsimp only [Cat.comp_obj, Cat.id_obj, rightZigzag, bicategoricalComp, - BicategoricalCoherence.assoc'_iso, BicategoricalCoherence.whiskerRight_iso, - BicategoricalCoherence.refl_iso, Iso.trans_hom, whiskerRightIso_hom, Iso.refl_hom, - Iso.symm_hom, Cat.comp_app, Cat.whiskerLeft_app, Cat.whiskerRight_app, Cat.id_app, - Cat.comp_map, Cat.associator_inv_app, eqToHom_refl, Cat.rightUnitor_hom_app] at this - simp only [Functor.map_id, Category.comp_id, Category.id_comp, Cat.leftUnitor_inv_app, - Cat.comp_obj, Cat.id_obj, eqToHom_refl] at this - rw [reassoc_of% this] - simp - right_inv a := by - simp only [whiskerBaseChange_eq', Adjunction.homEquiv₂_symm_apply] - dsimp - simp only [Cat.associator_inv_app, Cat.comp_obj, eqToHom_refl, Functor.map_id, - Cat.associator_hom_app, Cat.rightUnitor_hom_app, Cat.id_obj, Category.id_comp] - simp only [Functor.map_comp, Functor.map_inv, Category.comp_id, Category.assoc, - IsIso.inv_hom_id_assoc] - rw [← Cat.comp_map, (F.map r).adj.counit.naturality] - simp only [Cat.comp_obj, Cat.id_obj, Cat.id_map] - -- TODO: specialize the `left_triangle` and `right_triangle` conditions - -- for `Adj Cat` in `app`lied for - have := congr($((F.map r).adj.left_triangle).app M) - dsimp only [Cat.comp_obj, Cat.id_obj, leftZigzag, bicategoricalComp, - BicategoricalCoherence.assoc_iso, BicategoricalCoherence.whiskerRight_iso, - BicategoricalCoherence.refl_iso, Iso.trans_hom, whiskerRightIso_hom, Iso.refl_hom, - Cat.comp_app, Cat.whiskerRight_app, Cat.id_app, Cat.comp_map, Cat.whiskerLeft_app] at this - simp only [Cat.associator_hom_app, Cat.comp_obj, eqToHom_refl, Functor.map_id, Category.comp_id, - Category.id_comp, Cat.leftUnitor_hom_app, Cat.id_obj, Cat.rightUnitor_inv_app] at this - rw [reassoc_of% this] - -@[simp] -lemma coalgHom_coalgEquiv_symm [IsIso (F.baseChange sq)] {M} {N} - (a : (F.map r).l.obj M ⟶ (F.map b).l.obj N) : - F.coalgHom sq ((F.coalgEquiv sq _ _).symm a) = a := - (F.coalgEquiv sq _ _).apply_symm_apply _ - -@[simp] -lemma coalgEquiv_symm_coalgHom_apply [IsIso (F.baseChange sq)] {M} {N} - (a : M ⟶ (F.map t).l.obj ((F.map l).r.obj N)) : - (F.coalgEquiv sq M N).symm (F.coalgHom sq a) = a := - (F.coalgEquiv sq M N).symm_apply_apply _ - -section - -variable {S X Y : B} (f : S ⟶ X) (r b : X ⟶ Y) (sq : CommSq f f r b) (d : Y ⟶ X) - (hrd : r ≫ d = 𝟙 _) (hbd : b ≫ d = 𝟙 _) - -lemma map_coalgHom_of_comp_eq_id {M : (F.obj X).obj} - (a : M ⟶ (F.map f).l.obj ((F.map f).r.obj M)) : - (F.map d).l.map (F.coalgHom sq a) = - (F.map d).l.map ((F.map r).l.map (a ≫ (F.map f).adj.counit.app M)) ≫ - ((F.comp Adj.forget₁).mapComp' r d (𝟙 _) hrd).inv.app _ ≫ - ((F.comp Adj.forget₁).mapComp' b d (𝟙 _) hbd).hom.app _ := by - have := congr($(F.whiskerRight_whiskerBaseChange_self_self _ _ _ sq d hrd hbd).app M) - dsimp only [Cat.comp_obj, Cat.whiskerRight_app, comp_toPrelaxFunctor, - PrelaxFunctor.comp_toPrelaxFunctorStruct, PrelaxFunctorStruct.comp_toPrefunctor, - Prefunctor.comp_obj, Adj.forget₁_obj, Prefunctor.comp_map, Adj.forget₁_map, Cat.comp_app, - Cat.id_obj] at this - simp only [coalgHom, Functor.map_comp, comp_toPrelaxFunctor, - PrelaxFunctor.comp_toPrelaxFunctorStruct, PrelaxFunctorStruct.comp_toPrefunctor, - Prefunctor.comp_obj, Adj.forget₁_obj, - Prefunctor.comp_map, Adj.forget₁_map, Cat.comp_obj] - rw [this, Cat.associator_inv_app, Cat.leftUnitor_hom_app] - simp only [Cat.comp_obj, eqToHom_refl, Cat.id_obj, Category.comp_id, Category.id_comp] - simp_rw [← (F.map d).l.map_comp_assoc, ← (F.map r).l.map_comp] - simp - -lemma comp_counit_eq_id_iff {M : (F.obj X).obj} (a : M ⟶ (F.map f).l.obj ((F.map f).r.obj M)) : - a ≫ (F.map f).adj.counit.app M = 𝟙 M ↔ - (F.map d).l.map (F.coalgHom sq a) = - ((F.comp Adj.forget₁).mapComp' r d (𝟙 _) hrd).inv.app _ ≫ - ((F.comp Adj.forget₁).mapComp' b d (𝟙 _) hbd).hom.app _ := by - rw [F.map_coalgHom_of_comp_eq_id _ _ _ sq _ hrd hbd] - refine ⟨fun H ↦ ?_, fun H ↦ ?_⟩ - · simp [H] - · have : Functor.Faithful ((F.map r).l ≫ (F.map d).l) := by - have : Functor.Faithful (𝟙 ((F.comp Adj.forget₁).obj X)) := - inferInstanceAs <| (Functor.id _).Faithful - exact Functor.Faithful.of_iso - (((F.comp Adj.forget₁).mapId _).symm ≪≫ (F.comp Adj.forget₁).mapComp' r d (𝟙 _) hrd) - apply ((F.map r).l ≫ (F.map d).l).map_injective - simp only [Cat.comp_obj, Cat.id_obj, Cat.comp_map, Functor.map_comp, Functor.map_id] - rw [← cancel_mono - (((F.comp Adj.forget₁).mapComp' r d (𝟙 X) hrd).inv.app _ ≫ - ((F.comp Adj.forget₁).mapComp' b d (𝟙 X) hbd).hom.app _)] - simp only [Cat.id_obj, comp_toPrelaxFunctor, PrelaxFunctor.comp_toPrelaxFunctorStruct, - PrelaxFunctorStruct.comp_toPrefunctor, Prefunctor.comp_obj, Adj.forget₁_obj, - Prefunctor.comp_map, Adj.forget₁_map, Cat.comp_obj, Functor.map_comp, Category.assoc] at H - simp [H] - -end - -section - -variable {S X₁ X₂ X₃ : B} {f₁ : S ⟶ X₁} {f₂ : S ⟶ X₂} {f₃ : S ⟶ X₃} - {P₁₂ P₂₃ P₁₃ P₁₂₃ : B} {p₁ : X₁ ⟶ P₁₂₃} {p₂ : X₂ ⟶ P₁₂₃} {p₃ : X₃ ⟶ P₁₂₃} - {u₁₂ : X₁ ⟶ P₁₂} {u₂₁ : X₂ ⟶ P₁₂} {u₂₃ : X₂ ⟶ P₂₃} {u₃₂ : X₃ ⟶ P₂₃} - {u₁₃ : X₁ ⟶ P₁₃} {u₃₁ : X₃ ⟶ P₁₃} - {p₁₂ : P₁₂ ⟶ P₁₂₃} {p₂₃ : P₂₃ ⟶ P₁₂₃} {p₁₃ : P₁₃ ⟶ P₁₂₃} - (sq₁₂ : CommSq f₁ f₂ u₁₂ u₂₁) - (sq₂₃ : CommSq f₂ f₃ u₂₃ u₃₂) - (sq₁₃ : CommSq f₁ f₃ u₁₃ u₃₁) - (h₁₃₁₂ : CommSq u₁₃ u₁₂ p₁₃ p₁₂) - (h₂₁₂₃ : CommSq u₂₁ u₂₃ p₁₂ p₂₃) - (h₃₂₃₁ : CommSq u₃₂ u₃₁ p₂₃ p₁₃) - -@[reassoc] -lemma map_coalgHom_comp_map_coalgHom {A₁ : (F.obj X₁).obj} {A₂ : (F.obj X₂).obj} - {A₃ : (F.obj X₃).obj} - (a₁₂ : A₁ ⟶ (F.map f₁).l.obj ((F.map f₂).r.obj A₂)) - (a₂₃ : A₂ ⟶ (F.map f₂).l.obj ((F.map f₃).r.obj A₃)) : - (F.map p₁₂).l.map (F.coalgHom sq₁₂ a₁₂) ≫ - ((F.comp Adj.forget₁).isoMapOfCommSq h₂₁₂₃).hom.app _ ≫ - (F.map p₂₃).l.map (F.coalgHom sq₂₃ a₂₃) = - (F.map p₁₂).l.map ((F.map u₁₂).l.map a₁₂) ≫ - (F.map p₁₂).l.map ((F.map u₁₂).l.map ((F.map f₁).l.map ((F.map f₂).r.map a₂₃))) ≫ - (F.map p₁₂).l.map ((F.whiskerBaseChange sq₁₂).app _) ≫ - ((F.comp Adj.forget₁).isoMapOfCommSq h₂₁₂₃).hom.app _ ≫ - (F.map p₂₃).l.map ((F.whiskerBaseChange sq₂₃).app _) := by - dsimp [coalgHom] - simp only [Functor.map_comp, Category.assoc] - congr 1 - rw [← (F.map p₁₂).l.map_comp_assoc, ← Cat.comp_map _ (F.map u₁₂).l] - rw [← Cat.comp_map (F.map f₂).r, (F.whiskerBaseChange sq₁₂).naturality] - simp only [Cat.comp_obj, Functor.map_comp, Category.assoc] - congr 1 - rw [← Cat.comp_map _ (F.map p₁₂).l] - -- defeq abuse of `(F.map p₁₂).f` and `(F.comp Adj.forget₁).map p₁₂` - erw [((F.comp Adj.forget₁).isoMapOfCommSq h₂₁₂₃).hom.naturality_assoc] - simp - -include sq₁₂ sq₂₃ h₁₃₁₂ h₂₁₂₃ h₃₂₃₁ in -lemma coalgHom_eq_coalgHom_coalgHom' {A₁ : (F.obj X₁).obj} {A₃ : (F.obj X₃).obj} - (a₁₃ : A₁ ⟶ (F.map f₁).l.obj ((F.map f₃).r.obj A₃)) : - (F.map p₁₃).l.map (F.coalgHom sq₁₃ a₁₃) = - (F.map p₁₃).l.map ((F.map u₁₃).l.map a₁₃) ≫ - (F.map p₁₃).l.map ((F.map u₁₃).l.map ((F.map f₁).l.map ((F.map f₂).adj.unit.app _))) ≫ - ((F.comp Adj.forget₁).isoMapOfCommSq h₁₃₁₂).hom.app _ ≫ - (F.map p₁₂).l.map ((F.whiskerBaseChange sq₁₂).app _) ≫ - ((F.comp Adj.forget₁).isoMapOfCommSq h₂₁₂₃).hom.app _ ≫ - (F.map p₂₃).l.map ((F.whiskerBaseChange sq₂₃).app A₃) ≫ - ((F.comp Adj.forget₁).isoMapOfCommSq h₃₂₃₁).hom.app A₃ := by - dsimp [coalgHom] - simp only [Functor.map_comp] - have := congr($(F.whiskerRight_whiskerBaseChange_triple sq₁₂ sq₂₃ sq₁₃ h₁₃₁₂ h₂₁₂₃ h₃₂₃₁).app A₃) - dsimp at this - simp only [Cat.associator_inv_app, Cat.comp_obj, eqToHom_refl, Functor.map_id, - Cat.leftUnitor_inv_app, Cat.id_obj, Cat.associator_hom_app, Category.id_comp] at this - rw [this] - -variable {A₁ : (F.obj X₁).obj} {A₂ : (F.obj X₂).obj} - {A₃ : (F.obj X₃).obj} - (a₁₃ : A₁ ⟶ (F.map f₁).l.obj ((F.map f₃).r.obj A₃)) - (a₁₂ : A₁ ⟶ (F.map f₁).l.obj ((F.map f₂).r.obj A₂)) - (a₂₃ : A₂ ⟶ (F.map f₂).l.obj ((F.map f₃).r.obj A₃)) - -lemma coalgHom_eq_coalgHom_coalgHom - (H : a₁₂ ≫ (F.map f₁).l.map ((F.map f₂).r.map a₂₃) = - a₁₃ ≫ (F.map f₁).l.map ((F.map f₂).adj.unit.app _)) : - (F.map p₁₃).l.map (F.coalgHom sq₁₃ a₁₃) = - ((F.comp Adj.forget₁).isoMapOfCommSq h₁₃₁₂).hom.app _ ≫ - (F.map p₁₂).l.map (F.coalgHom sq₁₂ a₁₂) ≫ - ((F.comp Adj.forget₁).isoMapOfCommSq h₂₁₂₃).hom.app _ ≫ - (F.map p₂₃).l.map (F.coalgHom sq₂₃ a₂₃) ≫ - ((F.comp Adj.forget₁).isoMapOfCommSq h₃₂₃₁).hom.app _ := by - rw [F.coalgHom_eq_coalgHom_coalgHom' sq₁₂ sq₂₃ sq₁₃ h₁₃₁₂ h₂₁₂₃ h₃₂₃₁] - rw [map_coalgHom_comp_map_coalgHom_assoc] - rw [← (F.map p₁₃).l.map_comp_assoc, ← (F.map u₁₃).l.map_comp, ← H] - simp only [Cat.comp_obj, comp_toPrelaxFunctor, PrelaxFunctor.comp_toPrelaxFunctorStruct, - PrelaxFunctorStruct.comp_toPrefunctor, Prefunctor.comp_obj, Adj.forget₁_obj, - Prefunctor.comp_map, Adj.forget₁_map, Functor.map_comp, Category.assoc] - rw [← Cat.comp_map _ (F.map p₁₂).l] - erw [← ((F.comp Adj.forget₁).isoMapOfCommSq h₁₃₁₂).hom.naturality_assoc] - erw [← ((F.comp Adj.forget₁).isoMapOfCommSq h₁₃₁₂).hom.naturality_assoc] - simp - -lemma coalgHom_eq_coalgHom_coalgHom_iff : - a₁₂ ≫ (F.map f₁).l.map ((F.map f₂).r.map a₂₃) = - a₁₃ ≫ (F.map f₁).l.map ((F.map f₂).adj.unit.app _) ↔ - (F.map p₁₃).l.map (F.coalgHom sq₁₃ a₁₃) = - ((F.comp Adj.forget₁).isoMapOfCommSq h₁₃₁₂).hom.app _ ≫ - (F.map p₁₂).l.map (F.coalgHom sq₁₂ a₁₂) ≫ - ((F.comp Adj.forget₁).isoMapOfCommSq h₂₁₂₃).hom.app _ ≫ - (F.map p₂₃).l.map (F.coalgHom sq₂₃ a₂₃) ≫ - ((F.comp Adj.forget₁).isoMapOfCommSq h₃₂₃₁).hom.app _ := by - refine ⟨fun H ↦ F.coalgHom_eq_coalgHom_coalgHom _ _ _ _ _ _ _ _ _ H, fun H ↦ ?_⟩ - rw [F.coalgHom_eq_coalgHom_coalgHom' sq₁₂ sq₂₃ sq₁₃ h₁₃₁₂ h₂₁₂₃ h₃₂₃₁] at H - rw [map_coalgHom_comp_map_coalgHom_assoc] at H - simp_rw [← Category.assoc] at H - rw [cancel_mono] at H - simp_rw [Category.assoc] at H - dsimp at H - rw [← Cat.comp_map _ (F.map p₁₂).l] at H - erw [← ((F.comp Adj.forget₁).isoMapOfCommSq h₁₃₁₂).hom.naturality_assoc] at H - erw [← ((F.comp Adj.forget₁).isoMapOfCommSq h₁₃₁₂).hom.naturality_assoc] at H - dsimp at H - -- seems to need `(F.map u₁₃).l ≫ (F.map p₁₃).l` faithful and - -- `(F.whiskerBaseChange sq).app _` mono? - sorry - -end - -section Hom - -variable {M M' : (F.obj Y₁).obj} {N N' : (F.obj X₂).obj} - (a : M ⟶ (F.map t).l.obj ((F.map l).r.obj N)) - (a' : M' ⟶ (F.map t).l.obj ((F.map l).r.obj N')) - (u : M ⟶ M') (v : N ⟶ N') - -lemma map_comp_coalgHom_eq_coalgHom_map - (H : a ≫ (F.map t).l.map ((F.map l).r.map v) = u ≫ a') : - (((F.map r).l.map u ≫ F.coalgHom sq a' = F.coalgHom sq a ≫ (F.map b).l.map v)) := by - rw [coalgHom, ← (F.map r).l.map_comp_assoc, ← H, coalgHom] - simp [← (F.whiskerBaseChange sq).naturality] - -lemma iff_map_comp_coalgHom_eq_coalgHom_map [IsIso (F.baseChange sq)] : - a ≫ (F.map t).l.map ((F.map l).r.map v) = u ≫ a' ↔ - (((F.map r).l.map u ≫ F.coalgHom sq a' = F.coalgHom sq a ≫ (F.map b).l.map v)) := by - refine ⟨fun H ↦ F.map_comp_coalgHom_eq_coalgHom_map sq _ _ _ _ H, fun H ↦ ?_⟩ - rw [coalgHom, coalgHom, Category.assoc] at H - rw [← (F.whiskerBaseChange sq).naturality] at H - simp only [Cat.comp_obj, Cat.comp_map] at H - -- seems to need `(F.map r).l` faithful and `(F.whiskerBaseChange sq).app _` mono? - sorry - -end Hom - -end - end Pseudofunctor end CategoryTheory diff --git a/Mathlib/CategoryTheory/Sites/Descent/DescentDataDoublePrime.lean b/Mathlib/CategoryTheory/Sites/Descent/DescentDataDoublePrime.lean index 59bc0b09e1a154..dffe79ddd2c0ba 100644 --- a/Mathlib/CategoryTheory/Sites/Descent/DescentDataDoublePrime.lean +++ b/Mathlib/CategoryTheory/Sites/Descent/DescentDataDoublePrime.lean @@ -4,7 +4,6 @@ Released under Apache 2.0 license as described in the file LICENSE. Authors: Joël Riou, Christian Merten -/ import Mathlib.CategoryTheory.Sites.Descent.DescentDataPrime ---import Mathlib.CategoryTheory.Sites.Descent.DescentDataAsCoalgebra import Mathlib.CategoryTheory.Sites.Descent.IsStack import Mathlib.CategoryTheory.Bicategory.Adjunction.Adj import Mathlib.CategoryTheory.Bicategory.Adjunction.BaseChange From 9baf35831f5d67bc025883a8bdd7878a44b54922 Mon Sep 17 00:00:00 2001 From: Christian Merten Date: Sat, 7 Jun 2025 17:03:06 +0200 Subject: [PATCH 116/118] close more sorries --- .../Bicategory/Adjunction/Adj.lean | 9 ++ .../Bicategory/Adjunction/BaseChange.lean | 147 +++++++++++++----- 2 files changed, 121 insertions(+), 35 deletions(-) diff --git a/Mathlib/CategoryTheory/Bicategory/Adjunction/Adj.lean b/Mathlib/CategoryTheory/Bicategory/Adjunction/Adj.lean index 132dc0e74cbbd3..d9924221c3fb50 100644 --- a/Mathlib/CategoryTheory/Bicategory/Adjunction/Adj.lean +++ b/Mathlib/CategoryTheory/Bicategory/Adjunction/Adj.lean @@ -353,6 +353,15 @@ instance : Bicategory (Adj B) where @[simp] lemma whiskerLeft_τr' (α : a ⟶ b) {β β' : b ⟶ c} (y : β ⟶ β') : (α ◁ y).τr = y.τr ▷ α.r := rfl +@[simp] lemma leftUnitor_hom_τl' (α : a ⟶ b) : (λ_ α).hom.τl = (λ_ _).hom := rfl +@[simp] lemma leftUnitor_hom_τr' (α : a ⟶ b) : (λ_ α).hom.τr = (ρ_ _).inv := rfl +@[simp] lemma rightUnitor_hom_τl' (α : a ⟶ b) : (ρ_ α).hom.τl = (ρ_ _).hom := rfl +@[simp] lemma rightUnitor_hom_τr' (α : a ⟶ b) : (ρ_ α).hom.τr = (λ_ _).inv := rfl +@[simp] lemma leftUnitor_inv_τl' (α : a ⟶ b) : (λ_ α).inv.τl = (λ_ _).inv := rfl +@[simp] lemma leftUnitor_inv_τr' (α : a ⟶ b) : (λ_ α).inv.τr = (ρ_ _).hom := rfl +@[simp] lemma rightUnitor_inv_τl' (α : a ⟶ b) : (ρ_ α).inv.τl = (ρ_ _).inv := rfl +@[simp] lemma rightUnitor_inv_τr' (α : a ⟶ b) : (ρ_ α).inv.τr = (λ_ _).hom := rfl + /-- The forget pseudofunctor from `Adj B` to `B`. -/ @[simps obj map map₂ mapId mapComp] def forget₁ : Pseudofunctor (Adj B) B where diff --git a/Mathlib/CategoryTheory/Bicategory/Adjunction/BaseChange.lean b/Mathlib/CategoryTheory/Bicategory/Adjunction/BaseChange.lean index 27b21ea8ac33a1..5952cc8497bc2f 100644 --- a/Mathlib/CategoryTheory/Bicategory/Adjunction/BaseChange.lean +++ b/Mathlib/CategoryTheory/Bicategory/Adjunction/BaseChange.lean @@ -45,6 +45,12 @@ lemma Adjunction.whiskerRight_unit_associator_whiskerLeft_counit (adj₁ : Adjun rw [← adj₁.left_triangle] bicategory +@[reassoc (attr := simp)] +lemma Adjunction.whiskerLeft_unit_associator_whiskerRight_counit (adj₁ : Adjunction l₁ r₁) : + r₁ ◁ adj₁.unit ≫ (α_ _ _ _).inv ≫ adj₁.counit ▷ r₁ = (ρ_ _).hom ≫ (λ_ _).inv := by + rw [← adj₁.right_triangle] + bicategory + lemma mateEquiv_id (adj₁ : Adjunction l₁ r₁) (adj₂ : Adjunction l₂ r₂) : mateEquiv adj₁ adj₂ (𝟙 _) = adj₁.counit ≫ adj₂.unit := by simp only [mateEquiv_apply, @@ -66,6 +72,25 @@ lemma Adjunction.homEquiv₁_symm_comp {b c d : B} {l : b ⟶ c} adj.homEquiv₁.symm β ≫ l ◁ α := by simp [homEquiv₁_symm_apply] +lemma mateEquiv_whiskerRight_comp {c d e f : B} {g g' : c ⟶ e} {h : d ⟶ f} + {l₁ : c ⟶ d} {r₁ : d ⟶ c} {l₂ : e ⟶ f} {r₂ : f ⟶ e} (adj₁ : l₁ ⊣ r₁) + (adj₂ : l₂ ⊣ r₂) (α : g' ≫ l₂ ⟶ l₁ ≫ h) (β : g ⟶ g') : + mateEquiv adj₁ adj₂ (β ▷ l₂ ≫ α) = r₁ ◁ β ≫ mateEquiv adj₁ adj₂ α := + sorry + +lemma mateEquiv_comp_whiskerLeft {c d e f : B} {g : c ⟶ e} {h h' : d ⟶ f} + {l₁ : c ⟶ d} {r₁ : d ⟶ c} {l₂ : e ⟶ f} {r₂ : f ⟶ e} (adj₁ : l₁ ⊣ r₁) + (adj₂ : l₂ ⊣ r₂) (α : g ≫ l₂ ⟶ l₁ ≫ h) (β : h ⟶ h') : + mateEquiv adj₁ adj₂ (α ≫ l₁ ◁ β) = mateEquiv adj₁ adj₂ α ≫ β ▷ r₂ := + sorry + +lemma mateEquiv_of_iso {c d e f : Adj B} {g : c.obj ⟶ e.obj} {h : d.obj ⟶ f.obj} + {l₁ l₁' : c ⟶ d} {l₂ l₂' : e ⟶ f} + (e₁ : l₁ ≅ l₁') (e₂ : l₂ ≅ l₂') (α : g ≫ l₂.l ⟶ l₁.l ≫ h) : + mateEquiv l₁'.adj l₂'.adj (g ◁ e₂.inv.τl ≫ α ≫ e₁.hom.τl ▷ _) = + e₁.hom.τr ▷ g ≫ mateEquiv l₁.adj l₂.adj α ≫ h ◁ e₂.inv.τr := + sorry + @[reassoc] lemma whiskerLeft_whiskerLeft_associator_whiskerRight {x y z u v : B} (f : x ⟶ y) (g : y ⟶ z) (h : x ⟶ z) @@ -77,6 +102,18 @@ lemma whiskerLeft_whiskerLeft_associator_whiskerRight rw [← whisker_exchange] simp +@[simp] lemma Adj.associator_hom_τl' {a b c d : Adj B} (f : a ⟶ b) (g : b ⟶ c) (h : c ⟶ d) : + (α_ f g h).hom.τl = (α_ _ _ _).hom := rfl + +@[simp] lemma Adj.associator_hom_τr' {a b c d : Adj B} (f : a ⟶ b) (g : b ⟶ c) (h : c ⟶ d) : + (α_ f g h).hom.τr = (α_ _ _ _).hom := rfl + +@[simp] lemma Adj.associator_inv_τl' {a b c d : Adj B} (f : a ⟶ b) (g : b ⟶ c) (h : c ⟶ d) : + (α_ f g h).inv.τl = (α_ _ _ _).inv := rfl + +@[simp] lemma Adj.associator_inv_τr' {a b c d : Adj B} (f : a ⟶ b) (g : b ⟶ c) (h : c ⟶ d) : + (α_ f g h).inv.τr = (α_ _ _ _).inv := rfl + end Bicategory variable {C : Type*} [Category C] @@ -205,15 +242,27 @@ variable {X₁ X₂ Y₁ Y₂ Z₁ Z₂ : B} {t : X₁ ⟶ Y₁} {t' : Y₁ ⟶ (ht : t ≫ t' = t'') (hb : b ≫ b' = b'') lemma baseChange_horiz_comp' : - baseChange F (sq.horiz_comp' sq' ht hb) = - (F.map l).r ◁ ((F.comp Adj.forget₁).mapComp' t t' t'' ht).hom ≫ - (α_ _ _ _).inv ≫ - baseChange F sq ▷ (F.map t').l ≫ - (α_ _ _ _).hom ≫ - (F.map b).l ◁ baseChange F sq' ≫ - (α_ _ _ _).inv ≫ - ((F.comp Adj.forget₁).mapComp' b b' b'' hb).inv ▷ (F.map r).r := by - sorry + baseChange F (sq.horiz_comp' sq' ht hb) = + (F.map l).r ◁ (F.mapComp' t t' t'' ht).hom.τl ≫ + (α_ _ _ _).inv ≫ + baseChange F sq ▷ (F.map t').l ≫ + (α_ _ _ _).hom ≫ + (F.map b).l ◁ baseChange F sq' ≫ + (α_ _ _ _).inv ≫ + (F.mapComp' b b' b'' hb).inv.τl ▷ (F.map r).r := by + rw [baseChange, isoMapOfCommSq_horiz_comp F sq sq' ht hb] + dsimp + rw [baseChange, baseChange] + trans + (F.map l).r ◁ (F.mapComp' t t' t'' ht).hom.τl ≫ + Bicategory.mateEquiv (F.map l).adj (F.map r).adj + (leftAdjointSquare.vcomp (F.isoMapOfCommSq sq).hom.τl (F.isoMapOfCommSq sq').hom.τl) ≫ + ((F.mapComp' b b' b'' hb).inv.τl ▷ (F.map r).r) + · rw [mateEquiv_whiskerRight_comp] + simp_rw [← Category.assoc, mateEquiv_comp_whiskerLeft, Category.assoc] + rfl + · erw [Bicategory.mateEquiv_vcomp (F.map l).adj (F.map m).adj (F.map r).adj] + simp [rightAdjointSquare.vcomp] end Horizontal @@ -233,14 +282,26 @@ variable {X₁ X₂ X₃ Y₁ Y₂ Y₃ : B} lemma baseChange_vert_comp' : baseChange F (sq.vert_comp' sq' hl hr) = - Adj.forget₂.map₂ (F.mapComp' l l' l'').inv.op ▷ (F.map t).l ≫ - (α_ _ _ _).hom ≫ - (F.map l').r ◁ baseChange F sq ≫ - (α_ _ _ _).inv ≫ - baseChange F sq' ▷ (F.map r).r ≫ - (α_ _ _ _).hom ≫ - _ ◁ Adj.forget₂.map₂ (F.mapComp' r r' r'').hom.op := by - sorry + (F.mapComp' l l' l'').inv.τr ▷ (F.map t).l ≫ + (α_ _ _ _).hom ≫ + (F.map l').r ◁ baseChange F sq ≫ + (α_ _ _ _).inv ≫ + baseChange F sq' ▷ (F.map r).r ≫ + (α_ _ _ _).hom ≫ + _ ◁ (F.mapComp' r r' r'').hom.τr := by + rw [baseChange, isoMapOfCommSq_vert_comp F sq sq' hl hr] + dsimp + trans (F.mapComp' l l' l'' hl).inv.τr ▷ (F.map t).l ≫ + Bicategory.mateEquiv ((F.map l).adj.comp (F.map l').adj) ((F.map r).adj.comp (F.map r').adj) + (leftAdjointSquare.hcomp (F.isoMapOfCommSq sq).hom.τl + (F.isoMapOfCommSq sq').hom.τl) ≫ _ ◁ (F.mapComp' r r' r'' hr).hom.τr + · convert mateEquiv_of_iso (F.mapComp' l l' l'' hl).symm + (F.mapComp' r r' r'' hr).symm + (leftAdjointSquare.hcomp (F.isoMapOfCommSq sq).hom.τl (F.isoMapOfCommSq sq').hom.τl) using 1 + simp [leftAdjointSquare.hcomp] + · rw [Bicategory.mateEquiv_hcomp, rightAdjointSquare.hcomp] + simp_rw [Category.assoc] + rfl end Vertical @@ -331,24 +392,46 @@ lemma baseChange_id_left (b' : X₁ ⟶ Y₂) (hlb : l ≫ b = b') : (α_ _ _ _).hom ≫ _ ◁ F.baseChange sq ≫ (α_ _ _ _).inv ≫ - (F.mapComp' l b b' hlb).inv.τl ▷ _ := - sorry + (F.mapComp' l b b' hlb).inv.τl ▷ _ := by + let sql : CommSq (𝟙 X₁) (𝟙 X₁) l l := ⟨rfl⟩ + have ht : 𝟙 _ ≫ t = t := by simp + rw [F.baseChange_horiz_comp' sql sq ht hlb, baseChange_id_id_eq_unit, mapComp'_id_comp] + simp only [Adj.comp_l, Iso.trans_hom, Iso.symm_hom, whiskerRightIso_hom, Adj.comp_τl, Adj.id_l, + Adj.leftUnitor_inv_τl', Adj.whiskerRight_τl', Bicategory.whiskerLeft_comp, Adj.id_r, + comp_whiskerRight, whisker_assoc, Category.assoc, triangle_assoc_comp_right_assoc, + Iso.inv_hom_id_assoc] + nth_rw 2 [← Bicategory.whiskerLeft_comp_assoc] + simp [← Bicategory.comp_whiskerRight] lemma baseChange_id_comp : F.baseChange (t := 𝟙 Y₁) (l := r) (r := r ≫ d) (b := d) (by simp) = - (F.map r).r ◁ ((F.comp Adj.forget₁).mapId _).hom ≫ + (F.map r).r ◁ (F.mapId _).hom.τl ≫ (ρ_ _).hom ≫ (λ_ _).inv ≫ (F.map d).adj.unit ▷ _ ≫ (α_ _ _ _).hom ≫ - (F.map d).l ◁ (Adj.forget₂.map₂ (F.mapComp r d).hom.op) := - sorry + (F.map d).l ◁ (F.mapComp r d).hom.τr := by + let sqt : CommSq (𝟙 Y₁) (𝟙 Y₁) r r := ⟨rfl⟩ + let sqb : CommSq r r d d := ⟨rfl⟩ + have hl : 𝟙 _ ≫ r = r := by simp + rw [F.baseChange_vert_comp' sqt sqb hl rfl, baseChange_id_id_eq_unit, baseChange_self_self, + mapComp'_eq_mapComp, mapComp'_id_comp] + simp only [Adj.comp_r, Iso.trans_inv, whiskerRightIso_inv, Iso.symm_inv, Adj.comp_τr, Adj.id_r, + Adj.leftUnitor_hom_τr', Adj.whiskerRight_τr', comp_whiskerRight, whisker_assoc, + triangle_assoc_comp_right_inv_assoc, Adj.id_l, Bicategory.whiskerLeft_comp, + whiskerLeft_rightUnitor, Category.assoc, + Adjunction.whiskerLeft_unit_associator_whiskerRight_counit_assoc, Iso.inv_hom_id_assoc] + nth_rw 2 [← Bicategory.whiskerLeft_comp_assoc] + simp only [← whisker_exchange, id_whiskerLeft, + Category.assoc, Iso.inv_hom_id_assoc, Bicategory.whiskerLeft_comp, + whiskerLeft_rightUnitor_inv, Iso.hom_inv_id_assoc, whiskerLeft_inv_hom_assoc] + simp [← Bicategory.whiskerLeft_comp_assoc] lemma baseChange_of_comp_eq : F.baseChange (l := l) (t := t) (b := b') (r := r') ⟨by rw [← hrd, ← hbd, sq.w_assoc]⟩ = F.baseChange sq ≫ (F.map b).l ◁ ((λ_ _).inv ≫ (F.map d).adj.unit ▷ _) ≫ ((F.map b).l ◁ (α_ _ _ _).hom) ≫ (α_ _ _ _).inv ≫ - _ ◁ (Adj.forget₂.map₂ (F.mapComp' _ _ _ hrd).hom.op) ≫ - ((F.comp Adj.forget₁).mapComp' _ _ _ hbd).inv ▷ (F.map r').r := by + _ ◁ (F.mapComp' _ _ _ hrd).hom.τr ≫ + (F.mapComp' _ _ _ hbd).inv.τl ▷ (F.map r').r := by subst hbd hrd let sq'' : CommSq t l (r ≫ d) (b ≫ d) := ⟨by rw [sq.w_assoc]⟩ let sq' : CommSq (𝟙 _) r (r ≫ d) d := ⟨by simp⟩ @@ -369,17 +452,12 @@ lemma baseChange_of_comp_eq : rw [mapComp'_eq_mapComp, mapComp'_eq_mapComp] congr 6 simp only [Category.assoc] - have : (Adj.forget₁.mapId (F.obj Y₁)).hom = 𝟙 _ := rfl - rw [this] - simp only [Adj.forget₁_obj, Adj.forget₁_map, Adj.id_l, Bicategory.whiskerLeft_id, - Category.id_comp] rw [mapComp'_comp_id] + -- TODO: make this a `simp` lemma have : (Adj.forget₁.mapId (F.obj Y₁)).inv = 𝟙 _ := rfl - simp only [comp_toPrelaxFunctor, PrelaxFunctor.comp_toPrelaxFunctorStruct, - PrelaxFunctorStruct.comp_toPrefunctor, Prefunctor.comp_obj, Adj.forget₁_obj, - Prefunctor.comp_map, Adj.forget₁_map, comp_mapId, Adj.id_l, Iso.trans_symm, Iso.trans_hom, - Iso.symm_hom, whiskerLeftIso_hom, this, Functor.mapIso_inv, PrelaxFunctor.mapFunctor_map, - Category.id_comp, Bicategory.whiskerLeft_comp, whiskerLeft_rightUnitor_inv, Category.assoc] + simp only [Iso.trans_hom, Iso.symm_hom, whiskerLeftIso_hom, Adj.comp_τl, Adj.comp_l, Adj.id_l, + Adj.rightUnitor_inv_τl', Adj.whiskerLeft_τl', Bicategory.whiskerLeft_comp, + whiskerLeft_rightUnitor_inv, Category.assoc] rw [← comp_whiskerLeft_assoc, whisker_exchange_assoc, comp_whiskerLeft] simp only [Bicategory.whiskerRight_id, Category.assoc] simp [← Bicategory.whiskerLeft_comp_assoc, ← Bicategory.whiskerLeft_comp] @@ -547,8 +625,7 @@ lemma baseChange_triple' : simp only [Iso.inv_hom_id, Bicategory.whiskerLeft_id, Category.id_comp] nth_rw 1 [← Bicategory.whiskerLeft_comp (F.map f₃).r] rw [← Bicategory.comp_whiskerRight] - have : (λ_ (F.map f₃)).hom.τr = (ρ_ _).inv := rfl - simp [this] + simp rw [reassoc_of% this] -- TODO: improve this, intentionally ungolfed for now From a6625bc8f8c5dbdcadb7725d27d7dba9e3c0885a Mon Sep 17 00:00:00 2001 From: Christian Merten Date: Sat, 7 Jun 2025 23:05:44 +0200 Subject: [PATCH 117/118] clear last sorries --- .../Bicategory/Adjunction/BaseChange.lean | 129 +++++++++++++++--- 1 file changed, 112 insertions(+), 17 deletions(-) diff --git a/Mathlib/CategoryTheory/Bicategory/Adjunction/BaseChange.lean b/Mathlib/CategoryTheory/Bicategory/Adjunction/BaseChange.lean index 5952cc8497bc2f..5f43702bcdc8dc 100644 --- a/Mathlib/CategoryTheory/Bicategory/Adjunction/BaseChange.lean +++ b/Mathlib/CategoryTheory/Bicategory/Adjunction/BaseChange.lean @@ -34,6 +34,43 @@ namespace Bicategory variable {B : Type*} [Bicategory B] {c d e : B} {l₁ : c ⟶ d} {r₁ : d ⟶ c} {l₂ : d ⟶ e} {r₂ : e ⟶ d} +@[reassoc] +lemma whiskerLeft_whiskerLeft_associator_whiskerRight + {x y z v : B} (f : x ⟶ y) (g : y ⟶ z) (h : x ⟶ z) + (u' h' : z ⟶ v) + (α : f ≫ g ⟶ h) (β : u' ⟶ h') : + f ◁ g ◁ β ≫ (α_ _ _ _).inv ≫ α ▷ _ = + (α_ _ _ _).inv ≫ + α ▷ _ ≫ _ ◁ β := by + rw [← whisker_exchange] + simp + +@[reassoc] +lemma whiskerRight_associator_whiskerLeft_whiskerLeft + {x y z v : B} (f : x ⟶ y) (g : y ⟶ z) (h : x ⟶ z) + (u' h' : z ⟶ v) (α : h ⟶ f ≫ g) (β : u' ⟶ h') : + α ▷ u' ≫ (α_ f g u').hom ≫ f ◁ g ◁ β = + h ◁ β ≫ α ▷ _ ≫ (α_ _ _ _).hom := by + rw [whisker_exchange_assoc] + simp + +@[reassoc] +lemma whiskerLeft_associator_whiskerRight_whiskerRight + {x y z v : B} (f : v ⟶ y) (g : y ⟶ z) (h : v ⟶ z) + (u' h' : x ⟶ v) (α : h ⟶ f ≫ g) (β : u' ⟶ h') : + u' ◁ α ≫ (α_ _ _ _).inv ≫ β ▷ f ▷ g = + β ▷ h ≫ h' ◁ α ≫ (α_ _ _ _).inv := by + rw [← whisker_exchange_assoc] + simp + +@[reassoc] +lemma whiskerRight_whiskerRight_associator_whiskerLeft + {x y z v : B} (f : v ⟶ y) (g : y ⟶ z) (h : v ⟶ z) + (u' h' : x ⟶ v) (β : u' ⟶ h') (α : f ≫ g ⟶ h) : + β ▷ f ▷ g ≫ (α_ _ _ _).hom ≫ h' ◁ α = + (α_ _ _ _).hom ≫ u' ◁ α ≫ β ▷ h := by + simp [whisker_exchange] + @[reassoc (attr := simp)] lemma Adjunction.whiskerRight_unit_whiskerLeft_counit (adj₁ : Adjunction l₁ r₁) : adj₁.unit ▷ l₁ ⊗≫ l₁ ◁ adj₁.counit = (λ_ l₁).hom ≫ (ρ_ l₁).inv := @@ -72,35 +109,93 @@ lemma Adjunction.homEquiv₁_symm_comp {b c d : B} {l : b ⟶ c} adj.homEquiv₁.symm β ≫ l ◁ α := by simp [homEquiv₁_symm_apply] +lemma Adjunction.homEquiv₁_comp {b c d : B} {l : b ⟶ c} + {r : c ⟶ b} (adj : l ⊣ r) {g g' : b ⟶ d} {h : c ⟶ d} (β : g ⟶ l ≫ h) (α : g' ⟶ g) : + adj.homEquiv₁ (α ≫ β) = + r ◁ α ≫ adj.homEquiv₁ β := by + simp [homEquiv₁_apply] + +lemma Adjunction.homEquiv₁_symm_whiskerLeft_comp {b c d : B} {l : b ⟶ c} + {r : c ⟶ b} (adj : l ⊣ r) {g g' : b ⟶ d} {h : c ⟶ d} (β : g' ⟶ g) (α : r ≫ g ⟶ h) : + adj.homEquiv₁.symm (r ◁ β ≫ α) = + β ≫ adj.homEquiv₁.symm α := by + simp [homEquiv₁_symm_apply, whiskerRight_associator_whiskerLeft_whiskerLeft_assoc] + +lemma Adjunction.homEquiv₁_symm_whiskerRight_comp {b c e : B} {l : b ⟶ c} + {r : c ⟶ b} (adj : l ⊣ r) {h : b ⟶ e} {f : c ⟶ b} (α : r ≫ 𝟙 _ ⟶ f) : + adj.homEquiv₁.symm ((ρ_ _).inv ▷ h ≫ α ▷ h) = + (λ_ _).inv ≫ adj.homEquiv₁.symm α ▷ h ≫ (α_ _ _ _).hom := by + simp [homEquiv₁_symm_apply] + bicategory + +lemma Adjunction.homEquiv₂_comp {a b c : B} {l : b ⟶ c} {r : c ⟶ b} + (adj : l ⊣ r) {g : a ⟶ b} {h h' : a ⟶ c} (α : g ≫ l ⟶ h) (β : h ⟶ h') : + adj.homEquiv₂ (α ≫ β) = adj.homEquiv₂ α ≫ β ▷ r := by + simp [homEquiv₂_apply] + +lemma Adjunction.homEquiv₂_whiskerRight_comp {a b c : B} {l : b ⟶ c} {r : c ⟶ b} + (adj : l ⊣ r) {g g' : a ⟶ b} {h : a ⟶ c} (β : g' ⟶ g) (α : g ≫ l ⟶ h) : + adj.homEquiv₂ (β ▷ l ≫ α) = β ≫ adj.homEquiv₂ α := by + simp [homEquiv₂_apply, whiskerLeft_associator_whiskerRight_whiskerRight_assoc] + lemma mateEquiv_whiskerRight_comp {c d e f : B} {g g' : c ⟶ e} {h : d ⟶ f} {l₁ : c ⟶ d} {r₁ : d ⟶ c} {l₂ : e ⟶ f} {r₂ : f ⟶ e} (adj₁ : l₁ ⊣ r₁) (adj₂ : l₂ ⊣ r₂) (α : g' ≫ l₂ ⟶ l₁ ≫ h) (β : g ⟶ g') : - mateEquiv adj₁ adj₂ (β ▷ l₂ ≫ α) = r₁ ◁ β ≫ mateEquiv adj₁ adj₂ α := - sorry + mateEquiv adj₁ adj₂ (β ▷ l₂ ≫ α) = r₁ ◁ β ≫ mateEquiv adj₁ adj₂ α := by + rw [mateEquiv_eq_iff] + simp [mateEquiv_apply, Adjunction.homEquiv₂_whiskerRight_comp, + Adjunction.homEquiv₁_symm_whiskerLeft_comp] lemma mateEquiv_comp_whiskerLeft {c d e f : B} {g : c ⟶ e} {h h' : d ⟶ f} {l₁ : c ⟶ d} {r₁ : d ⟶ c} {l₂ : e ⟶ f} {r₂ : f ⟶ e} (adj₁ : l₁ ⊣ r₁) (adj₂ : l₂ ⊣ r₂) (α : g ≫ l₂ ⟶ l₁ ≫ h) (β : h ⟶ h') : - mateEquiv adj₁ adj₂ (α ≫ l₁ ◁ β) = mateEquiv adj₁ adj₂ α ≫ β ▷ r₂ := - sorry + mateEquiv adj₁ adj₂ (α ≫ l₁ ◁ β) = mateEquiv adj₁ adj₂ α ≫ β ▷ r₂ := by + rw [mateEquiv_eq_iff] + simp [Adjunction.homEquiv₁_symm_comp, mateEquiv_apply, Adjunction.homEquiv₂_comp] + +lemma Adj.homEquiv₁_of_iso {b c d : Adj B} {l l' : b ⟶ c} {g : b.obj ⟶ d.obj} + {h : c.obj ⟶ d.obj} (e : l ≅ l') (α : g ⟶ l.l ≫ h) : + l.adj.homEquiv₁ α = e.inv.τr ▷ g ≫ l'.adj.homEquiv₁ (α ≫ e.hom.τl ▷ h) := by + simp only [Adjunction.homEquiv₁_apply, whiskerLeft_comp, Category.assoc] + rw [← whisker_exchange_assoc] + congr 1 + simp only [whiskerRight_comp, Category.assoc, Iso.cancel_iso_inv_left] + rw [whiskerRight_whiskerRight_associator_whiskerLeft_assoc] + simp only [whiskerRight_comp, Category.assoc, Iso.hom_inv_id_assoc] + rw [← comp_whiskerRight_assoc, Adj.Hom₂.τr_whiskerRight_comp_counit] + simp only [comp_whiskerRight, whisker_assoc, Category.assoc, Iso.inv_hom_id_assoc] + simp [← whiskerLeft_comp_assoc, ← comp_whiskerRight] + +lemma Adj.homEquiv₁_symm_of_iso {b c d : Adj B} {l l' : b ⟶ c} {g : b.obj ⟶ d.obj} + {h : c.obj ⟶ d.obj} (e : l ≅ l') (α : l.r ≫ g ⟶ h) : + l.adj.homEquiv₁.symm α = l'.adj.homEquiv₁.symm (e.hom.τr ▷ g ≫ α) ≫ e.inv.τl ▷ _ := by + apply l.adj.homEquiv₁.injective + simp only [Equiv.apply_symm_apply] + rw [Adj.homEquiv₁_of_iso e] + simp [Adj.homEquiv₁_of_iso e, ← comp_whiskerRight, ← comp_whiskerRight_assoc] + +lemma Adj.homEquiv₂_of_iso {a b c : Adj B} {l l' : b ⟶ c} + {g : a.obj ⟶ b.obj} {h : a.obj ⟶ c.obj} (e : l ≅ l') + (α : g ≫ l.l ⟶ h) : + l.adj.homEquiv₂ α = l'.adj.homEquiv₂ (g ◁ e.inv.τl ≫ α) ≫ h ◁ e.hom.τr := by + simp only [Adjunction.homEquiv₂_apply, comp_whiskerRight, whisker_assoc, Category.assoc, + Iso.inv_hom_id_assoc, Iso.cancel_iso_inv_left] + rw [← whiskerLeft_comp_assoc, Hom₂.unit_comp_τl_whiskerRIght] + simp only [whiskerLeft_comp, Category.assoc] + simp [whiskerLeft_whiskerLeft_associator_whiskerRight_assoc, ← whiskerLeft_comp] lemma mateEquiv_of_iso {c d e f : Adj B} {g : c.obj ⟶ e.obj} {h : d.obj ⟶ f.obj} {l₁ l₁' : c ⟶ d} {l₂ l₂' : e ⟶ f} (e₁ : l₁ ≅ l₁') (e₂ : l₂ ≅ l₂') (α : g ≫ l₂.l ⟶ l₁.l ≫ h) : mateEquiv l₁'.adj l₂'.adj (g ◁ e₂.inv.τl ≫ α ≫ e₁.hom.τl ▷ _) = - e₁.hom.τr ▷ g ≫ mateEquiv l₁.adj l₂.adj α ≫ h ◁ e₂.inv.τr := - sorry - -@[reassoc] -lemma whiskerLeft_whiskerLeft_associator_whiskerRight - {x y z u v : B} (f : x ⟶ y) (g : y ⟶ z) (h : x ⟶ z) - (g' : z ⟶ u) (f' : u ⟶ v) (h' : z ⟶ v) - (α : f ≫ g ⟶ h) (β : g' ≫ f' ⟶ h') : - f ◁ g ◁ β ≫ (α_ _ _ _).inv ≫ α ▷ _ = - (α_ _ _ _).inv ≫ - α ▷ _ ≫ _ ◁ β := by - rw [← whisker_exchange] - simp + e₁.hom.τr ▷ g ≫ mateEquiv l₁.adj l₂.adj α ≫ h ◁ e₂.inv.τr := by + rw [mateEquiv_eq_iff, Adj.homEquiv₁_symm_of_iso e₁.symm, mateEquiv_apply] + simp only [Iso.symm_hom, ← comp_whiskerRight_assoc, Adj.inv_hom_id_τr, id_whiskerRight, + Category.id_comp, Adjunction.homEquiv₁_symm_comp, Equiv.symm_apply_apply, Category.assoc, + Iso.symm_inv, whiskerRight_comp] + rw [Adj.homEquiv₂_of_iso e₂.symm] + simp [Adj.homEquiv₂_of_iso e₂.symm, ← whiskerLeft_comp_assoc, Adjunction.homEquiv₂_comp, + whiskerRight_whiskerRight_associator_whiskerLeft_assoc] @[simp] lemma Adj.associator_hom_τl' {a b c d : Adj B} (f : a ⟶ b) (g : b ⟶ c) (h : c ⟶ d) : (α_ f g h).hom.τl = (α_ _ _ _).hom := rfl From 22d7d35bb6e82d0f454021f64fd2f7bc61db0738 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=ABl=20Riou?= Date: Sun, 8 Jun 2025 16:04:39 +0200 Subject: [PATCH 118/118] very little progress on IsStack --- Mathlib/CategoryTheory/Sites/Descent/IsStack.lean | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/Mathlib/CategoryTheory/Sites/Descent/IsStack.lean b/Mathlib/CategoryTheory/Sites/Descent/IsStack.lean index 7847144b2de2ee..45cf7a199fccbe 100644 --- a/Mathlib/CategoryTheory/Sites/Descent/IsStack.lean +++ b/Mathlib/CategoryTheory/Sites/Descent/IsStack.lean @@ -159,8 +159,13 @@ lemma hasEffectiveDescentRelativeTo_of_sieve_mem (J : GrothendieckTopology C) instance (J : GrothendieckTopology C) [F.IsStack J] : F.IsPrestack J where isSheaf {S} M N := by - rw [isSheaf_iff_isSheaf_of_type, Presieve.isSheaf_iff_isSheafFor_ofArrows] - intro ι X Y f hf + rw [isSheaf_iff_isSheaf_of_type] + intro X T hT + let T' : Sieve X.left := Sieve.overEquiv _ T + let f' (i : T'.arrows.category) := i.obj.hom + have : F.HasEffectiveDescentRelativeTo f' := + F.hasEffectiveDescentRelativeTo_of_sieve_mem J T' hT + have := (F.toDescentData_fullyFaithful_iff f').1 ⟨Functor.FullyFaithful.ofFullyFaithful _⟩ sorry end Pseudofunctor