2016-10-13 19:04:57 +00:00
|
|
|
|
/-
|
|
|
|
|
Copyright (c) 2015 Floris van Doorn. All rights reserved.
|
|
|
|
|
Released under Apache 2.0 license as described in the file LICENSE.
|
2017-06-29 13:57:11 +00:00
|
|
|
|
Authors: Floris van Doorn, Egbert Rijke, Favonia
|
2016-10-13 19:04:57 +00:00
|
|
|
|
|
|
|
|
|
Constructions with groups
|
|
|
|
|
-/
|
|
|
|
|
|
|
|
|
|
import algebra.group_theory hit.set_quotient types.list types.sum .subgroup .quotient_group
|
|
|
|
|
|
2017-06-08 20:04:58 +00:00
|
|
|
|
open eq algebra is_trunc set_quotient relation sigma prod prod.ops sum list trunc function
|
2018-10-03 23:39:08 +00:00
|
|
|
|
equiv is_equiv
|
2016-10-13 19:04:57 +00:00
|
|
|
|
namespace group
|
|
|
|
|
|
2017-08-21 21:05:59 +00:00
|
|
|
|
variables {G G' : Group} {g g' h h' k : G}
|
2016-11-24 04:54:57 +00:00
|
|
|
|
{A B : AbGroup}
|
2016-10-13 19:04:57 +00:00
|
|
|
|
|
|
|
|
|
/- Binary products (direct product) of Groups -/
|
|
|
|
|
definition product_one [constructor] : G × G' := (one, one)
|
|
|
|
|
definition product_inv [unfold 3] : G × G' → G × G' :=
|
|
|
|
|
λv, (v.1⁻¹, v.2⁻¹)
|
|
|
|
|
definition product_mul [unfold 3 4] : G × G' → G × G' → G × G' :=
|
|
|
|
|
λv w, (v.1 * w.1, v.2 * w.2)
|
|
|
|
|
|
|
|
|
|
section
|
|
|
|
|
local notation 1 := product_one
|
|
|
|
|
local postfix ⁻¹ := product_inv
|
|
|
|
|
local infix * := product_mul
|
|
|
|
|
|
|
|
|
|
theorem product_mul_assoc (g₁ g₂ g₃ : G × G') : g₁ * g₂ * g₃ = g₁ * (g₂ * g₃) :=
|
|
|
|
|
prod_eq !mul.assoc !mul.assoc
|
|
|
|
|
|
|
|
|
|
theorem product_one_mul (g : G × G') : 1 * g = g :=
|
|
|
|
|
prod_eq !one_mul !one_mul
|
|
|
|
|
|
|
|
|
|
theorem product_mul_one (g : G × G') : g * 1 = g :=
|
|
|
|
|
prod_eq !mul_one !mul_one
|
|
|
|
|
|
|
|
|
|
theorem product_mul_left_inv (g : G × G') : g⁻¹ * g = 1 :=
|
|
|
|
|
prod_eq !mul.left_inv !mul.left_inv
|
|
|
|
|
|
2016-11-24 04:54:57 +00:00
|
|
|
|
theorem product_mul_comm {G G' : AbGroup} (g h : G × G') : g * h = h * g :=
|
2016-10-13 19:04:57 +00:00
|
|
|
|
prod_eq !mul.comm !mul.comm
|
|
|
|
|
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
variables (G G')
|
|
|
|
|
definition group_prod [constructor] : group (G × G') :=
|
2017-02-02 22:14:48 +00:00
|
|
|
|
group.mk _ product_mul product_mul_assoc product_one product_one_mul product_mul_one
|
2016-10-13 19:04:57 +00:00
|
|
|
|
product_inv product_mul_left_inv
|
|
|
|
|
|
|
|
|
|
definition product [constructor] : Group :=
|
|
|
|
|
Group.mk _ (group_prod G G')
|
|
|
|
|
|
2016-11-24 04:54:57 +00:00
|
|
|
|
definition ab_group_prod [constructor] (G G' : AbGroup) : ab_group (G × G') :=
|
|
|
|
|
⦃ab_group, group_prod G G', mul_comm := product_mul_comm⦄
|
2016-10-13 19:04:57 +00:00
|
|
|
|
|
2016-11-24 04:54:57 +00:00
|
|
|
|
definition ab_product [constructor] (G G' : AbGroup) : AbGroup :=
|
|
|
|
|
AbGroup.mk _ (ab_group_prod G G')
|
2016-10-13 19:04:57 +00:00
|
|
|
|
|
2018-09-26 17:53:23 +00:00
|
|
|
|
definition add_product [constructor] (G G' : AddGroup) : AddGroup :=
|
|
|
|
|
group.product G G'
|
|
|
|
|
|
|
|
|
|
definition add_ab_product [constructor] (G G' : AddAbGroup) : AddAbGroup :=
|
|
|
|
|
group.ab_product G G'
|
|
|
|
|
|
2017-05-11 21:17:50 +00:00
|
|
|
|
infix ` ×g `:60 := group.product
|
|
|
|
|
infix ` ×ag `:60 := group.ab_product
|
2018-09-26 17:53:23 +00:00
|
|
|
|
infix ` ×a `:60 := group.add_product
|
|
|
|
|
infix ` ×aa `:60 := group.add_ab_product
|
|
|
|
|
|
2017-05-11 21:17:50 +00:00
|
|
|
|
|
2017-06-08 20:04:58 +00:00
|
|
|
|
definition product_inl [constructor] (G H : Group) : G →g G ×g H :=
|
|
|
|
|
homomorphism.mk (λx, (x, one)) (λx y, prod_eq !refl !one_mul⁻¹)
|
|
|
|
|
|
|
|
|
|
definition product_inr [constructor] (G H : Group) : H →g G ×g H :=
|
|
|
|
|
homomorphism.mk (λx, (one, x)) (λx y, prod_eq !one_mul⁻¹ !refl)
|
|
|
|
|
|
|
|
|
|
definition Group_sum_elim [constructor] {G H : Group} (I : AbGroup) (φ : G →g I) (ψ : H →g I) : G ×g H →g I :=
|
|
|
|
|
homomorphism.mk (λx, φ x.1 * ψ x.2) abstract (λx y, calc
|
|
|
|
|
φ (x.1 * y.1) * ψ (x.2 * y.2) = (φ x.1 * φ y.1) * (ψ x.2 * ψ y.2)
|
|
|
|
|
: by exact ap011 mul (to_respect_mul φ x.1 y.1) (to_respect_mul ψ x.2 y.2)
|
|
|
|
|
... = (φ x.1 * ψ x.2) * (φ y.1 * ψ y.2)
|
2018-09-11 15:06:46 +00:00
|
|
|
|
: by exact mul.comm4 (φ x.1) (φ y.1) (ψ x.2) (ψ y.2)) end
|
2017-06-08 20:04:58 +00:00
|
|
|
|
|
2017-05-11 21:17:50 +00:00
|
|
|
|
definition product_functor [constructor] {G G' H H' : Group} (φ : G →g H) (ψ : G' →g H') :
|
|
|
|
|
G ×g G' →g H ×g H' :=
|
|
|
|
|
homomorphism.mk (λx, (φ x.1, ψ x.2)) (λx y, prod_eq !to_respect_mul !to_respect_mul)
|
|
|
|
|
|
|
|
|
|
infix ` ×→g `:60 := group.product_functor
|
|
|
|
|
|
|
|
|
|
definition product_isomorphism [constructor] {G G' H H' : Group} (φ : G ≃g H) (ψ : G' ≃g H') :
|
|
|
|
|
G ×g G' ≃g H ×g H' :=
|
|
|
|
|
isomorphism.mk (φ ×→g ψ) !is_equiv_prod_functor
|
|
|
|
|
|
|
|
|
|
infix ` ×≃g `:60 := group.product_isomorphism
|
2016-10-13 19:04:57 +00:00
|
|
|
|
|
2017-06-08 20:04:58 +00:00
|
|
|
|
definition product_group_mul_eq {G H : Group} (g h : G ×g H) : g * h = product_mul g h :=
|
|
|
|
|
idp
|
|
|
|
|
|
2018-10-03 23:39:08 +00:00
|
|
|
|
definition product_pr1 [constructor] (G H : Group) : G ×g H →g G :=
|
|
|
|
|
homomorphism.mk (λx, x.1) (λx y, idp)
|
|
|
|
|
|
|
|
|
|
definition product_pr2 [constructor] (G H : Group) : G ×g H →g H :=
|
|
|
|
|
homomorphism.mk (λx, x.2) (λx y, idp)
|
|
|
|
|
|
|
|
|
|
definition product_trivial_right [constructor] (G H : Group) (HH : is_contr H) : G ×g H ≃g G :=
|
|
|
|
|
begin
|
|
|
|
|
apply isomorphism.mk (product_pr1 G H),
|
|
|
|
|
apply adjointify _ (product_inl G H),
|
|
|
|
|
{ intro g, reflexivity },
|
|
|
|
|
{ intro gh, exact prod_eq idp !is_prop.elim }
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
definition product_trivial_left [constructor] (G H : Group) (HH : is_contr G) : G ×g H ≃g H :=
|
|
|
|
|
begin
|
|
|
|
|
apply isomorphism.mk (product_pr2 G H),
|
|
|
|
|
apply adjointify _ (product_inr G H),
|
|
|
|
|
{ intro g, reflexivity },
|
|
|
|
|
{ intro gh, exact prod_eq !is_prop.elim idp }
|
|
|
|
|
end
|
|
|
|
|
|
2016-10-13 19:04:57 +00:00
|
|
|
|
end group
|