Built with Alectryon, running Coq+SerAPI v8.19.0+0.19.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]
Local Open Scope equiv_scope. Local Open Scope path_scope. (** * Basic facts about fibrations *) (* ** Homotopy fibers *) (** Paths in homotopy fibers can be constructed using [path_sigma] and [transport_paths_Fl]. *)
A, B: Type
f: A -> B
y: B
x1, x2: hfiber f y

{q : x1.1 = x2.1 & x1.2 = ap f q @ x2.2} <~> x1 = x2
A, B: Type
f: A -> B
y: B
x1, x2: hfiber f y

{q : x1.1 = x2.1 & x1.2 = ap f q @ x2.2} <~> x1 = x2
A, B: Type
f: A -> B
y: B
x1, x2: hfiber f y

{q : x1.1 = x2.1 & x1.2 = ap f q @ x2.2} <~> {p : x1.1 = x2.1 & transport (fun x : A => f x = y) p x1.2 = x2.2}
A, B: Type
f: A -> B
y: B
x1, x2: hfiber f y

forall a : x1.1 = x2.1, x1.2 = ap f a @ x2.2 <~> transport (fun x : A => f x = y) a x1.2 = x2.2
A, B: Type
f: A -> B
y: B
x1, x2: hfiber f y
p: x1.1 = x2.1

x1.2 = ap f p @ x2.2 <~> transport (fun x : A => f x = y) p x1.2 = x2.2
A, B: Type
f: A -> B
y: B
x1, x2: hfiber f y
p: x1.1 = x2.1

(ap f p)^ @ x1.2 = x2.2 <~> transport (fun x : A => f x = y) p x1.2 = x2.2
exact (equiv_concat_l (transport_paths_Fl _ _) _). Defined. Definition path_hfiber_uncurried {A B : Type} {f : A -> B} {y : B} {x1 x2 : hfiber f y} : { q : x1.1 = x2.1 & x1.2 = ap f q @ x2.2 } -> (x1 = x2) := equiv_path_hfiber x1 x2. Definition path_hfiber {A B : Type} {f : A -> B} {y : B} {x1 x2 : hfiber f y} (q : x1.1 = x2.1) (r : x1.2 = ap f q @ x2.2) : x1 = x2 := path_hfiber_uncurried (q;r). (** If we rearrange this a bit, then it characterizes the fibers of [ap]. *)
A, B: Type
f: A -> B
x1, x2: A
p: f x1 = f x2

hfiber (ap f) p <~> (x1; p) = (x2; 1)
A, B: Type
f: A -> B
x1, x2: A
p: f x1 = f x2

hfiber (ap f) p <~> (x1; p) = (x2; 1)
A, B: Type
f: A -> B
x1, x2: A
p: f x1 = f x2

hfiber (ap f) p <~> {q : (x1; p).1 = (x2; 1).1 & (x1; p).2 = ap f q @ (x2; 1).2}
A, B: Type
f: A -> B
x1, x2: A
p: f x1 = f x2

{x : x1 = x2 & ap f x = p} <~> {q : x1 = x2 & p = ap f q @ 1}
A, B: Type
f: A -> B
x1, x2: A
p: f x1 = f x2
q: x1 = x2

ap f q = p <~> p = ap f q @ 1
A, B: Type
f: A -> B
x1, x2: A
p: f x1 = f x2
q: x1 = x2

p = ap f q <~> p = ap f q @ 1
exact (equiv_concat_r (concat_p1 _)^ _). Defined. (** Homotopic maps have equivalent fibers. *)
A, B: Type
f, g: A -> B
h: f == g
b: B

hfiber f b <~> hfiber g b
A, B: Type
f, g: A -> B
h: f == g
b: B

hfiber f b <~> hfiber g b
A, B: Type
f, g: A -> B
h: f == g
b: B

IsEquiv (fun fx : {x : A & f x = b} => (fx.1; (h fx.1)^ @ fx.2))
A, B: Type
f, g: A -> B
h: f == g
b: B
a: A
p: g a = b

