Built with Alectryon, running Coq+SerAPI v8.18.0+0.18.3. 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.
[Loading ML file number_string_notation_plugin.cmxs (using legacy method) ... done]
Require Import Pointed. Require Import WildCat.Core HFiber. Require Import Truncations. Require Import Algebra.Groups.Group. Require Import Homotopy.HomotopyGroup. Local Open Scope pointed_scope. Local Open Scope nat_scope. (** 8.8.1 *)
H: Univalence
A, B: Type
f: A -> B
i: IsConnMap (Tr (-1)) (Trunc_functor 0 f)
ii: forall x y : A, IsEquiv (ap f)

IsEquiv f
H: Univalence
A, B: Type
f: A -> B
i: IsConnMap (Tr (-1)) (Trunc_functor 0 f)
ii: forall x y : A, IsEquiv (ap f)

IsEquiv f
H: Univalence
A, B: Type
f: A -> B
i: IsConnMap (Tr (-1)) (Trunc_functor 0 f)
ii: IsEmbedding f

IsEquiv f
H: Univalence
A, B: Type
f: A -> B
i: IsConnMap (Tr (-1)) (Trunc_functor 0 f)
ii: IsEmbedding f

IsConnMap (Tr (-1)) f
H: Univalence
A, B: Type
f: A -> B
i: IsConnMap (Tr (-1)) (Trunc_functor 0 f)
ii: IsEmbedding f

forall b : B, merely (hfiber f b)
H: Univalence
A, B: Type
f: A -> B
i: IsConnMap (Tr (-1)) (Trunc_functor 0 f)
ii: IsEmbedding f
b: B

Trunc (-1) (hfiber f b)
H: Univalence
A, B: Type
f: A -> B
i: IsConnMap (Tr (-1)) (Trunc_functor 0 f)
ii: IsEmbedding f
b: B
p: Tr (-1) (hfiber (Trunc_functor 0 f) (tr b))

Trunc (-1) (hfiber f b)
H: Univalence
A, B: Type
f: A -> B
i: IsConnMap (Tr (-1)) (Trunc_functor 0 f)
ii: IsEmbedding f
b: B

Tr (-1) (hfiber (Trunc_functor 0 f) (tr b)) -> Trunc (-1) (hfiber f b)
H: Univalence
A, B: Type
f: A -> B
i: IsConnMap (Tr (-1)) (Trunc_functor 0 f)
ii: IsEmbedding f
b: B

hfiber (Trunc_functor 0 f) (tr b) -> hfiber f b
H: Univalence
A, B: Type
f: A -> B
i: IsConnMap (Tr (-1)) (Trunc_functor 0 f)
ii: IsEmbedding f
b: B

forall proj1 : Tr 0 A, Trunc_functor 0 f proj1 = tr b -> hfiber f b
H: Univalence
A, B: Type
f: A -> B
i: IsConnMap (Tr (-1)) (Trunc_functor 0 f)
ii: IsEmbedding f
b: B

forall a : A, (fun aa : Trunc 0 A => Trunc_functor 0 f aa = tr b -> hfiber f b) (tr a)
H: Univalence
A, B: Type
f: A -> B
i: IsConnMap (Tr (-1)) (Trunc_functor 0 f)
ii: IsEmbedding f
b: B
a: A
p: Trunc_functor 0 f (tr a) = tr b

hfiber f b
H: Univalence
A, B: Type
f: A -> B
i: IsConnMap (Tr (-1)) (Trunc_functor 0 f)
ii: IsEmbedding f
b: B
a: A
p: Tr (-1) (f a = b)

hfiber f b
H: Univalence
A, B: Type
f: A -> B
i: IsConnMap (Tr (-1)) (Trunc_functor 0 f)
ii: IsEmbedding f
b: B
a: A
p: f a = b

hfiber f b
H: Univalence
A, B: Type
f: A -> B
i: IsConnMap (Tr (-1)) (Trunc_functor 0 f)
ii: IsEmbedding f
b: B
a: A
p: f a = b

f a = b
exact p. Defined. (** 8.8.2 *)
H: Univalence
A, B: Type
f: A -> B
i: IsEquiv (Trunc_functor 0 f)
ii: forall x : A, IsEquiv (fmap loops (pmap_from_point f x))

IsEquiv f
H: Univalence
A, B: Type
f: A -> B
i: IsEquiv (Trunc_functor 0 f)
ii: forall x : A, IsEquiv (fmap loops (pmap_from_point f x))

IsEquiv f
H: Univalence
A, B: Type
f: A -> B
i: IsEquiv (Trunc_functor 0 f)
ii: forall x : A, IsEquiv (fmap loops (pmap_from_point f x))

forall x y : A, IsEquiv (ap f)
H: Univalence
A, B: Type
f: A -> B
i: IsEquiv (Trunc_functor 0 f)
ii: forall x : A, IsEquiv (fmap loops (pmap_from_point f x))
x, y: A

IsEquiv (ap f)
H: Univalence
A, B: Type
f: A -> B
i: IsEquiv (Trunc_functor 0 f)
ii: forall x : A, IsEquiv (fmap loops (pmap_from_point f x))
x, y: A

f x = f y -> IsEquiv (ap f)
H: Univalence
A, B: Type
f: A -> B
i: IsEquiv (Trunc_functor 0 f)
ii: forall x : A, IsEquiv (fmap loops (pmap_from_point f x))
x, y: A
p: f x = f y

IsEquiv (ap f)
H: Univalence
A, B: Type
f: A -> B
i: IsEquiv (Trunc_functor 0 f)
ii: forall x : A, IsEquiv (fmap loops (pmap_from_point f x))
x, y: A
p: tr (f x) = tr (f y)

