feat(algebra): use infinity groups

This commit is contained in:
Floris van Doorn 2017-02-02 21:38:48 -05:00
parent 25ab404781
commit 5eafb1f6b2
5 changed files with 161 additions and 39 deletions

View file

@ -87,6 +87,11 @@ attribute algebra._trans_of_Group_of_AbGroup_1
algebra._trans_of_Group_of_AbGroup_3 [constructor]
attribute algebra._trans_of_Group_of_AbGroup_2 [unfold 1]
definition ab_group_AbGroup [instance] (G : AbGroup) : ab_group G :=
AbGroup.struct G
definition add_ab_group_AddAbGroup [instance] (G : AddAbGroup) : add_ab_group G :=
AbGroup.struct G
-- structure AddSemigroup :=
-- (carrier : Type) (struct : add_semigroup carrier)
@ -123,4 +128,66 @@ attribute algebra._trans_of_Group_of_AbGroup_2 [unfold 1]
-- attribute AddAbGroup.carrier [coercion]
-- attribute AddAbGroup.struct [instance]
-- some bundled infinity-structures
structure InfGroup :=
(carrier : Type) (struct : inf_group carrier)
attribute InfGroup.carrier [coercion]
attribute InfGroup.struct [instance]
section
local attribute InfGroup.struct [instance]
definition pType_of_InfGroup [constructor] [reducible] [coercion] (G : InfGroup) : Type* :=
pType.mk G 1
end
attribute algebra._trans_of_pType_of_InfGroup [unfold 1]
definition AddInfGroup : Type := InfGroup
definition AddInfGroup.mk [constructor] [reducible] (G : Type) (H : add_inf_group G) :
AddInfGroup :=
InfGroup.mk G H
definition AddInfGroup.struct [reducible] (G : AddInfGroup) : add_inf_group G :=
InfGroup.struct G
attribute AddInfGroup.struct InfGroup.struct [instance] [priority 2000]
structure AbInfGroup :=
(carrier : Type) (struct : ab_inf_group carrier)
attribute AbInfGroup.carrier [coercion]
definition AddAbInfGroup : Type := AbInfGroup
definition AddAbInfGroup.mk [constructor] [reducible] (G : Type) (H : add_ab_inf_group G) :
AddAbInfGroup :=
AbInfGroup.mk G H
definition AddAbInfGroup.struct [reducible] (G : AddAbInfGroup) : add_ab_inf_group G :=
AbInfGroup.struct G
attribute AddAbInfGroup.struct AbInfGroup.struct [instance] [priority 2000]
definition InfGroup_of_AbInfGroup [coercion] [constructor] (G : AbInfGroup) : InfGroup :=
InfGroup.mk G _
attribute algebra._trans_of_InfGroup_of_AbInfGroup_1 [constructor]
attribute algebra._trans_of_InfGroup_of_AbInfGroup [unfold 1]
definition InfGroup_of_Group [constructor] (G : Group) : InfGroup :=
InfGroup.mk G _
definition AddInfGroup_of_AddGroup [constructor] (G : AddGroup) : AddInfGroup :=
AddInfGroup.mk G _
definition AbInfGroup_of_AbGroup [constructor] (G : AbGroup) : AbInfGroup :=
AbInfGroup.mk G _
definition AddAbInfGroup_of_AddAbGroup [constructor] (G : AddAbGroup) : AddAbInfGroup :=
AddAbInfGroup.mk G _
end algebra

View file

