Skip to content

Instantly share code, notes, and snippets.

@gaxiiiiiiiiiiii
Created May 22, 2025 14:09
Show Gist options
  • Save gaxiiiiiiiiiiii/df8b288ce7f831ba3de95a4759286e18 to your computer and use it in GitHub Desktop.
Save gaxiiiiiiiiiiii/df8b288ce7f831ba3de95a4759286e18 to your computer and use it in GitHub Desktop.
import Mathlib.tactic
import Mathlib.CategoryTheory.Functor.Currying
import Mathlib.CategoryTheory.Comma.StructuredArrow.Basic
import Mathlib.CategoryTheory.Limits.Shapes.IsTerminal
open CategoryTheory
open Limits
/----------- /
/ 普遍射の定義 /
/ -----------/
def isUnivArrTo [Category C] [Category D] {S : D ⥤ C} {c : C} {r : D} (u : c ⟶ S.obj r) :=
IsInitial (StructuredArrow.mk u)
def isUnivArrTo.to' [Category C] [Category D] {S : D ⥤ C} {c : C} {r : D} {u : c ⟶ S.obj r}
(H : isUnivArrTo u) {r' : D} (u' : c ⟶ S.obj r') : r ⟶ r'
:= (H.to (StructuredArrow.mk u')).right
@[simp]
def isUnivArrTo.w' [Category C] [Category D] {S : D ⥤ C} {c : C} {r : D} {u : c ⟶ S.obj r}
(H : isUnivArrTo u) {r' : D} (u' : c ⟶ S.obj r') : u' = u ≫ S.map (H.to' u')
:= by
let E := (H.to (StructuredArrow.mk u')).w
simp at E
simp [isUnivArrTo.to']; rw [<- E]
def isUnivArrFrom [Category C] [Category D] {S : D ⥤ C} {c : C} {r : D} (u : S.obj r ⟶ c) :=
IsTerminal (CostructuredArrow.mk u)
def isUnivArrFrom.from' [Category C] [Category D] {S : D ⥤ C} {c : C} {r : D} {u : S.obj r ⟶ c}
(H : isUnivArrFrom u) {r' : D} (u' : S.obj r' ⟶ c) : r' ⟶ r
:= (H.from (CostructuredArrow.mk u')).left
@[simp]
def isUnivArrFrom.w' [Category C] [Category D] {S : D ⥤ C} {c : C} {r : D} {u : S.obj r ⟶ c}
(H : isUnivArrFrom u) {r' : D} (u' : S.obj r' ⟶ c) : S.map (H.from' u') ≫ u = u'
:= by
let E := (H.from (CostructuredArrow.mk u')).w
simp at E
simp [isUnivArrFrom.from']; rw [E]
/-------------------------------- /
/ 随伴の定義1 : a x の両者について自然 /
/ --------------------------------/
structure AdjNat [Category X] [Category A] (F : X ⥤ A) (G : A ⥤ X) where
-- A(F(x), -) ≅ X(x, G(-))
naturality1 (x : X) :
(curry.obj (F.op.prod (Functor.id A) ⋙ Functor.hom A)).obj (Opposite.op x) ≅
(curry.obj ((Functor.id Xᵒᵖ).prod G ⋙ Functor.hom X)).obj (Opposite.op x)
-- A(F(-), a) ≅ X(-, G(a))
naturality2 (a : A) :
(curry.obj ((F.op.prod (Functor.id A)) ⋙ Functor.hom A)).flip.obj a ≅
(curry.obj (((Functor.id Xᵒᵖ).prod G) ⋙ Functor.hom X)).flip.obj a
eq x a f :
(naturality1 x).hom.app a f = (naturality2 a).hom.app (Opposite.op x) f
def AdjNat.iso1 [Category X] [Category A] {F : X ⥤ A} {G : A ⥤ X} (σ : AdjNat F G) (x : X) (a : A) :
(F.obj x ⟶ a) ≅ (x ⟶ G.obj a)
:= {
hom := λ f => (σ.naturality1 x).hom.app a f
inv := λ g => (σ.naturality1 x).inv.app a g
hom_inv_id := by ext f; simp
inv_hom_id := by ext g; simp
}
def AdjNat.iso2 [Category X] [Category A] {F : X ⥤ A} {G : A ⥤ X} (σ : AdjNat F G) (x : X) (a : A) :
(F.obj x ⟶ a) ≅ (x ⟶ G.obj a)
:= {
hom := λ f => (σ.naturality2 a).hom.app (Opposite.op x) f
inv := λ g => (σ.naturality2 a).inv.app (Opposite.op x) g
hom_inv_id := by ext f; simp
inv_hom_id := by ext g; simp
}
lemma AdjNat.iso_eq [Category X] [Category A] {F : X ⥤ A} {G : A ⥤ X} (σ : AdjNat F G) (x : X) (a : A) :
AdjNat.iso1 σ x a = AdjNat.iso2 σ x a
:= by
ext f; simp [AdjNat.iso1, AdjNat.iso2]
exact σ.eq x a f
/------------------------------ /
/ 随伴の定義2 : 射による自然性の記述 /
/ ------------------------------/
structure AdjHom [Category X] [Category A] (F : X ⥤ A) (G : A ⥤ X) where
iso x a : (F.obj x ⟶ a) ≅ (x ⟶ G.obj a)
-- φ_{x a'}(f ≫ k) = φ_{x,a}(f) ≫ G(k)
naturality1 (x : X) (a a' : A) (f : F.obj x ⟶ a) (k : a ⟶ a') :
(iso x a').hom (f ≫ k) = (iso x a).hom f ≫ G.map k
-- φ_{x' a}(F(h) ≫ f) = h ≫ φ_{x,a}(f)
naturality2 (x x' : X) (a : A) (f : F.obj x ⟶ a) (h : x' ⟶ x) :
(iso x' a).hom (F.map h ≫ f) = h ≫ (iso x a).hom f
structure AdjInv [Category X] [Category A] (F : X ⥤ A) (G : A ⥤ X) where
iso x a : (F.obj x ⟶ a) ≅ (x ⟶ G.obj a)
-- φ⁻¹_{x', a}(g ≫ G(k)) = φ⁻¹_{x,a}(g) ≫ k
naturality1 (x : X) (a a' : A) (g : x ⟶ G.obj a) (k : a ⟶ a') :
(iso x a').inv (g ≫ G.map k) = (iso x a).inv g ≫ k
-- φ⁻¹_{x, a}(h ≫ g) = F(h) ≫ φ⁻¹_{x',a}(g)
naturality2 (x x' : X) (a : A) (h : x' ⟶ x) (g : x ⟶ G.obj a) :
(iso x' a).inv (h ≫ g) = F.map h ≫ (iso x a).inv g
/------------- /
/ 各定義の同値性 /
/ -------------/
def AdjHom.AdjInv [Category X] [Category A] {F : X ⥤ A} {G : A ⥤ X} (φ : AdjHom F G) :
AdjInv F G
:= {
iso := φ.iso
naturality1 := by
intro x a a' g k
have E := φ.naturality1 x a a' ((φ.iso x a).inv g) k
simp at E
rw [<- E]; simp
naturality2 := by
intro x x' a h g
have E := φ.naturality2 x x' a ((φ.iso x a).inv g) h
simp at E
rw [<- E]; simp
}
def AdjInv.AdjHom [Category X] [Category A] {F : X ⥤ A} {G : A ⥤ X} (φ : AdjInv F G) :
AdjHom F G
:= {
iso := φ.iso
naturality1 := by
intro x a a' f k
have E := φ.naturality1 x a a' ((φ.iso x a).hom f) k
simp at E
rw [<- E]; simp
naturality2 := by
intro x x' a f h
have E := φ.naturality2 x x' a h ((φ.iso x a).hom f)
simp at E
rw [<- E]; simp
}
def AdjNat.AdjHom [Category X] [Category A] {F : X ⥤ A} {G : A ⥤ X} (σ : AdjNat F G) :
AdjHom F G
:= {
iso := σ.iso1
naturality1 := by
intro x a a' f k
have E := (σ.naturality1 x).hom.naturality k
simp [Functor.hom] at E
have := congr_fun E f; simp at this
simp [AdjNat.iso1]
rw [this]
naturality2 := by
intro x x' a f h
have E := (σ.naturality2 a).hom.naturality h.op
simp [Functor.hom] at E
have := congr_fun E f; simp at this
rw [iso_eq, iso_eq]; simp [AdjNat.iso2]
rw [this]
}
def AdjHom.AdjNat [Category X] [Category A] {F : X ⥤ A} {G : A ⥤ X} (φ : AdjHom F G) :
AdjNat F G
:= {
naturality1 x := {
hom := {
app a := (φ.iso x a).hom
naturality := by
intro a a' k; simp [Functor.hom]
ext f; simp
exact φ.naturality1 x a a' f k
}
inv := {
app a := (φ.iso x a).inv
naturality := by
intro a a' k; simp [Functor.hom]
ext g; simp
have E := φ.naturality1 x a a' ((φ.iso x a).inv g) k
simp at E
rw [<- E]; simp
}
}
naturality2 a := {
hom := {
app x := (φ.iso x.unop a).hom
naturality := by
intro x x' k; simp [Functor.hom]
ext f; simp
exact φ.naturality2 x.unop x'.unop a f k.unop
}
inv := {
app x := (φ.iso x.unop a).inv
naturality := by
intro x x' k; simp [Functor.hom]
ext g; simp
have E := φ.naturality2 x.unop x'.unop a ((φ.iso _ _).inv g) k.unop
simp at E
rw [<- E]; simp
}
}
eq x a f := by simp
}
abbrev Adj [Category X] [Category A] (F : X ⥤ A) (G : A ⥤ X) := AdjHom F G
/---------------- /
/ 単位・余単位の定義 /
/ ----------------/
def Adj.unit [Category X] [Category A] {F : X ⥤ A} {G : A ⥤ X} (σ : Adj F G) :
(Functor.id X) ⟶ (F ⋙ G)
:= {
app x := (σ.iso x (F.obj x)).hom (𝟙 (F.obj x))
naturality x x' f := by
simp
have E := σ.naturality2 x' x (F.obj x') (𝟙 _) f
rw [<- E]; clear E; simp
have E := σ.naturality1 x (F.obj x) (F.obj x') (𝟙 _) (F.map f)
simp at E
rw [E]
}
def Adj.counit [Category X] [Category A] {F : X ⥤ A} {G : A ⥤ X} (σ : Adj F G) :
(G ⋙ F) ⟶ (Functor.id A)
:= {
app a := (σ.iso (G.obj a) a).inv (𝟙 (G.obj a))
naturality a a' f := by
simp
have E := σ.AdjInv.naturality1 (G.obj a) a a' (𝟙 _) f
simp [AdjHom.AdjInv] at E
have E' := σ.AdjInv.naturality2 (G.obj a') (G.obj a) a' (G.map f) (𝟙 _)
simp [AdjHom.AdjInv] at E'
rw [<- E', <- E]
}
lemma Adj.hom_eq_unit_map [Category X] [Category A] {F : X ⥤ A} {G : A ⥤ X} (σ : Adj F G) (x : X) (a : A) (f : F.obj x ⟶ a) :
-- σ(f) = μₓ ≫ G(f)
(σ.iso x a).hom f = σ.unit.app x ≫ G.map f
:= by
simp [Adj.unit]
have E := σ.naturality1 x (F.obj x) a (𝟙 _) f; simp at E
rw [E]
lemma Adj.inv_eq_map_counit [Category X] [Category A] {F : X ⥤ A} {G : A ⥤ X} (σ : Adj F G) (x : X) (a : A) (g : x ⟶ G.obj a) :
-- σ⁻¹(g) = F(g) ≫ εₐ
(σ.iso x a).inv g = F.map g ≫ σ.counit.app a
:= by
have E := σ.AdjInv.naturality2 (G.obj a) x a g (𝟙 _)
simp [AdjHom.AdjInv] at E
simp [Adj.counit]; rw [<- E]
lemma Adj.triangle1 [Category X] [Category A] {F : X ⥤ A} {G : A ⥤ X} (σ : Adj F G) :
-- G ⟶ G ⋙ F ≫ G ⟶ G
-- Gμ ≫ εG = 𝟙 G
whiskerLeft G σ.unit ≫ whiskerRight σ.counit G = 𝟙 G
:= by
ext a; simp
have E := (σ.hom_eq_unit_map (f := σ.counit.app a)); simp at E
rw [<- E]
simp [Adj.counit]
lemma Adj.triangle2 [Category X] [Category A] {F : X ⥤ A} {G : A ⥤ X} (σ : Adj F G) :
-- F ⟶ F ⋙ G ⋙ F ⟶ F
-- μF ≫ Fε = 𝟙 F
whiskerRight σ.unit F ≫ whiskerLeft F σ.counit = 𝟙 F
:= by
ext x; simp
have E := σ.inv_eq_map_counit (g := σ.unit.app x)
rw [<- E]
simp [Adj.unit]
/------------------ /
/ 単位・余単位の普遍性 /
/ -----------------/
def Adj.unit_isUnivArr [Category X] [Category A] {F : X ⥤ A} {G : A ⥤ X} (σ : Adj F G) (x : X) :
isUnivArrTo (S := G) (σ.unit.app x)
:= by
unfold isUnivArrTo
apply IsInitial.ofUniqueHom ?_ ?_
· intro Y; simp at Y
refine ⟨𝟙 _, (σ.iso x Y.right).inv Y.hom, ?_⟩
simp
rw [<- hom_eq_unit_map]; simp
· intro Y m
ext; simp
have E := m.w
simp at E
rw [E]; clear E
rw [<- hom_eq_unit_map]; simp
def Adj.counit_isUnivArr [Category X] [Category A] {F : X ⥤ A} {G : A ⥤ X} (σ : Adj F G) (a : A) :
isUnivArrFrom (S := F) (σ.counit.app a)
:= by
unfold isUnivArrFrom
apply IsTerminal.ofUniqueHom ?_ ?_
· intro Y
refine ⟨(σ.iso Y.left a).hom Y.hom, 𝟙 _, ?_⟩
simp
rw [<- inv_eq_map_counit]; simp
· intro Y m
ext; simp
have E := m.w
simp at E
conv at E => arg 1; arg 2; change σ.counit.app a
rw [<- E]; clear E
rw [<- inv_eq_map_counit]; simp
/------------------------ /
/ 単位/余単位による随伴の構成 /
/ ------------------------/
-- 普遍をなすunitによる構成
def Adj.mkby_NatUnivArrTo
[Category X] [Category A] {F : X ⥤ A} {G : A ⥤ X}
(μ : Functor.id X ⟶ F ⋙ G) (H : ∀ x, isUnivArrTo (S := G) (μ.app x)) :
Adj F G
:= {
iso x a := by
have Hx := H x
refine {
hom f := μ.app x ≫ G.map f
inv g := (Hx.to (StructuredArrow.mk g)).right
hom_inv_id := by
ext f; simp
set g := Hx.to (StructuredArrow.mk (μ.app x ≫ G.map f))
have E := Hx.hom_ext g ⟨𝟙 _, f, by simp⟩
rw [E]
inv_hom_id := by
ext g; simp
set f := (IsInitial.to Hx (StructuredArrow.mk g))
have Hf := f.w; simp at Hf
rw [<- Hf]
}
naturality1 x a a' f k := by simp
naturality2 x x' a f h := by
simp
have E := μ.naturality h; simp at E
rw [<- Category.assoc, <- E, Category.assoc]
}
-- 普遍射をなすcounitによる構成
def Adj.mkby_NatUnivArrFrom
[Category X] [Category A] {F : X ⥤ A} {G : A ⥤ X}
(ε : G ⋙ F ⟶ Functor.id A) (H : ∀ a, isUnivArrFrom (S := F) (ε.app a)) :
Adj F G
:= by
apply AdjInv.AdjHom
refine {
iso x a := {
hom f := ((H a).from (CostructuredArrow.mk f)).left
inv g := F.map g ≫ ε.app a
inv_hom_id := by
ext g; simp
set f := (H a).from (CostructuredArrow.mk (F.map g ≫ ε.app a))
have E := (H a).hom_ext f ⟨g, 𝟙 _, by simp⟩
rw [E]
hom_inv_id := by
ext f; simp
set g := (H a).from (CostructuredArrow.mk f)
have Hf := g.w; simp at Hf
rw [Hf]
}
naturality1 x a a' f k := by
simp
have E := ε.naturality k; simp at E
rw [E]
naturality2 x x' a f h := by
simp
}
-- triangleをなすunit/counitによる構成
-- Mathlibの随伴はこれ
def Adj.mkby_triangle
[Category X] [Category A] {F : X ⥤ A} {G : A ⥤ X}
(μ : Functor.id X ⟶ F ⋙ G) (ε : G ⋙ F ⟶ Functor.id A)
(H1 : whiskerLeft G μ ≫ whiskerRight ε G = 𝟙 G)
(H2 : whiskerRight μ F ≫ whiskerLeft F ε = 𝟙 F) :
Adj F G
:= {
iso x a := {
hom f := μ.app x ≫ G.map f
inv g := F.map g ≫ ε.app a
hom_inv_id := by
ext f; simp
have E := ε.naturality f; simp at E
rw [E, <- Category.assoc]; clear E
injection H2 with H2
have E := congr_fun H2 x; simp at E
rw [E]; simp
inv_hom_id := by
ext g; simp
have E := μ.naturality g; simp at E
rw [<- Category.assoc, <- E, Category.assoc]; clear E
injection H1 with H1
have E := congr_fun H1 a; simp at E
rw [E]; simp
}
naturality1 x a a' f k := by simp
naturality2 x x' a f h := by
simp
have E := μ.naturality h; simp at E
rw [<- Category.assoc, <- E, Category.assoc]
}
def Adj.mk_rightFunc
[Category X] [Category A] (G : A ⥤ X) {F₀ : X → A}
{μ : ∀ x : X, x ⟶ G.obj (F₀ x)} (Hμ : ∀ x, isUnivArrTo (S := G) (μ x)) :
X ⥤ A
:= {
obj x := F₀ x
map {x x'} f := ((Hμ x).to (StructuredArrow.mk (f ≫ μ x'))).right
map_id x := by rw [Category.id_comp]; simp
map_comp {x₁ x₂ x₃} f g := by
set fgμ := (StructuredArrow.mk ((f ≫ g) ≫ μ x₃))
set fμ := (StructuredArrow.mk (f ≫ μ x₂))
set gμ := (StructuredArrow.mk (g ≫ μ x₃))
set h₁ := ((Hμ x₁).to fμ)
set h₂ := ((Hμ x₂).to gμ)
set h := ((Hμ x₁).to fgμ)
have E₁ := h₁.w; simp [fμ] at E₁
have E₂ := h₂.w; simp [gμ] at E₂
rw [(Hμ x₁).hom_ext h]; swap
· refine ⟨𝟙 _, h₁.right ≫ h₂.right, ?_⟩
simp [fgμ]
rw [E₂, <- Category.assoc, E₁, Category.assoc]
· simp
}
def Adj.mk_leftFunc
[Category X] [Category A] (F : X ⥤ A) {G₀ : A → X}
{ε : ∀ a : A, F.obj (G₀ a) ⟶ a} (Hε : ∀ a, isUnivArrFrom (S := F) (ε a)) :
A ⥤ X
:= {
obj a := G₀ a
map {a a'} f := ((Hε a').from (CostructuredArrow.mk (ε a ≫ f))).left
map_id a := by rw [Category.comp_id]; simp
map_comp {a₁ a₂ a₃} f g := by
set fgε := (CostructuredArrow.mk (ε a₁ ≫ f ≫ g))
set fε := (CostructuredArrow.mk (ε a₁ ≫ f))
set gε := (CostructuredArrow.mk (ε a₂ ≫ g))
set h₁ := ((Hε a₂).from fε)
set h₂ := ((Hε a₃).from gε)
set h := ((Hε a₃).from fgε)
have E₁ := h₁.w; simp [fε] at E₁
have E₂ := h₂.w; simp [gε] at E₂
rw [(Hε a₃).hom_ext h]; swap
· refine ⟨h₁.left ≫ h₂.left, 𝟙 _, ?_⟩
simp [fgε]
rw [E₂, <- Category.assoc, E₁, Category.assoc]
· simp
}
-- TODO
-- def Adj.mkby_univArrTo
-- [Category X] [Category A] (G : A ⥤ X) {F₀ : X → A}
-- {μ : ∀ x : X, x ⟶ G.obj (F₀ x)} (Hμ : ∀ x, isUnivArrTo (S := G) (μ x)) :
-- Adj G (Adj.mk_rightFunc G Hμ)
-- := {
-- iso a x := {
-- hom f := by
-- simp [Adj.mk_rightFunc]
-- let Ff := (Adj.mk_rightFunc G Hμ).map f; simp [mk_rightFunc] at Ff
-- }
-- }
-- TODO
-- def Adj.mkby_UnivArrFrom
-- [Category X] [Category A] (F : X ⥤ A) {G₀ : A → X}
-- {ε : ∀ a : A, F.obj (G₀ a) ⟶ a} (Hε : ∀ a, isUnivArrFrom (S := F) (ε a)) :
-- Adj (Adj.mk_leftFunc F Hε) F
-- := sorry
-- TODO
-- lemma Adj.exists_leftFunc_iff_isUnivArrTo
-- [Category X] [Category A] (G : A ⥤ X) :
-- (∃ (F : X ⥤ A), Nonempty (Adj F G)) ↔
-- (∀ x : X, ∃ (a : A) (u : x ⟶ G.obj a), Nonempty (isUnivArrTo u))
-- := by
/------------- /
/ 左随伴の一意性 /
/ -------------/
def Adj.leftFunc_iso
[Category X] [Category A] {F₁ F₂ : X ⥤ A} {G : A ⥤ X}
(σ₁ : Adj F₁ G) (σ₂ : Adj F₂ G) :
F₁ ≅ F₂
:= {
hom := {
app x := (σ₁.unit_isUnivArr x).to' (σ₂.unit.app x)
naturality := by
intro x x' f
have Eg := (σ₁.unit_isUnivArr x).w' (σ₂.unit.app x)
have Eg' := (σ₁.unit_isUnivArr x').w' (σ₂.unit.app x')
set g := (σ₁.unit_isUnivArr x).to' (σ₂.unit.app x)
set g' := (σ₁.unit_isUnivArr x').to' (σ₂.unit.app x')
have E1 := σ₁.unit.naturality; simp at E1
have E2 := σ₁.counit.naturality; simp at E2
have E3 := σ₂.unit.naturality; simp at E3
have E4 := σ₂.counit.naturality; simp at E4
have Ht₁ := σ₁.triangle2; injection Ht₁ with Ht₁
have Ht₁x := congr_fun Ht₁ x; simp at Ht₁x; clear Ht₁
conv =>
arg 1
rw [<- Category.id_comp (F₁.map f), <- Ht₁x]; simp
rw [<- Category.assoc _ (F₁.map f), <- E2 (F₁.map f)]; simp
rw [<- E2 g']
rw [<- Category.assoc, <- Category.assoc, <- F₁.map_comp, <- E1 f]
rw [<- F₁.map_comp, Category.assoc f, <- Eg']; simp
conv =>
arg 2
rw [<- Category.id_comp g, <- Ht₁x]; simp
rw [<- Category.assoc _ g, <- E2 g]; simp
rw [<- Category.assoc (F₁.map (σ₁.unit.app x)), <- F₁.map_comp, <- Eg]; simp
rw [<- E2, <- Category.assoc, <- F₁.map_comp, <- E3]; simp
}
inv := {
app x := (σ₂.unit_isUnivArr x).to' (σ₁.unit.app x)
naturality x x' f := by
have Eg := (σ₂.unit_isUnivArr x).w' (σ₁.unit.app x)
have Eg' := (σ₂.unit_isUnivArr x').w' (σ₁.unit.app x')
set g := (σ₂.unit_isUnivArr x).to' (σ₁.unit.app x)
set g' := (σ₂.unit_isUnivArr x').to' (σ₁.unit.app x')
have E1 := σ₁.unit.naturality; simp at E1
have E2 := σ₁.counit.naturality; simp at E2
have E3 := σ₂.unit.naturality; simp at E3
have E4 := σ₂.counit.naturality; simp at E4
have Ht₁ := σ₂.triangle2; injection Ht₁ with Ht₁
have Ht₁x := congr_fun Ht₁ x; simp at Ht₁x; clear Ht₁
conv =>
arg 1
rw [<- Category.id_comp (F₂.map f), <- Ht₁x]; simp
rw [<- Category.assoc _ (F₂.map f), <- E4]; simp
rw [<- Category.assoc, <- F₂.map_comp, <- E3, <- E4, <- Category.assoc, <- F₂.map_comp]
rw [Category.assoc, <- Eg']; simp
conv =>
arg 2
rw [<- Category.id_comp g, <- Ht₁x]; simp
rw [<- Category.assoc _ g, <- E4]; simp
rw [<- Category.assoc (F₂.map (σ₂.unit.app x)), <- F₂.map_comp, <- Eg, <- E4]; simp
rw [<- Category.assoc, <- F₂.map_comp, <- E1]; simp
}
hom_inv_id := by
ext x; simp
have Eg := (σ₁.unit_isUnivArr x).w' (σ₂.unit.app x)
have Eg' := (σ₂.unit_isUnivArr x).w' (σ₁.unit.app x)
set g := (σ₁.unit_isUnivArr x).to' (σ₂.unit.app x)
set g' := (σ₂.unit_isUnivArr x).to' (σ₁.unit.app x)
have E := σ₁.triangle2; injection E with E
have Ex := congr_fun E x; simp at Ex; clear E
rw [<- Ex, Eg']; simp
have E1 := σ₁.counit.naturality; simp at E1
rw [E1 g', Eg]; simp
rw [<- Category.assoc (F₁.map (G.map g)), E1 g]; simp
rw [<- Category.assoc, Ex]; simp
inv_hom_id := by
ext x; simp
have E := (σ₂.unit_isUnivArr x).w' (σ₁.unit.app x)
have E' := (σ₁.unit_isUnivArr x).w' (σ₂.unit.app x)
set g := (σ₂.unit_isUnivArr x).to' (σ₁.unit.app x)
set g' := (σ₁.unit_isUnivArr x).to' (σ₂.unit.app x)
have E := σ₂.triangle2; injection E with E
have Ex := congr_fun E x; simp at Ex; clear E
rw [<- Ex, E']; simp
have E1 := σ₂.counit.naturality; simp at E1
rw [E1 g', E]; simp
rw [<- Category.assoc (F₂.map (G.map g)), E1 g]; simp
rw [<- Category.assoc, Ex]; simp
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment