Built with Alectryon. Bubbles () indicate interactive fragments: hover for details, tap to reveal contents. Use Ctrl+↑Ctrl+↓ to navigate, Ctrl+🖱️ to focus. On Mac, use ⌘ instead of Ctrl.
Require Import HoTT.Basics HoTT.Types.Require Import HoTT.Basics HoTT.Types.Require Import HFiber Factorization Truncations.Core Truncations.Connectedness HProp.From HoTT.WildCat Require Import Core Equiv PointedCat NatTrans.Require Import Pointed.Core Pointed.pEquiv.Require Import Spaces.Nat.Core.LocalOpen Scope pointed_scope.LocalOpen Scope path_scope.(** ** Loop spaces *)(** The type [x = x] is pointed. *)Instanceispointed_loopsA (a : A) : IsPointed (a = a) := 1.Definitionloops (A : pType) : pType
:= [point A = point A, 1].Definitioniterated_loops (n : nat) (A : pType) : pType
:= nat_iter n loops A.(* Inner unfolding for iterated loops *)Definitionunfold_iterated_loops (n : nat) (X : pType)
: iterated_loops n.+1 X = iterated_loops n (loops X)
:= nat_iter_succ_r _ _ _.(** The loop space decreases the truncation level by one. We don't bother making this an instance because it is automatically found by typeclass search, but we record it here in case anyone is looking for it. *)Definitionistrunc_loops {n} (A : pType) `{IsTrunc n.+1 A}
: IsTrunc n (loops A) := _.(** Similarly for connectedness. *)Definitionisconnected_loops `{Univalence} {n} (A : pType)
`{IsConnected n.+1 A} : IsConnected n (loops A) := _.
loops pUnit <~>* pUnit
loops pUnit <~>* pUnit
loops pUnit <~> pUnit
?f pt = pt
loops pUnit <~> pUnit
(fun_ : pt = pt => tt) o unit_name 1 == idmap
unit_name 1 o (fun_ : pt = pt => tt) == idmap
unit_name 1 o (fun_ : pt = pt => tt) == idmap
rapply path_contr.
equiv_adjointify (fun_ : pt = pt => tt) (unit_name 1)
((funx : Unit => match x as u return (tt = u) with
| tt => 1end)
:
(fun_ : pt = pt => tt) o unit_name 1 == idmap)
(path_contr 1) pt =
pt
reflexivity.Defined.(** ** Functoriality of loop spaces *)(** Action on 1-cells *)
Is0Functor loops
Is0Functor loops
forallab : pType, (a $-> b) -> loops a $-> loops b
A, B: pType f: A $-> B
loops A $-> loops B
A, B: pType f: A $-> B
(point_eq f)^ @ (ap f pt @ point_eq f) = pt
A, B: pType f: A $-> B
(point_eq f)^ @ (ap f pt @ point_eq f) = (point_eq f)^ @ point_eq f
A, B: pType f: A $-> B
ap f pt @ point_eq f = point_eq f
apply concat_1p.Defined.
Is1Functor loops
Is1Functor loops
forall (ab : pType) (fg : a $-> b),
f $== g -> fmap loops f $== fmap loops g
foralla : pType, fmap loops (Id a) $== Id (loops a)
forall (abc : pType) (f : a $-> b) (g : b $-> c),
fmap loops (g $o f) $== fmap loops g $o fmap loops f
(** Action on 2-cells *)
forall (ab : pType) (fg : a $-> b),
f $== g -> fmap loops f $== fmap loops g
A, B: pType f, g: A $-> B p: f $== g
fmap loops f $== fmap loops g
A: Type point0: IsPointed A B: Type f, g: A -> B p: forallx : A, f x = g x
foralla : pType, fmap loops (Id a) $== Id (loops a)
A: pType
fmap loops (Id A) $== Id (loops A)
A: pType
fmap loops (Id A) == Id (loops A)
A: pType
?p pt = dpoint_eq (fmap loops (Id A)) @ (dpoint_eq (Id (loops A)))^
A: pType
fmap loops (Id A) == Id (loops A)
A: pType p: loops A
fmap loops (Id A) p = Id (loops A) p
refine (concat_1p _ @ concat_p1 _ @ ap_idmap _).
A: pType
((funp : loops A =>
(concat_1p (ap idmap p @ 1) @ concat_p1 (ap idmap p)) @ ap_idmap p)
:
fmap loops (Id A) == Id (loops A)) pt =
dpoint_eq (fmap loops (Id A)) @ (dpoint_eq (Id (loops A)))^
reflexivity.(** Preservation of composition. *)
forall (abc : pType) (f : a $-> b) (g : b $-> c),
fmap loops (g $o f) $== fmap loops g $o fmap loops f
A, B, c: pType g: A $-> B f: B $-> c
fmap loops (f $o g) $== fmap loops f $o fmap loops g
A, B, c: pType g: A $-> B f: B $-> c
fmap loops (f $o g) == fmap loops f $o fmap loops g
fmap loops (f $o g) == fmap loops f $o fmap loops g
A, B, c: pType g: A $-> B f: B $-> c p: loops A
fmap loops (f $o g) p = (fmap loops f $o fmap loops g) p
A, B, c: pType g: A $-> B f: B $-> c p: loops A
(ap f (point_eq g) @ point_eq f)^ @
(ap (funx : A => f (g x)) p @ (ap f (point_eq g) @ point_eq f)) =
(point_eq f)^ @ (ap f ((point_eq g)^ @ (ap g p @ point_eq g)) @ point_eq f)
A, B, c: pType g: A $-> B f: B $-> c p: loops A
(point_eq f)^ @
((ap f (point_eq g))^ @
(ap (funx : A => f (g x)) p @ (ap f (point_eq g) @ point_eq f))) =
(point_eq f)^ @ (ap f ((point_eq g)^ @ (ap g p @ point_eq g)) @ point_eq f)
A, B, c: pType g: A $-> B f: B $-> c p: loops A
(ap f (point_eq g))^ @
(ap (funx : A => f (g x)) p @ (ap f (point_eq g) @ point_eq f)) =
ap f ((point_eq g)^ @ (ap g p @ point_eq g)) @ point_eq f
A, B, c: pType g: A $-> B f: B $-> c p: loops A
ap f (point_eq g)^ @
(ap (funx : A => f (g x)) p @ (ap f (point_eq g) @ point_eq f)) =
ap f (point_eq g)^ @ (ap f (ap g p @ point_eq g) @ point_eq f)
A, B, c: pType g: A $-> B f: B $-> c p: loops A
ap (funx : A => f (g x)) p @ (ap f (point_eq g) @ point_eq f) =
ap f (ap g p @ point_eq g) @ point_eq f
A, B, c: pType g: A $-> B f: B $-> c p: loops A
ap (funx : A => f (g x)) p @ (ap f (point_eq g) @ point_eq f) =
ap f (ap g p) @ (ap f (point_eq g) @ point_eq f)
A, B, c: pType g: A $-> B f: B $-> c p: loops A
ap (funx : A => f (g x)) p = ap f (ap g p)
apply ap_compose.
A, B, c: pType g: A $-> B f: B $-> c
((funp : loops A =>
((inv_pp (ap f (point_eq g)) (point_eq f) @@ 1) @
concat_pp_p (point_eq f)^ (ap f (point_eq g))^
(ap (funx : A => f (g x)) p @ (ap f (point_eq g) @ point_eq f))) @
whiskerL (point_eq f)^
(((((ap_V f (point_eq g))^ @@ 1) @
whiskerL (ap f (point_eq g)^)
((whiskerR (ap_compose g f p) (ap f (point_eq g) @ point_eq f) @
concat_p_pp (ap f (ap g p)) (ap f (point_eq g)) (point_eq f)) @
((ap_pp f (ap g p) (point_eq g))^ @@ 1))) @
concat_p_pp (ap f (point_eq g)^) (ap f (ap g p @ point_eq g))
(point_eq f)) @
((ap_pp f (point_eq g)^ (ap g p @ point_eq g))^ @@ 1))
:
fmap loops (f $o g) p = (fmap loops f $o fmap loops g) p)
:
fmap loops (f $o g) == fmap loops f $o fmap loops g) pt =
dpoint_eq (fmap loops (f $o g)) @ (dpoint_eq (fmap loops f $o fmap loops g))^
by pointed_reduce.Defined.(** *** Properties of loops functor *)(** Loops functor distributes over concatenation *)
X, Y: pType f: X ->* Y x, y: loops X
fmap loops f (x @ y) = fmap loops f x @ fmap loops f y
X, Y: pType f: X ->* Y x, y: loops X
fmap loops f (x @ y) = fmap loops f x @ fmap loops f y
X: Type point0: IsPointed X Y: Type f: X -> Y x, y: point0 = point0
ap f (x @ y) = ap f x @ ap f y
apply ap_pp.Defined.(** Loops is a pointed functor *)
H: Univalence n: trunc_index A, B: pType f: A ->* B C:= [image (Tr n.+1) f, factor1 (image (Tr n.+1) f) pt]: pType g:= Build_pMap (factor1 (image (Tr n.+1) f)) 1: A ->* C h:= Build_pMap (factor2 (image (Tr n.+1) f)) (point_eq f): C ->* B
(funx : loops A => fmap loops h (fmap loops g x)) == fmap loops f
H: Univalence n: trunc_index A, B: pType f: A ->* B C:= [image (Tr n.+1) f, factor1 (image (Tr n.+1) f) pt]: pType g:= Build_pMap (factor1 (image (Tr n.+1) f)) 1: A ->* C h:= Build_pMap (factor2 (image (Tr n.+1) f)) (point_eq f): C ->* B x: loops A
fmap loops f x = fmap loops h (fmap loops g x)
H: Univalence n: trunc_index A, B: pType f: A ->* B C:= [image (Tr n.+1) f, factor1 (image (Tr n.+1) f) pt]: pType g:= Build_pMap (factor1 (image (Tr n.+1) f)) 1: A ->* C h:= Build_pMap (factor2 (image (Tr n.+1) f)) (point_eq f): C ->* B x: loops A
fmap loops f x = fmap loops (h $o g) x
H: Univalence n: trunc_index A, B: pType f: A ->* B C:= [image (Tr n.+1) f, factor1 (image (Tr n.+1) f) pt]: pType g:= Build_pMap (factor1 (image (Tr n.+1) f)) 1: A ->* C h:= Build_pMap (factor2 (image (Tr n.+1) f)) (point_eq f): C ->* B x: loops A
(point_eq f)^ @ (ap f x @ point_eq f) =
(1 @ point_eq f)^ @ (ap (funx0 : A => f x0) x @ (1 @ point_eq f))
abstract (rewrite !concat_1p; reflexivity).
H: Univalence n: trunc_index A, B: pType f: A ->* B C:= [image (Tr n.+1) f, factor1 (image (Tr n.+1) f) pt]: pType g:= Build_pMap (factor1 (image (Tr n.+1) f)) 1: A ->* C h:= Build_pMap (factor2 (image (Tr n.+1) f)) (point_eq f): C ->* B I:= {|
intermediate := loops C;
factor1 := fmap loops g;
factor2 := fmap loops h;
fact_factors :=
(funx : loops A =>
((equiv_loops_image_subproof A B f x
:
fmap loops f x = fmap loops (h $o g) x) @
fmap_comp loops g h x)^)
:
(funx : loops A => fmap loops h (fmap loops g x)) == fmap loops f;
inclass1 := conn_map_fmap_loops A C g;
inclass2 := mapinO_tr_istruncmap (fmap loops h)
|}: Factorization (@IsConnMap (Tr n)) (@MapIn (Tr n)) (fmap loops f)
loops C <~> image (Tr n) (fmap loops f)
exact (path_intermediate (path_factor (O_factsys n) (fmap loops f) I
(image n (fmap loops f)))).Defined.(** Loop inversion is a pointed equivalence *)
A: pType
loops A <~>* loops A
A: pType
loops A <~>* loops A
A: pType
loops A ->* loops A
A: pType
IsEquiv ?pointed_equiv_fun
A: pType
IsEquiv (Build_pMap inverse 1)
apply isequiv_path_inverse.Defined.(** Loops functor preserves equivalences *)Definitionpequiv_fmap_loops {AB : pType}
: A $<~> B -> loops A $<~> loops B
:= emap loops.(** A version of [unfold_iterated_loops] that's an equivalence rather than an equality. We could get this from the equality, but it's more useful to construct it explicitly since then we can reason about it. *)
n: nat X: pType
iterated_loops n.+1 X <~>* iterated_loops n (loops X)
n: nat X: pType
iterated_loops n.+1 X <~>* iterated_loops n (loops X)
X: pType
iterated_loops 1 X <~>* iterated_loops 0 (loops X)
n: nat X: pType IHn: iterated_loops n.+1 X <~>* iterated_loops n (loops X)
iterated_loops n.+2 X <~>* iterated_loops n.+1 (loops X)
n: nat X: pType IHn: iterated_loops n.+1 X <~>* iterated_loops n (loops X)
iterated_loops n.+2 X <~>* iterated_loops n.+1 (loops X)
n: nat X: pType IHn: iterated_loops n.+1 X <~>* iterated_loops n (loops X)
apply pequiv_fmap_loops, IHn.Defined.(** For instance, we can prove that it's natural. *)
A, B: pType n: nat f: A ->* B
unfold_iterated_loops' n B o* fmap (iterated_loops n.+1) f ==*
fmap (iterated_loops n) (fmap loops f) o* unfold_iterated_loops' n A
A, B: pType n: nat f: A ->* B
unfold_iterated_loops' n B o* fmap (iterated_loops n.+1) f ==*
fmap (iterated_loops n) (fmap loops f) o* unfold_iterated_loops' n A
A, B: pType f: A ->* B
unfold_iterated_loops' 0 B o* fmap (iterated_loops 1) f ==*
fmap (iterated_loops 0) (fmap loops f) o* unfold_iterated_loops' 0 A
A, B: pType n: nat f: A ->* B IHn: unfold_iterated_loops' n B o* fmap (iterated_loops n.+1) f ==*
fmap (iterated_loops n) (fmap loops f) o* unfold_iterated_loops' n A
unfold_iterated_loops' n.+1 B o* fmap (iterated_loops n.+2) f ==*
fmap (iterated_loops n.+1) (fmap loops f) o* unfold_iterated_loops' n.+1 A
A, B: pType f: A ->* B
unfold_iterated_loops' 0 B o* fmap (iterated_loops 1) f ==*
fmap (iterated_loops 0) (fmap loops f) o* unfold_iterated_loops' 0 A
A, B: pType f: A ->* B
unfold_iterated_loops' 0 B o* fmap (iterated_loops 1) f ==
fmap (iterated_loops 0) (fmap loops f) o* unfold_iterated_loops' 0 A
A, B: pType n: nat f: A ->* B IHn: unfold_iterated_loops' n B o* fmap (iterated_loops n.+1) f ==*
fmap (iterated_loops n) (fmap loops f) o* unfold_iterated_loops' n A
unfold_iterated_loops' n.+1 B o* fmap (iterated_loops n.+2) f ==*
fmap (iterated_loops n.+1) (fmap loops f) o* unfold_iterated_loops' n.+1 A
A, B: pType n: nat f: A ->* B IHn: unfold_iterated_loops' n B o* fmap (iterated_loops n.+1) f ==*
fmap (iterated_loops n) (fmap loops f) o* unfold_iterated_loops' n A
fmap loops
((fix F (n0 : nat) :
iterated_loops n0.+1 B <~>* iterated_loops n0 (loops B) :=
match
n0 as n1
return (iterated_loops n1.+1 B <~>* iterated_loops n1 (loops B))
with
| 0%nat => pequiv_reflexive (iterated_loops 0 (loops B))
| n1.+1%nat => pequiv_fmap_loops (F n1)
end)
n $o
fmap (loops o (funx : pType => nat_iter n loops x)) f) ==*
fmap (iterated_loops n.+1) (fmap loops f) o* unfold_iterated_loops' n.+1 A
A, B: pType n: nat f: A ->* B IHn: unfold_iterated_loops' n B o* fmap (iterated_loops n.+1) f ==*
fmap (iterated_loops n) (fmap loops f) o* unfold_iterated_loops' n A
fmap loops
((fix F (n0 : nat) :
iterated_loops n0.+1 B <~>* iterated_loops n0 (loops B) :=
match
n0 as n1
return (iterated_loops n1.+1 B <~>* iterated_loops n1 (loops B))
with
| 0%nat => pequiv_reflexive (iterated_loops 0 (loops B))
| n1.+1%nat => pequiv_fmap_loops (F n1)
end)
n $o
fmap (loops o (funx : pType => nat_iter n loops x)) f) ==*
fmap loops
(fmap (iterated_loops n) (fmap loops f) $o
(fix F (n0 : nat) :
iterated_loops n0.+1 A <~>* iterated_loops n0 (loops A) :=
match
n0 as n1
return (iterated_loops n1.+1 A <~>* iterated_loops n1 (loops A))
with
| 0%nat => pequiv_reflexive (iterated_loops 0 (loops A))
| n1.+1%nat => pequiv_fmap_loops (F n1)
end)
n)
A, B: pType n: nat f: A ->* B IHn: unfold_iterated_loops' n B o* fmap (iterated_loops n.+1) f ==*
fmap (iterated_loops n) (fmap loops f) o* unfold_iterated_loops' n A
(fix F (n0 : nat) :
iterated_loops n0.+1 B <~>* iterated_loops n0 (loops B) :=
match
n0 as n1
return (iterated_loops n1.+1 B <~>* iterated_loops n1 (loops B))
with
| 0%nat => pequiv_reflexive (iterated_loops 0 (loops B))
| n1.+1%nat => pequiv_fmap_loops (F n1)
end)
n $o
fmap (loops o (funx : pType => nat_iter n loops x)) f $==
fmap (iterated_loops n) (fmap loops f) $o
(fix F (n0 : nat) :
iterated_loops n0.+1 A <~>* iterated_loops n0 (loops A) :=
match
n0 as n1
return (iterated_loops n1.+1 A <~>* iterated_loops n1 (loops A))
with
| 0%nat => pequiv_reflexive (iterated_loops 0 (loops A))
| n1.+1%nat => pequiv_fmap_loops (F n1)
end)
n
exact IHn.Defined.(** Iterated loops preserves equivalences *)Definitionpequiv_fmap_iterated_loops {AB} n
: A <~>* B -> iterated_loops n A <~>* iterated_loops n B
:= emap (iterated_loops n).(** Loops preserves products. *)
X, Y: pType
loops (X * Y) <~>* loops X * loops Y
X, Y: pType
loops (X * Y) <~>* loops X * loops Y
X, Y: pType
loops (X * Y) <~> [loops X * loops Y, ispointed_prod]
X, Y: pType
?f pt = pt
X, Y: pType
(equiv_path_prod pt pt)^-1%equiv pt = pt
reflexivity.Defined.(** There is a natural map from [loops (X * Y)] to [loops X * loops Y], and ideally it would definitionally underlie the equivalence [loops_prod]. That's not the case, but we show that [loops_prod] is homotopic to the expected maps after projecting to each factor. *)
X, Y: pType n: nat IHn: psnd o* iterated_loops_prod X Y ==* fmap (iterated_loops n) psnd
psnd o* iterated_loops_prod X Y ==* fmap (iterated_loops n) psnd
exact IHn.Defined.(* A dependent form of loops *)DefinitionloopsD {A} : pFam A -> pFam (loops A)
:= funPp => Build_pFam (funq : loops A => transport Pp q (dpoint Pp) = (dpoint Pp)) 1.
n: trunc_index A: pType P: pFam A H: IsTrunc_pFam n.+1 P
IsTrunc_pFam n (loopsD P)
n: trunc_index A: pType P: pFam A H: IsTrunc_pFam n.+1 P
IsTrunc_pFam n (loopsD P)
n: trunc_index A: pType P: pFam A H: IsTrunc_pFam n.+1 P a: loops A
IsTrunc n (loopsD P a)
n: trunc_index A: pType P: pFam A H: IsTrunc_pFam n.+1 P a: loops A i:= H pt: IsTrunc n.+1 (P pt)
IsTrunc n (loopsD P a)
exact _.Defined.(* psigma and loops 'commute' *)
A: pType P: pFam A
loops (psigma P) <~>* psigma (loopsD P)
A: pType P: pFam A
loops (psigma P) <~>* psigma (loopsD P)
A: pType P: pFam A
loops (psigma P) <~> psigma (loopsD P)
A: pType P: pFam A
?f pt = pt
A: pType P: pFam A
(equiv_path_sigma P pt pt)^-1%equiv pt = pt
reflexivity.Defined.(* product and loops 'commute' *)
H: Funext A: Type F: A -> pType
loops (pproduct F) <~>* pproduct (loops o F)
H: Funext A: Type F: A -> pType
loops (pproduct F) <~>* pproduct (loops o F)
H: Funext A: Type F: A -> pType
loops (pproduct F) <~> pproduct (loops o F)
H: Funext A: Type F: A -> pType
?f pt = pt
H: Funext A: Type F: A -> pType
equiv_apD10 (funx : A => F x) pt pt pt = pt
reflexivity.Defined.(* product and iterated loops commute *)
H: Funext A: Type F: A -> pType n: nat
iterated_loops n (pproduct F) <~>* pproduct (iterated_loops n o F)
H: Funext A: Type F: A -> pType n: nat
iterated_loops n (pproduct F) <~>* pproduct (iterated_loops n o F)
apply loops_psigma_commute.Defined.(* We can convert between loops in a type and loops in [Type] at that type. *)
H: Univalence A: Type
loops [Type, A] <~>* [A <~> A, 1%equiv]
H: Univalence A: Type
loops [Type, A] <~>* [A <~> A, 1%equiv]
H: Univalence A: Type
{f : loops [Type, A] <~> [A <~> A, 1%equiv] & f pt = pt}
H: Univalence A: Type
equiv_equiv_path A A pt = pt
reflexivity.Defined.(* An iterated version. Note that the statement with "-1" substituted for [n] is [loops [Type, A] <~>* [A -> A, idmap]], which is not true in general. Compare the previous result. *)
H: Funext n: trunc_index X: Type tr_loops: forallx0 : X, IsTrunc n.+1 (loops [X, x0]) x, y: X
IsTrunc n.+1 (x = y)
H: Funext n: trunc_index X: Type tr_loops: forallx0 : X, IsTrunc n.+1 (loops [X, x0]) x, y: X p: x = y
forally0 : x = y, IsTrunc n (p = y0)
H: Funext n: trunc_index X: Type tr_loops: forallx0 : X, IsTrunc n.+1 (loops [X, x0]) x: X
forally : x = x, IsTrunc n (1 = y)
napply tr_loops.Defined.(* 7.2.9, with [n] here meaning the same as [n-1] there. Note that [n.-1] in the statement is short for [trunc_index_pred (nat_to_trunc_index n)] which is definitionally equal to [(trunc_index_inc minus_two n).+1]. *)
H: Funext n: nat A: Type
IsTrunc n.-1 A <~> (foralla : A, Contr (iterated_loops n [A, a]))
H: Funext n: nat A: Type
IsTrunc n.-1 A <~> (foralla : A, Contr (iterated_loops n [A, a]))
H: Funext A: Type
IsTrunc 0%nat.-1 A <~> (foralla : A, Contr (iterated_loops 0 [A, a]))
H: Funext n: nat A: Type IHn: forallA0 : Type,
IsTrunc n.-1 A0 <~> (foralla0 : A0, Contr (iterated_loops n [A0, a0])) a: A
(foralla0 : loops [A, a], Contr (iterated_loops n [loops [A, a], a0])) <~>
In (Tr (-2)) (iterated_loops n (loops [A, a]))
H: Funext n: nat A: Type IHn: forallA0 : Type,
IsTrunc n.-1 A0 <~> (foralla0 : A0, Contr (iterated_loops n [A0, a0])) a: A
In (Tr (-2)) (iterated_loops n (loops [A, a])) ->
foralla0 : loops [A, a], Contr (iterated_loops n [loops [A, a], a0])
H: Funext n: nat A: Type IHn: forallA0 : Type,
IsTrunc n.-1 A0 <~> (foralla0 : A0, Contr (iterated_loops n [A0, a0])) a: A X: In (Tr (-2)) (iterated_loops n (loops [A, a])) p: loops [A, a]
Contr (iterated_loops n [loops [A, a], p])
H: Funext n: nat A: Type IHn: forallA0 : Type,
IsTrunc n.-1 A0 <~> (foralla0 : A0, Contr (iterated_loops n [A0, a0])) a: A X: In (Tr (-2)) (iterated_loops n (loops [A, a])) p: loops [A, a]
iterated_loops n (loops [A, a]) <~> iterated_loops n [loops [A, a], p]
H: Funext n: nat A: Type IHn: forallA0 : Type,
IsTrunc n.-1 A0 <~> (foralla0 : A0, Contr (iterated_loops n [A0, a0])) a: A X: In (Tr (-2)) (iterated_loops n (loops [A, a])) p: loops [A, a]
loops [A, a] $<~> [loops [A, a], p]
H: Funext n: nat A: Type IHn: forallA0 : Type,
IsTrunc n.-1 A0 <~> (foralla0 : A0, Contr (iterated_loops n [A0, a0])) a: A X: In (Tr (-2)) (iterated_loops n (loops [A, a])) p: loops [A, a]
loops [A, a] <~> [loops [A, a], p]
H: Funext n: nat A: Type IHn: forallA0 : Type,
IsTrunc n.-1 A0 <~> (foralla0 : A0, Contr (iterated_loops n [A0, a0])) a: A X: In (Tr (-2)) (iterated_loops n (loops [A, a])) p: loops [A, a]
?f pt = pt
H: Funext n: nat A: Type IHn: forallA0 : Type,
IsTrunc n.-1 A0 <~> (foralla0 : A0, Contr (iterated_loops n [A0, a0])) a: A X: In (Tr (-2)) (iterated_loops n (loops [A, a])) p: loops [A, a]
equiv_concat_lr p 1 pt = pt
H: Funext n: nat A: Type IHn: forallA0 : Type,
IsTrunc n.-1 A0 <~> (foralla0 : A0, Contr (iterated_loops n [A0, a0])) a: A X: In (Tr (-2)) (iterated_loops n (loops [A, a])) p: loops [A, a]
(p @ 1) @ 1 = p
exact (concat_p1 _ @ concat_p1 _).Defined.(** [loops_inv] is a natural transformation. *)
Is1Natural loops loops (funA : pType => loops_inv A)
Is1Natural loops loops (funA : pType => loops_inv A)
forall (aa' : pType) (f : a $-> a'),
(funA : pType => pointed_equiv_fun (loops A) (loops A) (loops_inv A)) a' $o
fmap loops f $==
fmap loops f $o
(funA : pType => pointed_equiv_fun (loops A) (loops A) (loops_inv A)) a
A, B: pType f: A $-> B
(funA0 : pType => pointed_equiv_fun (loops A0) (loops A0) (loops_inv A0)) B $o
fmap loops f $==
fmap loops f $o
(funA0 : pType => pointed_equiv_fun (loops A0) (loops A0) (loops_inv A0)) A
A, B: pType f: A $-> B
(funA0 : pType => pointed_equiv_fun (loops A0) (loops A0) (loops_inv A0)) B $o
fmap loops f ==
fmap loops f $o
(funA0 : pType => pointed_equiv_fun (loops A0) (loops A0) (loops_inv A0)) A
((funp : loops A =>
(inv_Vp (point_eq f) (ap f p @ point_eq f) @
whiskerR
(inv_pp (ap f p) (point_eq f) @ whiskerL (point_eq f)^ (ap_V f p)^)
(point_eq f)) @
concat_pp_p (point_eq f)^ (ap f (loops_inv A p)) (point_eq f))
:
(funA0 : pType => pointed_equiv_fun (loops A0) (loops A0) (loops_inv A0)) B $o
fmap loops f ==
fmap loops f $o
(funA0 : pType => pointed_equiv_fun (loops A0) (loops A0) (loops_inv A0)) A)
pt =
dpoint_eq
((funA0 : pType => pointed_equiv_fun (loops A0) (loops A0) (loops_inv A0))
B $o
fmap loops f) @
(dpoint_eq
(fmap loops f $o
(funA0 : pType => pointed_equiv_fun (loops A0) (loops A0) (loops_inv A0))
A))^
A: Type point0: IsPointed A B: Type f: A -> B
1 = 1
reflexivity.Defined.(** Loops on the pointed type of dependent pointed maps correspond to pointed dependent maps into a family of loops. We define this in this direction, because the forward map is pointed by reflexivity. *)
H: Funext A: pType B: A -> pType
loops (ppforall x : A, B x) <~>* (ppforall x : A, loops (B x))
H: Funext A: pType B: A -> pType
loops (ppforall x : A, B x) <~>* (ppforall x : A, loops (B x))
H: Funext A: pType B: A -> pType
loops (ppforall x : A, B x) <~> (ppforall x : A, loops (B x))
H: Funext A: pType B: A -> pType
?f pt = pt
H: Funext A: pType B: A -> pType
(equiv_path_pforall (point_pforall B) (point_pforall B))^-1%equiv pt = pt