468 lines
12 KiB
Text
468 lines
12 KiB
Text
universe u v w v₁ v₂ v₃ u₁ u₂ u₃
|
||
|
||
section Mathlib.Algebra.Group.ZeroOne
|
||
|
||
class One (α : Type u) where
|
||
one : α
|
||
|
||
instance (priority := 300) One.toOfNat1 {α} [One α] : OfNat α (nat_lit 1) where
|
||
ofNat := ‹One α›.1
|
||
|
||
end Mathlib.Algebra.Group.ZeroOne
|
||
|
||
section Mathlib.Algebra.Group.Defs
|
||
|
||
class HSMul (α : Type u) (β : Type v) (γ : outParam (Type w)) where
|
||
hSMul : α → β → γ
|
||
|
||
class SMul (M : Type u) (α : Type v) where
|
||
smul : M → α → α
|
||
|
||
infixr:73 " • " => SMul.smul
|
||
|
||
macro_rules | `($x • $y) => `(leftact% HSMul.hSMul $x $y)
|
||
|
||
instance instHSMul {α β} [SMul α β] : HSMul α β β where
|
||
hSMul := SMul.smul
|
||
|
||
class AddMonoid (M : Type u) extends Add M, Zero M where
|
||
protected add_assoc : ∀ a b c : M, a + b + c = a + (b + c)
|
||
protected zero_add : ∀ a : M, 0 + a = a
|
||
protected add_zero : ∀ a : M, a + 0 = a
|
||
|
||
section AddMonoid
|
||
variable {M : Type u} [AddMonoid M] {a b c : M}
|
||
|
||
theorem add_assoc : ∀ a b c : M, a + b + c = a + (b + c) :=
|
||
AddMonoid.add_assoc
|
||
|
||
theorem zero_add : ∀ a : M, 0 + a = a :=
|
||
AddMonoid.zero_add
|
||
|
||
theorem add_zero : ∀ a : M, a + 0 = a :=
|
||
AddMonoid.add_zero
|
||
|
||
theorem left_neg_eq_right_neg (hba : b + a = 0) (hac : a + c = 0) : b = c := by
|
||
rw [← zero_add c, ← hba, add_assoc, hac, add_zero b]
|
||
|
||
end AddMonoid
|
||
|
||
class AddGroup (A : Type u) extends AddMonoid A, Neg A where
|
||
protected neg_add_cancel : ∀ a : A, -a + a = 0
|
||
|
||
section Group
|
||
|
||
variable {G : Type u} [AddGroup G] {a b c : G}
|
||
|
||
theorem neg_add_cancel (a : G) : -a + a = 0 :=
|
||
AddGroup.neg_add_cancel a
|
||
|
||
theorem neg_eq_of_add (h : a + b = 0) : -a = b :=
|
||
left_neg_eq_right_neg (neg_add_cancel a) h
|
||
|
||
theorem add_neg_cancel (a : G) : a + -a = 0 := by
|
||
rw [← neg_add_cancel (-a), neg_eq_of_add (neg_add_cancel a)]
|
||
|
||
theorem add_neg_cancel_right (a b : G) : a + b + -b = a := by
|
||
rw [add_assoc, add_neg_cancel, add_zero]
|
||
|
||
theorem neg_neg (a : G) : - -a = a :=
|
||
neg_eq_of_add (neg_add_cancel a)
|
||
|
||
theorem neg_eq_of_add_eq_zero_left (h : a + b = 0) : -b = a := by
|
||
rw [← neg_eq_of_add h, neg_neg]
|
||
|
||
theorem eq_neg_of_add_eq_zero_left (h : a + b = 0) : a = -b :=
|
||
(neg_eq_of_add_eq_zero_left h).symm
|
||
|
||
theorem add_right_cancel (h : a + b = c + b) : a = c := by
|
||
rw [← add_neg_cancel_right a b, h, add_neg_cancel_right]
|
||
|
||
end Group
|
||
|
||
end Mathlib.Algebra.Group.Defs
|
||
|
||
section Mathlib.Algebra.Group.Hom.Defs
|
||
|
||
structure AddMonoidHom (M : Type u) (N : Type v) [AddMonoid M] [AddMonoid N] where
|
||
toFun : M → N
|
||
map_add' : ∀ x y, toFun (x + y) = toFun x + toFun y
|
||
|
||
infixr:25 " →+ " => AddMonoidHom
|
||
|
||
namespace AddMonoidHom
|
||
|
||
variable {M : Type u} {N : Type v}
|
||
|
||
instance [AddMonoid M] [AddMonoid N] : CoeFun (M →+ N) (fun _ => M → N) where
|
||
coe := toFun
|
||
|
||
section
|
||
|
||
variable [AddMonoid M] [AddGroup N]
|
||
|
||
def mk' (f : M → N) (map_add : ∀ a b : M, f (a + b) = f a + f b) : M →+ N where
|
||
toFun := f
|
||
map_add' := map_add
|
||
|
||
end
|
||
|
||
section
|
||
|
||
variable [AddGroup M] [AddGroup N]
|
||
|
||
theorem map_zero (f : M →+ N) : f 0 = 0 := by
|
||
have := calc f 0 + f 0
|
||
= f (0 + 0) := by rw [f.map_add']
|
||
_ = 0 + f 0 := by rw [zero_add, zero_add]
|
||
exact add_right_cancel this
|
||
|
||
theorem map_neg (f : M →+ N) (m : M) : f (-m) = - (f m) := by
|
||
apply eq_neg_of_add_eq_zero_left
|
||
rw [← f.map_add']
|
||
simp only [neg_add_cancel, f.map_zero]
|
||
|
||
end
|
||
|
||
end AddMonoidHom
|
||
|
||
end Mathlib.Algebra.Group.Hom.Defs
|
||
|
||
section Mathlib.Algebra.Group.Action.Defs
|
||
|
||
class MulOneClass (M : Type u) extends Mul M, One M where
|
||
|
||
class MulAction (α : Type u) (β : Type v) [MulOneClass α] extends SMul α β where
|
||
protected one_smul : ∀ b : β, (1 : α) • b = b
|
||
mul_smul : ∀ (x y : α) (b : β), (x * y) • b = x • y • b
|
||
|
||
end Mathlib.Algebra.Group.Action.Defs
|
||
|
||
section Mathlib.Algebra.GroupWithZero.Action.Defs
|
||
|
||
class DistribMulAction (M : Type u) (A : Type v) [MulOneClass M] [AddMonoid A] extends MulAction M A where
|
||
smul_zero : ∀ a : M, a • (0 : A) = 0
|
||
smul_add : ∀ (a : M) (x y : A), a • (x + y) = a • x + a • y
|
||
|
||
export DistribMulAction (smul_zero smul_add)
|
||
|
||
end Mathlib.Algebra.GroupWithZero.Action.Defs
|
||
|
||
section Mathlib.Algebra.Ring.Defs
|
||
|
||
class Semiring (α : Type u) extends AddMonoid α, MulOneClass α where
|
||
|
||
end Mathlib.Algebra.Ring.Defs
|
||
|
||
section Mathlib.Algebra.Module.Defs
|
||
|
||
class Module (R : Type u) (M : Type v) [Semiring R] [AddMonoid M] extends
|
||
DistribMulAction R M where
|
||
protected add_smul : ∀ (r s : R) (x : M), (r + s) • x = r • x + s • x
|
||
protected zero_smul : ∀ x : M, (0 : R) • x = 0
|
||
|
||
export Module (add_smul zero_smul)
|
||
|
||
end Mathlib.Algebra.Module.Defs
|
||
|
||
section Mathlib.Combinatorics.Quiver.Basic
|
||
|
||
class Quiver (V : Type u₁) where
|
||
Hom : V → V → Sort v₁
|
||
|
||
infixr:10 " ⟶ " => Quiver.Hom
|
||
|
||
structure Prefunctor (V : Type u₁) [Quiver.{v₁} V] (W : Type u₂) [Quiver.{v₂} W] where
|
||
obj : V → W
|
||
map : ∀ {X Y : V}, (X ⟶ Y) → (obj X ⟶ obj Y)
|
||
|
||
end Mathlib.Combinatorics.Quiver.Basic
|
||
|
||
section Mathlib.CategoryTheory.Category.Basic
|
||
|
||
namespace CategoryTheory
|
||
|
||
class CategoryStruct (obj : Type u₁) extends Quiver.{v₁ + 1} obj : Type max u₁ (v₁ + 1) where
|
||
id : ∀ X : obj, Hom X X
|
||
comp : ∀ {X Y Z : obj}, (X ⟶ Y) → (Y ⟶ Z) → (X ⟶ Z)
|
||
|
||
scoped notation "𝟙" => CategoryStruct.id -- type as \b1
|
||
scoped infixr:80 " ≫ " => CategoryStruct.comp -- type as \gg
|
||
|
||
class Category (obj : Type u₁) extends CategoryStruct.{v₁} obj : Type max u₁ (v₁ + 1) where
|
||
id_comp : ∀ {X Y : obj} (f : X ⟶ Y), 𝟙 X ≫ f = f
|
||
comp_id : ∀ {X Y : obj} (f : X ⟶ Y), f ≫ 𝟙 Y = f
|
||
assoc : ∀ {W X Y Z : obj} (f : W ⟶ X) (g : X ⟶ Y) (h : Y ⟶ Z), (f ≫ g) ≫ h = f ≫ g ≫ h
|
||
|
||
end CategoryTheory
|
||
|
||
end Mathlib.CategoryTheory.Category.Basic
|
||
|
||
section Mathlib.CategoryTheory.Functor.Basic
|
||
|
||
namespace CategoryTheory
|
||
|
||
structure Functor (C : Type u₁) [Category.{v₁} C] (D : Type u₂) [Category.{v₂} D]
|
||
extends Prefunctor C D : Type max v₁ v₂ u₁ u₂ where
|
||
|
||
infixr:26 " ⥤ " => Functor -- type as \func
|
||
|
||
end CategoryTheory
|
||
|
||
end Mathlib.CategoryTheory.Functor.Basic
|
||
|
||
section Mathlib.CategoryTheory.NatTrans
|
||
|
||
namespace CategoryTheory
|
||
|
||
variable {C : Type u₁} [Category.{v₁} C] {D : Type u₂} [Category.{v₂} D]
|
||
|
||
@[ext (iff := false)]
|
||
structure NatTrans (F G : C ⥤ D) : Type max u₁ v₂ where
|
||
app : ∀ X : C, F.obj X ⟶ G.obj X
|
||
naturality : ∀ ⦃X Y : C⦄ (f : X ⟶ Y), F.map f ≫ app Y = app X ≫ G.map f
|
||
|
||
theorem NatTrans.naturality_assoc {F G : C ⥤ D} (self : NatTrans F G) ⦃X Y : C⦄ (f : X ⟶ Y) {Z : D}
|
||
(h : G.obj Y ⟶ Z) : F.map f ≫ self.app Y ≫ h = self.app X ≫ G.map f ≫ h := by
|
||
rw [← Category.assoc, NatTrans.naturality, Category.assoc]
|
||
|
||
namespace NatTrans
|
||
|
||
protected def id (F : C ⥤ D) : NatTrans F F where
|
||
app X := 𝟙 (F.obj X)
|
||
naturality := by
|
||
intro X Y f
|
||
simp_all only [Category.comp_id, Category.id_comp]
|
||
|
||
open Category
|
||
|
||
variable {F G H : C ⥤ D}
|
||
|
||
def vcomp (α : NatTrans F G) (β : NatTrans G H) : NatTrans F H where
|
||
app X := α.app X ≫ β.app X
|
||
naturality := by
|
||
intro X Y f
|
||
simp_all only [naturality_assoc, naturality, assoc]
|
||
|
||
end NatTrans
|
||
|
||
end CategoryTheory
|
||
|
||
end Mathlib.CategoryTheory.NatTrans
|
||
|
||
section Mathlib.CategoryTheory.Functor.Category
|
||
|
||
namespace CategoryTheory
|
||
|
||
open NatTrans Category
|
||
|
||
variable {C : Type u₁} [Category.{v₁} C] {D : Type u₂} [Category.{v₂} D]
|
||
variable {F G : C ⥤ D}
|
||
|
||
instance Functor.category : Category.{max u₁ v₂} (C ⥤ D) where
|
||
Hom F G := NatTrans F G
|
||
id F := NatTrans.id F
|
||
comp α β := vcomp α β
|
||
id_comp := by
|
||
intro X Y f
|
||
simp_all only
|
||
ext x : 2
|
||
apply id_comp
|
||
comp_id := by
|
||
intro X Y f
|
||
simp_all only
|
||
ext x : 2
|
||
apply comp_id
|
||
assoc := by
|
||
intro W X Y Z f g h
|
||
simp_all only
|
||
ext x : 2
|
||
apply assoc
|
||
|
||
namespace NatTrans
|
||
|
||
@[ext (iff := false)]
|
||
theorem ext' {α β : F ⟶ G} (w : α.app = β.app) : α = β := NatTrans.ext w
|
||
|
||
end NatTrans
|
||
|
||
end CategoryTheory
|
||
|
||
end Mathlib.CategoryTheory.Functor.Category
|
||
|
||
section Mathlib.CategoryTheory.Preadditive.Basic
|
||
|
||
namespace CategoryTheory
|
||
|
||
variable (C : Type u) [Category.{v} C]
|
||
|
||
class Preadditive where
|
||
homGroup : ∀ P Q : C, AddGroup (P ⟶ Q) := by infer_instance
|
||
add_comp : ∀ (P Q R : C) (f f' : P ⟶ Q) (g : Q ⟶ R), (f + f') ≫ g = f ≫ g + f' ≫ g
|
||
comp_add : ∀ (P Q R : C) (f : P ⟶ Q) (g g' : Q ⟶ R), f ≫ (g + g') = f ≫ g + f ≫ g'
|
||
|
||
attribute [instance] Preadditive.homGroup
|
||
|
||
end CategoryTheory
|
||
|
||
namespace CategoryTheory
|
||
|
||
namespace Preadditive
|
||
|
||
open AddMonoidHom
|
||
|
||
variable {C : Type u₁} [Category.{v₁} C] [Preadditive C]
|
||
|
||
def leftComp {P Q : C} (R : C) (f : P ⟶ Q) : (Q ⟶ R) →+ (P ⟶ R) :=
|
||
mk' (fun g => f ≫ g) fun g g' => by simp only [comp_add]
|
||
|
||
def rightComp (P : C) {Q R : C} (g : Q ⟶ R) : (P ⟶ Q) →+ (P ⟶ R) :=
|
||
mk' (fun f => f ≫ g) fun f f' => by simp only [add_comp]
|
||
|
||
variable {P Q R : C} (f : P ⟶ Q) (g : Q ⟶ R)
|
||
|
||
theorem neg_comp : (-f) ≫ g = -f ≫ g :=
|
||
map_neg (rightComp P g) f
|
||
|
||
theorem comp_neg : f ≫ (-g) = -f ≫ g :=
|
||
map_neg (leftComp R f) g
|
||
|
||
theorem comp_zero : f ≫ (0 : Q ⟶ R) = 0 :=
|
||
show leftComp R f 0 = 0 from map_zero _
|
||
|
||
theorem zero_comp : (0 : P ⟶ Q) ≫ g = 0 :=
|
||
show rightComp P g 0 = 0 from map_zero _
|
||
|
||
end Preadditive
|
||
|
||
end CategoryTheory
|
||
|
||
end Mathlib.CategoryTheory.Preadditive.Basic
|
||
|
||
section Mathlib.CategoryTheory.Preadditive.Basic
|
||
|
||
namespace CategoryTheory
|
||
|
||
open Preadditive
|
||
|
||
variable {C : Type u₁} {D : Type u₂} [Category C] [Category D] [Preadditive D]
|
||
|
||
instance {F G : C ⥤ D} : Zero (F ⟶ G) where
|
||
zero :=
|
||
{ app := fun X => 0
|
||
naturality := by
|
||
intro X Y f
|
||
rw [Preadditive.comp_zero, Preadditive.zero_comp] }
|
||
|
||
instance {F G : C ⥤ D} : Add (F ⟶ G) where
|
||
add α β :=
|
||
{ app := fun X => α.app X + β.app X,
|
||
naturality := by
|
||
intro X Y f
|
||
simp_all only [comp_add, NatTrans.naturality, add_comp] }
|
||
|
||
instance {F G : C ⥤ D} : Neg (F ⟶ G) where
|
||
neg α :=
|
||
{ app := fun X => -α.app X,
|
||
naturality := by
|
||
intro X Y f
|
||
simp_all only [comp_neg, NatTrans.naturality, neg_comp] }
|
||
|
||
instance functorCategoryPreadditive : Preadditive (C ⥤ D) where
|
||
homGroup F G :=
|
||
{ add_assoc := by
|
||
intros
|
||
ext
|
||
apply add_assoc
|
||
zero_add := by
|
||
intros
|
||
ext
|
||
apply zero_add
|
||
add_zero := by
|
||
intros
|
||
ext
|
||
apply add_zero
|
||
neg_add_cancel := by
|
||
intros
|
||
dsimp only
|
||
ext
|
||
apply neg_add_cancel }
|
||
add_comp := by
|
||
intros
|
||
dsimp only [id_eq]
|
||
ext
|
||
apply add_comp
|
||
comp_add := by
|
||
intros
|
||
dsimp only [id_eq]
|
||
ext
|
||
apply comp_add
|
||
|
||
end CategoryTheory
|
||
|
||
end Mathlib.CategoryTheory.Preadditive.Basic
|
||
|
||
section Mathlib.CategoryTheory.Linear.Basic
|
||
|
||
namespace CategoryTheory
|
||
|
||
class Linear (R : Type w) [Semiring R] (C : Type u₁) [Category.{v₁} C] [Preadditive C] where
|
||
homModule : ∀ X Y : C, Module R (X ⟶ Y) := by infer_instance
|
||
smul_comp : ∀ (X Y Z : C) (r : R) (f : X ⟶ Y) (g : Y ⟶ Z), (r • f) ≫ g = r • f ≫ g
|
||
comp_smul : ∀ (X Y Z : C) (f : X ⟶ Y) (r : R) (g : Y ⟶ Z), f ≫ (r • g) = r • f ≫ g
|
||
|
||
attribute [instance] Linear.homModule
|
||
|
||
end CategoryTheory
|
||
|
||
end Mathlib.CategoryTheory.Linear.Basic
|
||
|
||
namespace CategoryTheory
|
||
|
||
variable {R : Type w} [Semiring R]
|
||
variable {C : Type u₁} {D : Type u₂} [Category C] [Category D] [Preadditive D] [Linear R D]
|
||
|
||
set_option maxHeartbeats 10000 in
|
||
instance functorCategoryLinear : Linear R (C ⥤ D) where
|
||
homModule F G :=
|
||
{
|
||
smul := fun r α ↦
|
||
{ app := fun X ↦ r • α.app X
|
||
naturality := by
|
||
intros
|
||
rw [Linear.comp_smul, Linear.smul_comp, α.naturality] }
|
||
one_smul := by
|
||
intros
|
||
ext
|
||
apply MulAction.one_smul
|
||
zero_smul := by
|
||
intros
|
||
ext
|
||
apply Module.zero_smul
|
||
smul_zero := by
|
||
intros
|
||
ext
|
||
apply DistribMulAction.smul_zero
|
||
add_smul := by
|
||
intros
|
||
ext
|
||
apply Module.add_smul
|
||
smul_add := by
|
||
intros
|
||
ext
|
||
apply DistribMulAction.smul_add
|
||
mul_smul := by
|
||
intros
|
||
ext
|
||
apply MulAction.mul_smul
|
||
}
|
||
smul_comp := by
|
||
intros
|
||
ext
|
||
apply Linear.smul_comp
|
||
comp_smul := by
|
||
intros
|
||
ext
|
||
apply Linear.comp_smul
|
||
|
||
end CategoryTheory
|