|
| 1 | +import CategoryTheoryInContextLean.Section_1_1 |
| 2 | +import Mathlib.Tactic.TFAE |
| 3 | + |
| 4 | +namespace CategoryInContext |
| 5 | + |
| 6 | +variable {α : Type*} [C : Category α] |
| 7 | + |
| 8 | +-- definition 1.2.1 |
| 9 | +def Category.opp (C : Category α) : Category α where |
| 10 | + Hom := fun X Y => C.Hom Y X |
| 11 | + id := fun X => Category.id X |
| 12 | + comp := fun f g => C.comp g f |
| 13 | + id_comp := by simp [Category.comp_id] |
| 14 | + comp_id := by simp [Category.id_comp] |
| 15 | + assoc := by simp [← Category.assoc] |
| 16 | + |
| 17 | +-- exmaple 1.2.2.i |
| 18 | +def Category.MatR' (α : Type*) [Ring α] : Category ℕ where |
| 19 | + Hom := fun m n => Matrix (Fin m) (Fin n) α |
| 20 | + id := 1 |
| 21 | + comp := fun f g => f * g |
| 22 | + id_comp := by simp |
| 23 | + comp_id := by simp |
| 24 | + assoc := by sorry -- not sure why simp doesn't work here |
| 25 | + |
| 26 | +theorem Category.MatR_opp_eq_MatR' [Ring α] : (MatR α).opp = MatR' α := by sorry |
| 27 | + |
| 28 | +-- exmaple 1.2.2.ii |
| 29 | +noncomputable instance Category.Poset' (α : Type*) [PartialOrder α] : Category α where |
| 30 | + Hom X Y := PLift (Y ≤ X) -- some universe gymnastics to move between Prop and Type |
| 31 | + id X := ⟨le_refl X⟩ |
| 32 | + comp f g := ⟨le_trans g.down f.down⟩ |
| 33 | + id_comp _ := rfl |
| 34 | + comp_id _ := rfl |
| 35 | + assoc _ _ _ := rfl |
| 36 | + |
| 37 | +theorem Category.Poset_opp_eq_Poset' [PartialOrder α] : (Poset α).opp = Poset' α := by sorry |
| 38 | + |
| 39 | +-- todo add 1.2.2.iii |
| 40 | + |
| 41 | +-- lemma 1.2.3 |
| 42 | +lemma Category.iso_equiv {X Y : α} (f : Hom X Y) : |
| 43 | + [ IsIso f, |
| 44 | + ∀ c : α, Function.Bijective (fun g : Hom c X => Category.comp g f), |
| 45 | + ∀ c : α, Function.Bijective (fun g : Hom Y c => Category.comp f g) |
| 46 | + ].TFAE := by sorry |
| 47 | + |
| 48 | +-- definition 1.2.7 |
| 49 | +def Category.Mono {X Y : α} (f : Hom X Y) : Prop := |
| 50 | + ∀ {W} (h k : Hom W X), Category.comp h f = Category.comp k f → h = k |
| 51 | +def Category.Epi {X Y : α} (f : Hom X Y) : Prop := |
| 52 | + ∀ {Z} (h k : Hom Y Z), Category.comp f h = Category.comp f k → h = k |
| 53 | + |
| 54 | +lemma Category.mono_op_epi {X Y : α} (f : Hom X Y) : |
| 55 | + Category.Mono f ↔ @Category.Epi α (Category.opp C) Y X f := by |
| 56 | + sorry |
| 57 | + |
| 58 | +lemma Category.epi_op_mono {X Y : α} (f : Hom X Y) : |
| 59 | + Category.Epi f ↔ @Category.Mono α (Category.opp C) Y X f := by |
| 60 | + sorry |
| 61 | + |
| 62 | +-- todo: add support for custom notation: X → Y for Hom X Y and X ↣ Y for {f: Hom X Y // Epi f} |
| 63 | +-- and X ↠ Y for {f: Hom X Y // Mono f} |
| 64 | + |
| 65 | +theorem Category.Mono_injection {X Y : α} (f : Hom X Y) (hf : Category.Mono f) : |
| 66 | + ∀ c : α, Function.Injective (fun g : Hom c X => Category.comp g f) := by |
| 67 | + intros g1 g2 h |
| 68 | + apply hf |
| 69 | + |
| 70 | +theorem Category.Epi_surjection {X Y : α} (f : Hom X Y) (hf : Category.Epi f) : |
| 71 | + ∀ c : α, Function.Injective (fun g : Hom Y c => Category.comp f g) := by |
| 72 | + intros g1 g2 h |
| 73 | + apply hf |
| 74 | + |
| 75 | +-- example 1.2.8 |
| 76 | +example {X Y : Set α} (f : Category.Hom X Y) (hf : Category.Mono f) : |
| 77 | + Function.Injective f := by sorry |
| 78 | +example {X Y : Set α} (f : Category.Hom X Y) (hf : Category.Epi f) : |
| 79 | + Function.Surjective f := by sorry |
| 80 | + |
| 81 | +-- example 1.2.9 |
| 82 | +def Category.IsSection {X Y : α} (f : Hom Y X) (g : Hom X Y) := comp g f = id X |
| 83 | +def Category.IsRetraction {X Y : α} (f : Hom X Y) (g : Hom Y X) := comp f g = id X |
| 84 | +def Category.IsRetract (X Y : α) := ∃ (f : Hom X Y), ∃ (g : Hom Y X), comp f g = id X |
| 85 | + |
| 86 | +alias Category.IsRightInverse := Category.IsSection |
| 87 | +alias Category.IsLeftInverse := Category.IsRetraction |
| 88 | + |
| 89 | +theorem Category.section_mono {X Y : α} (f : Hom Y X) (g : Hom X Y) (h : Category.IsSection f g) : |
| 90 | + Category.Mono f := by sorry |
| 91 | + |
| 92 | +theorem Category.retraction_epi {X Y : α} (f : Hom X Y) (g : Hom Y X) |
| 93 | + (h : Category.IsRetraction f g) : Category.Epi f := by sorry |
| 94 | + |
| 95 | +def Category.split_epi {X Y : α} (f : Hom X Y) := ∃ (g : Hom Y X), Category.IsRetraction f g |
| 96 | +def Category.split_mono {X Y : α} (f : Hom Y X) := ∃ (g : Hom X Y), Category.IsSection f g |
| 97 | + |
| 98 | +-- example 1.2.10 |
| 99 | +theorem Category.iso_mono_epi {X Y : α} (f : Hom X Y) (hf : Category.IsIso f) : |
| 100 | + Category.Mono f ∧ Category.Epi f := by sorry |
| 101 | + |
| 102 | +example : ∃ α : Type*, ∃ C : Category α, ∃ X Y : α, ∃ f : C.Hom X Y, |
| 103 | + Category.Mono f ∧ Category.Epi f ∧ ¬Category.IsIso f := by sorry |
| 104 | + |
| 105 | +-- lemma 1.2.11 / exercise 1.2.iii |
| 106 | +lemma Category.comp_mono_of_mono_mono {X Y Z : α} (f : Hom X Y) (g : Hom Y Z) |
| 107 | + (hf : Category.Mono f) (hg : Category.Mono g) : Category.Mono (comp f g) := by sorry |
| 108 | +lemma Category.mono_of_comp_mono {X Y Z : α} (f : Hom X Y) (g : Hom Y Z) |
| 109 | + (hfg : Category.Mono (comp f g)) : Category.Mono f := by sorry |
| 110 | +-- use duality tp prove epi versions |
| 111 | +lemma Category.comp_epi_of_epi_epi {X Y Z : α} (f : Hom X Y) (g : Hom Y Z) |
| 112 | + (hf : Category.Epi f) (hg : Category.Epi g) : Category.Epi (comp f g) := by sorry |
| 113 | +lemma Category.epi_of_comp_epi {X Y Z : α} (f : Hom X Y) (g : Hom Y Z) |
| 114 | + (hfg : Category.Epi (comp f g)) : Category.Epi g := by sorry |
| 115 | + |
| 116 | +-- exercise 1.2.i |
| 117 | +def Category.slice_over' (c : α) : Category (Σ X : α, Hom X c) := |
| 118 | + opp (@Category.slice_under α (opp C) c) |
| 119 | +theorem Category.slice_over_equiv_slice_over' (c : α) : |
| 120 | + Category.slice_over c = Category.slice_over' c := by sorry |
| 121 | + |
| 122 | +-- exercise 1.2.ii.i |
| 123 | +theorem Category.split_epi_iff {X Y : α} (f : Hom X Y) : |
| 124 | + Category.split_epi f ↔ |
| 125 | + ∀ c : α, Function.Surjective (fun g : Hom Y c => Category.comp f g) := by sorry |
| 126 | + |
| 127 | +-- exercise 1.2.ii.ii |
| 128 | +theorem Category.split_mono_iff {X Y : α} (f : Hom X Y) : |
| 129 | + Category.split_mono f ↔ |
| 130 | + ∀ c : α, Function.Surjective (fun g : Hom c X => Category.comp g f) := by sorry |
| 131 | + |
| 132 | +-- final part of exercise 1.2.2 |
| 133 | +def Category.Subcategory.mono : Subcategory α where |
| 134 | + obj := fun X => True |
| 135 | + hom := fun f => Category.Mono f |
| 136 | + id_mem X := by sorry |
| 137 | + comp_mem hX hY hZ hf hg := by sorry |
| 138 | + |
| 139 | +def Category.Subcategory.epi : Subcategory α where |
| 140 | + obj := fun X => True |
| 141 | + hom := fun f => Category.Epi f |
| 142 | + id_mem X := by sorry |
| 143 | + comp_mem hX hY hZ hf hg := by sorry |
| 144 | + |
| 145 | +-- todo: exercise 1.2.iv, we are missing the category of fields in 1.1 first |
| 146 | +-- todo: exercise 1.2.v, need to define category of rings in 1.1 first |
| 147 | + |
| 148 | +-- exercise 1.2.vi |
| 149 | +theorem Category.iso_of_mono_and_split_epi {X Y : α} (f : Hom X Y) |
| 150 | + (hm : Category.Mono f) (he : Category.split_epi f) : Category.IsIso f := by sorry |
| 151 | + |
| 152 | +-- prove by duality |
| 153 | +theorem Category.iso_of_epi_and_split_mono {X Y : α} (f : Hom X Y) |
| 154 | + (he : Category.Epi f) (hm : Category.split_mono f) : Category.IsIso f := by sorry |
| 155 | + |
| 156 | +-- todo: exercise 1.2.vii |
| 157 | + |
| 158 | +end CategoryInContext |
0 commit comments