feat(hott): prove something without using ua and update book.md
This commit is contained in:
parent
e9a6a532ab
commit
dd5dcb1dd1
7 changed files with 46 additions and 68 deletions
|
@ -16,9 +16,9 @@ set_option class.force_new true
|
|||
|
||||
namespace group
|
||||
|
||||
definition pointed_Group [instance] (G : Group) : pointed G := pointed.mk one
|
||||
definition pType_of_Group [reducible] (G : Group) : Type* := pointed.mk' G
|
||||
definition Set_of_Group (G : Group) : Set := trunctype.mk G _
|
||||
definition pointed_Group [instance] [constructor] (G : Group) : pointed G := pointed.mk 1
|
||||
definition pType_of_Group [constructor] [reducible] (G : Group) : Type* := pointed.MK G 1
|
||||
definition Set_of_Group [constructor] (G : Group) : Set := trunctype.mk G _
|
||||
|
||||
definition Group_of_CommGroup [coercion] [constructor] (G : CommGroup) : Group :=
|
||||
Group.mk G _
|
||||
|
@ -112,9 +112,8 @@ namespace group
|
|||
apply is_trunc_equiv_closed_rev, exact H
|
||||
end
|
||||
|
||||
local attribute group_pType_of_Group pointed.mk' [reducible]
|
||||
definition pmap_of_homomorphism [constructor] /- φ -/ : pType_of_Group G₁ →* pType_of_Group G₂ :=
|
||||
pmap.mk φ (respect_one φ)
|
||||
pmap.mk φ begin esimp, exact respect_one φ end
|
||||
|
||||
definition homomorphism_eq (p : group_fun φ₁ ~ group_fun φ₂) : φ₁ = φ₂ :=
|
||||
begin
|
||||
|
@ -146,7 +145,7 @@ namespace group
|
|||
|
||||
definition pequiv_of_isomorphism [constructor] (φ : G₁ ≃g G₂) :
|
||||
pType_of_Group G₁ ≃* pType_of_Group G₂ :=
|
||||
pequiv.mk φ _ (respect_one φ)
|
||||
pequiv.mk φ begin esimp, exact _ end begin esimp, exact respect_one φ end
|
||||
|
||||
definition isomorphism_of_equiv [constructor] (φ : G₁ ≃ G₂)
|
||||
(p : Πg₁ g₂, φ (g₁ * g₂) = φ g₁ * φ g₂) : G₁ ≃g G₂ :=
|
||||
|
|
10
hott/book.md
10
hott/book.md
|
@ -22,7 +22,7 @@ The rows indicate the chapters, the columns the sections.
|
|||
| Ch 5 | - | . | ½ | - | - | . | . | ½ | | | | | | | |
|
||||
| Ch 6 | . | + | + | + | + | + | + | + | ¾ | ¼ | ¾ | + | . | | |
|
||||
| Ch 7 | + | + | + | - | ¾ | - | - | | | | | | | | |
|
||||
| Ch 8 | + | + | + | + | ¾ | ¾ | - | ¾ | ½ | ¼ | | | | | |
|
||||
| Ch 8 | + | + | + | + | + | ¾ | - | + | + | ¼ | | | | | |
|
||||
| Ch 9 | ¾ | + | + | ½ | ¾ | ½ | - | - | - | | | | | | |
|
||||
| Ch 10 | ¼ | - | - | - | - | | | | | | | | | | |
|
||||
| Ch 11 | - | - | - | - | - | - | | | | | | | | | |
|
||||
|
@ -149,11 +149,11 @@ Every file is in the folder [homotopy](homotopy/homotopy.md)
|
|||
- 8.2 (Connectedness of suspensions): [susp](homotopy/susp.hlean) (different proof of Theorem 8.2.1)
|
||||
- 8.3 (πk≤n of an n-connected space and π_{k<n}(S^n)): [homotopy_group](homotopy/homotopy_group.hlean)
|
||||
- 8.4 (Fiber sequences and the long exact sequence): Mostly in [homotopy.chain_complex](homotopy/chain_complex.hlean), [homotopy.LES_of_homotopy_groups](homotopy/LES_of_homotopy_groups.hlean). Definitions 8.4.1 and 8.4.2 in [types.pointed](types/pointed.hlean), Corollary 8.4.8 in [homotopy.homotopy_group](homotopy/homotopy_group.hlean).
|
||||
- 8.5 (The Hopf fibration): [circle](homotopy/circle.hlean) (multiplication on the circle, Lemma 8.5.8), [join](homotopy/join.hlean) (join is associative, Lemma 8.5.9), [hopf](homotopy/hopf.hlean) (The Hopf construction, Lemmas 8.5.5 and 8.5.7), [complex_hopf](homotopy/complex_hopf.hlean) (the H-space structure on the circle and the complex Hopf fibration)
|
||||
- 8.6 (The Freudenthal suspension theorem): [connectedness](homotopy/connectedness.hlean) (Lemma 8.6.1), [wedge](homotopy/wedge.hlean) (Wedge connectivity, Lemma 8.6.2). Corollary 8.6.14 is proven directly in [homotopy.freudenthal](homotopy/freudenthal.hlean), however, we don't prove it as a Corollary of Theorem 8.6.4, which is not proven. Stability of iterated suspensions is also in [homotopy.freudenthal](homotopy/freudenthal.hlean). The homotopy groups of spheres in this section are computed in [homotopy.sphere2](homotopy/sphere2.hlean).
|
||||
- 8.5 (The Hopf fibration): [hit.pushout](hit/pushout.hlean) (Lemma 8.5.3), [hopf](homotopy/hopf.hlean) (The Hopf construction, Lemmas 8.5.5 and 8.5.7), [susp](homotopy/susp.hlean) (Definition 8.5.6), [circle](homotopy/circle.hlean) (multiplication on the circle, Lemma 8.5.8), [join](homotopy/join.hlean) (join is associative, Lemma 8.5.9), [complex_hopf](homotopy/complex_hopf.hlean) (the H-space structure on the circle and the complex Hopf fibration, i.e. Theorem 8.5.1), [sphere2](homotopy/sphere2.hlean) (Corollary 8.5.2)
|
||||
- 8.6 (The Freudenthal suspension theorem): [connectedness](homotopy/connectedness.hlean) (Lemma 8.6.1), [wedge](homotopy/wedge.hlean) (Wedge connectivity, Lemma 8.6.2). Corollary 8.6.14 is proven directly in [freudenthal](homotopy/freudenthal.hlean), however, we don't prove Theorem 8.6.4. Stability of iterated suspensions is also in [freudenthal](homotopy/freudenthal.hlean). The homotopy groups of spheres in this section are computed in [sphere2](homotopy/sphere2.hlean).
|
||||
- 8.7 (The van Kampen theorem): not formalized
|
||||
- 8.8 (Whitehead’s theorem and Whitehead’s principle): 8.8.1 and 8.8.2 at the bottom of [types.trunc](types/trunc.hlean), 8.8.3 in [homotopy.homotopy_group](homotopy/homotopy_group.hlean).
|
||||
- 8.9 (A general statement of the encode-decode method): One variation of the encode-decode method is in [types.eq](types/eq.hlean).
|
||||
- 8.8 (Whitehead’s theorem and Whitehead’s principle): 8.8.1 and 8.8.2 at the bottom of [types.trunc](types/trunc.hlean), 8.8.3 in [homotopy_group](homotopy/homotopy_group.hlean). [Rest to be moved]
|
||||
- 8.9 (A general statement of the encode-decode method): [types.eq](types/eq.hlean).
|
||||
- 8.10 (Additional Results): Theorem 8.10.3 is formalized in [homotopy.EM](homotopy/EM.hlean).
|
||||
|
||||
Chapter 9: Category theory
|
||||
|
|
|
@ -192,7 +192,7 @@ section
|
|||
end
|
||||
|
||||
local abbreviation encode [unfold_full] := @groupoid_quotient.encode G a
|
||||
local abbreviation decode [unfold 3] := @groupoid_quotient.decode G a
|
||||
local abbreviation decode [unfold_full] := @groupoid_quotient.decode G a
|
||||
|
||||
protected definition decode_encode (x : groupoid_quotient G) (p : elt a = x) :
|
||||
decode x (encode x p) = p :=
|
||||
|
|
|
@ -93,7 +93,6 @@ namespace EM
|
|||
|
||||
end EM
|
||||
|
||||
-- attribute EM.rec EM.elim [recursor 7]
|
||||
attribute EM.base [constructor]
|
||||
attribute EM.rec EM.elim [unfold 7] [recursor 7]
|
||||
attribute EM.rec_on EM.elim_on [unfold 4]
|
||||
|
@ -126,8 +125,6 @@ namespace EM
|
|||
proposition is_conn_pEM1 [instance] (G : Group) : is_conn 0 (pEM1 G) :=
|
||||
is_conn_EM1 G
|
||||
|
||||
-- TODO: prove this using truncated Whitehead.
|
||||
|
||||
definition EM1_map [unfold 7] {G : Group} {X : Type*} (e : Ω X ≃ G)
|
||||
(r : Πp q, e (p ⬝ q) = e p * e q) [is_conn 0 X] [is_trunc 1 X] : EM1 G → X :=
|
||||
begin
|
||||
|
@ -137,22 +134,6 @@ namespace EM
|
|||
{ exact inv_preserve_binary e concat mul r g h}
|
||||
end
|
||||
|
||||
-- TODO
|
||||
-- definition EM1_equiv {G : Group} {X : Type*} (e : Ω X ≃ G)
|
||||
-- (r : Πp q, e (p ⬝ q) = e p * e q) [is_conn 0 X] [is_trunc 1 X] : EM1 G ≃ X :=
|
||||
-- begin
|
||||
-- apply equiv.mk (EM1_map e r),
|
||||
-- apply whiteheads_principle 1,
|
||||
-- { apply is_equiv_of_is_contr},
|
||||
-- { intro x n, cases n with n,
|
||||
-- { exact sorry},
|
||||
-- { apply @is_equiv_of_is_contr, do 2 exact sorry}}
|
||||
-- end
|
||||
|
||||
-- definition pequiv_pEM1 {G : Group} {X : Type*} (e : π₁ X ≃g G) [is_conn 0 X] [is_trunc 1 X]
|
||||
-- : X ≃* pEM1 G :=
|
||||
-- sorry
|
||||
|
||||
end EM
|
||||
|
||||
open hopf susp
|
||||
|
@ -222,7 +203,7 @@ namespace EM
|
|||
|
||||
definition is_trunc_EMadd1 (G : CommGroup) (n : ℕ) : is_trunc (n+1) (EMadd1 G n) := _
|
||||
|
||||
/- K(G, n+1) -/
|
||||
/- K(G, n) -/
|
||||
definition EM (G : CommGroup) : ℕ → Type*
|
||||
| 0 := pType_of_Group G
|
||||
| (k+1) := EMadd1 G k
|
||||
|
|
|
@ -16,16 +16,16 @@ definition circle : Type₀ := sphere 1
|
|||
|
||||
namespace circle
|
||||
notation `S¹` := circle
|
||||
definition base1 : circle := !north
|
||||
definition base2 : circle := !south
|
||||
definition base1 : S¹ := !north
|
||||
definition base2 : S¹ := !south
|
||||
definition seg1 : base1 = base2 := merid !north
|
||||
definition seg2 : base1 = base2 := merid !south
|
||||
|
||||
definition base : circle := base1
|
||||
definition base : S¹ := base1
|
||||
definition loop : base = base := seg2 ⬝ seg1⁻¹
|
||||
|
||||
definition rec2 {P : circle → Type} (Pb1 : P base1) (Pb2 : P base2)
|
||||
(Ps1 : Pb1 =[seg1] Pb2) (Ps2 : Pb1 =[seg2] Pb2) (x : circle) : P x :=
|
||||
definition rec2 {P : S¹ → Type} (Pb1 : P base1) (Pb2 : P base2)
|
||||
(Ps1 : Pb1 =[seg1] Pb2) (Ps2 : Pb1 =[seg2] Pb2) (x : S¹) : P x :=
|
||||
begin
|
||||
induction x with b,
|
||||
{ exact Pb1},
|
||||
|
@ -36,24 +36,24 @@ namespace circle
|
|||
{ cases y}},
|
||||
end
|
||||
|
||||
definition rec2_on [reducible] {P : circle → Type} (x : circle) (Pb1 : P base1) (Pb2 : P base2)
|
||||
definition rec2_on [reducible] {P : S¹ → Type} (x : S¹) (Pb1 : P base1) (Pb2 : P base2)
|
||||
(Ps1 : Pb1 =[seg1] Pb2) (Ps2 : Pb1 =[seg2] Pb2) : P x :=
|
||||
circle.rec2 Pb1 Pb2 Ps1 Ps2 x
|
||||
|
||||
theorem rec2_seg1 {P : circle → Type} (Pb1 : P base1) (Pb2 : P base2)
|
||||
theorem rec2_seg1 {P : S¹ → Type} (Pb1 : P base1) (Pb2 : P base2)
|
||||
(Ps1 : Pb1 =[seg1] Pb2) (Ps2 : Pb1 =[seg2] Pb2)
|
||||
: apd (rec2 Pb1 Pb2 Ps1 Ps2) seg1 = Ps1 :=
|
||||
!rec_merid
|
||||
|
||||
theorem rec2_seg2 {P : circle → Type} (Pb1 : P base1) (Pb2 : P base2)
|
||||
theorem rec2_seg2 {P : S¹ → Type} (Pb1 : P base1) (Pb2 : P base2)
|
||||
(Ps1 : Pb1 =[seg1] Pb2) (Ps2 : Pb1 =[seg2] Pb2)
|
||||
: apd (rec2 Pb1 Pb2 Ps1 Ps2) seg2 = Ps2 :=
|
||||
!rec_merid
|
||||
|
||||
definition elim2 {P : Type} (Pb1 Pb2 : P) (Ps1 Ps2 : Pb1 = Pb2) (x : circle) : P :=
|
||||
definition elim2 {P : Type} (Pb1 Pb2 : P) (Ps1 Ps2 : Pb1 = Pb2) (x : S¹) : P :=
|
||||
rec2 Pb1 Pb2 (pathover_of_eq Ps1) (pathover_of_eq Ps2) x
|
||||
|
||||
definition elim2_on [reducible] {P : Type} (x : circle) (Pb1 Pb2 : P)
|
||||
definition elim2_on [reducible] {P : Type} (x : S¹) (Pb1 Pb2 : P)
|
||||
(Ps1 : Pb1 = Pb2) (Ps2 : Pb1 = Pb2) : P :=
|
||||
elim2 Pb1 Pb2 Ps1 Ps2 x
|
||||
|
||||
|
@ -71,10 +71,10 @@ namespace circle
|
|||
rewrite [▸*,-apd_eq_pathover_of_eq_ap,↑elim2,rec2_seg2],
|
||||
end
|
||||
|
||||
definition elim2_type (Pb1 Pb2 : Type) (Ps1 Ps2 : Pb1 ≃ Pb2) (x : circle) : Type :=
|
||||
definition elim2_type (Pb1 Pb2 : Type) (Ps1 Ps2 : Pb1 ≃ Pb2) (x : S¹) : Type :=
|
||||
elim2 Pb1 Pb2 (ua Ps1) (ua Ps2) x
|
||||
|
||||
definition elim2_type_on [reducible] (x : circle) (Pb1 Pb2 : Type) (Ps1 Ps2 : Pb1 ≃ Pb2)
|
||||
definition elim2_type_on [reducible] (x : S¹) (Pb1 Pb2 : Type) (Ps1 Ps2 : Pb1 ≃ Pb2)
|
||||
: Type :=
|
||||
elim2_type Pb1 Pb2 Ps1 Ps2 x
|
||||
|
||||
|
@ -86,8 +86,8 @@ namespace circle
|
|||
: transport (elim2_type Pb1 Pb2 Ps1 Ps2) seg2 = Ps2 :=
|
||||
by rewrite [tr_eq_cast_ap_fn,↑elim2_type,elim2_seg2];apply cast_ua_fn
|
||||
|
||||
protected definition rec {P : circle → Type} (Pbase : P base) (Ploop : Pbase =[loop] Pbase)
|
||||
(x : circle) : P x :=
|
||||
protected definition rec {P : S¹ → Type} (Pbase : P base) (Ploop : Pbase =[loop] Pbase)
|
||||
(x : S¹) : P x :=
|
||||
begin
|
||||
fapply (rec2_on x),
|
||||
{ exact Pbase},
|
||||
|
@ -96,7 +96,7 @@ namespace circle
|
|||
{ apply pathover_tr_of_pathover, exact Ploop}
|
||||
end
|
||||
|
||||
protected definition rec_on [reducible] {P : circle → Type} (x : circle) (Pbase : P base)
|
||||
protected definition rec_on [reducible] {P : S¹ → Type} (x : S¹) (Pbase : P base)
|
||||
(Ploop : Pbase =[loop] Pbase) : P x :=
|
||||
circle.rec Pbase Ploop x
|
||||
|
||||
|
@ -108,7 +108,7 @@ namespace circle
|
|||
definition con_refl {A : Type} {x y : A} (p : x = y) : p ⬝ refl _ = p :=
|
||||
eq.rec_on p idp
|
||||
|
||||
theorem rec_loop {P : circle → Type} (Pbase : P base) (Ploop : Pbase =[loop] Pbase) :
|
||||
theorem rec_loop {P : S¹ → Type} (Pbase : P base) (Ploop : Pbase =[loop] Pbase) :
|
||||
apd (circle.rec Pbase Ploop) loop = Ploop :=
|
||||
begin
|
||||
rewrite [↑loop,apd_con,↑circle.rec,↑circle.rec2_on,↑base,rec2_seg2,apd_inv,rec2_seg1],
|
||||
|
@ -116,10 +116,10 @@ namespace circle
|
|||
end
|
||||
|
||||
protected definition elim {P : Type} (Pbase : P) (Ploop : Pbase = Pbase)
|
||||
(x : circle) : P :=
|
||||
(x : S¹) : P :=
|
||||
circle.rec Pbase (pathover_of_eq Ploop) x
|
||||
|
||||
protected definition elim_on [reducible] {P : Type} (x : circle) (Pbase : P)
|
||||
protected definition elim_on [reducible] {P : Type} (x : S¹) (Pbase : P)
|
||||
(Ploop : Pbase = Pbase) : P :=
|
||||
circle.elim Pbase Ploop x
|
||||
|
||||
|
@ -155,10 +155,10 @@ namespace circle
|
|||
end
|
||||
|
||||
protected definition elim_type (Pbase : Type) (Ploop : Pbase ≃ Pbase)
|
||||
(x : circle) : Type :=
|
||||
(x : S¹) : Type :=
|
||||
circle.elim Pbase (ua Ploop) x
|
||||
|
||||
protected definition elim_type_on [reducible] (x : circle) (Pbase : Type)
|
||||
protected definition elim_type_on [reducible] (x : S¹) (Pbase : Type)
|
||||
(Ploop : Pbase ≃ Pbase) : Type :=
|
||||
circle.elim_type Pbase Ploop x
|
||||
|
||||
|
@ -230,7 +230,7 @@ namespace circle
|
|||
... = ap (circle.elim a p) (refl base) : by rewrite H,
|
||||
eq_bnot_ne_idp H2
|
||||
|
||||
definition nonidp (x : circle) : x = x :=
|
||||
definition nonidp (x : S¹) : x = x :=
|
||||
begin
|
||||
induction x,
|
||||
{ exact loop},
|
||||
|
@ -244,7 +244,7 @@ namespace circle
|
|||
|
||||
open int
|
||||
|
||||
protected definition code [unfold 1] (x : circle) : Type₀ :=
|
||||
protected definition code [unfold 1] (x : S¹) : Type₀ :=
|
||||
circle.elim_type_on x ℤ equiv_succ
|
||||
|
||||
definition transport_code_loop (a : ℤ) : transport circle.code loop a = succ a :=
|
||||
|
@ -253,10 +253,10 @@ namespace circle
|
|||
definition transport_code_loop_inv (a : ℤ) : transport circle.code loop⁻¹ a = pred a :=
|
||||
ap10 !elim_type_loop_inv a
|
||||
|
||||
protected definition encode [unfold 2] {x : circle} (p : base = x) : circle.code x :=
|
||||
protected definition encode [unfold 2] {x : S¹} (p : base = x) : circle.code x :=
|
||||
transport circle.code p (of_num 0)
|
||||
|
||||
protected definition decode [unfold 1] {x : circle} : circle.code x → base = x :=
|
||||
protected definition decode [unfold 1] {x : S¹} : circle.code x → base = x :=
|
||||
begin
|
||||
induction x,
|
||||
{ exact power loop},
|
||||
|
@ -264,7 +264,7 @@ namespace circle
|
|||
rewrite [power_con,transport_code_loop]}
|
||||
end
|
||||
|
||||
definition circle_eq_equiv [constructor] (x : circle) : (base = x) ≃ circle.code x :=
|
||||
definition circle_eq_equiv [constructor] (x : S¹) : (base = x) ≃ circle.code x :=
|
||||
begin
|
||||
fapply equiv.MK,
|
||||
{ exact circle.encode},
|
||||
|
@ -334,7 +334,7 @@ namespace circle
|
|||
{ intro x, apply is_trunc_equiv_closed_rev, apply eq_equiv_Z}
|
||||
end
|
||||
|
||||
proposition is_conn_circle [instance] : is_conn 0 circle :=
|
||||
proposition is_conn_circle [instance] : is_conn 0 S¹ :=
|
||||
sphere.is_conn_sphere -1.+2
|
||||
|
||||
definition circle_turn [reducible] (x : S¹) : x = x :=
|
||||
|
|
|
@ -142,8 +142,7 @@ namespace is_conn
|
|||
: is_conn_fun n (const A unit.star) → is_conn n A :=
|
||||
begin
|
||||
intro H, unfold is_conn_fun at H,
|
||||
rewrite [-(ua (fiber.fiber_star_equiv A))],
|
||||
exact (H unit.star)
|
||||
exact is_conn_equiv_closed n (fiber.fiber_star_equiv A) _,
|
||||
end
|
||||
|
||||
-- now maps from unit
|
||||
|
|
|
@ -155,7 +155,7 @@ namespace susp
|
|||
variables {A B : Type} (f : A → B)
|
||||
include f
|
||||
|
||||
protected definition functor : susp A → susp B :=
|
||||
protected definition functor [unfold 4] : susp A → susp B :=
|
||||
begin
|
||||
intro x, induction x with a,
|
||||
{ exact north },
|
||||
|
@ -167,7 +167,7 @@ namespace susp
|
|||
include Hf
|
||||
|
||||
open is_equiv
|
||||
protected definition is_equiv_functor [instance] : is_equiv (susp.functor f) :=
|
||||
protected definition is_equiv_functor [instance] [constructor] : is_equiv (susp.functor f) :=
|
||||
adjointify (susp.functor f) (susp.functor f⁻¹)
|
||||
abstract begin
|
||||
intro sb, induction sb with b, do 2 reflexivity,
|
||||
|
@ -209,18 +209,18 @@ namespace susp
|
|||
open pointed
|
||||
variables {X Y Z : Type*}
|
||||
|
||||
definition psusp_functor (f : X →* Y) : psusp X →* psusp Y :=
|
||||
definition psusp_functor [constructor] (f : X →* Y) : psusp X →* psusp Y :=
|
||||
begin
|
||||
fconstructor,
|
||||
{ exact susp.functor f },
|
||||
{ reflexivity }
|
||||
end
|
||||
|
||||
definition is_equiv_psusp_functor (f : X →* Y) [Hf : is_equiv f]
|
||||
definition is_equiv_psusp_functor [constructor] (f : X →* Y) [Hf : is_equiv f]
|
||||
: is_equiv (psusp_functor f) :=
|
||||
susp.is_equiv_functor f
|
||||
|
||||
definition psusp_equiv (f : X ≃* Y) : psusp X ≃* psusp Y :=
|
||||
definition psusp_equiv [constructor] (f : X ≃* Y) : psusp X ≃* psusp Y :=
|
||||
pequiv_of_equiv (susp.equiv f) idp
|
||||
|
||||
definition psusp_functor_compose (g : Y →* Z) (f : X →* Y)
|
||||
|
@ -231,7 +231,7 @@ namespace susp
|
|||
{ reflexivity },
|
||||
{ reflexivity },
|
||||
{ apply eq_pathover, apply hdeg_square,
|
||||
rewrite [▸*,ap_compose' _ (psusp_functor f),↑psusp_functor],
|
||||
rewrite [▸*,ap_compose' _ (psusp_functor f)],
|
||||
krewrite +susp.elim_merid } },
|
||||
{ reflexivity }
|
||||
end
|
||||
|
@ -263,7 +263,6 @@ namespace susp
|
|||
rewrite inverse2_right_inv,
|
||||
refine _ ⬝ !con.assoc',
|
||||
rewrite [ap_con_right_inv],
|
||||
unfold psusp_functor,
|
||||
xrewrite [idp_con_idp, -ap_compose (concat idp)]},
|
||||
end
|
||||
|
||||
|
@ -315,7 +314,7 @@ namespace susp
|
|||
{ reflexivity}
|
||||
end
|
||||
|
||||
definition susp_adjoint_loop (X Y : Type*) : pointed.mk' (susp X) →* Y ≃ X →* Ω Y :=
|
||||
definition susp_adjoint_loop [constructor] (X Y : Type*) : psusp X →* Y ≃ X →* Ω Y :=
|
||||
begin
|
||||
fapply equiv.MK,
|
||||
{ intro f, exact ap1 f ∘* loop_susp_unit X},
|
||||
|
|
Loading…
Reference in a new issue