/- Copyright (c) 2015 Floris van Doorn. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: Floris van Doorn Basic group theory This file will be rewritten in the future, when we develop are more systematic notation for describing homomorphisms -/ import algebra.category.category algebra.hott open eq algebra pointed function is_trunc pi category equiv is_equiv set_option class.force_new true namespace group definition pointed_Group [instance] (G : Group) : pointed G := pointed.mk one definition pType_of_Group [reducible] (G : Group) : Type* := pointed.mk' G definition Set_of_Group (G : Group) : Set := trunctype.mk G _ definition Group_of_CommGroup [coercion] [constructor] (G : CommGroup) : Group := Group.mk G _ definition comm_group_Group_of_CommGroup [instance] [constructor] (G : CommGroup) : comm_group (Group_of_CommGroup G) := begin esimp, exact _ end definition group_pType_of_Group [instance] (G : Group) : group (pType_of_Group G) := Group.struct G /- group homomorphisms -/ definition is_homomorphism [class] [reducible] {G₁ G₂ : Type} [group G₁] [group G₂] (φ : G₁ → G₂) : Type := Π(g h : G₁), φ (g * h) = φ g * φ h section variables {G G₁ G₂ G₃ : Type} {g h : G₁} (ψ : G₂ → G₃) {φ₁ φ₂ : G₁ → G₂} (φ : G₁ → G₂) [group G] [group G₁] [group G₂] [group G₃] [is_homomorphism ψ] [is_homomorphism φ₁] [is_homomorphism φ₂] [is_homomorphism φ] definition respect_mul /- φ -/ : Π(g h : G₁), φ (g * h) = φ g * φ h := by assumption theorem respect_one /- φ -/ : φ 1 = 1 := mul.right_cancel (calc φ 1 * φ 1 = φ (1 * 1) : respect_mul φ ... = φ 1 : ap φ !one_mul ... = 1 * φ 1 : one_mul) theorem respect_inv /- φ -/ (g : G₁) : φ g⁻¹ = (φ g)⁻¹ := eq_inv_of_mul_eq_one (!respect_mul⁻¹ ⬝ ap φ !mul.left_inv ⬝ !respect_one) definition is_embedding_homomorphism /- φ -/ (H : Π{g}, φ g = 1 → g = 1) : is_embedding φ := begin apply function.is_embedding_of_is_injective, intro g g' p, apply eq_of_mul_inv_eq_one, apply H, refine !respect_mul ⬝ _, rewrite [respect_inv φ, p], apply mul.right_inv end definition is_homomorphism_compose {ψ : G₂ → G₃} {φ : G₁ → G₂} (H1 : is_homomorphism ψ) (H2 : is_homomorphism φ) : is_homomorphism (ψ ∘ φ) := λg h, ap ψ !respect_mul ⬝ !respect_mul definition is_homomorphism_id (G : Type) [group G] : is_homomorphism (@id G) := λg h, idp end structure homomorphism (G₁ G₂ : Group) : Type := (φ : G₁ → G₂) (p : is_homomorphism φ) infix ` →g `:55 := homomorphism definition group_fun [unfold 3] [coercion] := @homomorphism.φ definition homomorphism.struct [instance] [priority 2000] {G₁ G₂ : Group} (φ : G₁ →g G₂) : is_homomorphism φ := homomorphism.p φ variables {G G₁ G₂ G₃ : Group} {g h : G₁} {ψ : G₂ →g G₃} {φ₁ φ₂ : G₁ →g G₂} (φ : G₁ →g G₂) definition to_respect_mul /- φ -/ (g h : G₁) : φ (g * h) = φ g * φ h := respect_mul φ g h theorem to_respect_one /- φ -/ : φ 1 = 1 := respect_one φ theorem to_respect_inv /- φ -/ (g : G₁) : φ g⁻¹ = (φ g)⁻¹ := respect_inv φ g definition to_is_embedding_homomorphism /- φ -/ (H : Π{g}, φ g = 1 → g = 1) : is_embedding φ := is_embedding_homomorphism φ @H definition is_set_homomorphism [instance] (G₁ G₂ : Group) : is_set (G₁ →g G₂) := begin have H : G₁ →g G₂ ≃ Σ(f : G₁ → G₂), Π(g₁ g₂ : G₁), f (g₁ * g₂) = f g₁ * f g₂, begin fapply equiv.MK, { intro φ, induction φ, constructor, assumption}, { intro v, induction v, constructor, assumption}, { intro v, induction v, reflexivity}, { intro φ, induction φ, reflexivity} end, apply is_trunc_equiv_closed_rev, exact H end local attribute group_pType_of_Group pointed.mk' [reducible] definition pmap_of_homomorphism [constructor] /- φ -/ : pType_of_Group G₁ →* pType_of_Group G₂ := pmap.mk φ (respect_one φ) definition homomorphism_eq (p : group_fun φ₁ ~ group_fun φ₂) : φ₁ = φ₂ := begin induction φ₁ with φ₁ q₁, induction φ₂ with φ₂ q₂, esimp at p, induction p, exact ap (homomorphism.mk φ₁) !is_prop.elim end /- categorical structure of groups + homomorphisms -/ definition homomorphism_compose [constructor] [trans] (ψ : G₂ →g G₃) (φ : G₁ →g G₂) : G₁ →g G₃ := homomorphism.mk (ψ ∘ φ) (is_homomorphism_compose _ _) definition homomorphism_id [constructor] [refl] (G : Group) : G →g G := homomorphism.mk (@id G) (is_homomorphism_id G) infixr ` ∘g `:75 := homomorphism_compose notation 1 := homomorphism_id _ structure isomorphism (A B : Group) := (to_hom : A →g B) (is_equiv_to_hom : is_equiv to_hom) infix ` ≃g `:25 := isomorphism attribute isomorphism.to_hom [coercion] attribute isomorphism.is_equiv_to_hom [instance] definition equiv_of_isomorphism [constructor] (φ : G₁ ≃g G₂) : G₁ ≃ G₂ := equiv.mk φ _ definition pequiv_of_isomorphism [constructor] (φ : G₁ ≃g G₂) : pType_of_Group G₁ ≃* pType_of_Group G₂ := pequiv.mk φ _ (respect_one φ) definition isomorphism_of_equiv [constructor] (φ : G₁ ≃ G₂) (p : Πg₁ g₂, φ (g₁ * g₂) = φ g₁ * φ g₂) : G₁ ≃g G₂ := isomorphism.mk (homomorphism.mk φ p) !to_is_equiv definition eq_of_isomorphism {G₁ G₂ : Group} (φ : G₁ ≃g G₂) : G₁ = G₂ := Group_eq (equiv_of_isomorphism φ) (respect_mul φ) definition isomorphism_of_eq {G₁ G₂ : Group} (φ : G₁ = G₂) : G₁ ≃g G₂ := isomorphism_of_equiv (equiv_of_eq (ap Group.carrier φ)) begin intros, induction φ, reflexivity end definition to_ginv [constructor] (φ : G₁ ≃g G₂) : G₂ →g G₁ := homomorphism.mk φ⁻¹ abstract begin intro g₁ g₂, apply eq_of_fn_eq_fn' φ, rewrite [respect_mul φ, +right_inv φ] end end definition isomorphism.refl [refl] [constructor] (G : Group) : G ≃g G := isomorphism.mk 1 !is_equiv_id definition isomorphism.symm [symm] [constructor] (φ : G₁ ≃g G₂) : G₂ ≃g G₁ := isomorphism.mk (to_ginv φ) !is_equiv_inv definition isomorphism.trans [trans] [constructor] (φ : G₁ ≃g G₂) (ψ : G₂ ≃g G₃) : G₁ ≃g G₃ := isomorphism.mk (ψ ∘g φ) !is_equiv_compose definition isomorphism.eq_trans [trans] [constructor] {G₁ G₂ G₃ : Group} (φ : G₁ = G₂) (ψ : G₂ ≃g G₃) : G₁ ≃g G₃ := proof isomorphism.trans (isomorphism_of_eq φ) ψ qed definition isomorphism.trans_eq [trans] [constructor] {G₁ G₂ G₃ : Group} (φ : G₁ ≃g G₂) (ψ : G₂ = G₃) : G₁ ≃g G₃ := isomorphism.trans φ (isomorphism_of_eq ψ) postfix `⁻¹ᵍ`:(max + 1) := isomorphism.symm infixl ` ⬝g `:75 := isomorphism.trans infixl ` ⬝gp `:75 := isomorphism.trans_eq infixl ` ⬝pg `:75 := isomorphism.eq_trans -- TODO -- definition Group_univalence (G₁ G₂ : Group) : (G₁ ≃g G₂) ≃ (G₁ = G₂) := -- begin -- fapply equiv.MK, -- { exact eq_of_isomorphism}, -- { intro p, apply transport _ p, reflexivity}, -- { intro p, induction p, esimp, }, -- { } -- end /- category of groups -/ definition precategory_group [constructor] : precategory Group := precategory.mk homomorphism @homomorphism_compose @homomorphism_id (λG₁ G₂ G₃ G₄ φ₃ φ₂ φ₁, homomorphism_eq (λg, idp)) (λG₁ G₂ φ, homomorphism_eq (λg, idp)) (λG₁ G₂ φ, homomorphism_eq (λg, idp)) -- TODO -- definition category_group : category Group := -- category.mk precategory_group -- begin -- intro G₁ G₂, -- fapply adjointify, -- { intro φ, fapply Group_eq, }, -- { }, -- { } -- end /- given an equivalence A ≃ B we can transport a group structure on A to a group structure on B -/ section parameters {A B : Type} (f : A ≃ B) [group A] definition group_equiv_mul (b b' : B) : B := f (f⁻¹ᶠ b * f⁻¹ᶠ b') definition group_equiv_one : B := f one definition group_equiv_inv (b : B) : B := f (f⁻¹ᶠ b)⁻¹ local infix * := group_equiv_mul local postfix ^ := group_equiv_inv local notation 1 := group_equiv_one theorem group_equiv_mul_assoc (b₁ b₂ b₃ : B) : (b₁ * b₂) * b₃ = b₁ * (b₂ * b₃) := by rewrite [↑group_equiv_mul, +left_inv f, mul.assoc] theorem group_equiv_one_mul (b : B) : 1 * b = b := by rewrite [↑group_equiv_mul, ↑group_equiv_one, left_inv f, one_mul, right_inv f] theorem group_equiv_mul_one (b : B) : b * 1 = b := by rewrite [↑group_equiv_mul, ↑group_equiv_one, left_inv f, mul_one, right_inv f] theorem group_equiv_mul_left_inv (b : B) : b^ * b = 1 := by rewrite [↑group_equiv_mul, ↑group_equiv_one, ↑group_equiv_inv, +left_inv f, mul.left_inv] definition group_equiv_closed : group B := ⦃group, mul := group_equiv_mul, mul_assoc := group_equiv_mul_assoc, one := group_equiv_one, one_mul := group_equiv_one_mul, mul_one := group_equiv_mul_one, inv := group_equiv_inv, mul_left_inv := group_equiv_mul_left_inv, is_set_carrier := is_trunc_equiv_closed 0 f⦄ end definition trivial_group_of_is_contr (G : Group) [H : is_contr G] : G ≃g G0 := begin fapply isomorphism_of_equiv, { apply equiv_unit_of_is_contr}, { intros, reflexivity} end definition trivial_group_of_is_contr' (G : Group) [H : is_contr G] : G = G0 := eq_of_isomorphism (trivial_group_of_is_contr G) /- A group where the point in the pointed type corresponds with 1 in the group. We need this structure when we are given a pointed type, and want to say that there is a group structure on it which is compatible with the point. This is used in chain complexes. -/ structure pgroup [class] (X : Type*) extends semigroup X, has_inv X := (pt_mul : Πa, mul pt a = a) (mul_pt : Πa, mul a pt = a) (mul_left_inv_pt : Πa, mul (inv a) a = pt) definition group_of_pgroup [reducible] [instance] (X : Type*) [H : pgroup X] : group X := ⦃group, H, one := pt, one_mul := pgroup.pt_mul , mul_one := pgroup.mul_pt, mul_left_inv := pgroup.mul_left_inv_pt⦄ definition pgroup_of_group (X : Type*) [H : group X] (p : one = pt :> X) : pgroup X := begin cases X with X x, esimp at *, induction p, exact ⦃pgroup, H, pt_mul := one_mul, mul_pt := mul_one, mul_left_inv_pt := mul.left_inv⦄ end end group