IsEquiv (ap f)
H: Univalence
A, B: Type
f: A -> B
i: IsEquiv (Trunc_functor 0 f)
ii: forall x : A, IsEquiv (fmap loops (pmap_from_point f x))
x, y: A
p: tr x = tr y

IsEquiv (ap f)
H: Univalence
A, B: Type
f: A -> B
i: IsEquiv (Trunc_functor 0 f)
ii: forall x : A, IsEquiv (fmap loops (pmap_from_point f x))
x, y: A
p: Tr (-1) (x = y)

IsEquiv (ap f)
H: Univalence
A, B: Type
f: A -> B
i: IsEquiv (Trunc_functor 0 f)
ii: forall x : A, IsEquiv (fmap loops (pmap_from_point f x))
x, y: A
p: x = y

IsEquiv (ap f)
H: Univalence
A, B: Type
f: A -> B
i: IsEquiv (Trunc_functor 0 f)
ii: forall x : A, IsEquiv (fmap loops (pmap_from_point f x))
x: A

IsEquiv (ap f)
H: Univalence
A, B: Type
f: A -> B
i: IsEquiv (Trunc_functor 0 f)
ii: forall x : A, IsEquiv (fun p : x = x => 1 @ (ap f p @ 1))
x: A

IsEquiv (ap f)
H: Univalence
A, B: Type
f: A -> B
i: IsEquiv (Trunc_functor 0 f)
ii: forall x : A, IsEquiv (fun p : x = x => 1 @ (ap f p @ 1))
x: A

(fun p : x = x => 1 @ (ap f p @ 1)) == ap f
exact (fun _ => concat_1p _ @ concat_p1 _). Defined. (** When the types are 0-connected and the map is pointed, just one [loops_functor] needs to be checked. *)
H: Univalence
A, B: pType
H0: IsConnected (Tr 0%nat) A
H1: IsConnected (Tr 0%nat) B
f: A ->* B
e: IsEquiv (fmap loops f)

IsEquiv f
H: Univalence
A, B: pType
H0: IsConnected (Tr 0%nat) A
H1: IsConnected (Tr 0%nat) B
f: A ->* B
e: IsEquiv (fmap loops f)

IsEquiv f
H: Univalence
A, B: pType
H0: IsConnected (Tr 0%nat) A
H1: IsConnected (Tr 0%nat) B
f: A ->* B
e: IsEquiv (fmap loops f)

IsEquiv (Trunc_functor 0 f)
H: Univalence
A, B: pType
H0: IsConnected (Tr 0%nat) A
H1: IsConnected (Tr 0%nat) B
f: A ->* B
e: IsEquiv (fmap loops f)
forall x : A, IsEquiv (fmap loops (pmap_from_point f x))
(** The pi_0 condition is trivial because [A] and [B] are 0-connected. *)
H: Univalence
A, B: pType
H0: IsConnected (Tr 0%nat) A
H1: IsConnected (Tr 0%nat) B
f: A ->* B
e: IsEquiv (fmap loops f)

forall x : A, IsEquiv (fmap loops (pmap_from_point f x))
(** Since [A] is 0-connected, it's enough to check the [loops_functor] condition for the basepoint. *)
H: Univalence
A, B: pType
H0: IsConnected (Tr 0%nat) A
H1: IsConnected (Tr 0%nat) B
f: A ->* B
e: IsEquiv (fmap loops f)

IsEquiv (fmap loops (pmap_from_point f pt))
(** The [loops_functor] condition for [pmap_from_point f _] is equivalent to the [loops_functor] condition for [f] with its given pointing. *)
H: Univalence
A, B: pType
H0: IsConnected (Tr 0%nat) A
H1: IsConnected (Tr 0%nat) B
f: A ->* B
e: IsEquiv (fmap loops f)

loops [A, pt] <~> loops [B, f pt]
H: Univalence
A, B: pType
H0: IsConnected (Tr 0%nat) A
H1: IsConnected (Tr 0%nat) B
f: A ->* B
e: IsEquiv (fmap loops f)
?f == fmap loops (pmap_from_point f pt)
H: Univalence
A, B: pType
H0: IsConnected (Tr 0%nat) A
H1: IsConnected (Tr 0%nat) B
f: A ->* B
e: IsEquiv (fmap loops f)

loops [A, pt] <~> loops [B, f pt]
exact (equiv_concat_lr (point_eq f) (point_eq f)^ oE (Build_Equiv _ _ _ e)).
H: Univalence
A, B: pType
H0: IsConnected (Tr 0%nat) A
H1: IsConnected (Tr 0%nat) B
f: A ->* B
e: IsEquiv (fmap loops f)

equiv_concat_lr (point_eq f) (point_eq f)^ oE {| equiv_fun := fmap loops f; equiv_isequiv := e |} == fmap loops (pmap_from_point f pt)
H: Univalence
A, B: pType
H0: IsConnected (Tr 0%nat) A
H1: IsConnected (Tr 0%nat) B
f: A ->* B
e: IsEquiv (fmap loops f)
r: loops [A, pt]

(equiv_concat_lr (point_eq f) (point_eq f)^ oE {| equiv_fun := fmap loops f; equiv_isequiv := e |}) r = fmap loops (pmap_from_point f pt) r
H: Univalence
A, B: pType
H0: IsConnected (Tr 0%nat) A
H1: IsConnected (Tr 0%nat) B
f: A ->* B
e: IsEquiv (fmap loops f)
r: loops [A, pt]

(point_eq f @ ((point_eq f)^ @ (ap f r @ point_eq f))) @ (point_eq f)^ = 1 @ (ap f r @ 1)
hott_simpl. Defined. (** Truncated Whitehead's principle (8.8.3) *)
ua: Univalence
A, B: Type
f: A -> B
n: trunc_index
H0: IsTrunc n A
H1: IsTrunc n B
i: IsEquiv (Trunc_functor 0 f)
ii: forall (x : A) (k : nat), IsEquiv (fmap (Pi k.+1) (pmap_from_point f x))

IsEquiv f
ua: Univalence
A, B: Type
f: A -> B
n: trunc_index
H0: IsTrunc n A
H1: IsTrunc n B
i: IsEquiv (Trunc_functor 0 f)
ii: forall (x : A) (k : nat), IsEquiv (fmap (Pi k.+1) (pmap_from_point f x))

IsEquiv f
ua: Univalence
n: trunc_index

forall A B : Type, IsTrunc n A -> IsTrunc n B -> forall f : A -> B, IsEquiv (Trunc_functor 0 f) -> (forall (x : A) (k : nat), IsEquiv (fmap (Pi k.+1) (pmap_from_point f x))) -> IsEquiv f
ua: Univalence

forall A B : Type, Contr A -> Contr B -> forall f : A -> B, IsEquiv (Trunc_functor 0 f) -> (forall (x : A) (k : nat), IsEquiv (fmap (Pi k.+1) (pmap_from_point f x))) -> IsEquiv f
ua: Univalence
n: trunc_index
IHn: forall A B : Type, IsTrunc n A -> IsTrunc n B -> forall f : A -> B, IsEquiv (Trunc_functor 0 f) -> (forall (x : A) (k : nat), IsEquiv (fmap (Pi k.+1) (pmap_from_point f x))) -> IsEquiv f
forall A B : Type, IsTrunc n.+1 A -> IsTrunc n.+1 B -> forall f : A -> B, IsEquiv (Trunc_functor 0 f) -> (forall (x : A) (k : nat), IsEquiv (fmap (Pi k.+1) (pmap_from_point f x))) -> IsEquiv f
ua: Univalence
n: trunc_index
IHn: forall A B : Type, IsTrunc n A -> IsTrunc n B -> forall f : A -> B, IsEquiv (Trunc_functor 0 f) -> (forall (x : A) (k : nat), IsEquiv (fmap (Pi k.+1) (pmap_from_point f x))) -> IsEquiv f

forall A B : Type, IsTrunc n.+1 A -> IsTrunc n.+1 B -> forall f : A -> B, IsEquiv (Trunc_functor 0 f) -> (forall (x : A) (k : nat), IsEquiv (fmap (Pi k.+1) (pmap_from_point f x))) -> IsEquiv f
ua: Univalence
n: trunc_index
IHn: forall A B : Type, IsTrunc n A -> IsTrunc n B -> forall f : A -> B, IsEquiv (Trunc_functor 0 f) -> (forall (x : A) (k : nat), IsEquiv (fmap (Pi k.+1) (pmap_from_point f x))) -> IsEquiv f
A, B: Type
H0: IsTrunc n.+1 A
H1: IsTrunc n.+1 B
f: A -> B
i: IsEquiv (Trunc_functor 0 f)
ii: forall (x : A) (k : nat), IsEquiv (fmap (Pi k.+1) (pmap_from_point f x))

IsEquiv f
ua: Univalence
n: trunc_index
IHn: forall A B : Type, IsTrunc n A -> IsTrunc n B -> forall f : A -> B, IsEquiv (Trunc_functor 0 f) -> (forall (x : A) (k : nat), IsEquiv (fmap (Pi k.+1) (pmap_from_point f x))) -> IsEquiv f
A, B: Type
H0: IsTrunc n.+1 A
H1: IsTrunc n.+1 B
f: A -> B
i: IsEquiv (Trunc_functor 0 f)
ii: forall (x : A) (k : nat), IsEquiv (fmap (Pi k.+1) (pmap_from_point f x))

forall x : A, IsEquiv (fmap loops (pmap_from_point f x))
ua: Univalence
n: trunc_index
IHn: forall A B : Type, IsTrunc n A -> IsTrunc n B -> forall f : A -> B, IsEquiv (Trunc_functor 0 f) -> (forall (x : A) (k : nat), IsEquiv (fmap (Pi k.+1) (pmap_from_point f x))) -> IsEquiv f
A, B: Type
H0: IsTrunc n.+1 A
H1: IsTrunc n.+1 B
f: A -> B
i: IsEquiv (Trunc_functor 0 f)
ii: forall (x : A) (k : nat), IsEquiv (fmap (Pi k.+1) (pmap_from_point f x))
x: A

IsEquiv (fmap loops (pmap_from_point f x))
ua: Univalence
n: trunc_index
IHn: forall A B : Type, IsTrunc n A -> IsTrunc n B -> forall f : A -> B, IsEquiv (Trunc_functor 0 f) -> (forall (x : A) (k : nat), IsEquiv (fmap (Pi k.+1) (pmap_from_point f x))) -> IsEquiv f
A, B: Type
H0: IsTrunc n.+1 A
H1: IsTrunc n.+1 B
f: A -> B
i: IsEquiv (Trunc_functor 0 f)
ii: forall (x : A) (k : nat), IsEquiv (fmap (Pi k.+1) (pmap_from_point f x))
x: A

IsEquiv (ap f)
ua: Univalence
n: trunc_index
IHn: forall A B : Type, IsTrunc n A -> IsTrunc n B -> forall f : A -> B, IsEquiv (Trunc_functor 0 f) -> (forall (x : A) (k : nat), IsEquiv (fmap (Pi k.+1) (pmap_from_point f x))) -> IsEquiv f
A, B: Type
H0: IsTrunc n.+1 A
H1: IsTrunc n.+1 B
f: A -> B
i: IsEquiv (Trunc_functor 0 f)
ii: forall (x : A) (k : nat), IsEquiv (fmap (Pi k.+1) (pmap_from_point f x))
x: A
ap f == fmap loops (pmap_from_point f x)
ua: Univalence
n: trunc_index
IHn: forall A B : Type, IsTrunc n A -> IsTrunc n B -> forall f : A -> B, IsEquiv (Trunc_functor 0 f) -> (forall (x : A) (k : nat), IsEquiv (fmap (Pi k.+1) (pmap_from_point f x))) -> IsEquiv f
A, B: Type
H0: IsTrunc n.+1 A
H1: IsTrunc n.+1 B
f: A -> B
i: IsEquiv (Trunc_functor 0 f)
ii: forall (x : A) (k : nat), IsEquiv (fmap (Pi k.+1) (pmap_from_point f x))
x: A

ap f == fmap loops (pmap_from_point f x)
ua: Univalence
n: trunc_index
IHn: forall A B : Type, IsTrunc n A -> IsTrunc n B -> forall f : A -> B, IsEquiv (Trunc_functor 0 f) -> (forall (x : A) (k : nat), IsEquiv (fmap (Pi k.+1) (pmap_from_point f x))) -> IsEquiv f
A, B: Type
H0: IsTrunc n.+1 A
H1: IsTrunc n.+1 B
f: A -> B
i: IsEquiv (Trunc_functor 0 f)
ii: forall (x : A) (k : nat), IsEquiv (fmap (Pi k.+1) (pmap_from_point f x))
x: A
p: x = x

ap f p = 1 @ (ap f p @ 1)
symmetry; exact (concat_1p _ @ concat_p1 _).
ua: Univalence
n: trunc_index
IHn: forall A B : Type, IsTrunc n A -> IsTrunc n B -> forall f : A -> B, IsEquiv (Trunc_functor 0 f) -> (forall (x : A) (k : nat), IsEquiv (fmap (Pi k.+1) (pmap_from_point f x))) -> IsEquiv f
A, B: Type
H0: IsTrunc n.+1 A
H1: IsTrunc n.+1 B
f: A -> B
i: IsEquiv (Trunc_functor 0 f)
ii: forall (x : A) (k : nat), IsEquiv (fmap (Pi k.+1) (pmap_from_point f x))
x: A

IsEquiv (ap f)
ua: Univalence
n: trunc_index
IHn: forall A B : Type, IsTrunc n A -> IsTrunc n B -> forall f : A -> B, IsEquiv (Trunc_functor 0 f) -> (forall (x : A) (k : nat), IsEquiv (fmap (Pi k.+1) (pmap_from_point f x))) -> IsEquiv f
A, B: Type
H0: IsTrunc n.+1 A
H1: IsTrunc n.+1 B
f: A -> B
i: IsEquiv (Trunc_functor 0 f)
ii: forall (x : A) (k : nat), IsEquiv (fmap (Pi k.+1) (pmap_from_point f x))
x: A
h0: IsTrunc n (x = x)

IsEquiv (ap f)
ua: Univalence
n: trunc_index
IHn: forall A B : Type, IsTrunc n A -> IsTrunc n B -> forall f : A -> B, IsEquiv (Trunc_functor 0 f) -> (forall (x : A) (k : nat), IsEquiv (fmap (Pi k.+1) (pmap_from_point f x))) -> IsEquiv f
A, B: Type
H0: IsTrunc n.+1 A
H1: IsTrunc n.+1 B
f: A -> B
i: IsEquiv (Trunc_functor 0 f)
ii: forall (x : A) (k : nat), IsEquiv (fmap (Pi k.+1) (pmap_from_point f x))
x: A
h0: IsTrunc n (x = x)
h1: IsTrunc n (f x = f x)

IsEquiv (ap f)
ua: Univalence
n: trunc_index
IHn: forall A B : Type, IsTrunc n A -> IsTrunc n B -> forall f : A -> B, IsEquiv (Trunc_functor 0 f) -> (forall (x : A) (k : nat), IsEquiv (fmap (Pi k.+1) (pmap_from_point f x))) -> IsEquiv f
A, B: Type
H0: IsTrunc n.+1 A
H1: IsTrunc n.+1 B
f: A -> B
i: IsEquiv (Trunc_functor 0 f)
ii: forall (x : A) (k : nat), IsEquiv (fmap (Pi k.+1) (pmap_from_point f x))
x: A
h0: IsTrunc n (x = x)
h1: IsTrunc n (f x = f x)

IsEquiv (Trunc_functor 0 (ap f))
ua: Univalence
n: trunc_index
IHn: forall A B : Type, IsTrunc n A -> IsTrunc n B -> forall f : A -> B, IsEquiv (Trunc_functor 0 f) -> (forall (x : A) (k : nat), IsEquiv (fmap (Pi k.+1) (pmap_from_point f x))) -> IsEquiv f
A, B: Type
H0: IsTrunc n.+1 A
H1: IsTrunc n.+1 B
f: A -> B
i: IsEquiv (Trunc_functor 0 f)
ii: forall (x : A) (k : nat), IsEquiv (fmap (Pi k.+1) (pmap_from_point f x))
x: A
h0: IsTrunc n (x = x)
h1: IsTrunc n (f x = f x)
forall (x0 : x = x) (k : nat), IsEquiv (fmap (Pi k.+1) (pmap_from_point (ap f) x0))
ua: Univalence
n: trunc_index
IHn: forall A B : Type, IsTrunc n A -> IsTrunc n B -> forall f : A -> B, IsEquiv (Trunc_functor 0 f) -> (forall (x : A) (k : nat), IsEquiv (fmap (Pi k.+1) (pmap_from_point f x))) -> IsEquiv f
A, B: Type
H0: IsTrunc n.+1 A
H1: IsTrunc n.+1 B
f: A -> B
i: IsEquiv (Trunc_functor 0 f)
ii: forall (x : A) (k : nat), IsEquiv (fmap (Pi k.+1) (pmap_from_point f x))
x: A
h0: IsTrunc n (x = x)
h1: IsTrunc n (f x = f x)

IsEquiv (Trunc_functor 0 (ap f))
ua: Univalence
n: trunc_index
IHn: forall A B : Type, IsTrunc n A -> IsTrunc n B -> forall f : A -> B, IsEquiv (Trunc_functor 0 f) -> (forall (x : A) (k : nat), IsEquiv (fmap (Pi k.+1) (pmap_from_point f x))) -> IsEquiv f
A, B: Type
H0: IsTrunc n.+1 A
H1: IsTrunc n.+1 B
f: A -> B
i: IsEquiv (Trunc_functor 0 f)
ii: forall (x : A) (k : nat), IsEquiv (fmap (Pi k.+1) (pmap_from_point f x))
x: A
h0: IsTrunc n (x = x)
h1: IsTrunc n (f x = f x)
h2: IsEquiv (fmap (Pi 1) (pmap_from_point f x))

IsEquiv (Trunc_functor 0 (ap f))
ua: Univalence
n: trunc_index
IHn: forall A B : Type, IsTrunc n A -> IsTrunc n B -> forall f : A -> B, IsEquiv (Trunc_functor 0 f) -> (forall (x : A) (k : nat), IsEquiv (fmap (Pi k.+1) (pmap_from_point f x))) -> IsEquiv f
A, B: Type
H0: IsTrunc n.+1 A
H1: IsTrunc n.+1 B
f: A -> B
i: IsEquiv (Trunc_functor 0 f)
ii: forall (x : A) (k : nat), IsEquiv (fmap (Pi k.+1) (pmap_from_point f x))
x: A
h0: IsTrunc n (x = x)
h1: IsTrunc n (f x = f x)
h2: IsEquiv (Trunc_functor 0 (fun p : x = x => 1 @ (ap f p @ 1)))

IsEquiv (Trunc_functor 0 (ap f))
ua: Univalence
n: trunc_index
IHn: forall A B : Type, IsTrunc n A -> IsTrunc n B -> forall f : A -> B, IsEquiv (Trunc_functor 0 f) -> (forall (x : A) (k : nat), IsEquiv (fmap (Pi k.+1) (pmap_from_point f x))) -> IsEquiv f
A, B: Type
H0: IsTrunc n.+1 A
H1: IsTrunc n.+1 B
f: A -> B
i: IsEquiv (Trunc_functor 0 f)
ii: forall (x : A) (k : nat), IsEquiv (fmap (Pi k.+1) (pmap_from_point f x))
x: A
h0: IsTrunc n (x = x)
h1: IsTrunc n (f x = f x)
h2: IsEquiv (Trunc_functor 0 (fun p : x = x => 1 @ (ap f p @ 1)))

Trunc_functor 0 (fun p : x = x => 1 @ (ap f p @ 1)) == Trunc_functor 0 (ap f)
ua: Univalence
n: trunc_index
IHn: forall A B : Type, IsTrunc n A -> IsTrunc n B -> forall f : A -> B, IsEquiv (Trunc_functor 0 f) -> (forall (x : A) (k : nat), IsEquiv (fmap (Pi k.+1) (pmap_from_point f x))) -> IsEquiv f
A, B: Type
H0: IsTrunc n.+1 A
H1: IsTrunc n.+1 B
f: A -> B
i: IsEquiv (Trunc_functor 0 f)
ii: forall (x : A) (k : nat), IsEquiv (fmap (Pi k.+1) (pmap_from_point f x))
x: A
h0: IsTrunc n (x = x)
h1: IsTrunc n (f x = f x)
h2: IsEquiv (Trunc_functor 0 (fun p : x = x => 1 @ (ap f p @ 1)))
p: x = x

1 @ (ap f p @ 1) = ap f p
exact (concat_1p _ @ concat_p1 _).
ua: Univalence
n: trunc_index
IHn: forall A B : Type, IsTrunc n A -> IsTrunc n B -> forall f : A -> B, IsEquiv (Trunc_functor 0 f) -> (forall (x : A) (k : nat), IsEquiv (fmap (Pi k.+1) (pmap_from_point f x))) -> IsEquiv f
A, B: Type
H0: IsTrunc n.+1 A
H1: IsTrunc n.+1 B
f: A -> B
i: IsEquiv (Trunc_functor 0 f)
ii: forall (x : A) (k : nat), IsEquiv (fmap (Pi k.+1) (pmap_from_point f x))
x: A
h0: IsTrunc n (x = x)
h1: IsTrunc n (f x = f x)

forall (x0 : x = x) (k : nat), IsEquiv (fmap (Pi k.+1) (pmap_from_point (ap f) x0))
ua: Univalence
n: trunc_index
IHn: forall A B : Type, IsTrunc n A -> IsTrunc n B -> forall f : A -> B, IsEquiv (Trunc_functor 0 f) -> (forall (x : A) (k : nat), IsEquiv (fmap (Pi k.+1) (pmap_from_point f x))) -> IsEquiv f
A, B: Type
H0: IsTrunc n.+1 A
H1: IsTrunc n.+1 B
f: A -> B
i: IsEquiv (Trunc_functor 0 f)
ii: forall (x : A) (k : nat), IsEquiv (fmap (Pi k.+1) (pmap_from_point f x))
x: A
h0: IsTrunc n (x = x)
h1: IsTrunc n (f x = f x)
k: nat

forall p : x = x, IsEquiv (fmap (Pi k.+1) (pmap_from_point (ap f) p))
ua: Univalence
n: trunc_index
IHn: forall A B : Type, IsTrunc n A -> IsTrunc n B -> forall f : A -> B, IsEquiv (Trunc_functor 0 f) -> (forall (x : A) (k : nat), IsEquiv (fmap (Pi k.+1) (pmap_from_point f x))) -> IsEquiv f
A, B: Type
H0: IsTrunc n.+1 A
H1: IsTrunc n.+1 B
f: A -> B
i: IsEquiv (Trunc_functor 0 f)
ii: forall (x : A) (k : nat), IsEquiv (fmap (Pi k.+1) (pmap_from_point f x))
x: A
h0: IsTrunc n (x = x)
h1: IsTrunc n (f x = f x)
k: nat

forall (y : A) (q : x = y), IsEquiv (fmap (Pi k.+1) (pmap_from_point (ap f) q))
ua: Univalence
n: trunc_index
IHn: forall A B : Type, IsTrunc n A -> IsTrunc n B -> forall f : A -> B, IsEquiv (Trunc_functor 0 f) -> (forall (x : A) (k : nat), IsEquiv (fmap (Pi k.+1) (pmap_from_point f x))) -> IsEquiv f
A, B: Type
H0: IsTrunc n.+1 A
H1: IsTrunc n.+1 B
f: A -> B
i: IsEquiv (Trunc_functor 0 f)
ii: forall (x : A) (k : nat), IsEquiv (fmap (Pi k.+1) (pmap_from_point f x))
x: A
h0: IsTrunc n (x = x)
h1: IsTrunc n (f x = f x)
k: nat
h3: forall (y : A) (q : x = y), IsEquiv (fmap (Pi k.+1) (pmap_from_point (ap f) q))
forall p : x = x, IsEquiv (fmap (Pi k.+1) (pmap_from_point (ap f) p))
ua: Univalence
n: trunc_index
IHn: forall A B : Type, IsTrunc n A -> IsTrunc n B -> forall f : A -> B, IsEquiv (Trunc_functor 0 f) -> (forall (x : A) (k : nat), IsEquiv (fmap (Pi k.+1) (pmap_from_point f x))) -> IsEquiv f
A, B: Type
H0: IsTrunc n.+1 A
H1: IsTrunc n.+1 B
f: A -> B
i: IsEquiv (Trunc_functor 0 f)
ii: forall (x : A) (k : nat), IsEquiv (fmap (Pi k.+1) (pmap_from_point f x))
x: A
h0: IsTrunc n (x = x)
h1: IsTrunc n (f x = f x)
k: nat

forall (y : A) (q : x = y), IsEquiv (fmap (Pi k.+1) (pmap_from_point (ap f) q))
ua: Univalence
n: trunc_index
IHn: forall A B : Type, IsTrunc n A -> IsTrunc n B -> forall f : A -> B, IsEquiv (Trunc_functor 0 f) -> (forall (x : A) (k : nat), IsEquiv (fmap (Pi k.+1) (pmap_from_point f x))) -> IsEquiv f
A, B: Type
H0: IsTrunc n.+1 A
H1: IsTrunc n.+1 B
f: A -> B
i: IsEquiv (Trunc_functor 0 f)
ii: forall (x : A) (k : nat), IsEquiv (fmap (Pi k.+1) (pmap_from_point f x))
x: A
h0: IsTrunc n (x = x)
h1: IsTrunc n (f x = f x)
k: nat
y: A
q: x = y

IsEquiv (fmap (Pi k.+1) (pmap_from_point (ap f) q))
ua: Univalence
n: trunc_index
IHn: forall A B : Type, IsTrunc n A -> IsTrunc n B -> forall f : A -> B, IsEquiv (Trunc_functor 0 f) -> (forall (x : A) (k : nat), IsEquiv (fmap (Pi k.+1) (pmap_from_point f x))) -> IsEquiv f
A, B: Type
H0: IsTrunc n.+1 A
H1: IsTrunc n.+1 B
f: A -> B
i: IsEquiv (Trunc_functor 0 f)
ii: forall (x : A) (k : nat), IsEquiv (fmap (Pi k.+1) (pmap_from_point f x))
x: A
h0: IsTrunc n (x = x)
h1: IsTrunc n (f x = f x)
k: nat

IsEquiv (fmap (Pi k.+1) (pmap_from_point (ap f) 1))
ua: Univalence
n: trunc_index
IHn: forall A B : Type, IsTrunc n A -> IsTrunc n B -> forall f : A -> B, IsEquiv (Trunc_functor 0 f) -> (forall (x : A) (k : nat), IsEquiv (fmap (Pi k.+1) (pmap_from_point f x))) -> IsEquiv f
A, B: Type
H0: IsTrunc n.+1 A
H1: IsTrunc n.+1 B
f: A -> B
i: IsEquiv (Trunc_functor 0 f)
ii: forall (x : A) (k : nat), IsEquiv (fmap (Pi k.+1) (pmap_from_point f x))
x: A
h0: IsTrunc n (x = x)
h1: IsTrunc n (f x = f x)
k: nat

Pi k.+1 [x = x, 1] -> Pi k.+1 [f x = f x, ap f 1]
ua: Univalence
n: trunc_index
IHn: forall A B : Type, IsTrunc n A -> IsTrunc n B -> forall f : A -> B, IsEquiv (Trunc_functor 0 f) -> (forall (x : A) (k : nat), IsEquiv (fmap (Pi k.+1) (pmap_from_point f x))) -> IsEquiv f
A, B: Type
H0: IsTrunc n.+1 A
H1: IsTrunc n.+1 B
f: A -> B
i: IsEquiv (Trunc_functor 0 f)
ii: forall (x : A) (k : nat), IsEquiv (fmap (Pi k.+1) (pmap_from_point f x))
x: A
h0: IsTrunc n (x = x)
h1: IsTrunc n (f x = f x)
k: nat
IsEquiv ?f
ua: Univalence
n: trunc_index
IHn: forall A B : Type, IsTrunc n A -> IsTrunc n B -> forall f : A -> B, IsEquiv (Trunc_functor 0 f) -> (forall (x : A) (k : nat), IsEquiv (fmap (Pi k.+1) (pmap_from_point f x))) -> IsEquiv f
A, B: Type
H0: IsTrunc n.+1 A
H1: IsTrunc n.+1 B
f: A -> B
i: IsEquiv (Trunc_functor 0 f)
ii: forall (x : A) (k : nat), IsEquiv (fmap (Pi k.+1) (pmap_from_point f x))
x: A
h0: IsTrunc n (x = x)
h1: IsTrunc n (f x = f x)
k: nat
?f == fmap (Pi k.+1) (pmap_from_point (ap f) 1)
ua: Univalence
n: trunc_index
IHn: forall A B : Type, IsTrunc n A -> IsTrunc n B -> forall f : A -> B, IsEquiv (Trunc_functor 0 f) -> (forall (x : A) (k : nat), IsEquiv (fmap (Pi k.+1) (pmap_from_point f x))) -> IsEquiv f
A, B: Type
H0: IsTrunc n.+1 A
H1: IsTrunc n.+1 B
f: A -> B
i: IsEquiv (Trunc_functor 0 f)
ii: forall (x : A) (k : nat), IsEquiv (fmap (Pi k.+1) (pmap_from_point f x))
x: A
h0: IsTrunc n (x = x)
h1: IsTrunc n (f x = f x)
k: nat

IsEquiv (fmap (Pi k.+1) (fmap loops (pmap_from_point f x)))
ua: Univalence
n: trunc_index
IHn: forall A B : Type, IsTrunc n A -> IsTrunc n B -> forall f : A -> B, IsEquiv (Trunc_functor 0 f) -> (forall (x : A) (k : nat), IsEquiv (fmap (Pi k.+1) (pmap_from_point f x))) -> IsEquiv f
A, B: Type
H0: IsTrunc n.+1 A
H1: IsTrunc n.+1 B
f: A -> B
i: IsEquiv (Trunc_functor 0 f)
ii: forall (x : A) (k : nat), IsEquiv (fmap (Pi k.+1) (pmap_from_point f x))
x: A
h0: IsTrunc n (x = x)
h1: IsTrunc n (f x = f x)
k: nat
fmap (Pi k.+1) (fmap loops (pmap_from_point f x)) == fmap (Pi k.+1) (pmap_from_point (ap f) 1)
ua: Univalence
n: trunc_index
IHn: forall A B : Type, IsTrunc n A -> IsTrunc n B -> forall f : A -> B, IsEquiv (Trunc_functor 0 f) -> (forall (x : A) (k : nat), IsEquiv (fmap (Pi k.+1) (pmap_from_point f x))) -> IsEquiv f
A, B: Type
H0: IsTrunc n.+1 A
H1: IsTrunc n.+1 B
f: A -> B
i: IsEquiv (Trunc_functor 0 f)
ii: forall (x : A) (k : nat), IsEquiv (fmap (Pi k.+1) (pmap_from_point f x))
x: A
h0: IsTrunc n (x = x)
h1: IsTrunc n (f x = f x)
k: nat

fmap (Pi k.+1) (fmap loops (pmap_from_point f x)) == fmap (Pi k.+1) (pmap_from_point (ap f) 1)
ua: Univalence
n: trunc_index
IHn: forall A B : Type, IsTrunc n A -> IsTrunc n B -> forall f : A -> B, IsEquiv (Trunc_functor 0 f) -> (forall (x : A) (k : nat), IsEquiv (fmap (Pi k.+1) (pmap_from_point f x))) -> IsEquiv f
A, B: Type
H0: IsTrunc n.+1 A
H1: IsTrunc n.+1 B
f: A -> B
i: IsEquiv (Trunc_functor 0 f)
ii: forall (x : A) (k : nat), IsEquiv (fmap (Pi k.+1) (pmap_from_point f x))
x: A
h0: IsTrunc n (x = x)
h1: IsTrunc n (f x = f x)
k: nat

fmap loops (pmap_from_point f x) == pmap_from_point (ap f) 1
ua: Univalence
n: trunc_index
IHn: forall A B : Type, IsTrunc n A -> IsTrunc n B -> forall f : A -> B, IsEquiv (Trunc_functor 0 f) -> (forall (x : A) (k : nat), IsEquiv (fmap (Pi k.+1) (pmap_from_point f x))) -> IsEquiv f
A, B: Type
H0: IsTrunc n.+1 A
H1: IsTrunc n.+1 B
f: A -> B
i: IsEquiv (Trunc_functor 0 f)
ii: forall (x : A) (k : nat), IsEquiv (fmap (Pi k.+1) (pmap_from_point f x))
x: A
h0: IsTrunc n (x = x)
h1: IsTrunc n (f x = f x)
k: nat
?p pt = dpoint_eq (fmap loops (pmap_from_point f x)) @ (dpoint_eq (pmap_from_point (ap f) 1))^
ua: Univalence
n: trunc_index
IHn: forall A B : Type, IsTrunc n A -> IsTrunc n B -> forall f : A -> B, IsEquiv (Trunc_functor 0 f) -> (forall (x : A) (k : nat), IsEquiv (fmap (Pi k.+1) (pmap_from_point f x))) -> IsEquiv f
A, B: Type
H0: IsTrunc n.+1 A
H1: IsTrunc n.+1 B
f: A -> B
i: IsEquiv (Trunc_functor 0 f)
ii: forall (x : A) (k : nat), IsEquiv (fmap (Pi k.+1) (pmap_from_point f x))
x: A
h0: IsTrunc n (x = x)
h1: IsTrunc n (f x = f x)
k: nat

fmap loops (pmap_from_point f x) == pmap_from_point (ap f) 1
ua: Univalence
n: trunc_index
IHn: forall A B : Type, IsTrunc n A -> IsTrunc n B -> forall f : A -> B, IsEquiv (Trunc_functor 0 f) -> (forall (x : A) (k : nat), IsEquiv (fmap (Pi k.+1) (pmap_from_point f x))) -> IsEquiv f
A, B: Type
H0: IsTrunc n.+1 A
H1: IsTrunc n.+1 B
f: A -> B
i: IsEquiv (Trunc_functor 0 f)
ii: forall (x : A) (k : nat), IsEquiv (fmap (Pi k.+1) (pmap_from_point f x))
x: A
h0: IsTrunc n (x = x)
h1: IsTrunc n (f x = f x)
k: nat
p: [x = x, 1]

1 @ (ap f p @ 1) = ap f p
refine (concat_1p _ @ concat_p1 _).
ua: Univalence
n: trunc_index
IHn: forall A B : Type, IsTrunc n A -> IsTrunc n B -> forall f : A -> B, IsEquiv (Trunc_functor 0 f) -> (forall (x : A) (k : nat), IsEquiv (fmap (Pi k.+1) (pmap_from_point f x))) -> IsEquiv f
A, B: Type
H0: IsTrunc n.+1 A
H1: IsTrunc n.+1 B
f: A -> B
i: IsEquiv (Trunc_functor 0 f)
ii: forall (x : A) (k : nat), IsEquiv (fmap (Pi k.+1) (pmap_from_point f x))
x: A
h0: IsTrunc n (x = x)
h1: IsTrunc n (f x = f x)
k: nat

((fun p : [x = x, 1] => concat_1p (ap f p @ 1) @ concat_p1 (ap f p) : fmap loops (pmap_from_point f x) p = pmap_from_point (ap f) 1 p) : fmap loops (pmap_from_point f x) == pmap_from_point (ap f) 1) pt = dpoint_eq (fmap loops (pmap_from_point f x)) @ (dpoint_eq (pmap_from_point (ap f) 1))^
reflexivity.
ua: Univalence
n: trunc_index
IHn: forall A B : Type, IsTrunc n A -> IsTrunc n B -> forall f : A -> B, IsEquiv (Trunc_functor 0 f) -> (forall (x : A) (k : nat), IsEquiv (fmap (Pi k.+1) (pmap_from_point f x))) -> IsEquiv f
A, B: Type
H0: IsTrunc n.+1 A
H1: IsTrunc n.+1 B
f: A -> B
i: IsEquiv (Trunc_functor 0 f)
ii: forall (x : A) (k : nat), IsEquiv (fmap (Pi k.+1) (pmap_from_point f x))
x: A
h0: IsTrunc n (x = x)
h1: IsTrunc n (f x = f x)
k: nat

IsEquiv (fmap (Pi k.+1) (fmap loops (pmap_from_point f x)))
ua: Univalence
n: trunc_index
IHn: forall A B : Type, IsTrunc n A -> IsTrunc n B -> forall f : A -> B, IsEquiv (Trunc_functor 0 f) -> (forall (x : A) (k : nat), IsEquiv (fmap (Pi k.+1) (pmap_from_point f x))) -> IsEquiv f
A, B: Type
H0: IsTrunc n.+1 A
H1: IsTrunc n.+1 B
f: A -> B
i: IsEquiv (Trunc_functor 0 f)
ii: forall (x : A) (k : nat), IsEquiv (fmap (Pi k.+1) (pmap_from_point f x))
x: A
h0: IsTrunc n (x = x)
h1: IsTrunc n (f x = f x)
k: nat

IsEquiv (fmap (Pi k.+2) (pmap_from_point f x))
ua: Univalence
n: trunc_index
IHn: forall A B : Type, IsTrunc n A -> IsTrunc n B -> forall f : A -> B, IsEquiv (Trunc_functor 0 f) -> (forall (x : A) (k : nat), IsEquiv (fmap (Pi k.+1) (pmap_from_point f x))) -> IsEquiv f
A, B: Type
H0: IsTrunc n.+1 A
H1: IsTrunc n.+1 B
f: A -> B
i: IsEquiv (Trunc_functor 0 f)
ii: forall (x : A) (k : nat), IsEquiv (fmap (Pi k.+1) (pmap_from_point f x))
x: A
h0: IsTrunc n (x = x)
h1: IsTrunc n (f x = f x)
k: nat
IsEquiv (pi_loops k.+1 [A, x])
ua: Univalence
n: trunc_index
IHn: forall A B : Type, IsTrunc n A -> IsTrunc n B -> forall f : A -> B, IsEquiv (Trunc_functor 0 f) -> (forall (x : A) (k : nat), IsEquiv (fmap (Pi k.+1) (pmap_from_point f x))) -> IsEquiv f
A, B: Type
H0: IsTrunc n.+1 A
H1: IsTrunc n.+1 B
f: A -> B
i: IsEquiv (Trunc_functor 0 f)
ii: forall (x : A) (k : nat), IsEquiv (fmap (Pi k.+1) (pmap_from_point f x))
x: A
h0: IsTrunc n (x = x)
h1: IsTrunc n (f x = f x)
k: nat
IsEquiv (pi_loops k.+1 [B, f x])
ua: Univalence
n: trunc_index
IHn: forall A B : Type, IsTrunc n A -> IsTrunc n B -> forall f : A -> B, IsEquiv (Trunc_functor 0 f) -> (forall (x : A) (k : nat), IsEquiv (fmap (Pi k.+1) (pmap_from_point f x))) -> IsEquiv f
A, B: Type
H0: IsTrunc n.+1 A
H1: IsTrunc n.+1 B
f: A -> B
i: IsEquiv (Trunc_functor 0 f)
ii: forall (x : A) (k : nat), IsEquiv (fmap (Pi k.+1) (pmap_from_point f x))
x: A
h0: IsTrunc n (x = x)
h1: IsTrunc n (f x = f x)
k: nat

IsEquiv (fmap (Pi k.+2) (pmap_from_point f x))
exact (ii x k.+1). Defined.