Spectral/homotopy/dsmash.hlean

1681 lines
83 KiB
Text
Raw Normal View History

-- Authors: Floris van Doorn
/-
The "dependent" smash product.
Given A : Type* and B : A → Type* it is the cofiber of
A B pt → Σ(a : A), B a
However, we define it (equivalently) as the pushout of 2 ← A + B pt → Σ(a : A), B a.
-/
import .smash_adjoint ..pointed_binary
open bool pointed eq equiv is_equiv sum bool prod unit circle cofiber sigma.ops wedge sigma function prod.ops
namespace dsmash
variables {A : Type*} {B : A → Type*}
definition sigma_of_sum [unfold 3] (u : A + B pt) : Σa, B a :=
by induction u with a b; exact ⟨a, pt⟩; exact ⟨pt, b⟩
definition dsmash' (B : A → Type*) : Type := pushout.pushout (@sigma_of_sum A B) (@smash.bool_of_sum A (B pt))
protected definition mk' (a : A) (b : B a) : dsmash' B := pushout.inl ⟨a, b⟩
definition dsmash [constructor] (B : A → Type*) : Type* :=
pointed.MK (dsmash' B) (dsmash.mk' pt pt)
notation `⋀` := dsmash
protected definition mk (a : A) (b : B a) : ⋀ B := pushout.inl ⟨a, b⟩
definition auxl : ⋀ B := pushout.inr ff
definition auxr : ⋀ B := pushout.inr tt
definition gluel (a : A) : dsmash.mk a pt = auxl :> ⋀ B := pushout.glue (sum.inl a)
definition gluer (b : B pt) : dsmash.mk pt b = auxr :> ⋀ B := pushout.glue (sum.inr b)
definition gluel' (a a' : A) : dsmash.mk a pt = dsmash.mk a' pt :> ⋀ B :=
gluel a ⬝ (gluel a')⁻¹
definition gluer' (b b' : B pt) : dsmash.mk pt b = dsmash.mk pt b' :> ⋀ B :=
gluer b ⬝ (gluer b')⁻¹
definition glue (a : A) (b : B pt) : dsmash.mk a pt = dsmash.mk pt b :> ⋀ B :=
gluel' a pt ⬝ gluer' pt b
definition glue_pt_left (b : B pt) : glue (Point A) b = gluer' pt b :=
whisker_right _ !con.right_inv ⬝ !idp_con
definition glue_pt_right (a : A) : glue a (Point (B a)) = gluel' a pt :=
proof whisker_left _ !con.right_inv qed
definition ap_mk_left {a a' : A} (p : a = a') : ap (λa, dsmash.mk a (Point (B a))) p = gluel' a a' :=
!ap_is_constant
definition ap_mk_right {b b' : B pt} (p : b = b') : ap (dsmash.mk (Point A)) p = gluer' b b' :=
!ap_is_constant
protected definition rec {P : ⋀ B → Type} (Pmk : Πa b, P (dsmash.mk a b))
(Pl : P auxl) (Pr : P auxr) (Pgl : Πa, Pmk a pt =[gluel a] Pl)
(Pgr : Πb, Pmk pt b =[gluer b] Pr) (x : dsmash' B) : P x :=
begin
induction x with x b u,
{ induction x with a b, exact Pmk a b },
{ induction b, exact Pl, exact Pr },
{ induction u,
{ apply Pgl },
{ apply Pgr }}
end
theorem rec_gluel {P : ⋀ B → Type} {Pmk : Πa b, P (dsmash.mk a b)}
{Pl : P auxl} {Pr : P auxr} (Pgl : Πa, Pmk a pt =[gluel a] Pl)
(Pgr : Πb, Pmk pt b =[gluer b] Pr) (a : A) :
apd (dsmash.rec Pmk Pl Pr Pgl Pgr) (gluel a) = Pgl a :=
!pushout.rec_glue
theorem rec_gluer {P : ⋀ B → Type} {Pmk : Πa b, P (dsmash.mk a b)}
{Pl : P auxl} {Pr : P auxr} (Pgl : Πa, Pmk a pt =[gluel a] Pl)
(Pgr : Πb, Pmk pt b =[gluer b] Pr) (b : B pt) :
apd (dsmash.rec Pmk Pl Pr Pgl Pgr) (gluer b) = Pgr b :=
!pushout.rec_glue
theorem rec_glue {P : ⋀ B → Type} {Pmk : Πa b, P (dsmash.mk a b)}
{Pl : P auxl} {Pr : P auxr} (Pgl : Πa, Pmk a pt =[gluel a] Pl)
(Pgr : Π(b : B pt), Pmk pt b =[gluer b] Pr) (a : A) (b : B pt) :
apd (dsmash.rec Pmk Pl Pr Pgl Pgr) (dsmash.glue a b) =
(Pgl a ⬝o (Pgl pt)⁻¹ᵒ) ⬝o (Pgr pt ⬝o (Pgr b)⁻¹ᵒ) :=
by rewrite [↑glue, ↑gluel', ↑gluer', +apd_con, +apd_inv, +rec_gluel, +rec_gluer]
protected definition elim {P : Type} (Pmk : Πa b, P) (Pl Pr : P)
(Pgl : Πa : A, Pmk a pt = Pl) (Pgr : Πb : B pt, Pmk pt b = Pr) (x : dsmash' B) : P :=
dsmash.rec Pmk Pl Pr (λa, pathover_of_eq _ (Pgl a)) (λb, pathover_of_eq _ (Pgr b)) x
-- an elim where you are forced to make (Pgl pt) and (Pgl pt) to be reflexivity
protected definition elim' [reducible] {P : Type} (Pmk : Πa b, P)
(Pgl : Πa : A, Pmk a pt = Pmk pt pt) (Pgr : Πb : B pt, Pmk pt b = Pmk pt pt)
(ql : Pgl pt = idp) (qr : Pgr pt = idp) (x : dsmash' B) : P :=
dsmash.elim Pmk (Pmk pt pt) (Pmk pt pt) Pgl Pgr x
theorem elim_gluel {P : Type} {Pmk : Πa b, P} {Pl Pr : P}
(Pgl : Πa : A, Pmk a pt = Pl) (Pgr : Πb : B pt, Pmk pt b = Pr) (a : A) :
ap (dsmash.elim Pmk Pl Pr Pgl Pgr) (gluel a) = Pgl a :=
begin
apply inj_inv !(pathover_constant (@gluel A B a)),
rewrite [▸*,-apd_eq_pathover_of_eq_ap,↑dsmash.elim,rec_gluel],
end
theorem elim_gluer {P : Type} {Pmk : Πa b, P} {Pl Pr : P}
(Pgl : Πa : A, Pmk a pt = Pl) (Pgr : Πb : B pt, Pmk pt b = Pr) (b : B pt) :
ap (dsmash.elim Pmk Pl Pr Pgl Pgr) (gluer b) = Pgr b :=
begin
apply inj_inv !(pathover_constant (@gluer A B b)),
rewrite [▸*,-apd_eq_pathover_of_eq_ap,↑dsmash.elim,rec_gluer],
end
theorem elim_glue {P : Type} {Pmk : Πa b, P} {Pl Pr : P}
(Pgl : Πa : A, Pmk a pt = Pl) (Pgr : Πb : B pt, Pmk pt b = Pr) (a : A) (b : B pt) :
ap (dsmash.elim Pmk Pl Pr Pgl Pgr) (glue a b) = (Pgl a ⬝ (Pgl pt)⁻¹) ⬝ (Pgr pt ⬝ (Pgr b)⁻¹) :=
by rewrite [↑glue, ↑gluel', ↑gluer', +ap_con, +ap_inv, +elim_gluel, +elim_gluer]
end dsmash
open dsmash
attribute dsmash.mk dsmash.mk' dsmash.auxl dsmash.auxr [constructor]
attribute dsmash.elim' dsmash.rec dsmash.elim [unfold 9] [recursor 9]
namespace dsmash
variables {A A' C : Type*} {B : A → Type*} {D : C → Type*} {a a' : A} {b : B a} {b' : B a'}
definition mk_eq_mk (p : a = a') (q : b =[p] b') : dsmash.mk a b = dsmash.mk a' b' :=
ap pushout.inl (dpair_eq_dpair p q)
definition gluer2 (b : B a) (p : a = pt) : dsmash.mk a b = auxr :=
mk_eq_mk p !pathover_tr ⬝ gluer _
definition elim_gluel' {P : Type} {Pmk : Πa b, P} {Pl Pr : P}
(Pgl : Πa : A, Pmk a pt = Pl) (Pgr : Πb : B pt, Pmk pt b = Pr) (a a' : A) :
ap (dsmash.elim Pmk Pl Pr Pgl Pgr) (gluel' a a') = Pgl a ⬝ (Pgl a')⁻¹ :=
!ap_con ⬝ whisker_left _ !ap_inv ⬝ !elim_gluel ◾ !elim_gluel⁻²
definition elim_gluer' {P : Type} {Pmk : Πa b, P} {Pl Pr : P}
(Pgl : Πa : A, Pmk a pt = Pl) (Pgr : Πb : B pt, Pmk pt b = Pr) (b b' : B pt) :
ap (dsmash.elim Pmk Pl Pr Pgl Pgr) (gluer' b b') = Pgr b ⬝ (Pgr b')⁻¹ :=
!ap_con ⬝ whisker_left _ !ap_inv ⬝ !elim_gluer ◾ !elim_gluer⁻²
definition elim_gluel'_same {P : Type} {Pmk : Πa b, P} {Pl Pr : P}
(Pgl : Πa : A, Pmk a pt = Pl) (Pgr : Πb : B pt, Pmk pt b = Pr) (a : A) :
elim_gluel' Pgl Pgr a a =
ap02 (dsmash.elim Pmk Pl Pr Pgl Pgr) (con.right_inv (gluel a)) ⬝ (con.right_inv (Pgl a))⁻¹ :=
begin
refine _ ⬝ whisker_right _ (eq_top_of_square (!ap_con_right_inv_sq))⁻¹,
refine _ ⬝ whisker_right _ !con_idp⁻¹,
refine _ ⬝ !con.assoc⁻¹,
apply whisker_left,
apply eq_con_inv_of_con_eq, symmetry,
apply con_right_inv_natural
end
definition elim_gluer'_same {P : Type} {Pmk : Πa b, P} {Pl Pr : P}
(Pgl : Πa : A, Pmk a pt = Pl) (Pgr : Πb : B pt, Pmk pt b = Pr) (b : B pt) :
elim_gluer' Pgl Pgr b b =
ap02 (dsmash.elim Pmk Pl Pr Pgl Pgr) (con.right_inv (gluer b)) ⬝ (con.right_inv (Pgr b))⁻¹ :=
begin
refine _ ⬝ whisker_right _ (eq_top_of_square (!ap_con_right_inv_sq))⁻¹,
refine _ ⬝ whisker_right _ !con_idp⁻¹,
refine _ ⬝ !con.assoc⁻¹,
apply whisker_left,
apply eq_con_inv_of_con_eq, symmetry,
apply con_right_inv_natural
end
definition elim'_gluel'_pt {P : Type} {Pmk : Πa b, P}
(Pgl : Πa : A, Pmk a pt = Pmk pt pt) (Pgr : Πb : B pt, Pmk pt b = Pmk pt pt)
(a : A) (ql : Pgl pt = idp) (qr : Pgr pt = idp) :
ap (dsmash.elim' Pmk Pgl Pgr ql qr) (gluel' a pt) = Pgl a :=
!elim_gluel' ⬝ whisker_left _ ql⁻²
definition elim'_gluer'_pt {P : Type} {Pmk : Πa b, P}
(Pgl : Πa : A, Pmk a pt = Pmk pt pt) (Pgr : Πb : B pt, Pmk pt b = Pmk pt pt)
(b : B pt) (ql : Pgl pt = idp) (qr : Pgr pt = idp) :
ap (dsmash.elim' Pmk Pgl Pgr ql qr) (gluer' b pt) = Pgr b :=
!elim_gluer' ⬝ whisker_left _ qr⁻²
protected definition rec_eq {C : Type} {f g : ⋀ B → C}
(Pmk : Πa b, f (dsmash.mk a b) = g (dsmash.mk a b))
(Pl : f auxl = g auxl) (Pr : f auxr = g auxr)
(Pgl : Πa, square (Pmk a pt) Pl (ap f (gluel a)) (ap g (gluel a)))
(Pgr : Πb, square (Pmk pt b) Pr (ap f (gluer b)) (ap g (gluer b))) (x : dsmash' B) : f x = g x :=
begin
induction x with a b a b,
{ exact Pmk a b },
{ exact Pl },
{ exact Pr },
{ apply eq_pathover, apply Pgl },
{ apply eq_pathover, apply Pgr }
end
definition rec_eq_gluel {C : Type} {f g : ⋀ B → C}
{Pmk : Πa b, f (dsmash.mk a b) = g (dsmash.mk a b)}
{Pl : f auxl = g auxl} {Pr : f auxr = g auxr}
(Pgl : Πa, square (Pmk a pt) Pl (ap f (gluel a)) (ap g (gluel a)))
(Pgr : Πb, square (Pmk pt b) Pr (ap f (gluer b)) (ap g (gluer b))) (a : A) :
natural_square (dsmash.rec_eq Pmk Pl Pr Pgl Pgr) (gluel a) = Pgl a :=
begin
refine ap square_of_pathover !rec_gluel ⬝ _,
apply to_right_inv !eq_pathover_equiv_square
end
definition rec_eq_gluer {C : Type} {f g : ⋀ B → C}
{Pmk : Πa b, f (dsmash.mk a b) = g (dsmash.mk a b)}
{Pl : f auxl = g auxl} {Pr : f auxr = g auxr}
(Pgl : Πa, square (Pmk a pt) Pl (ap f (gluel a)) (ap g (gluel a)))
(Pgr : Πb, square (Pmk pt b) Pr (ap f (gluer b)) (ap g (gluer b))) (b : B pt) :
natural_square (dsmash.rec_eq Pmk Pl Pr Pgl Pgr) (gluer b) = Pgr b :=
begin
refine ap square_of_pathover !rec_gluer ⬝ _,
apply to_right_inv !eq_pathover_equiv_square
end
/- the functorial action of the dependent smash product -/
definition dsmash_functor' [unfold 7] (f : A →* C) (g : Πa, B a →* D (f a)) : ⋀ B → ⋀ D :=
begin
intro x, induction x,
{ exact dsmash.mk (f a) (g a b) },
{ exact auxl },
{ exact auxr },
{ exact ap (dsmash.mk (f a)) (respect_pt (g a)) ⬝ gluel (f a) },
{ exact gluer2 (g pt b) (respect_pt f) }
end
definition dsmash_functor [constructor] (f : A →* C) (g : Πa, B a →* D (f a)) : ⋀ B →* ⋀ D :=
begin
fapply pmap.mk,
{ exact dsmash_functor' f g },
{ exact mk_eq_mk (respect_pt f) (respect_pt (g pt) ⬝po apd (λa, Point (D a)) (respect_pt f)) },
end
infixr ` ⋀→ `:65 := dsmash_functor
definition pmap_of_map' [constructor] (A : Type*) {B : Type} (f : A → B) :
A →* pointed.MK B (f pt) :=
pmap.mk f idp
definition functor_gluel (f : A →* C) (g : Πa, B a →* D (f a)) (a : A) :
ap (f ⋀→ g) (gluel a) = ap (dsmash.mk (f a)) (respect_pt (g a)) ⬝ gluel (f a) :=
!elim_gluel
definition functor_gluer (f : A →* C) (g : Πa, B a →* D (f a)) (b : B pt) :
ap (f ⋀→ g) (gluer b) = gluer2 (g pt b) (respect_pt f) :=
!elim_gluer
-- definition functor_gluel2 {C : Type} {D : C → Type} (f : A → C) (g : Πa, B a → D (f a)) (a : A) :
-- ap (@dsmash_functor A (pointed.MK C (f pt)) B (λc, pointed.MK (D c) _) (pmap_of_map' A f) (λa, pmap_of_map' (B a) (g a))) _ = _ :=
-- begin
-- refine !elim_gluel ⬝ !idp_con
-- end
-- definition functor_gluer2 {C D : Type} (f : A → C) (g : B → D) (b : B) :
-- ap (pmap_of_map f pt ⋀→ pmap_of_map g pt) (gluer b) = gluer (g b) :=
-- begin
-- refine !elim_gluer ⬝ !idp_con
-- end
-- definition functor_gluel' (f : A →* C) (g : Πa, B a →* D (f a)) (a a' : A) :
-- ap (f ⋀→ g) (gluel' a a') = ap (dsmash.mk (f a)) (respect_pt g) ⬝
-- gluel' (f a) (f a') ⬝ (ap (dsmash.mk (f a')) (respect_pt g))⁻¹ :=
-- begin
-- refine !elim_gluel' ⬝ _,
-- refine whisker_left _ !con_inv ⬝ _,
-- refine !con.assoc⁻¹ ⬝ _, apply whisker_right,
-- apply con.assoc
-- end
-- definition functor_gluer' (f : A →* C) (g : Πa, B a →* D (f a)) (b b' : B) :
-- ap (f ⋀→ g) (gluer' b b') = ap (λc, dsmash.mk c (g b)) (respect_pt f) ⬝
-- gluer' (g b) (g b') ⬝ (ap (λc, dsmash.mk c (g b')) (respect_pt f))⁻¹ :=
-- begin
-- refine !elim_gluer' ⬝ _,
-- refine whisker_left _ !con_inv ⬝ _,
-- refine !con.assoc⁻¹ ⬝ _, apply whisker_right,
-- apply con.assoc
-- end
/- the statements of the above rules becomes easier if one of the functions respects the basepoint
by reflexivity -/
-- definition functor_gluel'2 {D : Type} (f : A →* C) (g : B → D) (a a' : A) :
-- ap (f ⋀→ (pmap_of_map g pt)) (gluel' a a') = gluel' (f a) (f a') :=
-- begin
-- refine !ap_con ⬝ whisker_left _ !ap_inv ⬝ _,
-- refine (!functor_gluel ⬝ !idp_con) ◾ (!functor_gluel ⬝ !idp_con)⁻²
-- end
-- definition functor_gluer'2 {C : Type} (f : A → C) (g : Πa, B a →* D (f a)) (b b' : B) :
-- ap (pmap_of_map f pt ⋀→ g) (gluer' b b') = gluer' (g b) (g b') :=
-- begin
-- refine !ap_con ⬝ whisker_left _ !ap_inv ⬝ _,
-- refine (!functor_gluer ⬝ !idp_con) ◾ (!functor_gluer ⬝ !idp_con)⁻²
-- end
-- definition functor_gluel'2 {C D : Type} (f : A → C) (g : B → D) (a a' : A) :
-- ap (pmap_of_map f pt ⋀→ pmap_of_map g pt) (gluel' a a') = gluel' (f a) (f a') :=
-- !ap_con ⬝ whisker_left _ !ap_inv ⬝ !functor_gluel2 ◾ !functor_gluel2⁻²
-- definition functor_gluer'2 {C D : Type} (f : A → C) (g : B → D) (b b' : B) :
-- ap (pmap_of_map f pt ⋀→ pmap_of_map g pt) (gluer' b b') = gluer' (g b) (g b') :=
-- !ap_con ⬝ whisker_left _ !ap_inv ⬝ !functor_gluer2 ◾ !functor_gluer2⁻²
-- lemma functor_gluel'2_same {C D : Type} (f : A → C) (g : B → D) (a : A) :
-- functor_gluel'2 f g a a =
-- ap02 (pmap_of_map f pt ⋀→ pmap_of_map g pt) (con.right_inv (gluel a)) ⬝
-- (con.right_inv (gluel (f a)))⁻¹ :=
-- begin
-- refine _ ⬝ whisker_right _ (eq_top_of_square (!ap_con_right_inv_sq))⁻¹,
-- refine _ ⬝ whisker_right _ !con_idp⁻¹,
-- refine _ ⬝ !con.assoc⁻¹,
-- apply whisker_left,
-- apply eq_con_inv_of_con_eq, symmetry,
-- apply con_right_inv_natural
-- end
-- lemma functor_gluer'2_same {C D : Type} (f : A → C) (g : B → D) (b : B) :
-- functor_gluer'2 (pmap_of_map f pt) g b b =
-- ap02 (pmap_of_map f pt ⋀→ pmap_of_map g pt) (con.right_inv (gluer b)) ⬝
-- (con.right_inv (gluer (g b)))⁻¹ :=
-- begin
-- refine _ ⬝ whisker_right _ (eq_top_of_square (!ap_con_right_inv_sq))⁻¹,
-- refine _ ⬝ whisker_right _ !con_idp⁻¹,
-- refine _ ⬝ !con.assoc⁻¹,
-- apply whisker_left,
-- apply eq_con_inv_of_con_eq, symmetry,
-- apply con_right_inv_natural
-- end
definition dsmash_functor_pid [constructor] (B : A → Type*) :
pid A ⋀→ (λa, pid (B a)) ~* pid (⋀ B) :=
begin
fapply phomotopy.mk,
{ intro x, induction x with a b a b,
{ reflexivity },
{ reflexivity },
{ reflexivity },
{ apply eq_pathover_id_right, apply hdeg_square, exact !functor_gluel ⬝ !idp_con },
{ apply eq_pathover_id_right, apply hdeg_square, exact !functor_gluer ⬝ !idp_con }},
{ reflexivity }
end
/- the functorial action of the dependent smash product respects pointed homotopies, and some computation rules for this pointed homotopy -/
definition dsmash_functor_phomotopy {f f' : A →* C} {g : Πa, B a →* D (f a)} {g' : Πa, B a →* D (f' a)}
(h₁ : f ~* f') (h₂ : Πa, ptransport D (h₁ a) ∘* g a ~* g' a) : f ⋀→ g ~* f' ⋀→ g' :=
begin
induction h₁ using phomotopy_rec_idp,
--induction h₂ using phomotopy_rec_idp,
exact sorry --reflexivity
end
infixr ` ⋀~ `:78 := dsmash_functor_phomotopy
/- a more explicit proof, if we ever need it -/
-- definition dsmash_functor_homotopy [unfold 11] {f f' : A →* C} {g g' : Πa, B a →* D (f a)}
-- (h₁ : f ~* f') (h₂ : g ~* g') : f ⋀→ g ~ f' ⋀→ g' :=
-- begin
-- intro x, induction x with a b a b,
-- { exact ap011 dsmash.mk (h₁ a) (h₂ b) },
-- { reflexivity },
-- { reflexivity },
-- { apply eq_pathover,
-- refine !functor_gluel ⬝ph _ ⬝hp !functor_gluel⁻¹,
-- refine _ ⬝v square_of_eq_top (ap_mk_left (h₁ a)),
-- exact ap011_ap_square_right dsmash.mk (h₁ a) (to_homotopy_pt h₂) },
-- { apply eq_pathover,
-- refine !functor_gluer ⬝ph _ ⬝hp !functor_gluer⁻¹,
-- refine _ ⬝v square_of_eq_top (ap_mk_right (h₂ b)),
-- exact ap011_ap_square_left dsmash.mk (h₂ b) (to_homotopy_pt h₁) },
-- end
-- definition dsmash_functor_phomotopy [constructor] {f f' : A →* C} {g g' : Πa, B a →* D (f a)}
-- (h₁ : f ~* f') (h₂ : g ~* g') : f ⋀→ g ~* f' ⋀→ g' :=
-- begin
-- apply phomotopy.mk (dsmash_functor_homotopy h₁ h₂),
-- induction h₁ with h₁ h₁₀, induction h₂ with h₂ h₂₀,
-- induction f with f f₀, induction g with g g₀,
-- induction f' with f' f'₀, induction g' with g' g'₀,
-- induction C with C c₀, induction D with D d₀, esimp at *,
-- induction h₁₀, induction h₂₀, induction f'₀, induction g'₀,
-- exact !ap_ap011⁻¹
-- end
-- definition dsmash_functor_phomotopy_refl (f : A →* C) (g : Πa, B a →* D (f a)) :
-- dsmash_functor_phomotopy (phomotopy.refl f) (phomotopy.refl g) = phomotopy.rfl :=
-- !phomotopy_rec_idp_refl ⬝ !phomotopy_rec_idp_refl
-- definition dsmash_functor_phomotopy_symm {f₁ f₂ : A →* C} {g₁ g₂ : Πa, B a →* D (f a)}
-- (h : f₁ ~* f₂) (k : g₁ ~* g₂) :
-- dsmash_functor_phomotopy h⁻¹* k⁻¹* = (dsmash_functor_phomotopy h k)⁻¹* :=
-- begin
-- induction h using phomotopy_rec_idp, induction k using phomotopy_rec_idp,
-- exact ap011 dsmash_functor_phomotopy !refl_symm !refl_symm ⬝ !dsmash_functor_phomotopy_refl ⬝
-- !refl_symm⁻¹ ⬝ !dsmash_functor_phomotopy_refl⁻¹⁻²**
-- end
-- definition dsmash_functor_phomotopy_trans {f₁ f₂ f₃ : A →* C} {g₁ g₂ g₃ : Πa, B a →* D (f a)}
-- (h₁ : f₁ ~* f₂) (h₂ : f₂ ~* f₃) (k₁ : g₁ ~* g₂) (k₂ : g₂ ~* g₃) :
-- dsmash_functor_phomotopy (h₁ ⬝* h₂) (k₁ ⬝* k₂) =
-- dsmash_functor_phomotopy h₁ k₁ ⬝* dsmash_functor_phomotopy h₂ k₂ :=
-- begin
-- induction h₁ using phomotopy_rec_idp, induction h₂ using phomotopy_rec_idp,
-- induction k₁ using phomotopy_rec_idp, induction k₂ using phomotopy_rec_idp,
-- refine ap011 dsmash_functor_phomotopy !trans_refl !trans_refl ⬝ !trans_refl⁻¹ ⬝ idp ◾** _,
-- exact !dsmash_functor_phomotopy_refl⁻¹
-- end
-- definition dsmash_functor_phomotopy_trans_right {f₁ f₂ : A →* C} {g₁ g₂ g₃ : Πa, B a →* D (f a)}
-- (h₁ : f₁ ~* f₂) (k₁ : g₁ ~* g₂) (k₂ : g₂ ~* g₃) :
-- dsmash_functor_phomotopy h₁ (k₁ ⬝* k₂) =
-- dsmash_functor_phomotopy h₁ k₁ ⬝* dsmash_functor_phomotopy phomotopy.rfl k₂ :=
-- begin
-- refine ap (λx, dsmash_functor_phomotopy x _) !trans_refl⁻¹ ⬝ !dsmash_functor_phomotopy_trans,
-- end
-- definition dsmash_functor_phomotopy_phsquare {f₁ f₂ f₃ f₄ : A →* C} {g₁ g₂ g₃ g₄ : Πa, B a →* D (f a)}
-- {h₁ : f₁ ~* f₂} {h₂ : f₃ ~* f₄} {h₃ : f₁ ~* f₃} {h₄ : f₂ ~* f₄}
-- {k₁ : g₁ ~* g₂} {k₂ : g₃ ~* g₄} {k₃ : g₁ ~* g₃} {k₄ : g₂ ~* g₄}
-- (p : phsquare h₁ h₂ h₃ h₄) (q : phsquare k₁ k₂ k₃ k₄) :
-- phsquare (dsmash_functor_phomotopy h₁ k₁)
-- (dsmash_functor_phomotopy h₂ k₂)
-- (dsmash_functor_phomotopy h₃ k₃)
-- (dsmash_functor_phomotopy h₄ k₄) :=
-- !dsmash_functor_phomotopy_trans⁻¹ ⬝ ap011 dsmash_functor_phomotopy p q ⬝
-- !dsmash_functor_phomotopy_trans
-- definition dsmash_functor_eq_of_phomotopy (f : A →* C) {g g' : Πa, B a →* D (f a)}
-- (p : g ~* g') : ap (dsmash_functor f) (eq_of_phomotopy p) =
-- eq_of_phomotopy (dsmash_functor_phomotopy phomotopy.rfl p) :=
-- begin
-- induction p using phomotopy_rec_idp,
-- refine ap02 _ !eq_of_phomotopy_refl ⬝ _,
-- refine !eq_of_phomotopy_refl⁻¹ ⬝ _,
-- apply ap eq_of_phomotopy,
-- exact !dsmash_functor_phomotopy_refl⁻¹
-- end
-- definition dsmash_functor_eq_of_phomotopy_left (g : Πa, B a →* D (f a)) {f f' : A →* C}
-- (p : f ~* f') : ap (λf, dsmash_functor f g) (eq_of_phomotopy p) =
-- eq_of_phomotopy (dsmash_functor_phomotopy p phomotopy.rfl) :=
-- begin
-- induction p using phomotopy_rec_idp,
-- refine ap02 _ !eq_of_phomotopy_refl ⬝ _,
-- refine !eq_of_phomotopy_refl⁻¹ ⬝ _,
-- apply ap eq_of_phomotopy,
-- exact !dsmash_functor_phomotopy_refl⁻¹
-- end
/- the functorial action preserves compositions, the interchange law -/
-- definition dsmash_functor_pcompose_homotopy [unfold 11] {C D E F : Type}
-- (f' : C → E) (f : A → C) (g' : D → F) (g : B → D) :
-- (pmap_of_map f' (f pt) ∘* pmap_of_map f pt) ⋀→ (pmap_of_map g' (g pt) ∘* pmap_of_map g pt) ~
-- (pmap_of_map f' (f pt) ⋀→ pmap_of_map g' (g pt)) ∘* (pmap_of_map f pt ⋀→ pmap_of_map g pt) :=
-- begin
-- intro x, induction x with a b a b,
-- { reflexivity },
-- { reflexivity },
-- { reflexivity },
-- { apply eq_pathover, refine !functor_gluel2 ⬝ph _, esimp,
-- refine _ ⬝hp (ap_compose (_ ⋀→ _) _ _)⁻¹,
-- refine _ ⬝hp ap02 _ !functor_gluel2⁻¹, refine _ ⬝hp !functor_gluel2⁻¹, exact hrfl },
-- { apply eq_pathover, refine !functor_gluer2 ⬝ph _, esimp,
-- refine _ ⬝hp (ap_compose (_ ⋀→ _) _ _)⁻¹,
-- refine _ ⬝hp ap02 _ !functor_gluer2⁻¹, refine _ ⬝hp !functor_gluer2⁻¹, exact hrfl }
-- end
-- definition dsmash_functor_pcompose (f' : C →* E) (f : A →* C) (g' : D →* F) (g : Πa, B a →* D (f a)) :
-- (f' ∘* f) ⋀→ (g' ∘* g) ~* f' ⋀→ g' ∘* f ⋀→ g :=
-- begin
-- induction C with C, induction D with D, induction E with E, induction F with F,
-- induction f with f f₀, induction f' with f' f'₀, induction g with g g₀,
-- induction g' with g' g'₀, esimp at *,
-- induction f₀, induction f'₀, induction g₀, induction g'₀,
-- fapply phomotopy.mk,
-- { rexact dsmash_functor_pcompose_homotopy f' f g' g },
-- { reflexivity }
-- end
-- definition dsmash_functor_split (f : A →* C) (g : Πa, B a →* D (f a)) :
-- f ⋀→ g ~* f ⋀→ pid D ∘* pid A ⋀→ g :=
-- dsmash_functor_phomotopy !pcompose_pid⁻¹* !pid_pcompose⁻¹* ⬝* !dsmash_functor_pcompose
-- definition dsmash_functor_split_rev (f : A →* C) (g : Πa, B a →* D (f a)) :
-- f ⋀→ g ~* pid C ⋀→ g ∘* f ⋀→ pid B :=
-- dsmash_functor_phomotopy !pid_pcompose⁻¹* !pcompose_pid⁻¹* ⬝* !dsmash_functor_pcompose
/- An alternative proof which doesn't start by applying inductions, so which is more explicit -/
-- definition dsmash_functor_pcompose_homotopy [unfold 11] (f' : C →* E) (f : A →* C) (g' : D →* F)
-- (g : Πa, B a →* D (f a)) : (f' ∘* f) ⋀→ (g' ∘* g) ~ (f' ⋀→ g') ∘* (f ⋀→ g) :=
-- begin
-- intro x, induction x with a b a b,
-- { reflexivity },
-- { reflexivity },
-- { reflexivity },
-- { apply eq_pathover, exact abstract begin apply hdeg_square,
-- refine !functor_gluel ⬝ _ ⬝ (ap_compose (f' ⋀→ g') _ _)⁻¹,
-- refine whisker_right _ !ap_con ⬝ !con.assoc ⬝ _ ⬝ ap02 _ !functor_gluel⁻¹,
-- refine (!ap_compose'⁻¹ ⬝ !ap_compose') ◾ proof !functor_gluel⁻¹ qed ⬝ !ap_con⁻¹ end end },
-- { apply eq_pathover, exact abstract begin apply hdeg_square,
-- refine !functor_gluer ⬝ _ ⬝ (ap_compose (f' ⋀→ g') _ _)⁻¹,
-- refine whisker_right _ !ap_con ⬝ !con.assoc ⬝ _ ⬝ ap02 _ !functor_gluer⁻¹,
-- refine (!ap_compose'⁻¹ ⬝ !ap_compose') ◾ proof !functor_gluer⁻¹ qed ⬝ !ap_con⁻¹ end end }
-- end
-- definition dsmash_functor_pcompose [constructor] (f' : C →* E) (f : A →* C) (g' : D →* F) (g : Πa, B a →* D (f a)) :
-- (f' ∘* f) ⋀→ (g' ∘* g) ~* f' ⋀→ g' ∘* f ⋀→ g :=
-- begin
-- fapply phomotopy.mk,
-- { exact dsmash_functor_pcompose_homotopy f' f g' g },
-- { exact abstract begin induction C, induction D, induction E, induction F,
-- induction f with f f₀, induction f' with f' f'₀, induction g with g g₀,
-- induction g' with g' g'₀, esimp at *,
-- induction f₀, induction f'₀, induction g₀, induction g'₀, reflexivity end end }
-- end
-- definition dsmash_functor_pid_pcompose [constructor] (A : Type*) (g' : C →* D) (g : B →* C)
-- : pid A ⋀→ (g' ∘* g) ~* pid A ⋀→ g' ∘* pid A ⋀→ g :=
-- dsmash_functor_phomotopy !pid_pcompose⁻¹* phomotopy.rfl ⬝* !dsmash_functor_pcompose
-- definition dsmash_functor_pcompose_pid [constructor] (B : Type*) (f' : C →* D) (f : A →* C)
-- : (f' ∘* f) ⋀→ pid B ~* f' ⋀→ (pid B) ∘* f ⋀→ (pid B) :=
-- dsmash_functor_phomotopy phomotopy.rfl !pid_pcompose⁻¹* ⬝* !dsmash_functor_pcompose
/- composing commutes with applying homotopies -/
-- definition dsmash_functor_pcompose_phomotopy {f₂ f₂' : C →* E} {f f' : A →* C} {g₂ g₂' : D →* F}
-- {g g' : Πa, B a →* D (f a)} (h₂ : f₂ ~* f₂') (h₁ : f ~* f') (k₂ : g₂ ~* g₂') (k₁ : g ~* g') :
-- phsquare (dsmash_functor_pcompose f₂ f g₂ g)
-- (dsmash_functor_pcompose f₂' f' g₂' g')
-- (dsmash_functor_phomotopy (h₂ ◾* h₁) (k₂ ◾* k₁))
-- (dsmash_functor_phomotopy h₂ k₂ ◾* dsmash_functor_phomotopy h₁ k₁) :=
-- begin
-- induction h₁ using phomotopy_rec_idp, induction h₂ using phomotopy_rec_idp,
-- induction k₁ using phomotopy_rec_idp, induction k₂ using phomotopy_rec_idp,
-- refine (ap011 dsmash_functor_phomotopy !pcompose2_refl !pcompose2_refl ⬝
-- !dsmash_functor_phomotopy_refl) ⬝ph** phvrfl ⬝hp**
-- (ap011 pcompose2 !dsmash_functor_phomotopy_refl !dsmash_functor_phomotopy_refl ⬝
-- !pcompose2_refl)⁻¹,
-- end
-- definition dsmash_functor_pid_pcompose_phomotopy_right (g₂ : D →* E) {g g' : Πa, B a →* D (f a)}
-- (k : g ~* g') :
-- phsquare (dsmash_functor_pid_pcompose A g₂ g)
-- (dsmash_functor_pid_pcompose A g₂ g')
-- (dsmash_functor_phomotopy phomotopy.rfl (pwhisker_left g₂ k))
-- (pwhisker_left (pid A ⋀→ g₂) (dsmash_functor_phomotopy phomotopy.rfl k)) :=
-- begin
-- refine dsmash_functor_phomotopy_phsquare _ _ ⬝h** !dsmash_functor_pcompose_phomotopy ⬝hp**
-- ((ap (pwhisker_right _) !dsmash_functor_phomotopy_refl) ◾** idp ⬝ !pcompose2_refl_left),
-- exact (!pcompose2_refl ⬝ph** phvrfl)⁻¹ʰ**,
-- exact (phhrfl ⬝hp** !pcompose2_refl_left⁻¹)
-- end
section
variables {A₀₀ A₂₀ A₀₂ A₂₂ : Type*} {B₀₀ B₂₀ B₀₂ B₂₂ : Type*}
{f₁₀ : A₀₀ →* A₂₀} {f₀₁ : A₀₀ →* A₀₂} {f₂₁ : A₂₀ →* A₂₂} {f₁₂ : A₀₂ →* A₂₂}
{g₁₀ : B₀₀ →* B₂₀} {g₀₁ : B₀₀ →* B₀₂} {g₂₁ : B₂₀ →* B₂₂} {g₁₂ : B₀₂ →* B₂₂}
/- applying the functorial action of dsmash to squares of pointed maps -/
-- definition dsmash_functor_psquare (p : psquare f₁₀ f₁₂ f₀₁ f₂₁) (q : psquare g₁₀ g₁₂ g₀₁ g₂₁) :
-- psquare (f₁₀ ⋀→ g₁₀) (f₁₂ ⋀→ g₁₂) (f₀₁ ⋀→ g₀₁) (f₂₁ ⋀→ g₂₁) :=
-- !dsmash_functor_pcompose⁻¹* ⬝* dsmash_functor_phomotopy p q ⬝* !dsmash_functor_pcompose
end
/- f ∧ g is a pointed equivalence if f and g are -/
definition dsmash_functor_using_pushout [unfold 7] (f : A →* C) (g : Πa, B a →* D (f a)) :
⋀ B → ⋀ D :=
begin
refine pushout.functor (f +→ (transport D (respect_pt f) ∘ g pt)) (sigma_functor f g) id _ _,
{ intro v, induction v with a b,
exact ap (dpair _) (respect_pt (g a)),
exact sigma_eq (respect_pt f) !pathover_tr },
{ intro v, induction v with a b: reflexivity }
end
definition dsmash_functor_homotopy_pushout_functor (f : A →* C) (g : Πa, B a →* D (f a)) :
f ⋀→ g ~ dsmash_functor_using_pushout f g :=
begin
intro x, induction x,
{ reflexivity },
{ reflexivity },
{ reflexivity },
{ apply eq_pathover, refine !elim_gluel ⬝ph _ ⬝hp !pushout.elim_glue⁻¹,
apply hdeg_square, esimp, apply whisker_right, apply ap_compose },
{ apply eq_pathover, refine !elim_gluer ⬝ph _ ⬝hp !pushout.elim_glue⁻¹,
apply hdeg_square, reflexivity }
end
definition dsmash_pequiv [constructor] (f : A ≃* C) (g : Πa, B a ≃* D (f a)) : ⋀ B ≃* ⋀ D :=
begin
fapply pequiv_of_pmap (f ⋀→ g),
refine homotopy_closed _ (dsmash_functor_homotopy_pushout_functor f g)⁻¹ʰᵗʸ _,
apply pushout.is_equiv_functor,
{ apply is_equiv_sum_functor, apply is_equiv_compose, apply pequiv.to_is_equiv,
exact to_is_equiv (equiv_ap _ _) },
apply is_equiv_sigma_functor, intro a, apply pequiv.to_is_equiv
end
infixr ` ⋀≃ `:80 := dsmash_pequiv
definition dsmash_pequiv_left [constructor] (B : C → Type*) (f : A ≃* C) :
⋀ (B ∘ f) ≃* ⋀ B :=
f ⋀≃ λa, pequiv.rfl
definition dsmash_pequiv_right [constructor] {D : A → Type*} (g : Πa, B a ≃* D a) : ⋀ B ≃* ⋀ D :=
pequiv.rfl ⋀≃ g
/- f ∧ g is constant if f is constant -/
-- definition dsmash_functor_pconst_left_homotopy [unfold 6] {B' : Type} (f : B → B') (x : ⋀ B) :
-- (pconst A C ⋀→ pmap_of_map f pt) x = pt :=
-- begin
-- induction x with a b a b,
-- { exact gluer' (f b) pt },
-- { exact (gluel pt)⁻¹ },
-- { exact (gluer pt)⁻¹ᵖ },
-- { apply eq_pathover, note x := functor_gluel2 (λx : A, Point A') f a,
-- refine x ⬝ph _, refine _ ⬝hp !ap_constant⁻¹, apply square_of_eq,
-- rexact con.right_inv (gluer (f pt)) ⬝ (con.right_inv (gluel pt))⁻¹ },
-- { apply eq_pathover, note x := functor_gluer2 (λx : A, Point A') f b,
-- refine x ⬝ph _, refine _ ⬝hp !ap_constant⁻¹, apply square_of_eq, reflexivity }
-- end
-- definition dsmash_functor_pconst_left (f : B →* B') : pconst A A' ⋀→ f ~* pconst (⋀ B) (A' ∧ B') :=
-- begin
-- induction B' with B', induction f with f f₀, esimp at *, induction f₀,
-- fapply phomotopy.mk,
-- { exact dsmash_functor_pconst_left_homotopy f },
-- { rexact con.right_inv (gluer (f pt)) }
-- end
-- definition dsmash_functor_pconst_left_phomotopy {f f' : B →* B'} (p : f ~* f') :
-- phomotopy.refl (pconst A A') ⋀~ p ⬝* dsmash_functor_pconst_left f' = dsmash_functor_pconst_left f :=
-- begin
-- induction p using phomotopy_rec_idp,
-- exact !dsmash_functor_phomotopy_refl ◾** idp ⬝ !refl_trans
-- end
-- /- This makes dsmash_functor into a pointed map (B →* B') →* (⋀ B →* ⋀ B') -/
-- definition dsmash_functor_left [constructor] (A A' B : Type*) :
-- ppmap A A' →* ppmap (⋀ B) (A' ∧ B) :=
-- pmap.mk (λf, f ⋀→ pid B) (eq_of_phomotopy (dsmash_functor_pconst_left (pid B)))
/- We want to show that dsmash_functor_left is natural in A, B and C.
For this we need two coherence rules. Given the function h := (f' ∘ f) ⋀→ (g' ∘ g) and suppose
that either f' or f is constant. There are two ways to show that h is constant: either by using
exchange, or directly. We need to show that these two proofs result in the same pointed
homotopy. First we do the case where f is constant -/
-- private definition my_squarel {A : Type} {a₁ a₂ a₃ : A} (p₁ : a₁ = a₃) (p₂ : a₂ = a₃) :
-- square (p₁ ⬝ p₂⁻¹) p₂⁻¹ p₁ idp :=
-- proof square_of_eq idp qed
-- private definition my_squarer {A : Type} {a₁ a₂ a₃ : A} (p₁ : a₁ = a₃) (p₂ : a₁ = a₂) :
-- square (p₁ ⬝ p₁⁻¹) p₂⁻¹ p₂ idp :=
-- proof square_of_eq (con.right_inv p₁ ⬝ (con.right_inv p₂)⁻¹) qed
-- private definition my_cube_fillerl {B C : Type} {g : B → C} {fa₁ fa₂ b₀ : B}
-- {pa₁ : fa₁ = b₀} {pa₂ : fa₂ = b₀} {qa₁ : g (fa₁) = g b₀} {qa₂ : g (fa₂) = g b₀}
-- (ra₁ : ap g (pa₁) = qa₁) (ra₂ : ap g (pa₂) = qa₂) :
-- cube (hrfl ⬝hp (ra₁)⁻¹) hrfl
-- (my_squarel (qa₁) (qa₂)) (aps g (my_squarel (pa₁) (pa₂)))
-- (hrfl ⬝hp (!ap_con ⬝ whisker_left _ !ap_inv ⬝ (ra₁) ◾ (ra₂)⁻²)⁻¹)
-- (hrfl ⬝hp (ra₂)⁻²⁻¹ ⬝hp !ap_inv⁻¹) :=
-- begin
-- induction ra₂, induction ra₁, induction pa₂, induction pa₁, exact idc
-- end
-- private definition my_cube_fillerr {B C : Type} {g : B → C} {b₀ bl br : B}
-- {pl : b₀ = bl} {pr : b₀ = br} {ql : g b₀ = g bl} {qr : g b₀ = g br}
-- (sl : ap g pl = ql) (sr : ap g pr = qr) :
-- cube (hrfl ⬝hp sr⁻¹) hrfl
-- (my_squarer ql qr) (aps g (my_squarer pl pr))
-- (hrfl ⬝hp (!ap_con ⬝ whisker_left _ !ap_inv ⬝ sl ◾ sl⁻²)⁻¹)
-- (hrfl ⬝hp sr⁻²⁻¹ ⬝hp !ap_inv⁻¹) :=
-- begin
-- induction sr, induction sl, induction pr, induction pl, exact idc
-- end
-- definition dsmash_functor_pcompose_pconst2_homotopy {A A' A'' B B' B'' : Type}
-- (a₀ : A) (b₀ : B) (a₀' : A') (f' : A' → A'') (g' : B' → B'') (g : B → B')
-- (x : pointed.MK A a₀ ∧ pointed.MK B b₀) :
-- square (dsmash_functor_pcompose_homotopy f' (λ a, a₀') g' g x)
-- idp
-- (dsmash_functor_pconst_left_homotopy (λ a, g' (g a)) x)
-- (ap (dsmash_functor' (pmap.mk f' (refl (f' a₀'))) (pmap.mk g' (refl (g' (g b₀)))))
-- (dsmash_functor_pconst_left_homotopy g x)) :=
-- begin
-- induction x with a b a b,
-- { refine _ ⬝hp (functor_gluer'2 f' g' (g b) (g b₀))⁻¹, exact hrfl },
-- { refine _ ⬝hp !ap_inv⁻¹, refine _ ⬝hp !functor_gluel2⁻²⁻¹, exact hrfl },
-- { refine _ ⬝hp !ap_inv⁻¹, refine _ ⬝hp !functor_gluer2⁻²⁻¹, exact hrfl },
-- { exact abstract begin apply square_pathover,
-- refine !rec_eq_gluel ⬝p1 _ ⬝1p !natural_square_refl⁻¹,
-- refine !rec_eq_gluel ⬝p2 _ ⬝2p !natural_square_ap_fn⁻¹,
-- apply whisker001, apply whisker021,
-- apply move201, refine _ ⬝1p !eq_hconcat_hdeg_square⁻¹,
-- apply move221, refine _ ⬝1p !hdeg_square_hconcat_eq⁻¹,
-- refine ap (hconcat_eq _) !ap_inv ⬝p1 _ ⬝2p (ap (aps _) !rec_eq_gluel ⬝ !aps_eq_hconcat)⁻¹,
-- apply whisker021, refine _ ⬝2p !aps_hconcat_eq⁻¹, apply move221,
-- refine _ ⬝1p !hdeg_square_hconcat_eq⁻¹,
-- refine _ ⬝1p ap hdeg_square (eq_bot_of_square (transpose !ap02_ap_constant)),
-- apply my_cube_fillerr end end },
-- { exact abstract begin apply square_pathover,
-- refine !rec_eq_gluer ⬝p1 _ ⬝1p !natural_square_refl⁻¹,
-- refine !rec_eq_gluer ⬝p2 _ ⬝2p !natural_square_ap_fn⁻¹,
-- apply whisker001, apply whisker021,
-- apply move201, refine _ ⬝1p !eq_hconcat_hdeg_square⁻¹,
-- apply move221, refine _ ⬝1p !hdeg_square_hconcat_eq⁻¹,
-- refine ap (hconcat_eq _) !ap_inv ⬝p1 _ ⬝2p (ap (aps _) !rec_eq_gluer ⬝ !aps_eq_hconcat)⁻¹,
-- apply whisker021, refine _ ⬝2p !aps_hconcat_eq⁻¹, apply move221,
-- refine _ ⬝1p !hdeg_square_hconcat_eq⁻¹,
-- refine _ ⬝1p ap hdeg_square (eq_bot_of_square (transpose !ap02_ap_constant)),
-- apply my_cube_fillerl end end }
-- end
-- definition dsmash_functor_pcompose_pconst2 (f' : A' →* A'') (g' : B' →* B'') (g : B →* B') :
-- phsquare (dsmash_functor_pcompose f' (pconst A A') g' g)
-- (dsmash_functor_pconst_left (g' ∘* g))
-- (dsmash_functor_phomotopy (pcompose_pconst f') phomotopy.rfl)
-- (pwhisker_left (f' ⋀→ g') (dsmash_functor_pconst_left g) ⬝*
-- pcompose_pconst (f' ⋀→ g')) :=
-- begin
-- induction A with A a₀, induction B with B b₀,
-- induction A' with A' a₀', induction B' with B' b₀',
-- induction A'' with A'' a₀'', induction B'' with B'' b₀'',
-- induction f' with f' f'₀, induction g' with g' g₀', induction g with g g₀,
-- esimp at *, induction f'₀, induction g₀', induction g₀,
-- refine !dsmash_functor_phomotopy_refl ⬝ph** _, refine _ ⬝ !refl_trans⁻¹,
-- fapply phomotopy_eq,
-- { intro x, refine eq_of_square _ ⬝ !con_idp,
-- exact dsmash_functor_pcompose_pconst2_homotopy a₀ b₀ a₀' f' g' g x },
-- { refine _ ⬝ !idp_con⁻¹,
-- refine whisker_right _ (!whisker_right_idp ⬝ !eq_of_square_hrfl_hconcat_eq) ⬝ _,
-- refine !con.assoc ⬝ _, apply con_eq_of_eq_inv_con,
-- refine whisker_right _ _ ⬝ _, rotate 1, rexact functor_gluer'2_same f' g' (g b₀),
-- refine !inv_con_cancel_right ⬝ _,
-- refine !whisker_left_idp⁻¹ ⬝ _,
-- refine !con_idp ⬝ _,
-- apply whisker_left,
-- apply ap (whisker_left idp),
-- exact (!idp_con ⬝ !idp_con ⬝ !whisker_right_idp ⬝ !idp_con)⁻¹ }
-- end
-- /- a version where the left maps are identities -/
-- definition dsmash_functor_pcompose_pconst2_pid (f' : A' →* A'') :
-- phsquare (dsmash_functor_pcompose_pid B f' (pconst A A'))
-- (dsmash_functor_pconst_left (pid B))
-- (pcompose_pconst f' ⋀~ phomotopy.rfl)
-- (pwhisker_left (f' ⋀→ pid B) (dsmash_functor_pconst_left (pid B)) ⬝*
-- pcompose_pconst (f' ⋀→ pid B)) :=
-- (!dsmash_functor_phomotopy_refl ◾** idp ⬝ !refl_trans) ⬝pv**
-- dsmash_functor_pcompose_pconst2 f' (pid B) (pid B)
-- /- a small rewrite of the previous -/
-- -- definition dsmash_functor_pcompose_pid_pconst' (f' : A' →* A'') :
-- -- pwhisker_left (f' ⋀→ pid B) (dsmash_functor_pconst_left (pid B)) ⬝*
-- -- pcompose_pconst (f' ⋀→ pid B) =
-- -- (dsmash_functor_pcompose_pid B f' (pconst A A'))⁻¹* ⬝*
-- -- (pcompose_pconst f' ⋀~ phomotopy.rfl ⬝*
-- -- dsmash_functor_pconst_left (pid B)) :=
-- -- begin
-- -- apply eq_symm_trans_of_trans_eq,
-- -- exact dsmash_functor_pcompose_pid_pconst f'
-- -- end
-- /- if f' is constant -/
-- definition dsmash_functor_pcompose_pconst1_homotopy [unfold 13] {A A' A'' B B' B'' : Type}
-- (a₀ : A) (b₀ : B) (a₀'' : A'') (f : A → A') (g' : B' → B'') (g : B → B')
-- (x : pointed.MK A a₀ ∧ pointed.MK B b₀) :
-- square (dsmash_functor_pcompose_homotopy (λa', a₀'') f g' g x)
-- idp
-- (dsmash_functor_pconst_left_homotopy (λ a, g' (g a)) x)
-- (dsmash_functor_pconst_left_homotopy g'
-- ((pmap_of_map f a₀ ⋀→ pmap_of_map g b₀) x)) :=
-- begin
-- induction x with a b a b,
-- { exact hrfl },
-- { exact hrfl },
-- { exact hrfl },
-- { exact abstract begin apply square_pathover,
-- refine !rec_eq_gluel ⬝p1 _ ⬝1p !natural_square_refl⁻¹,
-- refine !rec_eq_gluel ⬝p2 _ ⬝2p
-- (natural_square_compose (dsmash_functor_pconst_left_homotopy g') _ _)⁻¹ᵖ,
-- apply whisker001, apply whisker021,
-- apply move201, refine _ ⬝1p !eq_hconcat_hdeg_square⁻¹,
-- apply move221, refine _ ⬝1p !hdeg_square_hconcat_eq⁻¹,
-- refine ap (hconcat_eq _) !ap_inv ⬝p1 _ ⬝2p (natural_square_eq2 _ !functor_gluel2)⁻¹ᵖ,
-- apply whisker021,
-- refine _ ⬝1p ap hdeg_square (eq_of_square (!ap_constant_compose⁻¹ʰ) ⬝ !idp_con)⁻¹,
-- apply move221, refine _ ⬝1p !hdeg_square_hconcat_eq⁻¹,
-- refine _ ⬝2p !rec_eq_gluel⁻¹, apply whisker021,
-- apply move221, refine _ ⬝1p !hdeg_square_hconcat_eq⁻¹,
-- refine _ ⬝1p ap hdeg_square (eq_bot_of_square (transpose !ap02_constant)),
-- exact rfl2 end end },
-- { exact abstract begin apply square_pathover,
-- refine !rec_eq_gluer ⬝p1 _ ⬝1p !natural_square_refl⁻¹,
-- refine !rec_eq_gluer ⬝p2 _ ⬝2p
-- (natural_square_compose (dsmash_functor_pconst_left_homotopy g') _ _)⁻¹ᵖ,
-- apply whisker001, apply whisker021,
-- apply move201, refine _ ⬝1p !eq_hconcat_hdeg_square⁻¹,
-- apply move221, refine _ ⬝1p !hdeg_square_hconcat_eq⁻¹,
-- refine ap (hconcat_eq _) !ap_inv ⬝p1 _ ⬝2p (natural_square_eq2 _ !functor_gluer2)⁻¹ᵖ,
-- apply whisker021,
-- refine _ ⬝1p ap hdeg_square (eq_of_square (!ap_constant_compose⁻¹ʰ) ⬝ !idp_con)⁻¹,
-- apply move221, refine _ ⬝1p !hdeg_square_hconcat_eq⁻¹,
-- refine _ ⬝2p !rec_eq_gluer⁻¹, apply whisker021,
-- apply move221, refine _ ⬝1p !hdeg_square_hconcat_eq⁻¹,
-- refine _ ⬝1p ap hdeg_square (eq_bot_of_square (transpose !ap02_constant)),
-- exact rfl2 end end },
-- end
-- definition dsmash_functor_pcompose_pconst1 (f : A →* A') (g' : B' →* B'') (g : B →* B') :
-- phsquare (dsmash_functor_pcompose (pconst A' A'') f g' g)
-- (dsmash_functor_pconst_left (g' ∘* g))
-- (pconst_pcompose f ⋀~ phomotopy.rfl)
-- (pwhisker_right (f ⋀→ g) (dsmash_functor_pconst_left g') ⬝*
-- pconst_pcompose (f ⋀→ g)) :=
-- begin
-- induction A with A a₀, induction B with B b₀,
-- induction A' with A' a₀', induction B' with B' b₀',
-- induction A'' with A'' a₀'', induction B'' with B'' b₀'',
-- induction f with f f₀, induction g' with g' g₀', induction g with g g₀,
-- esimp at *, induction f₀, induction g₀', induction g₀,
-- refine !dsmash_functor_phomotopy_refl ⬝ph** _, refine _ ⬝ !refl_trans⁻¹,
-- fapply phomotopy_eq,
-- { intro x, refine eq_of_square (dsmash_functor_pcompose_pconst1_homotopy a₀ b₀ a₀'' f g' g x) },
-- { refine whisker_right _ (!whisker_right_idp ⬝ !eq_of_square_hrfl) ⬝ _,
-- have H : Π{A : Type} {a a' : A} (p : a = a'),
-- idp_con (p ⬝ p⁻¹) ⬝ con.right_inv p = idp ⬝
-- whisker_left idp (idp ⬝ (idp ⬝ proof whisker_right idp (idp_con (p ⬝ p⁻¹ᵖ))⁻¹ᵖ qed ⬝
-- whisker_left idp (con.right_inv p))), by intros; induction p; reflexivity,
-- rexact H (gluer (g' (g b₀))) }
-- end
-- /- a version where the left maps are identities -/
-- definition dsmash_functor_pcompose_pconst1_pid (f : A →* A') :
-- phsquare (dsmash_functor_pcompose_pid B (pconst A' A'') f)
-- (dsmash_functor_pconst_left (pid B))
-- (pconst_pcompose f ⋀~ phomotopy.rfl)
-- (pwhisker_right (f ⋀→ pid B) (dsmash_functor_pconst_left (pid B)) ⬝*
-- pconst_pcompose (f ⋀→ pid B)) :=
-- (!dsmash_functor_phomotopy_refl ◾** idp ⬝ !refl_trans) ⬝pv**
-- dsmash_functor_pcompose_pconst1 f (pid B) (pid B)
-- /- Using these lemmas we show that dsmash_functor_left is natural in all arguments -/
-- definition dsmash_functor_left_natural_left (B C : Type*) (f : A' →* A) :
-- psquare (dsmash_functor_left A B C) (dsmash_functor_left A' B C)
-- (ppcompose_right f) (ppcompose_right (f ⋀→ pid C)) :=
-- begin
-- refine _⁻¹*,
-- fapply phomotopy_mk_ppmap,
-- { intro g, exact dsmash_functor_pcompose_pid C g f },
-- { refine idp ◾** (!phomotopy_of_eq_con ⬝ (ap phomotopy_of_eq !pcompose_right_eq_of_phomotopy ⬝
-- !phomotopy_of_eq_of_phomotopy) ◾** !phomotopy_of_eq_of_phomotopy) ⬝ _ ,
-- refine _ ⬝ (!phomotopy_of_eq_con ⬝ (ap phomotopy_of_eq !dsmash_functor_eq_of_phomotopy_left ⬝
-- !phomotopy_of_eq_of_phomotopy) ◾** !phomotopy_of_eq_of_phomotopy)⁻¹,
-- apply dsmash_functor_pcompose_pconst1_pid }
-- end
-- definition dsmash_functor_left_natural_middle (A C : Type*) (f : B →* B') :
-- psquare (dsmash_functor_left A B C) (dsmash_functor_left A B' C)
-- (ppcompose_left f) (ppcompose_left (f ⋀→ pid C)) :=
-- begin
-- refine _⁻¹*,
-- fapply phomotopy_mk_ppmap,
-- { exact dsmash_functor_pcompose_pid C f },
-- { refine idp ◾** (!phomotopy_of_eq_con ⬝ (ap phomotopy_of_eq !pcompose_left_eq_of_phomotopy ⬝
-- !phomotopy_of_eq_of_phomotopy) ◾** !phomotopy_of_eq_of_phomotopy) ⬝ _ ,
-- refine _ ⬝ (!phomotopy_of_eq_con ⬝ (ap phomotopy_of_eq !dsmash_functor_eq_of_phomotopy_left ⬝
-- !phomotopy_of_eq_of_phomotopy) ◾** !phomotopy_of_eq_of_phomotopy)⁻¹,
-- apply dsmash_functor_pcompose_pconst2_pid }
-- end
-- definition dsmash_functor_left_natural_right (A B : Type*) (f : C →* C') :
-- psquare (dsmash_functor_left A B C) (ppcompose_right (pid A ⋀→ f))
-- (dsmash_functor_left A B C') (ppcompose_left (pid B ⋀→ f)) :=
-- begin
-- refine _⁻¹*,
-- fapply phomotopy_mk_ppmap,
-- { intro g, exact dsmash_functor_psquare proof phomotopy.rfl qed proof phomotopy.rfl qed },
-- { esimp,
-- refine idp ◾** (!phomotopy_of_eq_con ⬝ (ap phomotopy_of_eq !pcompose_left_eq_of_phomotopy ⬝
-- !phomotopy_of_eq_of_phomotopy) ◾** !phomotopy_of_eq_of_phomotopy) ⬝ _ ,
-- refine _ ⬝ (!phomotopy_of_eq_con ⬝ (ap phomotopy_of_eq !pcompose_right_eq_of_phomotopy ⬝
-- !phomotopy_of_eq_of_phomotopy) ◾** !phomotopy_of_eq_of_phomotopy)⁻¹,
-- apply eq_of_phsquare,
-- refine (phmove_bot_of_left _ !dsmash_functor_pcompose_pconst1⁻¹ʰ**) ⬝h**
-- (!dsmash_functor_phomotopy_refl ⬝pv** !phhrfl) ⬝h** !dsmash_functor_pcompose_pconst2 ⬝vp** _,
-- refine !trans_assoc ⬝ !trans_assoc ⬝ idp ◾** _ ⬝ !trans_refl,
-- refine idp ◾** !refl_trans ⬝ !trans_left_inv }
-- end
-- definition dsmash_functor_left_natural_middle_phomotopy (A C : Type*) {f f' : B →* B'}
-- (p : f ~* f') : dsmash_functor_left_natural_middle A C f =
-- ppcompose_left_phomotopy p ⬝ph* dsmash_functor_left_natural_middle A C f' ⬝hp*
-- ppcompose_left_phomotopy (p ⋀~ phomotopy.rfl) :=
-- begin
-- induction p using phomotopy_rec_idp,
-- symmetry,
-- refine !ppcompose_left_phomotopy_refl ◾ph* idp ◾hp*
-- (ap ppcompose_left_phomotopy !dsmash_functor_phomotopy_refl ⬝
-- !ppcompose_left_phomotopy_refl) ⬝ _,
-- exact !rfl_phomotopy_hconcat ⬝ !hconcat_phomotopy_rfl
-- end
-- /- the following is not really used, but a symmetric version of the natural equivalence
-- dsmash_functor_left -/
-- /- f ∧ g is constant if g is constant -/
-- definition dsmash_functor_pconst_right_homotopy [unfold 6] {C : Type} (f : A → C) (x : ⋀ B) :
-- (pmap_of_map f pt ⋀→ pconst B D) x = pt :=
-- begin
-- induction x with a b a b,
-- { exact gluel' (f a) pt },
-- { exact (gluel pt)⁻¹ },
-- { exact (gluer pt)⁻¹ },
-- { apply eq_pathover, note x := functor_gluel2 f (λx : B, Point D) a, esimp [pconst] at *,
-- refine x ⬝ph _, refine _ ⬝hp !ap_constant⁻¹, apply square_of_eq, reflexivity },
-- { apply eq_pathover, note x := functor_gluer2 f (λx : B, Point D) b, esimp [pconst] at *,
-- refine x ⬝ph _, refine _ ⬝hp !ap_constant⁻¹, apply square_of_eq,
-- rexact con.right_inv (gluel (f pt)) ⬝ (con.right_inv (gluer pt))⁻¹ }
-- end
-- definition dsmash_functor_pconst_right (f : A →* C) :
-- f ⋀→ (pconst B D) ~* pconst (⋀ B) (⋀ D) :=
-- begin
-- induction C with C, induction f with f f₀, esimp at *, induction f₀,
-- fapply phomotopy.mk,
-- { exact dsmash_functor_pconst_right_homotopy f },
-- { rexact con.right_inv (gluel (f pt)) }
-- end
-- definition dsmash_functor_pconst_right_phomotopy {f f' : A →* C} (p : f ~* f') :
-- dsmash_functor_phomotopy p (phomotopy.refl (pconst B D)) ⬝* dsmash_functor_pconst_right f' =
-- dsmash_functor_pconst_right f :=
-- begin
-- induction p using phomotopy_rec_idp,
-- exact !dsmash_functor_phomotopy_refl ◾** idp ⬝ !refl_trans
-- end
-- /- This makes dsmash_functor into a pointed map (B →* B') →* (⋀ B →* ⋀ B') -/
-- definition dsmash_functor_right [constructor] (B : A → Type*) (C : Type*) :
-- ppmap B C →* ppmap (⋀ B) (A ∧ C) :=
-- pmap.mk (dsmash_functor (pid A)) (eq_of_phomotopy (dsmash_functor_pconst_right (pid A)))
-- /- We want to show that dsmash_functor_right is natural in A, B and C.
-- For this we need two coherence rules. Given the function h := (f' ∘ f) ⋀→ (g' ∘ g) and suppose
-- that either g' or g is constant. There are two ways to show that h is constant: either by using
-- exchange, or directly. We need to show that these two proofs result in the same pointed
-- homotopy. First we do the case where g is constant -/
-- definition dsmash_functor_pcompose_pconst4_homotopy {A B C D E F : Type}
-- (a₀ : A) (b₀ : B) (d₀ : D) (f' : C → E) (f : A → C) (g : D → F)
-- (x : pointed.MK A a₀ ∧ pointed.MK B b₀) :
-- square (dsmash_functor_pcompose_homotopy f' f g (λ a, d₀) x)
-- idp
-- (dsmash_functor_pconst_right_homotopy (λ a, f' (f a)) x)
-- (ap (dsmash_functor' (pmap.mk f' (refl (f' (f a₀)))) (pmap.mk g (refl (g d₀))))
-- (dsmash_functor_pconst_right_homotopy f x)) :=
-- begin
-- induction x with a b a b,
-- { refine _ ⬝hp (functor_gluel'2 f' g (f a) (f a₀))⁻¹, exact hrfl },
-- { refine _ ⬝hp !ap_inv⁻¹, refine _ ⬝hp !functor_gluel2⁻²⁻¹, exact hrfl },
-- { refine _ ⬝hp !ap_inv⁻¹, refine _ ⬝hp !functor_gluer2⁻²⁻¹, exact hrfl },
-- { exact abstract begin apply square_pathover,
-- refine !rec_eq_gluel ⬝p1 _ ⬝1p !natural_square_refl⁻¹,
-- refine !rec_eq_gluel ⬝p2 _ ⬝2p !natural_square_ap_fn⁻¹,
-- apply whisker001, apply whisker021,
-- apply move201, refine _ ⬝1p !eq_hconcat_hdeg_square⁻¹,
-- apply move221, refine _ ⬝1p !hdeg_square_hconcat_eq⁻¹,
-- refine ap (hconcat_eq _) !ap_inv ⬝p1 _ ⬝2p (ap (aps _) !rec_eq_gluel ⬝ !aps_eq_hconcat)⁻¹,
-- apply whisker021, refine _ ⬝2p !aps_hconcat_eq⁻¹, apply move221,
-- refine _ ⬝1p !hdeg_square_hconcat_eq⁻¹,
-- refine _ ⬝1p ap hdeg_square (eq_bot_of_square (transpose !ap02_ap_constant)),
-- apply my_cube_fillerl end end },
-- { exact abstract begin apply square_pathover,
-- refine !rec_eq_gluer ⬝p1 _ ⬝1p !natural_square_refl⁻¹,
-- refine !rec_eq_gluer ⬝p2 _ ⬝2p !natural_square_ap_fn⁻¹,
-- apply whisker001, apply whisker021,
-- apply move201, refine _ ⬝1p !eq_hconcat_hdeg_square⁻¹,
-- apply move221, refine _ ⬝1p !hdeg_square_hconcat_eq⁻¹,
-- refine ap (hconcat_eq _) !ap_inv ⬝p1 _ ⬝2p (ap (aps _) !rec_eq_gluer ⬝ !aps_eq_hconcat)⁻¹,
-- apply whisker021, refine _ ⬝2p !aps_hconcat_eq⁻¹, apply move221,
-- refine _ ⬝1p !hdeg_square_hconcat_eq⁻¹,
-- refine _ ⬝1p ap hdeg_square (eq_bot_of_square (transpose !ap02_ap_constant)),
-- apply my_cube_fillerr end end }
-- end
-- definition dsmash_functor_pcompose_pconst4 (f' : C →* E) (f : A →* C) (g : D →* F) :
-- phsquare (dsmash_functor_pcompose f' f g (pconst B D))
-- (dsmash_functor_pconst_right (f' ∘* f))
-- (dsmash_functor_phomotopy phomotopy.rfl (pcompose_pconst g))
-- (pwhisker_left (f' ⋀→ g) (dsmash_functor_pconst_right f) ⬝*
-- pcompose_pconst (f' ⋀→ g)) :=
-- begin
-- induction A with A a₀, induction B with B b₀,
-- induction E with E e₀, induction C with C c₀, induction F with F x₀, induction D with D d₀,
-- induction f' with f' f'₀, induction f with f f₀, induction g with g g₀,
-- esimp at *, induction f'₀, induction f₀, induction g₀,
-- refine !dsmash_functor_phomotopy_refl ⬝ph** _, refine _ ⬝ !refl_trans⁻¹,
-- fapply phomotopy_eq,
-- { intro x, refine eq_of_square _ ⬝ !con_idp,
-- exact dsmash_functor_pcompose_pconst4_homotopy a₀ b₀ d₀ f' f g x, },
-- { refine _ ⬝ !idp_con⁻¹,
-- refine whisker_right _ (!whisker_right_idp ⬝ !eq_of_square_hrfl_hconcat_eq) ⬝ _,
-- refine !con.assoc ⬝ _, apply con_eq_of_eq_inv_con,
-- refine whisker_right _ _ ⬝ _, rotate 1, rexact functor_gluel'2_same f' g (f a₀),
-- refine !inv_con_cancel_right ⬝ _,
-- refine !whisker_left_idp⁻¹ ⬝ _,
-- refine !con_idp ⬝ _,
-- apply whisker_left,
-- apply ap (whisker_left idp),
-- exact (!idp_con ⬝ !idp_con ⬝ !whisker_right_idp ⬝ !idp_con)⁻¹ }
-- end
-- /- a version where the left maps are identities -/
-- definition dsmash_functor_pcompose_pconst4_pid (g : D →* F) :
-- phsquare (dsmash_functor_pid_pcompose A g (pconst B D))
-- (dsmash_functor_pconst_right (pid A))
-- (dsmash_functor_phomotopy phomotopy.rfl (pcompose_pconst g))
-- (pwhisker_left (pid A ⋀→ g) (dsmash_functor_pconst_right (pid A)) ⬝*
-- pcompose_pconst (pid A ⋀→ g)) :=
-- (!dsmash_functor_phomotopy_refl ◾** idp ⬝ !refl_trans) ⬝pv**
-- dsmash_functor_pcompose_pconst4 (pid A) (pid A) g
-- /- a small rewrite of the previous -/
-- -- definition dsmash_functor_pid_pcompose_pconst' (g : D →* F) :
-- -- pwhisker_left (pid A ⋀→ g) (dsmash_functor_pconst_right (pid A)) ⬝*
-- -- pcompose_pconst (pid A ⋀→ g) =
-- -- (dsmash_functor_pid_pcompose A g (pconst B D))⁻¹* ⬝*
-- -- (dsmash_functor_phomotopy phomotopy.rfl (pcompose_pconst g) ⬝*
-- -- dsmash_functor_pconst_right (pid A)) :=
-- -- begin
-- -- apply eq_symm_trans_of_trans_eq,
-- -- exact dsmash_functor_pid_pcompose_pconst g
-- -- end
-- /- if g' is constant -/
-- definition dsmash_functor_pcompose_pconst3_homotopy [unfold 13] {A B C D E F : Type}
-- (a₀ : A) (b₀ : B) (x₀ : F) (f' : C → E) (f : A → C) (g : B → D)
-- (x : pointed.MK A a₀ ∧ pointed.MK B b₀) :
-- square (dsmash_functor_pcompose_homotopy f' f (λ a, x₀) g x)
-- idp
-- (dsmash_functor_pconst_right_homotopy (λ a, f' (f a)) x)
-- (dsmash_functor_pconst_right_homotopy f'
-- (dsmash_functor (pmap_of_map f a₀) (pmap_of_map g b₀) x)) :=
-- begin
-- induction x with a b a b,
-- { exact hrfl },
-- { exact hrfl },
-- { exact hrfl },
-- { exact abstract begin apply square_pathover,
-- refine !rec_eq_gluel ⬝p1 _ ⬝1p !natural_square_refl⁻¹,
-- refine !rec_eq_gluel ⬝p2 _ ⬝2p
-- (natural_square_compose (dsmash_functor_pconst_right_homotopy f') _ _)⁻¹ᵖ,
-- apply whisker001, apply whisker021,
-- apply move201, refine _ ⬝1p !eq_hconcat_hdeg_square⁻¹,
-- apply move221, refine _ ⬝1p !hdeg_square_hconcat_eq⁻¹,
-- refine ap (hconcat_eq _) !ap_inv ⬝p1 _ ⬝2p (natural_square_eq2 _ !functor_gluel2)⁻¹ᵖ,
-- apply whisker021,
-- refine _ ⬝1p ap hdeg_square (eq_of_square (!ap_constant_compose⁻¹ʰ) ⬝ !idp_con)⁻¹,
-- apply move221, refine _ ⬝1p !hdeg_square_hconcat_eq⁻¹,
-- refine _ ⬝2p !rec_eq_gluel⁻¹, apply whisker021,
-- apply move221, refine _ ⬝1p !hdeg_square_hconcat_eq⁻¹,
-- refine _ ⬝1p ap hdeg_square (eq_bot_of_square (transpose !ap02_constant)),
-- exact rfl2 end end },
-- { exact abstract begin apply square_pathover,
-- refine !rec_eq_gluer ⬝p1 _ ⬝1p !natural_square_refl⁻¹,
-- refine !rec_eq_gluer ⬝p2 _ ⬝2p
-- (natural_square_compose (dsmash_functor_pconst_right_homotopy f') _ _)⁻¹ᵖ,
-- apply whisker001, apply whisker021,
-- apply move201, refine _ ⬝1p !eq_hconcat_hdeg_square⁻¹,
-- apply move221, refine _ ⬝1p !hdeg_square_hconcat_eq⁻¹,
-- refine ap (hconcat_eq _) !ap_inv ⬝p1 _ ⬝2p (natural_square_eq2 _ !functor_gluer2)⁻¹ᵖ,
-- apply whisker021,
-- refine _ ⬝1p ap hdeg_square (eq_of_square (!ap_constant_compose⁻¹ʰ) ⬝ !idp_con)⁻¹,
-- apply move221, refine _ ⬝1p !hdeg_square_hconcat_eq⁻¹,
-- refine _ ⬝2p !rec_eq_gluer⁻¹, apply whisker021,
-- apply move221, refine _ ⬝1p !hdeg_square_hconcat_eq⁻¹,
-- refine _ ⬝1p ap hdeg_square (eq_bot_of_square (transpose !ap02_constant)),
-- exact rfl2 end end },
-- end
-- definition dsmash_functor_pcompose_pconst3 (f' : C →* E) (f : A →* C) (g : Πa, B a →* D (f a)) :
-- phsquare (dsmash_functor_pcompose f' f (pconst D F) g)
-- (dsmash_functor_pconst_right (f' ∘* f))
-- (dsmash_functor_phomotopy phomotopy.rfl (pconst_pcompose g))
-- (pwhisker_right (f ⋀→ g) (dsmash_functor_pconst_right f') ⬝*
-- pconst_pcompose (f ⋀→ g)) :=
-- begin
-- induction A with A a₀, induction B with B b₀,
-- induction E with E e₀, induction C with C c₀, induction F with F x₀, induction D with D d₀,
-- induction f' with f' f'₀, induction f with f f₀, induction g with g g₀,
-- esimp at *, induction f'₀, induction f₀, induction g₀,
-- refine !dsmash_functor_phomotopy_refl ⬝ph** _, refine _ ⬝ !refl_trans⁻¹,
-- fapply phomotopy_eq,
-- { intro x, refine eq_of_square (dsmash_functor_pcompose_pconst3_homotopy a₀ b₀ x₀ f' f g x) },
-- { refine whisker_right _ (!whisker_right_idp ⬝ !eq_of_square_hrfl) ⬝ _,
-- have H : Π{A : Type} {a a' : A} (p : a = a'),
-- idp_con (p ⬝ p⁻¹) ⬝ con.right_inv p = idp ⬝
-- whisker_left idp (idp ⬝ (idp ⬝ proof whisker_right idp (idp_con (p ⬝ p⁻¹ᵖ))⁻¹ᵖ qed ⬝
-- whisker_left idp (con.right_inv p))), by intros; induction p; reflexivity,
-- rexact H (gluel (f' (f a₀))) }
-- end
-- /- a version where the left maps are identities -/
-- definition dsmash_functor_pcompose_pconst3_pid (g : Πa, B a →* D (f a)) :
-- phsquare (dsmash_functor_pid_pcompose A (pconst D F) g)
-- (dsmash_functor_pconst_right (pid A))
-- (dsmash_functor_phomotopy phomotopy.rfl (pconst_pcompose g))
-- (pwhisker_right (pid A ⋀→ g) (dsmash_functor_pconst_right (pid A)) ⬝*
-- pconst_pcompose (pid A ⋀→ g)) :=
-- (!dsmash_functor_phomotopy_refl ◾** idp ⬝ !refl_trans) ⬝pv**
-- dsmash_functor_pcompose_pconst3 (pid A) (pid A) g
-- /- Using these lemmas we show that dsmash_functor_right is natural in all arguments -/
-- definition dsmash_functor_right_natural_right (A B : Type*) (f : C →* C') :
-- psquare (dsmash_functor_right A B C) (dsmash_functor_right A B C')
-- (ppcompose_left f) (ppcompose_left (pid A ⋀→ f)) :=
-- begin
-- refine _⁻¹*,
-- fapply phomotopy_mk_ppmap,
-- { exact dsmash_functor_pid_pcompose A f },
-- { refine idp ◾** (!phomotopy_of_eq_con ⬝ (ap phomotopy_of_eq !pcompose_left_eq_of_phomotopy ⬝
-- !phomotopy_of_eq_of_phomotopy) ◾** !phomotopy_of_eq_of_phomotopy) ⬝ _ ,
-- refine _ ⬝ (!phomotopy_of_eq_con ⬝ (ap phomotopy_of_eq !dsmash_functor_eq_of_phomotopy ⬝
-- !phomotopy_of_eq_of_phomotopy) ◾** !phomotopy_of_eq_of_phomotopy)⁻¹,
-- apply dsmash_functor_pcompose_pconst4_pid }
-- end
-- definition dsmash_functor_right_natural_middle (A C : Type*) (f : B' →* B) :
-- psquare (dsmash_functor_right A B C) (dsmash_functor_right A B' C)
-- (ppcompose_right f) (ppcompose_right (pid A ⋀→ f)) :=
-- begin
-- refine _⁻¹*,
-- fapply phomotopy_mk_ppmap,
-- { intro g, exact dsmash_functor_pid_pcompose A g f },
-- { refine idp ◾** (!phomotopy_of_eq_con ⬝ (ap phomotopy_of_eq !pcompose_right_eq_of_phomotopy ⬝
-- !phomotopy_of_eq_of_phomotopy) ◾** !phomotopy_of_eq_of_phomotopy) ⬝ _ ,
-- refine _ ⬝ (!phomotopy_of_eq_con ⬝ (ap phomotopy_of_eq !dsmash_functor_eq_of_phomotopy ⬝
-- !phomotopy_of_eq_of_phomotopy) ◾** !phomotopy_of_eq_of_phomotopy)⁻¹,
-- apply dsmash_functor_pcompose_pconst3_pid }
-- end
-- definition dsmash_functor_right_natural_left (B C : Type*) (f : A →* A') :
-- psquare (dsmash_functor_right A B C) (ppcompose_right (f ⋀→ (pid B)))
-- (dsmash_functor_right A' B C) (ppcompose_left (f ⋀→ (pid C))) :=
-- begin
-- refine _⁻¹*,
-- fapply phomotopy_mk_ppmap,
-- { intro g, exact dsmash_functor_psquare proof phomotopy.rfl qed proof phomotopy.rfl qed },
-- { esimp,
-- refine idp ◾** (!phomotopy_of_eq_con ⬝ (ap phomotopy_of_eq !pcompose_left_eq_of_phomotopy ⬝
-- !phomotopy_of_eq_of_phomotopy) ◾** !phomotopy_of_eq_of_phomotopy) ⬝ _ ,
-- refine _ ⬝ (!phomotopy_of_eq_con ⬝ (ap phomotopy_of_eq !pcompose_right_eq_of_phomotopy ⬝
-- !phomotopy_of_eq_of_phomotopy) ◾** !phomotopy_of_eq_of_phomotopy)⁻¹,
-- apply eq_of_phsquare,
-- refine (phmove_bot_of_left _ !dsmash_functor_pcompose_pconst3⁻¹ʰ**) ⬝h**
-- (!dsmash_functor_phomotopy_refl ⬝pv** !phhrfl) ⬝h** !dsmash_functor_pcompose_pconst4 ⬝vp** _,
-- refine !trans_assoc ⬝ !trans_assoc ⬝ idp ◾** _ ⬝ !trans_refl,
-- refine idp ◾** !refl_trans ⬝ !trans_left_inv }
-- end
-- /- ⋀ B ≃* pcofiber (pprod_of_wedge A B) -/
-- variables (A B)
-- open pushout
-- definition dsmash_equiv_cofiber : ⋀ B ≃ cofiber (@prod_of_wedge A B) :=
-- begin
-- unfold [dsmash, cofiber, dsmash'], symmetry,
-- fapply pushout_vcompose_equiv wedge_of_sum,
-- { symmetry, refine equiv_unit_of_is_contr _ _, apply is_contr_pushout_wedge_of_sum },
-- { intro x, reflexivity },
-- { apply prod_of_wedge_of_sum }
-- end
-- definition dsmash_punit_pequiv [constructor] : dsmash A punit ≃* punit :=
-- begin
-- apply pequiv_punit_of_is_contr,
-- apply is_contr.mk (dsmash.mk pt ⋆), intro x,
-- induction x,
-- { induction b, exact gluel' pt a },
-- { exact gluel pt },
-- { exact gluer pt },
-- { apply eq_pathover_constant_left_id_right, apply square_of_eq_top,
-- exact whisker_right _ !idp_con⁻¹ },
-- { apply eq_pathover_constant_left_id_right, induction b,
-- refine !con.right_inv ⬝pv _, exact square_of_eq idp },
-- end
-- definition pprod_of_wedge [constructor] : wedge A B →* A ×* B :=
-- begin
-- fconstructor,
-- { exact prod_of_wedge },
-- { reflexivity }
-- end
-- definition dsmash_pequiv_pcofiber [constructor] : ⋀ B ≃* pcofiber (pprod_of_wedge A B) :=
-- begin
-- apply pequiv_of_equiv (dsmash_equiv_cofiber A B),
-- exact cofiber.glue pt
-- end
-- variables {A B}
-- /- commutativity -/
-- definition dsmash_flip' [unfold 3] (x : ⋀ B) : dsmash B A :=
-- begin
-- induction x,
-- { exact dsmash.mk b a },
-- { exact auxr },
-- { exact auxl },
-- { exact gluer a },
-- { exact gluel b }
-- end
-- definition dsmash_flip_dsmash_flip' [unfold 3] (x : ⋀ B) : dsmash_flip' (dsmash_flip' x) = x :=
-- begin
-- induction x,
-- { reflexivity },
-- { reflexivity },
-- { reflexivity },
-- { apply eq_pathover_id_right,
-- refine ap_compose dsmash_flip' _ _ ⬝ ap02 _ !elim_gluel ⬝ !elim_gluer ⬝ph _,
-- apply hrfl },
-- { apply eq_pathover_id_right,
-- refine ap_compose dsmash_flip' _ _ ⬝ ap02 _ !elim_gluer ⬝ !elim_gluel ⬝ph _,
-- apply hrfl }
-- end
-- variables (A B)
-- definition dsmash_flip [constructor] : ⋀ B →* dsmash B A :=
-- pmap.mk dsmash_flip' idp
-- definition dsmash_flip_dsmash_flip [constructor] :
-- dsmash_flip B A ∘* dsmash_flip A B ~* pid (⋀ B) :=
-- phomotopy.mk dsmash_flip_dsmash_flip' idp
-- definition dsmash_comm [constructor] : ⋀ B ≃* dsmash B A :=
-- begin
-- apply pequiv.MK, do 2 apply dsmash_flip_dsmash_flip
-- end
-- variables {A B}
-- definition dsmash_flip_dsmash_functor' [unfold 7] (f : A →* C) (g : Πa, B a →* D (f a)) : hsquare
-- dsmash_flip' dsmash_flip' (dsmash_functor' f g) (dsmash_functor' g f) :=
-- begin
-- intro x, induction x,
-- { reflexivity },
-- { reflexivity },
-- { reflexivity },
-- { apply eq_pathover,
-- refine ap_compose (dsmash_functor' _ _) _ _ ⬝ ap02 _ !elim_gluel ⬝ !functor_gluer ⬝ph _
-- ⬝hp (ap_compose dsmash_flip' _ _ ⬝ ap02 _ !functor_gluel)⁻¹ᵖ,
-- refine _ ⬝hp (!ap_con ⬝ !ap_compose' ◾ !elim_gluel)⁻¹, exact hrfl },
-- { apply eq_pathover,
-- refine ap_compose (dsmash_functor' _ _) _ _ ⬝ ap02 _ !elim_gluer ⬝ !functor_gluel ⬝ph _
-- ⬝hp (ap_compose dsmash_flip' _ _ ⬝ ap02 _ !functor_gluer)⁻¹ᵖ,
-- refine _ ⬝hp (!ap_con ⬝ !ap_compose' ◾ !elim_gluer)⁻¹, exact hrfl },
-- end
-- definition dsmash_flip_dsmash_functor (f : A →* C) (g : Πa, B a →* D (f a)) :
-- psquare (dsmash_flip A B) (dsmash_flip C D) (f ⋀→ g) (g ⋀→ f) :=
-- begin
-- apply phomotopy.mk (dsmash_flip_dsmash_functor' f g), refine !idp_con ⬝ _ ⬝ !idp_con⁻¹,
-- refine !ap_ap011 ⬝ _, apply ap011_flip,
-- end
definition pinr [constructor] (B : A → Type*) (a : A) : B a →* ⋀ B :=
begin
fapply pmap.mk,
{ intro b, exact dsmash.mk a b },
{ exact gluel' a pt }
end
definition pinl [constructor] (b : Πa, B a) : A →* ⋀ B :=
begin
fapply pmap.mk,
{ intro a, exact dsmash.mk a (b a) },
{ exact gluer' (b pt) pt }
end
-- definition pinr_phomotopy {a a' : A} (p : a = a') : pinr B a ~* pinr B a' :=
-- begin
-- fapply phomotopy.mk,
-- { exact ap010 (pmap.to_fun ∘ pinr B) p },
-- { induction p, apply idp_con }
-- end
definition dsmash_pmap_unit_pt [constructor] (B : A → Type*) : pinr B pt ~* pconst (B pt) (⋀ B) :=
begin
fapply phomotopy.mk,
{ intro b, exact gluer' b pt },
{ rexact con.right_inv (gluer pt) ⬝ (con.right_inv (gluel pt))⁻¹ }
end
definition dsmash_pmap_unit [constructor] (B : A → Type*) : Π*(a : A), B a →** ⋀ B :=
begin
fapply ppi.mk,
{ exact pinr B },
{ apply eq_of_phomotopy, exact dsmash_pmap_unit_pt B }
end
/- The unit is natural in the first argument -/
definition dsmash_functor_pid_pinr' [constructor] (B : A' → Type*) (f : A →* A') (a : A) :
pinr B (f a) ~* (f ⋀→ λa, !pid) ∘* pinr (B ∘ f) a :=
begin
fapply phomotopy.mk,
{ intro b, reflexivity },
{ refine !idp_con ⬝ _,
induction A' with A' a₀', induction f with f f₀, esimp at *,
induction f₀, exact sorry }
end
-- definition dsmash_pmap_unit_pt_natural [constructor] (B : A → Type*) (f : A →* A') :
-- dsmash_functor_pid_pinr' B f pt ⬝*
-- pwhisker_left (f ⋀→ λa, !pid) (dsmash_pmap_unit_pt A B) ⬝*
-- pcompose_pconst (f ⋀→ λa, !pid) =
-- _ /-pinr_phomotopy (respect_pt f)-/ ⬝* dsmash_pmap_unit_pt A' B :=
-- begin
-- induction f with f f₀, induction A' with A' a₀', esimp at *,
-- induction f₀, refine _ ⬝ !refl_trans⁻¹,
-- refine !trans_refl ⬝ _,
-- fapply phomotopy_eq',
-- { intro b, refine !idp_con ⬝ _,
-- rexact functor_gluer'2 f (pid B) b pt },
-- { refine whisker_right_idp _ ⬝ph _,
-- refine ap (λx, _ ⬝ x) _ ⬝ph _,
-- rotate 1, rexact (functor_gluer'2_same f (pid B) pt),
-- refine whisker_right _ !idp_con ⬝pv _,
-- refine !con.assoc⁻¹ ⬝ph _, apply whisker_bl,
-- refine whisker_left _ !to_homotopy_pt_mk ⬝pv _,
-- refine !con.assoc⁻¹ ⬝ whisker_right _ _ ⬝pv _,
-- rotate 1, esimp, apply whisker_left_idp_con,
-- refine !con.assoc ⬝pv _, apply whisker_tl,
-- refine whisker_right _ !idp_con ⬝pv _,
-- refine whisker_right _ !whisker_right_idp ⬝pv _,
-- refine whisker_right _ (!idp_con ⬝ !ap02_con) ⬝ !con.assoc ⬝pv _,
-- apply whisker_tl,
-- apply vdeg_square,
-- refine whisker_right _ !ap_inv ⬝ _, apply inv_con_eq_of_eq_con,
-- rexact functor_gluel'2_same (pmap_of_map f pt) (pmap_of_map id (Point B)) pt }
-- end
-- definition dsmash_pmap_unit_natural (B : A' → Type*) (f : A →* A') :
-- psquare (dsmash_pmap_unit (B ∘ f)) (dsmash_pmap_unit B) f _ := --(ppcompose_left (f ⋀→ pid B))
-- begin
-- apply ptranspose,
-- induction A with A a₀, induction B with B b₀, induction A' with A' a₀',
-- induction f with f f₀, esimp at *, induction f₀, fapply phomotopy_mk_ppmap,
-- { intro a, exact dsmash_functor_pid_pinr' _ (pmap_of_map f a₀) a },
-- { refine ap (λx, _ ⬝* phomotopy_of_eq x) !respect_pt_pcompose ⬝ _
-- ⬝ ap phomotopy_of_eq !respect_pt_pcompose⁻¹,
-- esimp, refine _ ⬝ ap phomotopy_of_eq !idp_con⁻¹,
-- refine _ ⬝ !phomotopy_of_eq_of_phomotopy⁻¹,
-- refine ap (λx, _ ⬝* phomotopy_of_eq (x ⬝ _)) !pcompose_left_eq_of_phomotopy ⬝ _,
-- refine ap (λx, _ ⬝* x) (!phomotopy_of_eq_con ⬝
-- !phomotopy_of_eq_of_phomotopy ◾** !phomotopy_of_eq_of_phomotopy ⬝ !trans_refl) ⬝ _,
-- refine _ ⬝ dsmash_pmap_unit_pt_natural _ (pmap_of_map f a₀) ⬝ _,
-- { exact !trans_refl⁻¹ },
-- { exact !refl_trans }}
-- end
/- The unit is also dinatural in the first argument, but that's easier to prove after the adjunction.
We don't need it for the adjunction -/
/- The unit-counit laws -/
-- definition dsmash_pmap_unit_counit (B : A → Type*) :
-- dsmash_pmap_counit B (⋀ B) ∘* dsmash_pmap_unit A B ⋀→ pid B ~* pid (⋀ B) :=
-- begin
-- fapply phomotopy.mk,
-- { intro x,
-- induction x with a b a b,
-- { reflexivity },
-- { exact gluel pt },
-- { exact gluer pt },
-- { apply eq_pathover_id_right,
-- refine ap_compose dsmash_pmap_counit_map _ _ ⬝ ap02 _ !functor_gluel ⬝ph _,
-- refine !ap_con ⬝ !ap_compose' ◾ !elim_gluel ⬝ph _,
-- refine !idp_con ⬝ph _,
-- apply square_of_eq, refine !idp_con ⬝ !inv_con_cancel_right⁻¹ },
-- { apply eq_pathover_id_right,
-- refine ap_compose dsmash_pmap_counit_map _ _ ⬝ ap02 _ !functor_gluer ⬝ph _,
-- refine !ap_con ⬝ !ap_compose' ◾ !elim_gluer ⬝ph _,
-- refine !ap_eq_of_phomotopy ⬝ph _,
-- apply square_of_eq, refine !idp_con ⬝ !inv_con_cancel_right⁻¹ }},
-- { refine _ ⬝ !ap_compose, refine _ ⬝ (ap_is_constant respect_pt _)⁻¹,
-- rexact (con.right_inv (gluel pt))⁻¹ }
-- end
-- definition dsmash_pmap_counit_unit_pt [constructor] (f : A →* B) :
-- dsmash_pmap_counit A B ∘* pinr A f ~* f :=
-- begin
-- fapply phomotopy.mk,
-- { intro a, reflexivity },
-- { refine !idp_con ⬝ !elim_gluel'⁻¹ }
-- end
-- definition dsmash_pmap_counit_unit (B : A → Type*) :
-- ppcompose_left (dsmash_pmap_counit A B) ∘* dsmash_pmap_unit (ppmap A B) A ~* pid (ppmap A B) :=
-- begin
-- fapply phomotopy_mk_ppmap,
-- { intro f, exact dsmash_pmap_counit_unit_pt f },
-- { refine !trans_refl ⬝ _,
-- refine _ ⬝ ap (λx, phomotopy_of_eq (x ⬝ _)) !pcompose_left_eq_of_phomotopy⁻¹,
-- refine _ ⬝ !phomotopy_of_eq_con⁻¹,
-- refine _ ⬝ !phomotopy_of_eq_of_phomotopy⁻¹ ◾** !phomotopy_of_eq_of_phomotopy⁻¹,
-- refine _ ⬝ !trans_refl⁻¹,
-- fapply phomotopy_eq,
-- { intro a, esimp, refine !elim_gluer'⁻¹ },
-- { esimp, refine whisker_right _ !whisker_right_idp ⬝ _ ⬝ !idp_con⁻¹,
-- refine whisker_right _ !elim_gluer'_same⁻² ⬝ _ ⬝ !elim_gluel'_same⁻¹⁻²,
-- apply inv_con_eq_of_eq_con, refine !idp_con ⬝ _, esimp,
-- refine _ ⬝ !ap02_con ⬝ whisker_left _ !ap_inv,
-- refine !whisker_right_idp ⬝ _,
-- exact !idp_con }}
-- end
/- The underlying (unpointed) functions of the equivalence A →* (B →* C) ≃* ⋀ B →* C) -/
-- definition dsmash_elim [constructor] (f : Π*(a : A), ppmap (B a) C) : ⋀ B →* C :=
-- smash.smash_pmap_counit _ C ∘* _ /-f ⋀→ pid B_-/
-- definition dsmash_elim_inv [constructor] (g : ⋀ B →* C) : A →* ppmap B C :=
-- ppcompose_left g ∘* dsmash_pmap_unit A B
-- /- They are inverses, constant on the constant function and natural -/
-- definition dsmash_elim_left_inv (f : A →* ppmap B C) : dsmash_elim_inv (dsmash_elim f) ~* f :=
-- begin
-- refine !pwhisker_right !ppcompose_left_pcompose ⬝* _,
-- refine !passoc ⬝* _,
-- refine !pwhisker_left !dsmash_pmap_unit_natural ⬝* _,
-- refine !passoc⁻¹* ⬝* _,
-- refine !pwhisker_right !dsmash_pmap_counit_unit ⬝* _,
-- apply pid_pcompose
-- end
-- definition dsmash_elim_right_inv (g : ⋀ B →* C) : dsmash_elim (dsmash_elim_inv g) ~* g :=
-- begin
-- refine !pwhisker_left !dsmash_functor_pcompose_pid ⬝* _,
-- refine !passoc⁻¹* ⬝* _,
-- refine !pwhisker_right !dsmash_pmap_counit_natural_right⁻¹* ⬝* _,
-- refine !passoc ⬝* _,
-- refine !pwhisker_left !dsmash_pmap_unit_counit ⬝* _,
-- apply pcompose_pid
-- end
-- definition dsmash_elim_pconst (B : A → Type*) (C : Type*) :
-- dsmash_elim (pconst A (ppmap B C)) ~* pconst (⋀ B) C :=
-- begin
-- refine pwhisker_left _ (dsmash_functor_pconst_left (pid B)) ⬝* !pcompose_pconst
-- end
-- definition dsmash_elim_inv_pconst (B : A → Type*) (C : Type*) :
-- dsmash_elim_inv (pconst (⋀ B) C) ~* pconst A (ppmap B C) :=
-- begin
-- fapply phomotopy_mk_ppmap,
-- { intro f, apply pconst_pcompose },
-- { esimp, refine !trans_refl ⬝ _,
-- refine _ ⬝ (!phomotopy_of_eq_con ⬝ (ap phomotopy_of_eq !pcompose_left_eq_of_phomotopy ⬝
-- !phomotopy_of_eq_of_phomotopy) ◾** !phomotopy_of_eq_of_phomotopy)⁻¹,
-- apply pconst_pcompose_phomotopy_pconst }
-- end
-- definition dsmash_elim_natural_right (f : C →* C') (g : A →* ppmap B C) :
-- f ∘* dsmash_elim g ~* dsmash_elim (ppcompose_left f ∘* g) :=
-- begin
-- refine _ ⬝* pwhisker_left _ !dsmash_functor_pcompose_pid⁻¹*,
-- refine !passoc⁻¹* ⬝* pwhisker_right _ _ ⬝* !passoc,
-- apply dsmash_pmap_counit_natural_right
-- end
-- definition dsmash_elim_inv_natural_right {A B C C' : Type*} (f : C →* C')
-- (g : ⋀ B →* C) : ppcompose_left f ∘* dsmash_elim_inv g ~* dsmash_elim_inv (f ∘* g) :=
-- begin
-- refine !passoc⁻¹* ⬝* pwhisker_right _ _,
-- exact !ppcompose_left_pcompose⁻¹*
-- end
-- definition dsmash_elim_natural_left (f : A →* A') (g : B →* B') (h : A' →* ppmap B' C) :
-- dsmash_elim h ∘* (f ⋀→ g) ~* dsmash_elim (ppcompose_right g ∘* h ∘* f) :=
-- begin
-- refine !dsmash_functor_pcompose_pid ⬝ph* _,
-- refine _ ⬝v* !dsmash_pmap_counit_natural_left,
-- refine dsmash_functor_psquare !pid_pcompose⁻¹* (phrefl g)
-- end
-- definition dsmash_elim_phomotopy {f f' : A →* ppmap B C} (p : f ~* f') :
-- dsmash_elim f ~* dsmash_elim f' :=
-- begin
-- apply pwhisker_left,
-- exact dsmash_functor_phomotopy p phomotopy.rfl
-- end
-- definition dsmash_elim_inv_phomotopy {f f' : ⋀ B →* C} (p : f ~* f') :
-- dsmash_elim_inv f ~* dsmash_elim_inv f' :=
-- pwhisker_right _ (ppcompose_left_phomotopy p)
-- definition dsmash_elim_eq_of_phomotopy {f f' : A →* ppmap B C} (p : f ~* f') :
-- ap dsmash_elim (eq_of_phomotopy p) = eq_of_phomotopy (dsmash_elim_phomotopy p) :=
-- begin
-- induction p using phomotopy_rec_idp,
-- refine ap02 _ !eq_of_phomotopy_refl ⬝ _,
-- refine !eq_of_phomotopy_refl⁻¹ ⬝ _,
-- apply ap eq_of_phomotopy,
-- refine _ ⬝ ap (pwhisker_left _) !dsmash_functor_phomotopy_refl⁻¹,
-- refine !pwhisker_left_refl⁻¹
-- end
-- definition dsmash_elim_inv_eq_of_phomotopy {f f' : ⋀ B →* C} (p : f ~* f') :
-- ap dsmash_elim_inv (eq_of_phomotopy p) = eq_of_phomotopy (dsmash_elim_inv_phomotopy p) :=
-- begin
-- induction p using phomotopy_rec_idp,
-- refine ap02 _ !eq_of_phomotopy_refl ⬝ _,
-- refine !eq_of_phomotopy_refl⁻¹ ⬝ _,
-- apply ap eq_of_phomotopy,
-- refine _ ⬝ ap (pwhisker_right _) !ppcompose_left_phomotopy_refl⁻¹,
-- refine !pwhisker_right_refl⁻¹
-- end
/- The pointed maps of the equivalence A →* (B →* C) ≃* ⋀ B →* C -/
-- definition dsmash_pelim : (Π*(a : A), ppmap (B a) C) →* ppmap (⋀ B) C :=
-- ppcompose_left (smash.smash_pmap_counit (B pt) C) ∘* sorry
-- -- ppcompose_left (smash_pmap_counit B C) ∘* dsmash_functor_left A (ppmap B C) B
-- open smash
-- definition smash_pelim_inv (B : A → Type*) (C : Type*) :
-- ppmap (A ∧ B) C →* ppmap A (ppmap B C) :=
-- ppcompose_right (smash_pmap_unit A B) ∘* pppcompose B (A ∧ B) C
-- -- definition smash_pelim_inv : ppmap (⋀ B) C →* Π*a, ppmap (B a) C :=
-- -- _ ∘* pppcompose _ (⋀ B) C --ppcompose_right (smash_pmap_unit A B) ∘* pppcompose B (A ∧ B) C
-- /- The forward function is natural in all three arguments -/
-- definition dsmash_pelim_natural_left (B C : Type*) (f : A' →* A) :
-- psquare (dsmash_pelim A B C) (dsmash_pelim A' B C)
-- (ppcompose_right f) (ppcompose_right (f ⋀→ pid B)) :=
-- dsmash_functor_left_natural_left (ppmap B C) B f ⬝h* !ppcompose_left_ppcompose_right
-- definition dsmash_pelim_natural_middle (A C : Type*) (f : B' →* B) :
-- psquare (dsmash_pelim A B C) (dsmash_pelim A B' C)
-- (ppcompose_left (ppcompose_right f)) (ppcompose_right (pid A ⋀→ f)) :=
-- pwhisker_tl _ !ppcompose_left_ppcompose_right ⬝*
-- (!dsmash_functor_left_natural_right⁻¹* ⬝pv*
-- dsmash_functor_left_natural_middle _ _ (ppcompose_right f) ⬝h*
-- ppcompose_left_psquare !dsmash_pmap_counit_natural_left)
-- definition dsmash_pelim_natural_right (B : A → Type*) (f : C →* C') :
-- psquare (dsmash_pelim A B C) (dsmash_pelim A B C')
-- (ppcompose_left (ppcompose_left f)) (ppcompose_left f) :=
-- dsmash_functor_left_natural_middle _ _ (ppcompose_left f) ⬝h*
-- ppcompose_left_psquare (dsmash_pmap_counit_natural_right _ f)
-- definition dsmash_pelim_natural_lm (C : Type*) (f : A' →* A) (g : B' →* B) :
-- psquare (dsmash_pelim A B C) (dsmash_pelim A' B' C)
-- (ppcompose_left (ppcompose_right g) ∘* ppcompose_right f) (ppcompose_right (f ⋀→ g)) :=
-- dsmash_pelim_natural_left B C f ⬝v* dsmash_pelim_natural_middle A' C g ⬝hp*
-- ppcompose_right_phomotopy (dsmash_functor_split f g) ⬝* !ppcompose_right_pcompose
-- definition dsmash_pelim_pid (B C : Type*) :
-- dsmash_pelim (ppmap B C) B C !pid ~* dsmash_pmap_counit B C :=
-- pwhisker_left _ !dsmash_functor_pid ⬝* !pcompose_pid
-- definition dsmash_pelim_inv_pid (B : A → Type*) :
-- dsmash_pelim_inv A B (⋀ B) !pid ~* dsmash_pmap_unit A B :=
-- pwhisker_right _ !ppcompose_left_pid ⬝* !pid_pcompose
-- /- The equivalence (note: the forward function of dsmash_adjoint_pmap is dsmash_pelim_inv) -/
-- definition is_equiv_dsmash_elim [constructor] (B : A → Type*) (C : Type*) : is_equiv (@dsmash_elim A B C) :=
-- begin
-- fapply adjointify,
-- { exact dsmash_elim_inv },
-- { intro g, apply eq_of_phomotopy, exact dsmash_elim_right_inv g },
-- { intro f, apply eq_of_phomotopy, exact dsmash_elim_left_inv f }
-- end
-- definition dsmash_adjoint_pmap_inv [constructor] (B : A → Type*) (C : Type*) :
-- ppmap A (ppmap B C) ≃* ppmap (⋀ B) C :=
-- pequiv_of_pmap (dsmash_pelim A B C) (is_equiv_dsmash_elim A B C)
definition dsmash_pelim_fn_fn [constructor] (f : ⋀ B →* C) (a : A) : B a →* C :=
pmap.mk (λb, f (dsmash.mk a b)) (ap f (gluel' a pt) ⬝ respect_pt f)
definition dsmash_pelim_fn [constructor] (f : ⋀ B →* C) : dbpmap B (λa, C) :=
begin
fapply dbpmap.mk (dsmash_pelim_fn_fn f),
{ intro b, exact ap f (gluer' b pt) ⬝ respect_pt f },
{ apply whisker_right, apply ap02, exact !con.right_inv ⬝ !con.right_inv⁻¹ }
end
definition dsmash_pelim_pmap [constructor] (B : A → Type*) (C : Type*) :
ppmap (⋀ B) C →* dbppmap B (λa, C) :=
begin
apply pmap.mk dsmash_pelim_fn,
fapply dbpmap_eq,
{ intro a, exact phomotopy.mk homotopy.rfl !ap_constant⁻¹ },
{ intro b, exact !ap_constant ⬝pv ids },
{ esimp, esimp [whisker_right], exact sorry }
end
definition dsmash_pelim_pequiv [constructor] (B : A → Type*) (C : Type*) :
ppmap (⋀ B) C ≃* dbppmap B (λa, C) :=
sorry
set_option pp.binder_types true
open is_trunc
/- we could also use pushout_arrow_equiv -/
definition dsmash_arrow_equiv [constructor] (B : A → Type*) (C : Type) :
(⋀ B → C) ≃ Σ(f : Πa, B a → C) (c₁ : C) (c₀ : C), (Πa, f a pt = c₀) × (Πb, f pt b = c₁) :=
begin
fapply equiv.MK,
{ intro f, exact ⟨λa b, f (dsmash.mk a b), f auxr, f auxl, (λa, ap f (gluel a), λb, ap f (gluer b))⟩ },
{ intro x, exact dsmash.elim x.1 x.2.2.1 x.2.1 x.2.2.2.1 x.2.2.2.2 },
{ intro x, induction x with f x, induction x with c₁ x, induction x with c₀ x, induction x with p₁ p₂,
apply ap (dpair _), apply ap (dpair _), apply ap (dpair _), esimp,
exact pair_eq (eq_of_homotopy (elim_gluel _ _)) (eq_of_homotopy (elim_gluer _ _)) },
{ intro f, apply eq_of_homotopy, intro x, induction x, reflexivity, reflexivity, reflexivity,
apply eq_pathover, apply hdeg_square, apply elim_gluel,
apply eq_pathover, apply hdeg_square, apply elim_gluer }
end
definition dsmash_arrow_equiv_inv_pt [constructor]
(x : Σ(f : Πa, B a → C) (c₁ : C) (c₀ : C), (Πa, f a pt = c₀) × (Πb, f pt b = c₁)) :
to_inv (dsmash_arrow_equiv B C) x pt = x.1 pt pt :=
by reflexivity
open pi
definition dsmash_pelim_equiv (B : A → Type*) (C : Type*) :
ppmap (⋀ B) C ≃ dbppmap B (λa, C) :=
begin
refine !pmap.sigma_char ⬝e _,
refine sigma_equiv_sigma_left !dsmash_arrow_equiv ⬝e _,
refine sigma_equiv_sigma_right (λx, equiv_eq_closed_left _ (dsmash_arrow_equiv_inv_pt x)) ⬝e _,
refine !sigma_assoc_equiv ⬝e _,
refine sigma_equiv_sigma_right (λf, !sigma_assoc_equiv ⬝e
sigma_equiv_sigma_right (λc₁, !sigma_assoc_equiv ⬝e
sigma_equiv_sigma_right (λc₂, sigma_equiv_sigma_left !sigma.equiv_prod⁻¹ᵉ ⬝e
!sigma_assoc_equiv) ⬝e
sigma_assoc_equiv_left _ (sigma_homotopy_constant_equiv pt (λa, f a pt))⁻¹ᵉ ⬝e
sigma_equiv_sigma_right (λh₁, !sigma_comm_equiv) ⬝e !sigma_comm_equiv) ⬝e
sigma_assoc_equiv_left _ (sigma_homotopy_constant_equiv pt (f pt))⁻¹ᵉ ⬝e
sigma_equiv_sigma_right (λh₂,
sigma_equiv_sigma_right (λr₂,
2018-09-20 14:03:59 +00:00
sigma_equiv_sigma_right (λh₁, !comm_equiv_constant) ⬝e !sigma_comm_equiv) ⬝e
!sigma_comm_equiv) ⬝e
!sigma_comm_equiv ⬝e
sigma_equiv_sigma_right (λr,
sigma_equiv_sigma_left (pi_equiv_pi_right (λb, equiv_eq_closed_right _ r)) ⬝e
sigma_equiv_sigma_right (λh₂,
sigma_equiv_sigma !eq_equiv_con_inv_eq_idp⁻¹ᵉ (λr₂,
sigma_equiv_sigma_left (pi_equiv_pi_right (λa, equiv_eq_closed_right _ r)) ⬝e
sigma_equiv_sigma_right (λh₁, !eq_equiv_con_inv_eq_idp⁻¹ᵉ)) ⬝e
!sigma_comm_equiv ⬝e
2018-09-20 14:03:59 +00:00
sigma_equiv_sigma_right (λh₁, !comm_equiv_constant)) ⬝e
!sigma_comm_equiv) ⬝e
!sigma_comm_equiv ⬝e sigma_equiv_sigma_right (λh₁,
!sigma_comm_equiv ⬝e sigma_equiv_sigma_right (λh₂,
!sigma_sigma_eq_right))) ⬝e _,
refine !sigma_assoc_equiv' ⬝e _,
refine sigma_equiv_sigma_left (@sigma_pi_equiv_pi_sigma _ _ (λa f, f pt = pt) ⬝e
pi_equiv_pi_right (λa, !pmap.sigma_char⁻¹ᵉ)) ⬝e _,
exact !dbpmap.sigma_char⁻¹ᵉ
end
definition dsmash_pelim_equiv' (B : A → Type*) (C : Type*) :
ppmap (⋀ B) C ≃ Π*a, B a →** C :=
dsmash_pelim_equiv B C ⬝e (ppi_equiv_dbpmap B (λa, C))⁻¹ᵉ
end dsmash