(h a)^ @ (h a @ p) = p
A, B: Type
f, g: A -> B
h: f == g
b: B
a: A
p: f a = b
h a @ ((h a)^ @ p) = p
A, B: Type
f, g: A -> B
h: f == g
b: B
a: A
p: g a = b

(h a)^ @ (h a @ p) = p
apply concat_V_pp.
A, B: Type
f, g: A -> B
h: f == g
b: B
a: A
p: f a = b

h a @ ((h a)^ @ p) = p
apply concat_p_Vp. Defined. (** Commutative squares induce maps between fibers. *)
A, B, C, D: Type
f: A -> B
g: C -> D
h: A -> C
k: B -> D
p: k o f == g o h
b: B

hfiber f b -> hfiber g (k b)
A, B, C, D: Type
f: A -> B
g: C -> D
h: A -> C
k: B -> D
p: k o f == g o h
b: B

hfiber f b -> hfiber g (k b)
A, B, C, D: Type
f: A -> B
g: C -> D
h: A -> C
k: B -> D
p: k o f == g o h
b: B

A -> C
A, B, C, D: Type
f: A -> B
g: C -> D
h: A -> C
k: B -> D
p: k o f == g o h
b: B
forall a : A, (fun x : A => f x = b) a -> (fun x : C => g x = k b) (?f a)
A, B, C, D: Type
f: A -> B
g: C -> D
h: A -> C
k: B -> D
p: k o f == g o h
b: B

A -> C
exact h.
A, B, C, D: Type
f: A -> B
g: C -> D
h: A -> C
k: B -> D
p: k o f == g o h
b: B

forall a : A, (fun x : A => f x = b) a -> (fun x : C => g x = k b) (h a)
intros a e; exact ((p a)^ @ ap k e). Defined. (** This doesn't need to be defined as an instance, since typeclass search can already find it, but we state it here for the reader's benefit. *) Definition isequiv_functor_hfiber {A B C D} {f : A -> B} {g : C -> D} {h : A -> C} {k : B -> D} `{IsEquiv A C h} `{IsEquiv B D k} (p : k o f == g o h) (b : B) : IsEquiv (functor_hfiber p b) := _. Definition equiv_functor_hfiber {A B C D} {f : A -> B} {g : C -> D} {h : A <~> C} {k : B <~> D} (p : k o f == g o h) (b : B) : hfiber f b <~> hfiber g (k b) := Build_Equiv _ _ (functor_hfiber p b) _. (** A version of [functor_hfiber] which is functorial in both the function and the point *)
A, B, C, D: Type
f: A -> B
g: C -> D
h: A -> C
k: B -> D
p: k o f == g o h
b: B
b': D
q: k b = b'

hfiber f b -> hfiber g b'
A, B, C, D: Type
f: A -> B
g: C -> D
h: A -> C
k: B -> D
p: k o f == g o h
b: B
b': D
q: k b = b'

hfiber f b -> hfiber g b'
A, B, C, D: Type
f: A -> B
g: C -> D
h: A -> C
k: B -> D
p: k o f == g o h
b: B
b': D
q: k b = b'

A -> C
A, B, C, D: Type
f: A -> B
g: C -> D
h: A -> C
k: B -> D
p: k o f == g o h
b: B
b': D
q: k b = b'
forall a : A, (fun x : A => f x = b) a -> (fun x : C => g x = b') (?f a)
A, B, C, D: Type
f: A -> B
g: C -> D
h: A -> C
k: B -> D
p: k o f == g o h
b: B
b': D
q: k b = b'

A -> C
exact h.
A, B, C, D: Type
f: A -> B
g: C -> D
h: A -> C
k: B -> D
p: k o f == g o h
b: B
b': D
q: k b = b'

forall a : A, (fun x : A => f x = b) a -> (fun x : C => g x = b') (h a)
A, B, C, D: Type
f: A -> B
g: C -> D
h: A -> C
k: B -> D
p: k o f == g o h
b: B
b': D
q: k b = b'
a: A
e: (fun x : A => f x = b) a

(fun x : C => g x = b') (h a)
exact ((p a)^ @ ap k e @ q). Defined.
A, B, C, D: Type
f: A -> B
g: C -> D
h: A -> C
k: B -> D
H: IsEquiv h
H0: IsEquiv k
p: k o f == g o h
b: B
b': D
q: k b = b'

IsEquiv (functor_hfiber2 p q)
A, B, C, D: Type
f: A -> B
g: C -> D
h: A -> C
k: B -> D
H: IsEquiv h
H0: IsEquiv k
p: k o f == g o h
b: B
b': D
q: k b = b'

IsEquiv (functor_hfiber2 p q)
A, B, C, D: Type
f: A -> B
g: C -> D
h: A -> C
k: B -> D
H: IsEquiv h
H0: IsEquiv k
p: k o f == g o h
b: B
b': D
q: k b = b'
a: A

IsEquiv (fun e : f a = b => ((p a)^ @ ap k e) @ q)
exact (isequiv_compose (fun e => (p a)^ @ ap k e) (fun e' => e' @ q)). Defined. Definition equiv_functor_hfiber2 {A B C D} {f : A -> B} {g : C -> D} {h : A <~> C} {k : B <~> D} (p : k o f == g o h) {b : B} {b' : D} (q : k b = b') : hfiber f b <~> hfiber g b' := Build_Equiv _ _ (functor_hfiber2 p q) _.
A, B, C, X, Y, Z: Type
k: A -> B
l: B -> C
f: A -> X
g: B -> Y
h: C -> Z
i: X -> Y
j: Y -> Z
H: i o f == g o k
K: j o g == h o l

forall x : X, functor_hfiber (comm_square_comp' H K) x == functor_hfiber K (i x) o (functor_hfiber H x : hfiber f x -> hfiber g (i x))
A, B, C, X, Y, Z: Type
k: A -> B
l: B -> C
f: A -> X
g: B -> Y
h: C -> Z
i: X -> Y
j: Y -> Z
H: i o f == g o k
K: j o g == h o l

forall x : X, functor_hfiber (comm_square_comp' H K) x == functor_hfiber K (i x) o (functor_hfiber H x : hfiber f x -> hfiber g (i x))
A, B, C, X, Y, Z: Type
k: A -> B
l: B -> C
f: A -> X
g: B -> Y
h: C -> Z
i: X -> Y
j: Y -> Z
H: i o f == g o k
K: j o g == h o l
x: X
y: A
p: f y = x

functor_hfiber (comm_square_comp' H K) x (y; p) = functor_hfiber K (i x) (functor_hfiber H x (y; p))
A, B, C, X, Y, Z: Type
k: A -> B
l: B -> C
f: A -> X
g: B -> Y
h: C -> Z
i: X -> Y
j: Y -> Z
H: i o f == g o k
K: j o g == h o l
y: A

functor_hfiber (comm_square_comp' H K) (f y) (y; 1) = functor_hfiber K (i (f y)) (functor_hfiber H (f y) (y; 1))
A, B, C, X, Y, Z: Type
k: A -> B
l: B -> C
f: A -> X
g: B -> Y
h: C -> Z
i: X -> Y
j: Y -> Z
H: i o f == g o k
K: j o g == h o l
y: A

transport (fun x : C => h x = j (i (f y))) 1 ((comm_square_comp' H K (y; 1).1)^ @ ap (fun x : X => j (i x)) (y; 1).2) = (K (functor_hfiber H (f y) (y; 1)).1)^ @ ap j (functor_hfiber H (f y) (y; 1)).2
A, B, C, X, Y, Z: Type
k: A -> B
l: B -> C
f: A -> X
g: B -> Y
h: C -> Z
i: X -> Y
j: Y -> Z
H: i o f == g o k
K: j o g == h o l
y: A

(comm_square_comp' H K (y; 1).1)^ = (K (functor_hfiber H (f y) (y; 1)).1)^ @ ap j (functor_hfiber H (f y) (y; 1)).2
A, B, C, X, Y, Z: Type
k: A -> B
l: B -> C
f: A -> X
g: B -> Y
h: C -> Z
i: X -> Y
j: Y -> Z
H: i o f == g o k
K: j o g == h o l
y: A

(ap j (H (y; 1).1))^ = ap j (functor_hfiber H (f y) (y; 1)).2
A, B, C, X, Y, Z: Type
k: A -> B
l: B -> C
f: A -> X
g: B -> Y
h: C -> Z
i: X -> Y
j: Y -> Z
H: i o f == g o k
K: j o g == h o l
y: A

(functor_hfiber H (f y) (y; 1)).2 = (H (y; 1).1)^
apply concat_p1. Defined. (** ** The 3x3 lemma for fibrations *)
A, B, C, D: Type
f: A -> B
g: C -> D
h: A -> C
k: B -> D
p: k o f == g o h
b: B
c: C
q: g c = k b

hfiber (functor_hfiber p b) (c; q) <~> hfiber (functor_hfiber (fun x : A => (p x)^) c) (b; q^)
A, B, C, D: Type
f: A -> B
g: C -> D
h: A -> C
k: B -> D
p: k o f == g o h
b: B
c: C
q: g c = k b

hfiber (functor_hfiber p b) (c; q) <~> hfiber (functor_hfiber (fun x : A => (p x)^) c) (b; q^)
A, B, C, D: Type
f: A -> B
g: C -> D
h: A -> C
k: B -> D
p: k o f == g o h
b: B
c: C
q: g c = k b

forall a : hfiber h c, ?Goal a <~> functor_hfiber (fun x : A => (p x)^) c a = (b; q^)
A, B, C, D: Type
f: A -> B
g: C -> D
h: A -> C
k: B -> D
p: k o f == g o h
b: B
c: C
q: g c = k b
{x : _ & ?Goal2 x} <~> {x : _ & ?Goal x}
A, B, C, D: Type
f: A -> B
g: C -> D
h: A -> C
k: B -> D
p: k o f == g o h
b: B
c: C
q: g c = k b
forall a : hfiber f b, ?Goal2 a <~> functor_hfiber p b a = (c; q)
A, B, C, D: Type
f: A -> B
g: C -> D
h: A -> C
k: B -> D
p: k o f == g o h
b: B
c: C
q: g c = k b

{a : hfiber f b & {p0 : (functor_hfiber p b a).1 = (c; q).1 & transport (fun x : C => g x = k b) p0 (functor_hfiber p b a).2 = (c; q).2}} <~> {a : hfiber h c & {p0 : (functor_hfiber (fun x : A => (p x)^) c a).1 = (b; q^).1 & transport (fun x : B => k x = g c) p0 (functor_hfiber (fun x : A => (p x)^) c a).2 = (b; q^).2}}
A, B, C, D: Type
f: A -> B
g: C -> D
h: A -> C
k: B -> D
p: k o f == g o h
b: B
c: C
q: g c = k b

{a : A & {p0 : f a = b & {p1 : (functor_hfiber p b (a; p0)).1 = (c; q).1 & transport (fun x : C => g x = k b) p1 (functor_hfiber p b (a; p0)).2 = (c; q).2}}} <~> {a : A & {p0 : h a = c & {p1 : (functor_hfiber (fun x : A => (p x)^) c (a; p0)).1 = (b; q^).1 & transport (fun x : B => k x = g c) p1 (functor_hfiber (fun x : A => (p x)^) c (a; p0)).2 = (b; q^).2}}}
A, B, C, D: Type
f: A -> B
g: C -> D
h: A -> C
k: B -> D
p: k o f == g o h
b: B
c: C
q: g c = k b
a: A

{p0 : f a = b & {p1 : h a = c & transport (fun x : C => g x = k b) p1 ((p a)^ @ ap k p0) = q}} <~> {p0 : h a = c & {p1 : f a = b & transport (fun x : B => k x = g c) p1 (((p a)^)^ @ ap g p0) = q^}}
A, B, C, D: Type
f: A -> B
g: C -> D
h: A -> C
k: B -> D
p: k o f == g o h
b: B
c: C
q: g c = k b
a: A

{p0 : f a = b & {p1 : h a = c & transport (fun x : C => g x = k b) p1 ((p a)^ @ ap k p0) = q}} <~> {a0 : f a = b & {b0 : h a = c & transport (fun x : B => k x = g c) a0 (((p a)^)^ @ ap g b0) = q^}}
A, B, C, D: Type
f: A -> B
g: C -> D
h: A -> C
k: B -> D
p: k o f == g o h
b: B
c: C
q: g c = k b
a: A
a0: f a = b
a1: h a = c

transport (fun x : C => g x = k b) a1 ((p a)^ @ ap k a0) = q <~> transport (fun x : B => k x = g c) a0 (((p a)^)^ @ ap g a1) = q^
A, B, C, D: Type
f: A -> B
g: C -> D
h: A -> C
k: B -> D
p: k o f == g o h
b: B
c: C
q: g c = k b
a: A
a0: f a = b
a1: h a = c

transport (fun x : C => g x = k b) a1 ((p a)^ @ ap k a0) = q <~> (transport (fun x : B => k x = g c) a0 (((p a)^)^ @ ap g a1))^ = (q^)^
A, B, C, D: Type
f: A -> B
g: C -> D
h: A -> C
k: B -> D
p: k o f == g o h
b: B
c: C
q: g c = k b
a: A
a0: f a = b
a1: h a = c

transport (fun x : C => g x = k b) a1 ((p a)^ @ ap k a0) = q <~> (transport (fun x : B => k x = g c) a0 (((p a)^)^ @ ap g a1))^ = q
A, B, C, D: Type
f: A -> B
g: C -> D
h: A -> C
k: B -> D
p: k o f == g o h
b: B
c: C
q: g c = k b
a: A
a0: f a = b
a1: h a = c

(transport (fun x : B => k x = g c) a0 (((p a)^)^ @ ap g a1))^ = transport (fun x : C => g x = k b) a1 ((p a)^ @ ap k a0)
abstract (rewrite !transport_paths_Fl, !inv_pp, !inv_V, concat_pp_p; reflexivity). Defined. (** ** Replacing a map with a fibration *)
B, C: Type
f: C -> B

C <~> {y : B & hfiber f y}
B, C: Type
f: C -> B

C <~> {y : B & hfiber f y}
make_equiv_contr_basedpaths. Defined. (** This is a useful variant for taking a "double fiber" of two maps. *)
X, Y, Z: Type
f: X -> Y
g: X -> Z

X <~> {y : Y & {z : Z & {x : X & (f x = y) * (g x = z)}}}
X, Y, Z: Type
f: X -> Y
g: X -> Z

X <~> {y : Y & {z : Z & {x : X & (f x = y) * (g x = z)}}}
make_equiv_contr_basedpaths. Defined.
X: Type
x: X
P: X -> Type

P x <~> hfiber pr1 x
X: Type
x: X
P: X -> Type

P x <~> hfiber pr1 x
make_equiv_contr_basedpaths. Defined. (** ** Exercise 4.4: The unstable octahedral axiom. *) Section UnstableOctahedral. Context (n : trunc_index) {A B C : Type} (f : A -> B) (g : B -> C). Definition hfiber_compose_map (c : C) : hfiber (g o f) c -> hfiber g c := fun x => (f x.1 ; x.2).
n: trunc_index
A, B, C: Type
f: A -> B
g: B -> C
b: B

hfiber (hfiber_compose_map (g b)) (b; 1) <~> hfiber f b
n: trunc_index
A, B, C: Type
f: A -> B
g: B -> C
b: B

hfiber (hfiber_compose_map (g b)) (b; 1) <~> hfiber f b
n: trunc_index
A, B, C: Type
f: A -> B
g: B -> C
b: B

{x : {x : A & g (f x) = g b} & (f x.1; x.2) = (b; 1)} <~> {x : A & f x = b}
(** Once we "destruct" the equality in a sigma type, the rest is just shuffling of data and path induction. *)
n: trunc_index
A, B, C: Type
f: A -> B
g: B -> C
b: B

{x : {x : A & g (f x) = g b} & {p : f x.1 = b & transport (fun x0 : B => g x0 = g b) p x.2 = 1}} <~> {x : A & f x = b}
make_equiv_contr_basedpaths. Defined.
n: trunc_index
A, B, C: Type
f: A -> B
g: B -> C
c: C

hfiber (g o f) c <~> {w : hfiber g c & hfiber f w.1}
n: trunc_index
A, B, C: Type
f: A -> B
g: B -> C
c: C

hfiber (g o f) c <~> {w : hfiber g c & hfiber f w.1}
make_equiv_contr_basedpaths. Defined.
n: trunc_index
A, B, C: Type
f: A -> B
g: B -> C
IsTruncMap0: IsTruncMap n g
IsTruncMap1: IsTruncMap n f

IsTruncMap n (g o f)
n: trunc_index
A, B, C: Type
f: A -> B
g: B -> C
IsTruncMap0: IsTruncMap n g
IsTruncMap1: IsTruncMap n f

IsTruncMap n (g o f)
n: trunc_index
A, B, C: Type
f: A -> B
g: B -> C
IsTruncMap0: IsTruncMap n g
IsTruncMap1: IsTruncMap n f
c: C

IsTrunc n (hfiber (fun x : A => g (f x)) c)
exact (istrunc_isequiv_istrunc _ (hfiber_compose c)^-1). Defined. End UnstableOctahedral. (** We characterize the fibers of [functor_forall], but only in the special case where the base map is [idmap]. This doesn't depend on anything else in this file, but can't be put in Types/Forall.v, because it requires results from Types/Sigma.v. *)
H: Funext
A: Type
P, Q: A -> Type
h: forall a : A, P a -> Q a
g: forall a : A, Q a

hfiber (functor_forall_id h) g <~> (forall a : A, hfiber (h a) (g a))
H: Funext
A: Type
P, Q: A -> Type
h: forall a : A, P a -> Q a
g: forall a : A, Q a

hfiber (functor_forall_id h) g <~> (forall a : A, hfiber (h a) (g a))
H: Funext
A: Type
P, Q: A -> Type
h: forall a : A, P a -> Q a
g: forall a : A, Q a

{x : forall a : A, P a & (fun b : A => h b (x b)) = g} <~> (forall a : A, {x : P a & h a x = g a})
H: Funext
A: Type
P, Q: A -> Type
h: forall a : A, P a -> Q a
g: forall a : A, Q a

{x : forall a : A, P a & (fun b : A => h b (x b)) = g} <~> {f : forall x : A, P x & forall x : A, h x (f x) = g x}
H: Funext
A: Type
P, Q: A -> Type
h: forall a : A, P a -> Q a
g: forall a : A, Q a
f: forall a : A, P a

(fun b : A => h b (f b)) = g <~> (forall x : A, h x (f x) = g x)
apply equiv_apD10. Defined. (** ** Fibers of constant functions *) Definition hfiber_const A {B} (y y' : B) : hfiber (fun _ : A => y) y' <~> A * (y = y') := equiv_sigma_prod0 A (y = y'). Instance istruncmap_const n {A B} `{!IsTrunc n A} (y : B) `{!forall y', IsTrunc n (y = y')} : IsTruncMap n (fun _ : A => y) := fun y' => _. (** ** [IsTruncMap n.+1 f <-> IsTruncMap n (ap f)] *) Instance istruncmap_ap {A B} n (f:A -> B) `{!IsTruncMap n.+1 f} : forall x y, IsTruncMap n (@ap _ _ f x y) := fun x x' y => istrunc_equiv_istrunc _ (hfiber_ap y)^-1.
A, B: Type
n: trunc_index
f: A -> B
H: forall x y : A, IsTruncMap n (ap f)

IsTruncMap n.+1 f
A, B: Type
n: trunc_index
f: A -> B
H: forall x y : A, IsTruncMap n (ap f)

IsTruncMap n.+1 f
A, B: Type
n: trunc_index
f: A -> B
H: forall x y : A, IsTruncMap n (ap f)
y: B

forall x y0 : hfiber f y, IsTrunc n (x = y0)
intros [a p] [b q]; destruct q; exact (istrunc_equiv_istrunc _ (hfiber_ap p)). Defined. Definition equiv_istruncmap_ap `{Funext} {A B} n (f:A -> B) : IsTruncMap n.+1 f <~> (forall x y, IsTruncMap n (@ap _ _ f x y)) := equiv_iff_hprop (@istruncmap_ap _ _ n f) (@istruncmap_from_ap _ _ n f).
A, B: Type
f: A -> B
IsEmbedding0: IsEmbedding f

forall x y : A, IsEquiv (ap f)
A, B: Type
f: A -> B
IsEmbedding0: IsEmbedding f

forall x y : A, IsEquiv (ap f)
A, B: Type
f: A -> B
IsEmbedding0: IsEmbedding f
x, y: A

IsEquiv (ap f)
apply isequiv_contr_map,_. Defined. Definition equiv_ap_isembedding {A B} (f : A -> B) `{!IsEmbedding f} (x y : A) : (x = y) <~> (f x = f y) := Build_Equiv _ _ (ap f) _.
A, B: Type
f: A -> B
H: forall x y : A, IsEquiv (ap f)

IsEmbedding f
A, B: Type
f: A -> B
H: forall x y : A, IsEquiv (ap f)

IsEmbedding f
rapply istruncmap_from_ap. Defined.
H: Funext
A, B: Type
f: A -> B

IsEmbedding f <~> (forall x y : A, IsEquiv (ap f))
H: Funext
A, B: Type
f: A -> B

IsEmbedding f <~> (forall x y : A, IsEquiv (ap f))
exact (equiv_iff_hprop (@isequiv_ap_isembedding _ _ f) (@isembedding_isequiv_ap _ _ f)). Defined. (** It follows from [isembedding_isequiv_ap] and [isequiv_ap_equiv_fun] that [equiv_fun] is an embedding. *)
H: Funext
A, B: Type

IsEmbedding equiv_fun
H: Funext
A, B: Type

IsEmbedding equiv_fun
rapply isembedding_isequiv_ap. Defined.
X, Y: Type
f: X -> Y
I: IsEmbedding f
x0, x1: X

forall p : f x0 = f x1, ap f (isinj_embedding f I x0 x1 p) = p
X, Y: Type
f: X -> Y
I: IsEmbedding f
x0, x1: X

forall p : f x0 = f x1, ap f (isinj_embedding f I x0 x1 p) = p
X, Y: Type
f: X -> Y
I: IsEmbedding f
x0, x1: X
q: x0 = x1

ap f (isinj_embedding f I x0 x1 (equiv_ap_isembedding f x0 x1 q)) = equiv_ap_isembedding f x0 x1 q
X, Y: Type
f: X -> Y
I: IsEmbedding f
x0: X

ap f (isinj_embedding f I x0 x0 (equiv_ap_isembedding f x0 x0 1)) = equiv_ap_isembedding f x0 x0 1
X, Y: Type
f: X -> Y
I: IsEmbedding f
x0: X

ap f (isinj_embedding f I x0 x0 1) = 1
exact (ap _ (isinj_embedding_beta f)). Defined.