Spectral/homotopy/dsmash.hlean
2018-09-20 16:03:59 +02:00

1680 lines
83 KiB
Text
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

-- 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₂,
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
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