2017-04-28 09:26:17 +00:00
|
|
|
|
import algebra.group_theory ..pointed ..homotopy.smash
|
|
|
|
|
|
|
|
|
|
open eq pointed algebra group eq equiv is_trunc is_conn prod prod.ops
|
|
|
|
|
smash susp unit pushout trunc prod
|
|
|
|
|
|
|
|
|
|
section
|
|
|
|
|
variables {A B C : Type*}
|
|
|
|
|
|
|
|
|
|
definition prod.pair_pmap (f : C →* A) (g : C →* B)
|
|
|
|
|
: C →* A ×* B :=
|
|
|
|
|
pmap.mk (λ c, (f c, g c)) (pair_eq (respect_pt f) (respect_pt g))
|
|
|
|
|
|
|
|
|
|
-- ×* is the product in Type*
|
|
|
|
|
definition pmap_prod_equiv : (C →* A ×* B) ≃ (C →* A) × (C →* B) :=
|
|
|
|
|
begin
|
|
|
|
|
apply equiv.MK (λ f, (ppr1 ∘* f, ppr2 ∘* f))
|
|
|
|
|
(λ w, prod.elim w prod.pair_pmap),
|
|
|
|
|
{ intro p, induction p with f g, apply pair_eq,
|
2017-07-21 14:55:27 +00:00
|
|
|
|
{ apply eq_of_phomotopy, fapply phomotopy.mk,
|
2017-04-28 09:26:17 +00:00
|
|
|
|
{ intro x, reflexivity },
|
2017-07-21 14:55:27 +00:00
|
|
|
|
{ symmetry, apply trans (prod_eq_pr1 (respect_pt f) (respect_pt g)),
|
2017-04-28 09:26:17 +00:00
|
|
|
|
apply inverse, apply idp_con } },
|
2017-07-21 14:55:27 +00:00
|
|
|
|
{ apply eq_of_phomotopy, fapply phomotopy.mk,
|
2017-04-28 09:26:17 +00:00
|
|
|
|
{ intro x, reflexivity },
|
2017-07-21 14:55:27 +00:00
|
|
|
|
{ symmetry, apply trans (prod_eq_pr2 (respect_pt f) (respect_pt g)),
|
2017-04-28 09:26:17 +00:00
|
|
|
|
apply inverse, apply idp_con } } },
|
2017-07-21 14:55:27 +00:00
|
|
|
|
{ intro f, apply eq_of_phomotopy, fapply phomotopy.mk,
|
2017-04-28 09:26:17 +00:00
|
|
|
|
{ intro x, apply prod.eta },
|
2017-07-21 14:55:27 +00:00
|
|
|
|
{ symmetry, exact prod.pair_eq_eta (respect_pt f) } }
|
2017-04-28 09:26:17 +00:00
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
-- since ~* is the identity type of pointed maps,
|
|
|
|
|
-- the following follows by univalence, but we give a direct proof
|
|
|
|
|
-- if we really have to, we could prove the uncurried version
|
|
|
|
|
-- is an equivalence, but it's a pain without eta for products
|
|
|
|
|
definition pair_phomotopy {f g : C →* A ×* B}
|
|
|
|
|
(h : ppr1 ∘* f ~* ppr1 ∘* g) (k : ppr2 ∘* f ~* ppr2 ∘* g)
|
|
|
|
|
: f ~* g :=
|
|
|
|
|
phomotopy.mk (λ x, prod_eq (h x) (k x))
|
|
|
|
|
begin
|
|
|
|
|
apply prod.prod_eq_assemble,
|
|
|
|
|
{ esimp, rewrite [prod.eq_pr1_concat,prod_eq_pr1],
|
|
|
|
|
exact to_homotopy_pt h },
|
|
|
|
|
{ esimp, rewrite [prod.eq_pr2_concat,prod_eq_pr2],
|
|
|
|
|
exact to_homotopy_pt k }
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
-- should be in wedge
|
|
|
|
|
definition or_of_wedge {A B : Type*} (w : wedge A B)
|
|
|
|
|
: trunc.or (Σ a, w = inl a) (Σ b, w = inr b) :=
|
|
|
|
|
begin
|
|
|
|
|
induction w with a b,
|
|
|
|
|
{ exact trunc.tr (sum.inl (sigma.mk a idp)) },
|
|
|
|
|
{ exact trunc.tr (sum.inr (sigma.mk b idp)) },
|
|
|
|
|
{ apply is_prop.elimo }
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
namespace group -- is this the correct namespace?
|
|
|
|
|
|
|
|
|
|
-- TODO: modify h_space to match
|
|
|
|
|
|
|
|
|
|
-- TODO: move these to appropriate places
|
|
|
|
|
definition pdiag (A : Type*) : A →* (A ×* A) :=
|
|
|
|
|
pmap.mk (λ a, (a, a)) idp
|
|
|
|
|
|
|
|
|
|
section prod
|
|
|
|
|
variables (A B : Type*)
|
|
|
|
|
|
|
|
|
|
definition wpr1 (A B : Type*) : (A ∨ B) →* A :=
|
|
|
|
|
pmap.mk (wedge.elim (pid A) (pconst B A) idp) idp
|
|
|
|
|
|
|
|
|
|
definition wpr2 (A B : Type*) : (A ∨ B) →* B :=
|
|
|
|
|
pmap.mk (wedge.elim (pconst A B) (pid B) idp) idp
|
|
|
|
|
|
2017-07-20 17:01:22 +00:00
|
|
|
|
definition ppr1_pprod_of_wedge (A B : Type*)
|
|
|
|
|
: ppr1 ∘* pprod_of_wedge A B ~* wpr1 A B :=
|
2017-04-28 09:26:17 +00:00
|
|
|
|
begin
|
|
|
|
|
fconstructor,
|
|
|
|
|
{ intro w, induction w with a b,
|
|
|
|
|
{ reflexivity },
|
|
|
|
|
{ reflexivity },
|
|
|
|
|
{ apply eq_pathover, apply hdeg_square,
|
2017-07-20 17:01:22 +00:00
|
|
|
|
apply trans (ap_compose ppr1 (pprod_of_wedge A B) (pushout.glue star)),
|
2017-04-28 09:26:17 +00:00
|
|
|
|
krewrite pushout.elim_glue, krewrite pushout.elim_glue } },
|
|
|
|
|
{ reflexivity }
|
|
|
|
|
end
|
|
|
|
|
|
2017-07-20 17:01:22 +00:00
|
|
|
|
definition ppr2_pprod_of_wedge (A B : Type*)
|
|
|
|
|
: ppr2 ∘* pprod_of_wedge A B ~* wpr2 A B :=
|
2017-04-28 09:26:17 +00:00
|
|
|
|
begin
|
|
|
|
|
fconstructor,
|
|
|
|
|
{ intro w, induction w with a b,
|
|
|
|
|
{ reflexivity },
|
|
|
|
|
{ reflexivity },
|
|
|
|
|
{ apply eq_pathover, apply hdeg_square,
|
2017-07-20 17:01:22 +00:00
|
|
|
|
apply trans (ap_compose ppr2 (pprod_of_wedge A B) (pushout.glue star)),
|
2017-04-28 09:26:17 +00:00
|
|
|
|
krewrite pushout.elim_glue, krewrite pushout.elim_glue } },
|
|
|
|
|
{ reflexivity }
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
end prod
|
|
|
|
|
structure co_h_space [class] (A : Type*) :=
|
|
|
|
|
(comul : A →* (A ∨ A))
|
2017-07-20 17:01:22 +00:00
|
|
|
|
(colaw : pprod_of_wedge A A ∘* comul ~* pdiag A)
|
2017-04-28 09:26:17 +00:00
|
|
|
|
|
|
|
|
|
open co_h_space
|
|
|
|
|
|
|
|
|
|
definition co_h_space_of_counit_laws {A : Type*}
|
|
|
|
|
(c : A →* (A ∨ A))
|
|
|
|
|
(l : wpr1 A A ∘* c ~* pid A) (r : wpr2 A A ∘* c ~* pid A)
|
|
|
|
|
: co_h_space A :=
|
|
|
|
|
co_h_space.mk c (pair_phomotopy
|
|
|
|
|
(calc
|
2017-07-20 17:01:22 +00:00
|
|
|
|
ppr1 ∘* pprod_of_wedge A A ∘* c
|
|
|
|
|
~* (ppr1 ∘* pprod_of_wedge A A) ∘* c
|
|
|
|
|
: (passoc ppr1 (pprod_of_wedge A A) c)⁻¹*
|
2017-04-28 09:26:17 +00:00
|
|
|
|
... ~* wpr1 A A ∘* c
|
2017-07-20 17:01:22 +00:00
|
|
|
|
: pwhisker_right c (ppr1_pprod_of_wedge A A)
|
2017-04-28 09:26:17 +00:00
|
|
|
|
... ~* pid A : l)
|
|
|
|
|
(calc
|
2017-07-20 17:01:22 +00:00
|
|
|
|
ppr2 ∘* pprod_of_wedge A A ∘* c
|
|
|
|
|
~* (ppr2 ∘* pprod_of_wedge A A) ∘* c
|
|
|
|
|
: (passoc ppr2 (pprod_of_wedge A A) c)⁻¹*
|
2017-04-28 09:26:17 +00:00
|
|
|
|
... ~* wpr2 A A ∘* c
|
2017-07-20 17:01:22 +00:00
|
|
|
|
: pwhisker_right c (ppr2_pprod_of_wedge A A)
|
2017-04-28 09:26:17 +00:00
|
|
|
|
... ~* pid A : r))
|
|
|
|
|
|
|
|
|
|
section
|
|
|
|
|
variables (A : Type*) [H : co_h_space A]
|
|
|
|
|
include H
|
|
|
|
|
|
|
|
|
|
definition counit_left : wpr1 A A ∘* comul A ~* pid A :=
|
|
|
|
|
calc
|
|
|
|
|
wpr1 A A ∘* comul A
|
2017-07-20 17:01:22 +00:00
|
|
|
|
~* (ppr1 ∘* (pprod_of_wedge A A)) ∘* comul A
|
|
|
|
|
: (pwhisker_right (comul A) (ppr1_pprod_of_wedge A A))⁻¹*
|
|
|
|
|
... ~* ppr1 ∘* ((pprod_of_wedge A A) ∘* comul A)
|
|
|
|
|
: passoc ppr1 (pprod_of_wedge A A) (comul A)
|
2017-04-28 09:26:17 +00:00
|
|
|
|
... ~* pid A
|
|
|
|
|
: pwhisker_left ppr1 (colaw A)
|
|
|
|
|
|
|
|
|
|
definition counit_right : wpr2 A A ∘* comul A ~* pid A :=
|
|
|
|
|
calc
|
|
|
|
|
wpr2 A A ∘* comul A
|
2017-07-20 17:01:22 +00:00
|
|
|
|
~* (ppr2 ∘* (pprod_of_wedge A A)) ∘* comul A
|
|
|
|
|
: (pwhisker_right (comul A) (ppr2_pprod_of_wedge A A))⁻¹*
|
|
|
|
|
... ~* ppr2 ∘* ((pprod_of_wedge A A) ∘* comul A)
|
|
|
|
|
: passoc ppr2 (pprod_of_wedge A A) (comul A)
|
2017-04-28 09:26:17 +00:00
|
|
|
|
... ~* pid A
|
|
|
|
|
: pwhisker_left ppr2 (colaw A)
|
|
|
|
|
|
|
|
|
|
definition is_conn_co_h_space : is_conn 0 A :=
|
|
|
|
|
begin
|
|
|
|
|
apply is_contr.mk (trunc.tr pt), intro ta,
|
|
|
|
|
induction ta with a,
|
|
|
|
|
have t : trunc -1 ((Σ b, comul A a = inl b) ⊎ (Σ c, comul A a = inr c)),
|
|
|
|
|
from (or_of_wedge (comul A a)),
|
|
|
|
|
induction t with s, induction s with bp cp,
|
|
|
|
|
{ induction bp with b p, apply ap trunc.tr,
|
|
|
|
|
exact (ap (wpr2 A A) p)⁻¹ ⬝ (counit_right A a) },
|
|
|
|
|
{ induction cp with c p, apply ap trunc.tr,
|
|
|
|
|
exact (ap (wpr1 A A) p)⁻¹ ⬝ (counit_left A a) }
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
section
|
|
|
|
|
variable (A : Type*)
|
|
|
|
|
|
2017-07-20 17:01:22 +00:00
|
|
|
|
definition pinch : ⅀ A →* wedge (⅀ A) (⅀ A) :=
|
2017-04-28 09:26:17 +00:00
|
|
|
|
begin
|
|
|
|
|
fapply pmap.mk,
|
|
|
|
|
{ intro sa, induction sa with a,
|
|
|
|
|
{ exact inl north }, { exact inr south },
|
|
|
|
|
{ exact ap inl (glue a ⬝ (glue pt)⁻¹) ⬝ glue star ⬝ ap inr (glue a) } },
|
|
|
|
|
{ reflexivity }
|
|
|
|
|
end
|
|
|
|
|
|
2017-07-20 17:01:22 +00:00
|
|
|
|
definition co_h_space_susp : co_h_space (⅀ A) :=
|
2017-04-28 09:26:17 +00:00
|
|
|
|
co_h_space_of_counit_laws (pinch A)
|
|
|
|
|
begin
|
|
|
|
|
fapply phomotopy.mk,
|
|
|
|
|
{ intro sa, induction sa with a,
|
|
|
|
|
{ reflexivity },
|
|
|
|
|
{ exact glue pt },
|
|
|
|
|
{ apply eq_pathover,
|
2018-09-07 14:30:39 +00:00
|
|
|
|
krewrite [ap_id,-ap_compose' (wpr1 (⅀ A) (⅀ A)) (pinch A)],
|
2017-04-28 09:26:17 +00:00
|
|
|
|
krewrite elim_merid, rewrite ap_con,
|
|
|
|
|
krewrite [pushout.elim_inr,ap_constant],
|
|
|
|
|
rewrite ap_con, krewrite [pushout.elim_inl,pushout.elim_glue,ap_id],
|
|
|
|
|
apply square_of_eq, apply trans !idp_con, apply inverse,
|
|
|
|
|
apply trans (con.assoc (merid a) (glue pt)⁻¹ (glue pt)),
|
|
|
|
|
exact whisker_left (merid a) (con.left_inv (glue pt)) } },
|
|
|
|
|
{ reflexivity }
|
|
|
|
|
end
|
|
|
|
|
begin
|
|
|
|
|
fapply phomotopy.mk,
|
|
|
|
|
{ intro sa, induction sa with a,
|
|
|
|
|
{ reflexivity },
|
|
|
|
|
{ reflexivity },
|
|
|
|
|
{ apply eq_pathover,
|
2018-09-07 14:30:39 +00:00
|
|
|
|
krewrite [ap_id,-ap_compose' (wpr2 (⅀ A) (⅀ A)) (pinch A)],
|
2017-04-28 09:26:17 +00:00
|
|
|
|
krewrite elim_merid, rewrite ap_con,
|
|
|
|
|
krewrite [pushout.elim_inr,ap_id],
|
|
|
|
|
rewrite ap_con, krewrite [pushout.elim_inl,pushout.elim_glue,ap_constant],
|
|
|
|
|
apply square_of_eq, apply trans !idp_con, apply inverse,
|
|
|
|
|
exact idp_con (merid a) } },
|
|
|
|
|
{ reflexivity }
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
end
|
|
|
|
|
/-
|
|
|
|
|
terminology: magma, comagma? co_h_space/co_h_space?
|
|
|
|
|
pre_inf_group? pre_inf_cogroup? ghs (for group-like H-space?)
|
|
|
|
|
cgcohs (cogroup-like co-H-space?) cogroup_like_co_h_space?
|
|
|
|
|
-/
|
|
|
|
|
|
|
|
|
|
end group
|