@ -114,6 +114,9 @@ definition comm_monoid.to_add_comm_monoid {A : Type} [s : comm_monoid A] : add_c
structure group [class] (A : Type) extends monoid A, inf_group A
definition group_of_inf_group (A : Type) [s : inf_group A] [is_set A] : group A :=
⦃group, s, is_set_carrier := _⦄
section group
variable [s : group A]
@ -131,6 +134,9 @@ end group
structure ab_group [class] (A : Type) extends group A, comm_monoid A, ab_inf_group A
definition ab_group_of_ab_inf_group (A : Type) [s : ab_inf_group A] [is_set A] : ab_group A :=
⦃ab_group, s, is_set_carrier := _⦄
/- additive group -/
definition add_group [class] : Type → Type := group
@ -146,6 +152,10 @@ definition add_inf_group_of_add_group [reducible] [trans_instance] (A : Type)
definition add_group.to_group {A : Type} [s : add_group A] : group A := s
definition group.to_add_group {A : Type} [s : group A] : add_group A := s
definition add_group_of_add_inf_group (A : Type) [s : add_inf_group A] [is_set A] :
add_group A :=
⦃group, s, is_set_carrier := _⦄
section add_group
variables [s : add_group A]
@ -178,6 +188,10 @@ definition add_ab_inf_group_of_add_ab_group [reducible] [trans_instance] (A : Ty
definition add_ab_group.to_ab_group {A : Type} [s : add_ab_group A] : ab_group A := s
definition ab_group.to_add_ab_group {A : Type} [s : ab_group A] : add_ab_group A := s
definition add_ab_group_of_add_ab_inf_group (A : Type) [s : add_ab_inf_group A] [is_set A] :
add_ab_group A :=
⦃ab_group, s, is_set_carrier := _⦄
definition group_of_add_group (A : Type) [G : add_group A] : group A :=
⦃group,
mul := has_add.add,

View file

@ -404,6 +404,39 @@ namespace group
mul_pt := mul_one,
mul_left_inv_pt := mul.left_inv ⦄
-- infinity pgroups
structure inf_pgroup [class] (X : Type*) extends inf_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 inf_group_of_inf_pgroup [reducible] [instance] (X : Type*) [H : inf_pgroup X]
: inf_group X :=
⦃inf_group, H,
one := pt,
one_mul := inf_pgroup.pt_mul ,
mul_one := inf_pgroup.mul_pt,
mul_left_inv := inf_pgroup.mul_left_inv_pt⦄
definition inf_pgroup_of_inf_group (X : Type*) [H : inf_group X] (p : one = pt :> X) : inf_pgroup X :=
begin
cases X with X x, esimp at *, induction p,
exact ⦃inf_pgroup, H,
pt_mul := one_mul,
mul_pt := mul_one,
mul_left_inv_pt := mul.left_inv⦄
end
definition inf_Group_of_inf_pgroup (G : Type*) [inf_pgroup G] : InfGroup :=
InfGroup.mk G _
definition inf_pgroup_InfGroup [instance] (G : InfGroup) : inf_pgroup G :=
⦃ inf_pgroup, InfGroup.struct G,
pt_mul := one_mul,
mul_pt := mul_one,
mul_left_inv_pt := mul.left_inv ⦄
/- equality of groups and abelian groups -/
definition group.to_has_mul {A : Type} (H : group A) : has_mul A := _

View file

@ -15,6 +15,17 @@ open nat eq pointed trunc is_trunc algebra group function equiv unit is_equiv na
-- TODO: rename homotopy_group_functor_compose to homotopy_group_functor_pcompose
namespace eq
definition inf_pgroup_loop [constructor] [instance] (A : Type*) : inf_pgroup (Ω A) :=
inf_pgroup.mk concat con.assoc inverse idp_con con_idp con.left_inv
definition inf_group_loop [constructor] (A : Type*) : inf_group (Ω A) := _
definition ab_inf_group_loop [constructor] [instance] (A : Type*) : ab_inf_group (Ω (Ω A)) :=
⦃ab_inf_group, inf_group_loop _, mul_comm := eckmann_hilton⦄
definition gloop [constructor] (A : Type*) : InfGroup :=
InfGroup.mk (Ω A) (inf_group_loop A)
definition homotopy_group [reducible] [constructor] (n : ) (A : Type*) : Set* :=
ptrunc 0 (Ω[n] A)
@ -22,7 +33,7 @@ namespace eq
definition group_homotopy_group [instance] [constructor] [reducible] (n : ) (A : Type*)
: group (π[succ n] A) :=
trunc_group concat inverse idp con.assoc idp_con con_idp con.left_inv
trunc_group (Ω[succ n] A)
definition group_homotopy_group2 [instance] (k : ) (A : Type*) :
group (carrier (ptrunctype.to_pType (π[k + 1] A))) :=
@ -30,7 +41,7 @@ namespace eq
definition ab_group_homotopy_group [constructor] [reducible] (n : ) (A : Type*)
: ab_group (π[succ (succ n)] A) :=
trunc_ab_group concat inverse idp con.assoc idp_con con_idp con.left_inv eckmann_hilton
trunc_ab_group (Ω[succ (succ n)] A)
local attribute ab_group_homotopy_group [instance]

View file

@ -6,99 +6,96 @@ Authors: Floris van Doorn
truncating an ∞-group to a group
-/
import hit.trunc algebra.group
import hit.trunc algebra.bundled
open eq is_trunc trunc
namespace algebra
section
parameters (n : trunc_index) {A : Type} (mul : A → A → A) (inv : A → A) (one : A)
(mul_assoc : ∀a b c, mul (mul a b) c = mul a (mul b c))
(one_mul : ∀a, mul one a = a) (mul_one : ∀a, mul a one = a)
(mul_left_inv : ∀a, mul (inv a) a = one)
parameters (n : trunc_index) {A : Type} [inf_group A]
local abbreviation G := trunc n A
include mul
definition trunc_mul [unfold 9 10] (g h : G) : G :=
begin
induction g with p,
induction h with q,
exact tr (mul p q)
exact tr (p * q)
end
omit mul include inv
definition trunc_inv [unfold 9] (g : G) : G :=
begin
induction g with p,
exact tr (inv p)
exact tr p⁻¹
end
omit inv include one
definition trunc_one [constructor] : G :=
tr one
tr 1
local notation 1 := trunc_one
local postfix ⁻¹ := trunc_inv
local infix * := trunc_mul
parameters {mul} {inv} {one}
omit one include mul_assoc
theorem trunc_mul_assoc (g₁ g₂ g₃ : G) : g₁ * g₂ * g₃ = g₁ * (g₂ * g₃) :=
begin
induction g₁ with p₁,
induction g₂ with p₂,
induction g₃ with p₃,
exact ap tr !mul_assoc,
exact ap tr !mul.assoc,
end
omit mul_assoc include one_mul
theorem trunc_one_mul (g : G) : 1 * g = g :=
begin
induction g with p,
exact ap tr !one_mul
end
omit one_mul include mul_one
theorem trunc_mul_one (g : G) : g * 1 = g :=
begin
induction g with p,
exact ap tr !mul_one
end
omit mul_one include mul_left_inv
theorem trunc_mul_left_inv (g : G) : g⁻¹ * g = 1 :=
begin
induction g with p,
exact ap tr !mul_left_inv
exact ap tr !mul.left_inv
end
omit mul_left_inv
theorem trunc_mul_comm (mul_comm : ∀a b, mul a b = mul b a) (g h : G)
: g * h = h * g :=
parameter (A)
definition trunc_inf_group [constructor] [instance] : inf_group (trunc n A) :=
⦃inf_group,
mul := algebra.trunc_mul n,
mul_assoc := algebra.trunc_mul_assoc n,
one := algebra.trunc_one n,
one_mul := algebra.trunc_one_mul n,
mul_one := algebra.trunc_mul_one n,
inv := algebra.trunc_inv n,
mul_left_inv := algebra.trunc_mul_left_inv n⦄
definition trunc_group [constructor] : group (trunc 0 A) :=
group_of_inf_group _
end
section
variables (n : trunc_index) {A : Type} [ab_inf_group A]
theorem trunc_mul_comm (g h : trunc n A) : trunc_mul n g h = trunc_mul n h g :=
begin
induction g with p,
induction h with q,
exact ap tr !mul_comm
exact ap tr !mul.comm
end
parameters (mul) (inv) (one)
variable (A)
definition trunc_ab_inf_group [constructor] [instance] : ab_inf_group (trunc n A) :=
⦃ab_inf_group, trunc_inf_group n A, mul_comm := algebra.trunc_mul_comm n⦄
definition trunc_group [constructor] : group (trunc 0 A) :=
⦃group,
mul := algebra.trunc_mul 0 mul,
mul_assoc := algebra.trunc_mul_assoc 0 mul_assoc,
one := algebra.trunc_one 0 one,
one_mul := algebra.trunc_one_mul 0 one_mul,
mul_one := algebra.trunc_mul_one 0 mul_one,
inv := algebra.trunc_inv 0 inv,
mul_left_inv := algebra.trunc_mul_left_inv 0 mul_left_inv,
is_set_carrier := _⦄
definition trunc_ab_group [constructor] (mul_comm : ∀a b, mul a b = mul b a)
: ab_group (trunc 0 A) :=
⦃ab_group, trunc_group, mul_comm := algebra.trunc_mul_comm 0 mul_comm⦄
definition trunc_ab_group [constructor] : ab_group (trunc 0 A) :=
ab_group_of_ab_inf_group _
end
end algebra