factor free group on set via free group on pointed set
This commit is contained in:
parent
32512bf47d
commit
8f998637b5
2 changed files with 59 additions and 18 deletions
|
@ -1,7 +1,7 @@
|
||||||
/-
|
/-
|
||||||
Copyright (c) 2015 Floris van Doorn. All rights reserved.
|
Copyright (c) 2015-2018 Floris van Doorn. All rights reserved.
|
||||||
Released under Apache 2.0 license as described in the file LICENSE.
|
Released under Apache 2.0 license as described in the file LICENSE.
|
||||||
Authors: Floris van Doorn, Egbert Rijke
|
Authors: Floris van Doorn, Egbert Rijke, Ulrik Buchholtz
|
||||||
|
|
||||||
Constructions with groups
|
Constructions with groups
|
||||||
-/
|
-/
|
||||||
|
@ -9,7 +9,7 @@ Constructions with groups
|
||||||
import algebra.group_theory hit.set_quotient types.list types.sum ..move_to_lib
|
import algebra.group_theory hit.set_quotient types.list types.sum ..move_to_lib
|
||||||
|
|
||||||
open eq algebra is_trunc set_quotient relation sigma sigma.ops prod sum list trunc function equiv
|
open eq algebra is_trunc set_quotient relation sigma sigma.ops prod sum list trunc function equiv
|
||||||
prod.ops decidable is_equiv
|
prod.ops decidable is_equiv pointed
|
||||||
|
|
||||||
universe variable u
|
universe variable u
|
||||||
|
|
||||||
|
@ -17,14 +17,16 @@ namespace group
|
||||||
|
|
||||||
variables {G G' : Group} {g g' h h' k : G} {A B : AbGroup}
|
variables {G G' : Group} {g g' h h' k : G} {A B : AbGroup}
|
||||||
|
|
||||||
/- Free Group of a set -/
|
/- Free Group of a pointed set -/
|
||||||
variables (X : Type) [is_set X] {l l' : list (X ⊎ X)}
|
variables (X : Type*) [is_set X] {l l' : list (X ⊎ X)}
|
||||||
namespace free_group
|
namespace free_group
|
||||||
|
|
||||||
inductive free_group_rel : list (X ⊎ X) → list (X ⊎ X) → Type :=
|
inductive free_group_rel : list (X ⊎ X) → list (X ⊎ X) → Type :=
|
||||||
| rrefl : Πl, free_group_rel l l
|
| rrefl : Πl, free_group_rel l l
|
||||||
| cancel1 : Πx, free_group_rel [inl x, inr x] []
|
| cancel1 : Πx, free_group_rel [inl x, inr x] []
|
||||||
| cancel2 : Πx, free_group_rel [inr x, inl x] []
|
| cancel2 : Πx, free_group_rel [inr x, inl x] []
|
||||||
|
| cancelpt1 : free_group_rel [inl pt] []
|
||||||
|
| cancelpt2 : free_group_rel [inr pt] []
|
||||||
| resp_append : Π{l₁ l₂ l₃ l₄}, free_group_rel l₁ l₂ → free_group_rel l₃ l₄ →
|
| resp_append : Π{l₁ l₂ l₃ l₄}, free_group_rel l₁ l₂ → free_group_rel l₃ l₄ →
|
||||||
free_group_rel (l₁ ++ l₃) (l₂ ++ l₄)
|
free_group_rel (l₁ ++ l₃) (l₂ ++ l₄)
|
||||||
| rtrans : Π{l₁ l₂ l₃}, free_group_rel l₁ l₂ → free_group_rel l₂ l₃ →
|
| rtrans : Π{l₁ l₂ l₃}, free_group_rel l₁ l₂ → free_group_rel l₂ l₃ →
|
||||||
|
@ -48,6 +50,8 @@ namespace group
|
||||||
{ reflexivity},
|
{ reflexivity},
|
||||||
{ repeat esimp [map], exact cancel2 x},
|
{ repeat esimp [map], exact cancel2 x},
|
||||||
{ repeat esimp [map], exact cancel1 x},
|
{ repeat esimp [map], exact cancel1 x},
|
||||||
|
{ exact cancelpt2 X },
|
||||||
|
{ exact cancelpt1 X },
|
||||||
{ rewrite [+map_append], exact resp_append IH₁ IH₂},
|
{ rewrite [+map_append], exact resp_append IH₁ IH₂},
|
||||||
{ exact rtrans IH₁ IH₂}
|
{ exact rtrans IH₁ IH₂}
|
||||||
end
|
end
|
||||||
|
@ -58,6 +62,8 @@ namespace group
|
||||||
{ reflexivity},
|
{ reflexivity},
|
||||||
{ repeat esimp [map], exact cancel2 x},
|
{ repeat esimp [map], exact cancel2 x},
|
||||||
{ repeat esimp [map], exact cancel1 x},
|
{ repeat esimp [map], exact cancel1 x},
|
||||||
|
{ exact cancelpt1 X },
|
||||||
|
{ exact cancelpt2 X },
|
||||||
{ rewrite [+reverse_append], exact resp_append IH₂ IH₁},
|
{ rewrite [+reverse_append], exact resp_append IH₂ IH₁},
|
||||||
{ exact rtrans IH₁ IH₂}
|
{ exact rtrans IH₁ IH₂}
|
||||||
end
|
end
|
||||||
|
@ -127,15 +133,17 @@ namespace group
|
||||||
class_of [inl x]
|
class_of [inl x]
|
||||||
|
|
||||||
definition fgh_helper [unfold 6] (f : X → G) (g : G) (x : X ⊎ X) : G :=
|
definition fgh_helper [unfold 6] (f : X → G) (g : G) (x : X ⊎ X) : G :=
|
||||||
g * sum.rec (λx, f x) (λx, (f x)⁻¹) x
|
g * sum.rec (λz, f z) (λz, (f z)⁻¹) x
|
||||||
|
|
||||||
theorem fgh_helper_respect_rel (f : X → G) (r : free_group_rel X l l')
|
theorem fgh_helper_respect_rel (f : X →* G) (r : free_group_rel X l l')
|
||||||
: Π(g : G), foldl (fgh_helper f) g l = foldl (fgh_helper f) g l' :=
|
: Π(g : G), foldl (fgh_helper f) g l = foldl (fgh_helper f) g l' :=
|
||||||
begin
|
begin
|
||||||
induction r with l x x l₁ l₂ l₃ l₄ r₁ r₂ IH₁ IH₂ l₁ l₂ l₃ r₁ r₂ IH₁ IH₂: intro g,
|
induction r with l x x l₁ l₂ l₃ l₄ r₁ r₂ IH₁ IH₂ l₁ l₂ l₃ r₁ r₂ IH₁ IH₂: intro g,
|
||||||
{ reflexivity},
|
{ reflexivity},
|
||||||
{ unfold [foldl], apply mul_inv_cancel_right},
|
{ unfold [foldl], apply mul_inv_cancel_right},
|
||||||
{ unfold [foldl], apply inv_mul_cancel_right},
|
{ unfold [foldl], apply inv_mul_cancel_right},
|
||||||
|
{ unfold [foldl], rewrite (respect_pt f), apply mul_one },
|
||||||
|
{ unfold [foldl], rewrite [respect_pt f, one_inv], apply mul_one },
|
||||||
{ rewrite [+foldl_append, IH₁, IH₂]},
|
{ rewrite [+foldl_append, IH₁, IH₂]},
|
||||||
{ exact !IH₁ ⬝ !IH₂}
|
{ exact !IH₁ ⬝ !IH₂}
|
||||||
end
|
end
|
||||||
|
@ -149,7 +157,7 @@ namespace group
|
||||||
rewrite [-mul.assoc, ↑fgh_helper, one_mul]}
|
rewrite [-mul.assoc, ↑fgh_helper, one_mul]}
|
||||||
end
|
end
|
||||||
|
|
||||||
definition free_group_hom [constructor] (f : X → G) : free_group X →g G :=
|
definition free_group_hom [constructor] (f : X →* G) : free_group X →g G :=
|
||||||
begin
|
begin
|
||||||
fapply homomorphism.mk,
|
fapply homomorphism.mk,
|
||||||
{ intro g, refine set_quotient.elim _ _ g,
|
{ intro g, refine set_quotient.elim _ _ g,
|
||||||
|
@ -173,16 +181,23 @@ namespace group
|
||||||
(respect_inv ψ (class_of [inl x]))⁻¹ }
|
(respect_inv ψ (class_of [inl x]))⁻¹ }
|
||||||
end
|
end
|
||||||
|
|
||||||
definition fn_of_free_group_hom [unfold_full] (φ : free_group X →g G) : X → G :=
|
definition fn_of_free_group_hom [unfold_full] (φ : free_group X →g G) : X →* G :=
|
||||||
φ ∘ free_group_inclusion
|
ppi.mk (φ ∘ free_group_inclusion)
|
||||||
|
begin
|
||||||
|
refine (_ ⬝ respect_one φ),
|
||||||
|
apply ap φ, apply eq_of_rel, apply tr,
|
||||||
|
exact (free_group_rel.cancelpt1 X)
|
||||||
|
end
|
||||||
|
|
||||||
variables (X G)
|
variables (X G)
|
||||||
definition free_group_hom_equiv_fn : (free_group X →g G) ≃ (X → G) :=
|
definition free_group_hom_equiv_fn : (free_group X →g G) ≃ (X →* G) :=
|
||||||
begin
|
begin
|
||||||
fapply equiv.MK,
|
fapply equiv.MK,
|
||||||
{ exact fn_of_free_group_hom},
|
{ exact fn_of_free_group_hom},
|
||||||
{ exact free_group_hom},
|
{ exact free_group_hom},
|
||||||
{ intro f, apply eq_of_homotopy, intro x, esimp, unfold [foldl], apply one_mul},
|
{ intro f, apply eq_of_phomotopy, fapply phomotopy.mk,
|
||||||
|
{ intro x, esimp, unfold [foldl], apply one_mul },
|
||||||
|
{ apply is_prop.elim } },
|
||||||
{ intro φ, apply homomorphism_eq, apply free_group_hom_eq, intro x, apply one_mul }
|
{ intro φ, apply homomorphism_eq, apply free_group_hom_eq, intro x, apply one_mul }
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -629,16 +644,20 @@ namespace group
|
||||||
|
|
||||||
variable (X)
|
variable (X)
|
||||||
|
|
||||||
definition free_group_of_dfree_group [constructor] : dfree_group X →g free_group X :=
|
open option
|
||||||
dfree_group_hom free_group_inclusion
|
|
||||||
|
|
||||||
definition dfree_group_of_free_group [constructor] : free_group X →g dfree_group X :=
|
definition free_group_of_dfree_group [constructor] : dfree_group X →g free_group X₊ :=
|
||||||
free_group_hom dfree_group_inclusion
|
dfree_group_hom (free_group_inclusion ∘ some)
|
||||||
|
|
||||||
definition dfree_group_isomorphism : dfree_group X ≃g free_group X :=
|
definition dfree_group_of_free_group [constructor] : free_group X₊ →g dfree_group X :=
|
||||||
|
free_group_hom (ppi.mk (option.rec 1 dfree_group_inclusion) idp)
|
||||||
|
|
||||||
|
definition dfree_group_isomorphism : dfree_group X ≃g free_group X₊ :=
|
||||||
begin
|
begin
|
||||||
apply isomorphism.MK (free_group_of_dfree_group X) (dfree_group_of_free_group X),
|
apply isomorphism.MK (free_group_of_dfree_group X) (dfree_group_of_free_group X),
|
||||||
{ apply free_group_hom_eq, intro x, reflexivity },
|
{ apply free_group_hom_eq, intro x, induction x with x,
|
||||||
|
{ symmetry, apply eq_of_rel, apply tr, exact free_group.free_group_rel.cancelpt1 X₊ },
|
||||||
|
{ reflexivity } },
|
||||||
{ apply dfree_group_hom_eq, intro x, reflexivity }
|
{ apply dfree_group_hom_eq, intro x, reflexivity }
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -69,6 +69,28 @@ end nat
|
||||||
|
|
||||||
namespace pointed
|
namespace pointed
|
||||||
|
|
||||||
|
open option sum
|
||||||
|
definition option_equiv_sum (A : Type) : option A ≃ A ⊎ unit :=
|
||||||
|
begin
|
||||||
|
fapply equiv.MK,
|
||||||
|
{ intro z, induction z with a,
|
||||||
|
{ exact inr star },
|
||||||
|
{ exact inl a } },
|
||||||
|
{ intro z, induction z with a b,
|
||||||
|
{ exact some a },
|
||||||
|
{ exact none } },
|
||||||
|
{ intro z, induction z with a b,
|
||||||
|
{ reflexivity },
|
||||||
|
{ induction b, reflexivity } },
|
||||||
|
{ intro z, induction z with a, all_goals reflexivity }
|
||||||
|
end
|
||||||
|
|
||||||
|
theorem is_trunc_add_point [instance] (n : ℕ₋₂) (A : Type) [HA : is_trunc (n.+2) A]
|
||||||
|
: is_trunc (n.+2) A₊ :=
|
||||||
|
begin
|
||||||
|
apply is_trunc_equiv_closed_rev _ (option_equiv_sum A),
|
||||||
|
apply is_trunc_sum
|
||||||
|
end
|
||||||
|
|
||||||
end pointed open pointed
|
end pointed open pointed
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue