Created
August 7, 2025 06:44
-
-
Save gaxiiiiiiiiiiii/222b1654ab40d2f19379046a1d73839a to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| import Mathlib | |
| import Mathlib.CategoryTheory.Category.Basic | |
| import Mathlib.CategoryTheory.Yoneda | |
| open CategoryTheory | |
| open Limits | |
| #check Functor.cones | |
| /- | |
| @[simps!] | |
| def cones : Cα΅α΅ β₯€ Type max uβ vβ := | |
| (const J).op β yoneda.obj F | |
| -/ | |
| #check cones | |
| /- | |
| @[simps!] | |
| def cones : (J β₯€ C) β₯€ Cα΅α΅ β₯€ Type max uβ vβ where | |
| obj := Functor.cones | |
| map f := whiskerLeft (const J).op (yoneda.map f) | |
| -/ | |
| abbrev cone [Category.{k, h} J] [Category.{u, v} π] (X : π) (D : J β₯€ π) | |
| := (Functor.const J).obj X βΆ D | |
| def mkCone [Category.{k, h} J] [Category.{u, v} π] (D : J β₯€ π) : | |
| πα΅α΅ β₯€ Type (max h u) | |
| := (cones _ _ ).obj D | |
| structure Limit [Category.{v', u'} J] [Category.{v, u} π] (D : J β₯€ π) where | |
| limit : π | |
| repr : (mkCone D).RepresentableBy limit | |
| class hasLimit [Category.{v', u'} J] [Category.{v, u} π] (D : J β₯€ π) where | |
| has_limit : Limit D | |
| class hasFiniteLimit [SmallCategory J] [FinCategory J] [Category π] (D : J β₯€ π) extends hasLimit D | |
| def Limit.homEquiv [Category J] [Category π] {D : J β₯€ π} (L : Limit D) : | |
| β {X}, (X βΆ L.limit) β cone X D | |
| := L.repr.homEquiv | |
| def Limit.homEquiv_comp [Category J] [Category π] {D : J β₯€ π} (L : Limit D) : | |
| β {X Y : π} (f : X βΆ Y) (g : Y βΆ L.limit), | |
| L.repr.homEquiv (f β« g) = (Functor.const J).map f β« L.repr.homEquiv g | |
| -- (L.homEquiv (f β« g)).app j = f β« (L.homEquiv g).app j | |
| := Ξ» _ _ => by rw [L.repr.homEquiv_comp ]; rfl | |
| def Limit.limitCone [Category J] [Category π] {D : J β₯€ π} (L : Limit D) : | |
| cone L.limit D := L.repr.homEquiv (π L.limit) | |
| def Limit.lift [Category J] [Category π] {D : J β₯€ π} (L : Limit D) {X : π} (c : cone X D) : | |
| X βΆ L.limit := L.repr.homEquiv.symm c | |
| lemma Limit.fac [Category J] [Category π] (D : J β₯€ π) (L : Limit D) : | |
| β {X : π} (c : cone X D) (j : J), L.lift c β« L.limitCone.app j = c.app j | |
| := by | |
| intro X c j | |
| have E := L.homEquiv_comp (L.lift c) (π _); simp at E | |
| conv at E => arg 1; simp [Limit.lift] | |
| conv => arg 2; rw [E]; simp | |
| simp [Limit.limitCone] | |
| lemma Limit.uniq [Category J] [Category π] {D : J β₯€ π} (L : Limit D) : | |
| β {X} (c : cone X D) (m : X βΆ L.limit) (_ : β j, m β« L.limitCone.app j = c.app j), m = L.lift c | |
| := by | |
| intro X c m Hm | |
| apply (L.homEquiv (X := X)).injective | |
| have E := L.repr.homEquiv.right_inv c | |
| change _ = L.repr.homEquiv.toFun (L.repr.homEquiv.invFun c) | |
| rw [E] | |
| apply NatTrans.ext; ext i | |
| rw [<- Hm i] | |
| have E := L.homEquiv_comp m (π _); simp at E | |
| have E' : (L.repr.homEquiv m).app i = ((Functor.const J).map m β« L.repr.homEquiv (π L.limit)).app i := by rw [E] | |
| change (L.repr.homEquiv m).app i = _ | |
| rw [E']; rfl | |
| section pullback | |
| inductive vertical where | |
| | left | right | cod | |
| -- abbrev hasPullback.Pair := Discrete hasPullback.Pair' | |
| inductive vertical.Hom : vertical β vertical β Type where | |
| | left : Hom .left .cod | |
| | right : Hom .right .cod | |
| | id p : Hom p p | |
| instance vertical.category : Category vertical where | |
| Hom := vertical.Hom | |
| id := vertical.Hom.id | |
| comp {p p' p''} f g := by | |
| rcases f<;> rcases g<;> try constructor | |
| id_comp {X Y} f := by rcases f<;> simp | |
| comp_id {X Y} f := by rcases f<;> simp | |
| assoc {X Y Z W} f g h := by | |
| rcases f<;> rcases g<;> rcases h<;> simp | |
| def hasPullback.functor [Category π] {X Y Z : π} (f : X βΆ Z) (g : Y βΆ Z) : | |
| vertical β₯€ π | |
| where | |
| obj p := match p with | |
| | .left => X | |
| | .right => Y | |
| | .cod => Z | |
| map {p p'} h := match h with | |
| | vertical.Hom.left => f | |
| | vertical.Hom.right => g | |
| | vertical.Hom.id p => match p with | |
| | .left => π X | |
| | .right => π Y | |
| | .cod => π Z | |
| map_id p := by rcases p<;> simp | |
| map_comp {pβ pβ pβ} f g := by | |
| rcases f<;> rcases g<;> try simp | |
| rcases pβ<;> simp | |
| class hasPullback [Category π] {X Y Z : π} (f : X βΆ Z) (g : Y βΆ Z) where | |
| has_pullback : hasLimit (hasPullback.functor f g) | |
| def hasPullback.pullback [Category π] {X Y Z : π} (f : X βΆ Z) (g : Y βΆ Z) [P : hasPullback f g] : | |
| π := P.has_pullback.has_limit.limit | |
| def hasPullback.fst [Category π] {X Y Z : π} (f : X βΆ Z) (g : Y βΆ Z) [P : hasPullback f g] : | |
| pullback f g βΆ X := P.has_pullback.has_limit.limitCone.app vertical.left | |
| def hasPullback.snd [Category π] {X Y Z : π} (f : X βΆ Z) (g : Y βΆ Z) [P : hasPullback f g] : | |
| pullback f g βΆ Y := P.has_pullback.has_limit.limitCone.app vertical.right | |
| lemma hasPullback.condition [Category π] {X Y Z : π} (f : X βΆ Z) (g : Y βΆ Z) [P : hasPullback f g] : | |
| fst f g β« f = snd f g β« g | |
| := by | |
| have H := P.has_pullback.has_limit.limitCone.naturality | |
| have H1 : _ = fst f g β« f := H (vertical.Hom.left); simp at H1 | |
| have H2 : _ = snd f g β« g := H (vertical.Hom.right); simp at H2 | |
| rw [<- H2, <- H1] | |
| def hasPullback.mkCone [Category π] {X Y Z W : π} {f : X βΆ Z} {g : Y βΆ Z} [P : hasPullback f g] (h : W βΆ pullback f g) : | |
| cone W (hasPullback.functor f g) := { | |
| app := Ξ» p => match p with | |
| | .left => h β« fst f g | |
| | .right => h β« snd f g | |
| | .cod => h β« fst f g β« f | |
| naturality {p p'} k := match k with | |
| | vertical.Hom.left => by simp [functor] | |
| | vertical.Hom.right => by simp [functor]; rw [condition f g] | |
| | vertical.Hom.id p => match p with | |
| | .left => by simp [functor] | |
| | .right => by simp [functor] | |
| | .cod => by simp [functor] | |
| } | |
| def hasPullback.lift [Category π] {X Y Z : π} {f : X βΆ Z} {g : Y βΆ Z} [P : hasPullback f g] {W : π} (h : W βΆ pullback f g) : | |
| W βΆ pullback f g := P.has_pullback.has_limit.lift (mkCone h) | |
| lemma hasPullback.lift_fst [Category π] {X Y Z : π} {f : X βΆ Z} {g : Y βΆ Z} [P : hasPullback f g] {W : π} (h : W βΆ pullback f g) : | |
| lift h β« fst f g = h β« fst f g := P.has_pullback.has_limit.fac (c := mkCone h) (j := vertical.left) | |
| lemma hasPullback.lift_snd [Category π] {X Y Z : π} {f : X βΆ Z} {g : Y βΆ Z} [P : hasPullback f g] {W : π} (h : W βΆ pullback f g) : | |
| lift h β« snd f g = h β« snd f g := P.has_pullback.has_limit.fac (c := mkCone h) (j := vertical.right) | |
| lemma hasPullback.uniq [Category π] {X Y Z : π} {f : X βΆ Z} {g : Y βΆ Z} [P : hasPullback f g] {W : π} (h : W βΆ pullback f g) | |
| (m : W βΆ pullback f g) (H1 : m β« fst f g = h β« fst f g) (H2 : m β« snd f g = h β« snd f g) : | |
| m = lift h | |
| := by | |
| apply P.has_pullback.has_limit.uniq (c := mkCone h) m | |
| intro j; rcases j<;> try simp [mkCone] | |
| Β· rw [<- H1]; rfl | |
| Β· rw [<- H2]; rfl | |
| Β· have E := P.has_pullback.has_limit.limitCone.naturality | |
| have E' : _ = fst f g β« f := E (vertical.Hom.left); simp at E' | |
| rw [E', <- Category.assoc, H1, Category.assoc] | |
| end pullback | |
| section product | |
| inductive Pair : Type where | left | right | |
| inductive Pair.Hom : Pair β Pair β Type u where | id p : Hom p p | |
| instance Pair.cateogry : Category.{0, 0} Pair where | |
| Hom := Hom | |
| id := Hom.id | |
| comp {p p' p''} f g := by | |
| cases f; cases g; exact Hom.id p | |
| id_comp f := by cases f; simp | |
| comp_id f := by cases f; simp | |
| assoc {pβ pβ pβ pβ} f g h := by | |
| cases f; cases g; cases h; simp | |
| def Pair.functor [Category.{v, u} π] (X Y : π) : | |
| Pair β₯€ π | |
| where | |
| obj p := match p with | |
| | Pair.left => X | |
| | Pair.right => Y | |
| map {p p'} f := by | |
| rcases f with β¨pβ© | |
| cases p<;> simp | |
| Β· exact π X | |
| Β· exact π Y | |
| map_id p := by | |
| cases p<;> simp [CategoryStruct.id] | |
| map_comp {pβ pβ pβ} f g := by | |
| rcases f with β¨pββ© | |
| rcases g with β¨pββ© | |
| simp [CategoryStruct.comp] | |
| rcases pβ<;> simp | |
| class hasProd [Category.{v, u} π] (X Y : π) where | |
| has_prod : hasLimit (Pair.functor X Y) | |
| def hasProd.prod [Category.{v, u} π] (X Y : π) [P : hasProd X Y] : | |
| π := P.has_prod.has_limit.limit | |
| def hasProd.fst [Category.{v, u} π] (X Y : π) [P : hasProd X Y] : | |
| prod X Y βΆ X := P.has_prod.has_limit.limitCone.app (Pair.left) | |
| def hasProd.snd [Category.{v, u} π] (X Y : π) [P : hasProd X Y] : | |
| prod X Y βΆ Y := P.has_prod.has_limit.limitCone.app (Pair.right) | |
| def hasProd.mkCone [Category.{v, u} π] {X Y : π} {Z : π} (f : Z βΆ X) (g : Z βΆ Y) : | |
| cone Z (Pair.functor X Y) := { | |
| app := Ξ» p => match p with | |
| | Pair.left => f | |
| | Pair.right => g | |
| naturality {p p'} f := by | |
| rcases f; simp | |
| rcases p<;> simp [Pair.functor] | |
| } | |
| def hasProd.lift [Category.{v, u} π] {X Y : π} [P : hasProd X Y] {Z : π} (f : Z βΆ X) (g : Z βΆ Y) : | |
| Z βΆ prod X Y := P.has_prod.has_limit.lift (mkCone f g) | |
| lemma hasProd.lift_fst [Category.{v, u} π] (X Y : π) [P : hasProd X Y] {Z : π} (f : Z βΆ X) (g : Z βΆ Y) : | |
| lift f g β« fst X Y = f := P.has_prod.has_limit.fac (c := mkCone f g) (j := Pair.left) | |
| lemma hasProd.lift_snd [Category.{v, u} π] (X Y : π) [P : hasProd X Y] {Z : π} (f : Z βΆ X) (g : Z βΆ Y) : | |
| lift f g β« snd X Y = g := P.has_prod.has_limit.fac (c := mkCone f g) (j := Pair.right) | |
| lemma hasProd.uniq [Category.{v, u} π] {X Y : π} [P : hasProd X Y] {Z : π} (f : Z βΆ X) (g : Z βΆ Y) | |
| (m : Z βΆ prod X Y) (Hf : m β« fst X Y = f) (Hg : m β« snd X Y = g) : | |
| m = lift f g | |
| := by | |
| apply P.has_prod.has_limit.uniq (c := mkCone f g) m | |
| intro j; rcases j<;> simp [mkCone]<;> assumption | |
| end product | |
| section equalizer | |
| inductive parallel where | dom | cod | |
| inductive parallel.Hom : parallel β parallel β Type | |
| | left : Hom dom cod | |
| | right : Hom dom cod | |
| | id p : Hom p p | |
| instance parallel.category : Category.{0, 0} parallel where | |
| Hom := parallel.Hom | |
| id := parallel.Hom.id | |
| comp {p p' p''} f g := by | |
| rcases f<;> rcases g | |
| Β· apply Hom.left | |
| Β· apply Hom.right | |
| Β· apply Hom.left | |
| Β· apply Hom.right | |
| Β· apply Hom.id | |
| id_comp {X Y} f := by rcases f<;> simp | |
| comp_id {X Y} f := by rcases f<;> simp | |
| assoc {X Y Z W} f g h := by | |
| rcases f<;> rcases g<;> rcases h<;> simp | |
| def parallel.functor [Category.{v, u} π] {X Y : π} (f g : X βΆ Y) : | |
| parallel β₯€ π | |
| where | |
| obj p := match p with | |
| | dom => X | |
| | cod => Y | |
| map {p p'} h := match h with | |
| | Hom.left => f | |
| | Hom.right => g | |
| | Hom.id p => match p with | |
| | dom => π X | |
| | cod => π Y | |
| map_id p := by rcases p<;> simp | |
| map_comp {pβ pβ pβ} f g := by | |
| rcases f<;> rcases g<;> simp | |
| rcases pβ<;> simp | |
| class hasEqualizer [Category.{v, u} π] {X Y : π} (f g : X βΆ Y) where | |
| has_equalizer : hasLimit (parallel.functor f g) | |
| def hasEqualizer.equalizer [Category.{v, u} π] {X Y : π} (f g : X βΆ Y) [P : hasEqualizer f g] : | |
| π := P.has_equalizer.has_limit.limit | |
| def hasEqualizer.mkCone [Category.{v, u} π] {X Y Z : π} {f g : X βΆ Y} (h : Z βΆ X) (H : h β« f = h β« g) : | |
| cone Z (parallel.functor f g) := { | |
| app := Ξ» p => match p with | |
| | parallel.dom => h | |
| | parallel.cod => h β« f | |
| naturality {p p'} h := by | |
| rcases h<;> simp [parallel.functor]; assumption | |
| rcases p<;> simp | |
| } | |
| def hasEqualizer.lift [Category.{v, u} π] {X Y : π} {f g : X βΆ Y} [P : hasEqualizer f g] {Z : π} (h : Z βΆ X) (H : h β« f = h β« g) : | |
| Z βΆ equalizer f g := P.has_equalizer.has_limit.lift (mkCone h H) | |
| def hasEqualizer.ΞΉ [Category.{v, u} π] {X Y : π} (f g : X βΆ Y) [P : hasEqualizer f g] : | |
| equalizer f g βΆ X := P.has_equalizer.has_limit.limitCone.app (parallel.dom) | |
| def hasEqualizer.ΞΉ' [Category.{v, u} π] {X Y : π} (f g : X βΆ Y) [P : hasEqualizer f g] : | |
| equalizer f g βΆ Y := P.has_equalizer.has_limit.limitCone.app (parallel.cod) | |
| lemma hasEqualizer.ΞΉ_comp1 [Category.{v, u} π] {X Y : π} (f g : X βΆ Y) [P : hasEqualizer f g] : | |
| ΞΉ' f g = ΞΉ f g β« f := by | |
| simp [ΞΉ'] | |
| have : _ = ΞΉ f g β« f:= P.has_equalizer.has_limit.limitCone.naturality parallel.Hom.left; simp at this | |
| rw [this] | |
| lemma hasEqualizer.ΞΉ_comp2 [Category.{v, u} π] {X Y : π} (f g : X βΆ Y) [P : hasEqualizer f g] : | |
| ΞΉ' f g = ΞΉ f g β« g := by | |
| simp [ΞΉ'] | |
| have : _ = ΞΉ f g β« g:= P.has_equalizer.has_limit.limitCone.naturality parallel.Hom.right; simp at this | |
| rw [this] | |
| lemma hasEqualizer.lift_ΞΉ [Category.{v, u} π] {X Y : π} (f g : X βΆ Y) [P : hasEqualizer f g] {Z : π} (h : Z βΆ X) (H : h β« f = h β« g) : | |
| lift h H β« ΞΉ f g = h := P.has_equalizer.has_limit.fac (c := mkCone h H) (j := parallel.dom) | |
| lemma hasEqualizer.ΞΉ_condition [Category.{v, u} π] {X Y : π} (f g : X βΆ Y) [P : hasEqualizer f g] : | |
| ΞΉ f g β« f = ΞΉ f g β« g | |
| := by | |
| have El : _ = ΞΉ f g β« f := P.has_equalizer.has_limit.limitCone.naturality parallel.Hom.left; simp at El | |
| have Er : _ = ΞΉ f g β« g := P.has_equalizer.has_limit.limitCone.naturality parallel.Hom.right; simp at Er | |
| rw [<- El, <- Er] | |
| lemma hasEqualizer.uniq [Category.{v, u} π] {X Y : π} (f g : X βΆ Y) [P : hasEqualizer f g] {Z : π} (h : Z βΆ X) (H : h β« f = h β« g) | |
| (m : Z βΆ equalizer f g) (Hm : m β« ΞΉ f g = h) : | |
| m = lift h H | |
| := by | |
| apply P.has_equalizer.has_limit.uniq (c := mkCone h H) m | |
| intro i; rcases i<;> simp [mkCone] | |
| Β· simp [ΞΉ] at Hm; rw [Hm] | |
| Β· have El : _ = ΞΉ f g β« f := P.has_equalizer.has_limit.limitCone.naturality parallel.Hom.left; simp at El | |
| rw [El, <- Category.assoc, Hm] | |
| end equalizer | |
| section terminal | |
| #check (Discrete PEmpty) | |
| #check Functor.empty | |
| example [Category π] : Discrete PEmpty β₯€ π | |
| where | |
| obj e := e.as.elim | |
| map {e e'} f := by | |
| rcases f with β¨β¨Eβ©β© | |
| rw [E] | |
| exact π (e'.as.elim ) | |
| map_id e := by simp | |
| map_comp {eβ eβ eβ} f g := by | |
| rcases f with β¨β¨Eββ©β© | |
| rcases g with β¨β¨Eββ©β© | |
| rcases eβ with β¨eββ©; rcases eβ with β¨eββ©; rcases eβ with β¨eββ© | |
| simp at *; simp at Eβ Eβ | |
| subst eβ eβ; simp | |
| structure hasTerminal (π) [Category π] where | |
| has_terminal : hasLimit (Functor.empty π) | |
| def hasTerminal.terminal [Category π] {P : hasTerminal π} : π := P.has_terminal.has_limit.limit | |
| def hasTerminal.mkCone [Category π] (X : π) : | |
| cone X (Functor.empty π) := { | |
| app := Ξ» e => by | |
| simp [Functor.empty] | |
| exact e.as.elim | |
| naturality {e e'} h := by | |
| simp [Functor.empty, Discrete.functor] | |
| rcases h with β¨Eβ© | |
| rcases E with β¨Eβ© | |
| simp | |
| apply eq_of_heq | |
| rw [(heq_comp_eqToHom_iff e.as.elim e'.as.elim)] | |
| rw [E] | |
| } | |
| def hasTerminal.from [Category π] (P : hasTerminal π) (X : π) : | |
| X βΆ P.terminal := P.has_terminal.has_limit.lift (mkCone X) | |
| lemma hasTerminal.uniq [Category π] {P : hasTerminal π} (X : π) (m : X βΆ P.terminal) : | |
| m = P.from X | |
| := by | |
| have := P.has_terminal.has_limit.uniq (c := mkCone X); simp at this | |
| rw [this m]; rfl | |
| end terminal |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment