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.
From HoTT Require Import Basics Types.From HoTT Require Import Basics Types.
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 x0 : A, IsEquiv (fmap loops (pmap_from_point f x0))
x, y: A

IsEquiv (ap f)
H: Univalence
A, B: Type
f: A -> B
i: IsEquiv (Trunc_functor 0 f)
ii: forall x0 : A, IsEquiv (fmap loops (pmap_from_point f x0))
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 x0 : A, IsEquiv (fmap loops (pmap_from_point f x0))
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 x0 : A, IsEquiv (fmap loops (pmap_from_point f x0))
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 x0 : A, IsEquiv (fmap loops (pmap_from_point f x0))
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 x0 : A, IsEquiv (fmap loops (pmap_from_point f x0))
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 x0 : A, IsEquiv (fmap loops (pmap_from_point f x0))
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 x0 : A, IsEquiv (fmap loops (pmap_from_point f x0))
x: A

IsEquiv (ap f)
H: Univalence
A, B: Type
f: A -> B
i: IsEquiv (Trunc_functor 0 f)
ii: forall x0 : A, IsEquiv (fun p : x0 = x0 => 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 x0 : A, IsEquiv (fun p : x0 = x0 => 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 A0 B0 : Type, IsTrunc n A0 -> IsTrunc n B0 -> forall f0 : A0 -> B0, IsEquiv (Trunc_functor 0 f0) -> (forall (x : A0) (k : nat), IsEquiv (fmap (Pi k.+1) (pmap_from_point f0 x))) -> IsEquiv f0
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 A0 B0 : Type, IsTrunc n A0 -> IsTrunc n B0 -> forall f0 : A0 -> B0, IsEquiv (Trunc_functor 0 f0) -> (forall (x : A0) (k : nat), IsEquiv (fmap (Pi k.+1) (pmap_from_point f0 x))) -> IsEquiv f0
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 A0 B0 : Type, IsTrunc n A0 -> IsTrunc n B0 -> forall f0 : A0 -> B0, IsEquiv (Trunc_functor 0 f0) -> (forall (x0 : A0) (k : nat), IsEquiv (fmap (Pi k.+1) (pmap_from_point f0 x0))) -> IsEquiv f0
A, B: Type
H0: IsTrunc n.+1 A
H1: IsTrunc n.+1 B
f: A -> B
i: IsEquiv (Trunc_functor 0 f)
ii: forall (x0 : A) (k : nat), IsEquiv (fmap (Pi k.+1) (pmap_from_point f x0))
x: A

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

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

ap f == fmap loops (pmap_from_point f x)
ua: Univalence
n: trunc_index
IHn: forall A0 B0 : Type, IsTrunc n A0 -> IsTrunc n B0 -> forall f0 : A0 -> B0, IsEquiv (Trunc_functor 0 f0) -> (forall (x0 : A0) (k : nat), IsEquiv (fmap (Pi k.+1) (pmap_from_point f0 x0))) -> IsEquiv f0
A, B: Type
H0: IsTrunc n.+1 A
H1: IsTrunc n.+1 B
f: A -> B
i: IsEquiv (Trunc_functor 0 f)
ii: forall (x0 : A) (k : nat), IsEquiv (fmap (Pi k.+1) (pmap_from_point f x0))
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 A0 B0 : Type, IsTrunc n A0 -> IsTrunc n B0 -> forall f0 : A0 -> B0, IsEquiv (Trunc_functor 0 f0) -> (forall (x0 : A0) (k : nat), IsEquiv (fmap (Pi k.+1) (pmap_from_point f0 x0))) -> IsEquiv f0
A, B: Type
H0: IsTrunc n.+1 A
H1: IsTrunc n.+1 B
f: A -> B
i: IsEquiv (Trunc_functor 0 f)
ii: forall (x0 : A) (k : nat), IsEquiv (fmap (Pi k.+1) (pmap_from_point f x0))
x: A

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

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

IsEquiv (ap f)
ua: Univalence
n: trunc_index
IHn: forall A0 B0 : Type, IsTrunc n A0 -> IsTrunc n B0 -> forall f0 : A0 -> B0, IsEquiv (Trunc_functor 0 f0) -> (forall (x0 : A0) (k : nat), IsEquiv (fmap (Pi k.+1) (pmap_from_point f0 x0))) -> IsEquiv f0
A, B: Type
H0: IsTrunc n.+1 A
H1: IsTrunc n.+1 B
f: A -> B
i: IsEquiv (Trunc_functor 0 f)
ii: forall (x0 : A) (k : nat), IsEquiv (fmap (Pi k.+1) (pmap_from_point f x0))
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 A0 B0 : Type, IsTrunc n A0 -> IsTrunc n B0 -> forall f0 : A0 -> B0, IsEquiv (Trunc_functor 0 f0) -> (forall (x0 : A0) (k : nat), IsEquiv (fmap (Pi k.+1) (pmap_from_point f0 x0))) -> IsEquiv f0
A, B: Type
H0: IsTrunc n.+1 A
H1: IsTrunc n.+1 B
f: A -> B
i: IsEquiv (Trunc_functor 0 f)
ii: forall (x0 : A) (k : nat), IsEquiv (fmap (Pi k.+1) (pmap_from_point f x0))
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 A0 B0 : Type, IsTrunc n A0 -> IsTrunc n B0 -> forall f0 : A0 -> B0, IsEquiv (Trunc_functor 0 f0) -> (forall (x0 : A0) (k : nat), IsEquiv (fmap (Pi k.+1) (pmap_from_point f0 x0))) -> IsEquiv f0
A, B: Type
H0: IsTrunc n.+1 A
H1: IsTrunc n.+1 B
f: A -> B
i: IsEquiv (Trunc_functor 0 f)
ii: forall (x0 : A) (k : nat), IsEquiv (fmap (Pi k.+1) (pmap_from_point f x0))
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 A0 B0 : Type, IsTrunc n A0 -> IsTrunc n B0 -> forall f0 : A0 -> B0, IsEquiv (Trunc_functor 0 f0) -> (forall (x0 : A0) (k : nat), IsEquiv (fmap (Pi k.+1) (pmap_from_point f0 x0))) -> IsEquiv f0
A, B: Type
H0: IsTrunc n.+1 A
H1: IsTrunc n.+1 B
f: A -> B
i: IsEquiv (Trunc_functor 0 f)
ii: forall (x0 : A) (k : nat), IsEquiv (fmap (Pi k.+1) (pmap_from_point f x0))
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 A0 B0 : Type, IsTrunc n A0 -> IsTrunc n B0 -> forall f0 : A0 -> B0, IsEquiv (Trunc_functor 0 f0) -> (forall (x0 : A0) (k : nat), IsEquiv (fmap (Pi k.+1) (pmap_from_point f0 x0))) -> IsEquiv f0
A, B: Type
H0: IsTrunc n.+1 A
H1: IsTrunc n.+1 B
f: A -> B
i: IsEquiv (Trunc_functor 0 f)
ii: forall (x0 : A) (k : nat), IsEquiv (fmap (Pi k.+1) (pmap_from_point f x0))
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 A0 B0 : Type, IsTrunc n A0 -> IsTrunc n B0 -> forall f0 : A0 -> B0, IsEquiv (Trunc_functor 0 f0) -> (forall (x0 : A0) (k : nat), IsEquiv (fmap (Pi k.+1) (pmap_from_point f0 x0))) -> IsEquiv f0
A, B: Type
H0: IsTrunc n.+1 A
H1: IsTrunc n.+1 B
f: A -> B
i: IsEquiv (Trunc_functor 0 f)
ii: forall (x0 : A) (k : nat), IsEquiv (fmap (Pi k.+1) (pmap_from_point f x0))
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 A0 B0 : Type, IsTrunc n A0 -> IsTrunc n B0 -> forall f0 : A0 -> B0, IsEquiv (Trunc_functor 0 f0) -> (forall (x0 : A0) (k : nat), IsEquiv (fmap (Pi k.+1) (pmap_from_point f0 x0))) -> IsEquiv f0
A, B: Type
H0: IsTrunc n.+1 A
H1: IsTrunc n.+1 B
f: A -> B
i: IsEquiv (Trunc_functor 0 f)
ii: forall (x0 : A) (k : nat), IsEquiv (fmap (Pi k.+1) (pmap_from_point f x0))
x: A
h0: IsTrunc n (x = x)
h1: IsTrunc n (f x = f x)
h2: IsEquiv (Trunc_functor 0 (fun p0 : x = x => 1 @ (ap f p0 @ 1)))
p: x = x

1 @ (ap f p @ 1) = ap f p
exact (concat_1p _ @ concat_p1 _).
ua: Univalence
n: trunc_index
IHn: forall A0 B0 : Type, IsTrunc n A0 -> IsTrunc n B0 -> forall f0 : A0 -> B0, IsEquiv (Trunc_functor 0 f0) -> (forall (x0 : A0) (k : nat), IsEquiv (fmap (Pi k.+1) (pmap_from_point f0 x0))) -> IsEquiv f0
A, B: Type
H0: IsTrunc n.+1 A
H1: IsTrunc n.+1 B
f: A -> B
i: IsEquiv (Trunc_functor 0 f)
ii: forall (x0 : A) (k : nat), IsEquiv (fmap (Pi k.+1) (pmap_from_point f x0))
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 A0 B0 : Type, IsTrunc n A0 -> IsTrunc n B0 -> forall f0 : A0 -> B0, IsEquiv (Trunc_functor 0 f0) -> (forall (x0 : A0) (k0 : nat), IsEquiv (fmap (Pi k0.+1) (pmap_from_point f0 x0))) -> IsEquiv f0
A, B: Type
H0: IsTrunc n.+1 A
H1: IsTrunc n.+1 B
f: A -> B
i: IsEquiv (Trunc_functor 0 f)
ii: forall (x0 : A) (k0 : nat), IsEquiv (fmap (Pi k0.+1) (pmap_from_point f x0))
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 A0 B0 : Type, IsTrunc n A0 -> IsTrunc n B0 -> forall f0 : A0 -> B0, IsEquiv (Trunc_functor 0 f0) -> (forall (x0 : A0) (k0 : nat), IsEquiv (fmap (Pi k0.+1) (pmap_from_point f0 x0))) -> IsEquiv f0
A, B: Type
H0: IsTrunc n.+1 A
H1: IsTrunc n.+1 B
f: A -> B
i: IsEquiv (Trunc_functor 0 f)
ii: forall (x0 : A) (k0 : nat), IsEquiv (fmap (Pi k0.+1) (pmap_from_point f x0))
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 A0 B0 : Type, IsTrunc n A0 -> IsTrunc n B0 -> forall f0 : A0 -> B0, IsEquiv (Trunc_functor 0 f0) -> (forall (x0 : A0) (k0 : nat), IsEquiv (fmap (Pi k0.+1) (pmap_from_point f0 x0))) -> IsEquiv f0
A, B: Type
H0: IsTrunc n.+1 A
H1: IsTrunc n.+1 B
f: A -> B
i: IsEquiv (Trunc_functor 0 f)
ii: forall (x0 : A) (k0 : nat), IsEquiv (fmap (Pi k0.+1) (pmap_from_point f x0))
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 A0 B0 : Type, IsTrunc n A0 -> IsTrunc n B0 -> forall f0 : A0 -> B0, IsEquiv (Trunc_functor 0 f0) -> (forall (x0 : A0) (k0 : nat), IsEquiv (fmap (Pi k0.+1) (pmap_from_point f0 x0))) -> IsEquiv f0
A, B: Type
H0: IsTrunc n.+1 A
H1: IsTrunc n.+1 B
f: A -> B
i: IsEquiv (Trunc_functor 0 f)
ii: forall (x0 : A) (k0 : nat), IsEquiv (fmap (Pi k0.+1) (pmap_from_point f x0))
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 A0 B0 : Type, IsTrunc n A0 -> IsTrunc n B0 -> forall f0 : A0 -> B0, IsEquiv (Trunc_functor 0 f0) -> (forall (x0 : A0) (k0 : nat), IsEquiv (fmap (Pi k0.+1) (pmap_from_point f0 x0))) -> IsEquiv f0
A, B: Type
H0: IsTrunc n.+1 A
H1: IsTrunc n.+1 B
f: A -> B
i: IsEquiv (Trunc_functor 0 f)
ii: forall (x0 : A) (k0 : nat), IsEquiv (fmap (Pi k0.+1) (pmap_from_point f x0))
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 A0 B0 : Type, IsTrunc n A0 -> IsTrunc n B0 -> forall f0 : A0 -> B0, IsEquiv (Trunc_functor 0 f0) -> (forall (x0 : A0) (k0 : nat), IsEquiv (fmap (Pi k0.+1) (pmap_from_point f0 x0))) -> IsEquiv f0
A, B: Type
H0: IsTrunc n.+1 A
H1: IsTrunc n.+1 B
f: A -> B
i: IsEquiv (Trunc_functor 0 f)
ii: forall (x0 : A) (k0 : nat), IsEquiv (fmap (Pi k0.+1) (pmap_from_point f x0))
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 A0 B0 : Type, IsTrunc n A0 -> IsTrunc n B0 -> forall f0 : A0 -> B0, IsEquiv (Trunc_functor 0 f0) -> (forall (x0 : A0) (k0 : nat), IsEquiv (fmap (Pi k0.+1) (pmap_from_point f0 x0))) -> IsEquiv f0
A, B: Type
H0: IsTrunc n.+1 A
H1: IsTrunc n.+1 B
f: A -> B
i: IsEquiv (Trunc_functor 0 f)
ii: forall (x0 : A) (k0 : nat), IsEquiv (fmap (Pi k0.+1) (pmap_from_point f x0))
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 A0 B0 : Type, IsTrunc n A0 -> IsTrunc n B0 -> forall f0 : A0 -> B0, IsEquiv (Trunc_functor 0 f0) -> (forall (x0 : A0) (k0 : nat), IsEquiv (fmap (Pi k0.+1) (pmap_from_point f0 x0))) -> IsEquiv f0
A, B: Type
H0: IsTrunc n.+1 A
H1: IsTrunc n.+1 B
f: A -> B
i: IsEquiv (Trunc_functor 0 f)
ii: forall (x0 : A) (k0 : nat), IsEquiv (fmap (Pi k0.+1) (pmap_from_point f x0))
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 A0 B0 : Type, IsTrunc n A0 -> IsTrunc n B0 -> forall f0 : A0 -> B0, IsEquiv (Trunc_functor 0 f0) -> (forall (x0 : A0) (k0 : nat), IsEquiv (fmap (Pi k0.+1) (pmap_from_point f0 x0))) -> IsEquiv f0
A, B: Type
H0: IsTrunc n.+1 A
H1: IsTrunc n.+1 B
f: A -> B
i: IsEquiv (Trunc_functor 0 f)
ii: forall (x0 : A) (k0 : nat), IsEquiv (fmap (Pi k0.+1) (pmap_from_point f x0))
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 A0 B0 : Type, IsTrunc n A0 -> IsTrunc n B0 -> forall f0 : A0 -> B0, IsEquiv (Trunc_functor 0 f0) -> (forall (x0 : A0) (k0 : nat), IsEquiv (fmap (Pi k0.+1) (pmap_from_point f0 x0))) -> IsEquiv f0
A, B: Type
H0: IsTrunc n.+1 A
H1: IsTrunc n.+1 B
f: A -> B
i: IsEquiv (Trunc_functor 0 f)
ii: forall (x0 : A) (k0 : nat), IsEquiv (fmap (Pi k0.+1) (pmap_from_point f x0))
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 A0 B0 : Type, IsTrunc n A0 -> IsTrunc n B0 -> forall f0 : A0 -> B0, IsEquiv (Trunc_functor 0 f0) -> (forall (x0 : A0) (k0 : nat), IsEquiv (fmap (Pi k0.+1) (pmap_from_point f0 x0))) -> IsEquiv f0
A, B: Type
H0: IsTrunc n.+1 A
H1: IsTrunc n.+1 B
f: A -> B
i: IsEquiv (Trunc_functor 0 f)
ii: forall (x0 : A) (k0 : nat), IsEquiv (fmap (Pi k0.+1) (pmap_from_point f x0))
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 A0 B0 : Type, IsTrunc n A0 -> IsTrunc n B0 -> forall f0 : A0 -> B0, IsEquiv (Trunc_functor 0 f0) -> (forall (x0 : A0) (k0 : nat), IsEquiv (fmap (Pi k0.+1) (pmap_from_point f0 x0))) -> IsEquiv f0
A, B: Type
H0: IsTrunc n.+1 A
H1: IsTrunc n.+1 B
f: A -> B
i: IsEquiv (Trunc_functor 0 f)
ii: forall (x0 : A) (k0 : nat), IsEquiv (fmap (Pi k0.+1) (pmap_from_point f x0))
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 A0 B0 : Type, IsTrunc n A0 -> IsTrunc n B0 -> forall f0 : A0 -> B0, IsEquiv (Trunc_functor 0 f0) -> (forall (x0 : A0) (k0 : nat), IsEquiv (fmap (Pi k0.+1) (pmap_from_point f0 x0))) -> IsEquiv f0
A, B: Type
H0: IsTrunc n.+1 A
H1: IsTrunc n.+1 B
f: A -> B
i: IsEquiv (Trunc_functor 0 f)
ii: forall (x0 : A) (k0 : nat), IsEquiv (fmap (Pi k0.+1) (pmap_from_point f x0))
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 A0 B0 : Type, IsTrunc n A0 -> IsTrunc n B0 -> forall f0 : A0 -> B0, IsEquiv (Trunc_functor 0 f0) -> (forall (x0 : A0) (k0 : nat), IsEquiv (fmap (Pi k0.+1) (pmap_from_point f0 x0))) -> IsEquiv f0
A, B: Type
H0: IsTrunc n.+1 A
H1: IsTrunc n.+1 B
f: A -> B
i: IsEquiv (Trunc_functor 0 f)
ii: forall (x0 : A) (k0 : nat), IsEquiv (fmap (Pi k0.+1) (pmap_from_point f x0))
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 A0 B0 : Type, IsTrunc n A0 -> IsTrunc n B0 -> forall f0 : A0 -> B0, IsEquiv (Trunc_functor 0 f0) -> (forall (x0 : A0) (k0 : nat), IsEquiv (fmap (Pi k0.+1) (pmap_from_point f0 x0))) -> IsEquiv f0
A, B: Type
H0: IsTrunc n.+1 A
H1: IsTrunc n.+1 B
f: A -> B
i: IsEquiv (Trunc_functor 0 f)
ii: forall (x0 : A) (k0 : nat), IsEquiv (fmap (Pi k0.+1) (pmap_from_point f x0))
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 A0 B0 : Type, IsTrunc n A0 -> IsTrunc n B0 -> forall f0 : A0 -> B0, IsEquiv (Trunc_functor 0 f0) -> (forall (x0 : A0) (k0 : nat), IsEquiv (fmap (Pi k0.+1) (pmap_from_point f0 x0))) -> IsEquiv f0
A, B: Type
H0: IsTrunc n.+1 A
H1: IsTrunc n.+1 B
f: A -> B
i: IsEquiv (Trunc_functor 0 f)
ii: forall (x0 : A) (k0 : nat), IsEquiv (fmap (Pi k0.+1) (pmap_from_point f x0))
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
exact (concat_1p _ @ concat_p1 _).
ua: Univalence
n: trunc_index
IHn: forall A0 B0 : Type, IsTrunc n A0 -> IsTrunc n B0 -> forall f0 : A0 -> B0, IsEquiv (Trunc_functor 0 f0) -> (forall (x0 : A0) (k0 : nat), IsEquiv (fmap (Pi k0.+1) (pmap_from_point f0 x0))) -> IsEquiv f0
A, B: Type
H0: IsTrunc n.+1 A
H1: IsTrunc n.+1 B
f: A -> B
i: IsEquiv (Trunc_functor 0 f)
ii: forall (x0 : A) (k0 : nat), IsEquiv (fmap (Pi k0.+1) (pmap_from_point f x0))
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 A0 B0 : Type, IsTrunc n A0 -> IsTrunc n B0 -> forall f0 : A0 -> B0, IsEquiv (Trunc_functor 0 f0) -> (forall (x0 : A0) (k0 : nat), IsEquiv (fmap (Pi k0.+1) (pmap_from_point f0 x0))) -> IsEquiv f0
A, B: Type
H0: IsTrunc n.+1 A
H1: IsTrunc n.+1 B
f: A -> B
i: IsEquiv (Trunc_functor 0 f)
ii: forall (x0 : A) (k0 : nat), IsEquiv (fmap (Pi k0.+1) (pmap_from_point f x0))
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 A0 B0 : Type, IsTrunc n A0 -> IsTrunc n B0 -> forall f0 : A0 -> B0, IsEquiv (Trunc_functor 0 f0) -> (forall (x0 : A0) (k0 : nat), IsEquiv (fmap (Pi k0.+1) (pmap_from_point f0 x0))) -> IsEquiv f0
A, B: Type
H0: IsTrunc n.+1 A
H1: IsTrunc n.+1 B
f: A -> B
i: IsEquiv (Trunc_functor 0 f)
ii: forall (x0 : A) (k0 : nat), IsEquiv (fmap (Pi k0.+1) (pmap_from_point f x0))
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 A0 B0 : Type, IsTrunc n A0 -> IsTrunc n B0 -> forall f0 : A0 -> B0, IsEquiv (Trunc_functor 0 f0) -> (forall (x0 : A0) (k0 : nat), IsEquiv (fmap (Pi k0.+1) (pmap_from_point f0 x0))) -> IsEquiv f0
A, B: Type
H0: IsTrunc n.+1 A
H1: IsTrunc n.+1 B
f: A -> B
i: IsEquiv (Trunc_functor 0 f)
ii: forall (x0 : A) (k0 : nat), IsEquiv (fmap (Pi k0.+1) (pmap_from_point f x0))
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 A0 B0 : Type, IsTrunc n A0 -> IsTrunc n B0 -> forall f0 : A0 -> B0, IsEquiv (Trunc_functor 0 f0) -> (forall (x0 : A0) (k0 : nat), IsEquiv (fmap (Pi k0.+1) (pmap_from_point f0 x0))) -> IsEquiv f0
A, B: Type
H0: IsTrunc n.+1 A
H1: IsTrunc n.+1 B
f: A -> B
i: IsEquiv (Trunc_functor 0 f)
ii: forall (x0 : A) (k0 : nat), IsEquiv (fmap (Pi k0.+1) (pmap_from_point f x0))
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 A0 B0 : Type, IsTrunc n A0 -> IsTrunc n B0 -> forall f0 : A0 -> B0, IsEquiv (Trunc_functor 0 f0) -> (forall (x0 : A0) (k0 : nat), IsEquiv (fmap (Pi k0.+1) (pmap_from_point f0 x0))) -> IsEquiv f0
A, B: Type
H0: IsTrunc n.+1 A
H1: IsTrunc n.+1 B
f: A -> B
i: IsEquiv (Trunc_functor 0 f)
ii: forall (x0 : A) (k0 : nat), IsEquiv (fmap (Pi k0.+1) (pmap_from_point f x0))
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.