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]
LocalOpen Scope equiv_scope.LocalOpen 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 (funx : A => f x = y) p x1.2 = x2.2}
A, B: Type f: A -> B y: B x1, x2: hfiber f y
foralla : x1.1 = x2.1,
x1.2 = ap f a @ x2.2 <~>
transport (funx : 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 (funx : 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 (funx : A => f x = y) p x1.2 = x2.2
exact (equiv_concat_l (transport_paths_Fl _ _) _).Defined.Definitionpath_hfiber_uncurried {AB : Type} {f : A -> B} {y : B}
{x1x2 : hfiber f y}
: { q : x1.1 = x2.1 & x1.2 = ap f q @ x2.2 } -> (x1 = x2)
:= equiv_path_hfiber x1 x2.Definitionpath_hfiber {AB : Type} {f : A -> B} {y : B}
{x1x2 : 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
IsEquiv
(funfx : {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
foralla : A,
(funx : A => f x = b) a ->
(funx : 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
foralla : A,
(funx : A => f x = b) a ->
(funx : 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. *)Definitionisequiv_functor_hfiber {ABCD}
{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) := _.Definitionequiv_functor_hfiber {ABCD}
{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'
foralla : A,
(funx : A => f x = b) a ->
(funx : 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'
foralla : A,
(funx : A => f x = b) a ->
(funx : 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: (funx : A => f x = b) a
(funx : 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 (fune : f a = b => ((p a)^ @ ap k e) @ q)
exact (isequiv_compose (fune => (p a)^ @ ap k e) (fune' => e' @ q)).Defined.Definitionequiv_functor_hfiber2 {ABCD}
{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
forallx : 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
forallx : 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 (funx : C => h x = j (i (f y))) 1
((comm_square_comp' H K (y; 1).1)^ @
ap (funx : 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 (funx : 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 (funx : 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
foralla : hfiber h c,
?Goal a <~>
functor_hfiber (funx : 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
foralla : 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 (funx : C => g x = k b) p0
(functor_hfiber p b a).2 = (c; q).2}} <~>
{a : hfiber h c &
{p0
: (functor_hfiber (funx : A => (p x)^) c a).1 =
(b; q^).1 &
transport (funx : B => k x = g c) p0
(functor_hfiber (funx : 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 (funx : 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 (funx : A => (p x)^) c (a; p0)).1 =
(b; q^).1 &
transport (funx : B => k x = g c) p1
(functor_hfiber (funx : 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 (funx : C => g x = k b) p1
((p a)^ @ ap k p0) = q}} <~>
{p0 : h a = c &
{p1 : f a = b &
transport (funx : 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 (funx : C => g x = k b) p1
((p a)^ @ ap k p0) = q}} <~>
{a0 : f a = b &
{b0 : h a = c &
transport (funx : 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 (funx : C => g x = k b) a1
((p a)^ @ ap k a0) = q <~>
transport (funx : 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 (funx : C => g x = k b) a1
((p a)^ @ ap k a0) = q <~>
(transport (funx : 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 (funx : C => g x = k b) a1
((p a)^ @ ap k a0) = q <~>
(transport (funx : 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 (funx : B => k x = g c) a0
(((p a)^)^ @ ap g a1))^ =
transport (funx : 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. *)SectionUnstableOctahedral.Context (n : trunc_index) {ABC : Type} (f : A -> B) (g : B -> C).Definitionhfiber_compose_map (c : C)
: hfiber (g o f) c -> hfiber g c
:= funx => (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 (funx0 : 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 (funx : A => g (f x)) c)
exact (istrunc_isequiv_istrunc _ (hfiber_compose c)^-1).Defined.EndUnstableOctahedral.(** 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: foralla : A, P a -> Q a g: foralla : A, Q a
hfiber (functor_forall_id h) g <~>
(foralla : A, hfiber (h a) (g a))
H: Funext A: Type P, Q: A -> Type h: foralla : A, P a -> Q a g: foralla : A, Q a
hfiber (functor_forall_id h) g <~>
(foralla : A, hfiber (h a) (g a))
H: Funext A: Type P, Q: A -> Type h: foralla : A, P a -> Q a g: foralla : A, Q a
{x : foralla : A, P a & (funb : A => h b (x b)) = g} <~>
(foralla : A, {x : P a & h a x = g a})
H: Funext A: Type P, Q: A -> Type h: foralla : A, P a -> Q a g: foralla : A, Q a
{x : foralla : A, P a & (funb : A => h b (x b)) = g} <~>
{f : forallx : A, P x &
forallx : A, h x (f x) = g x}
H: Funext A: Type P, Q: A -> Type h: foralla : A, P a -> Q a g: foralla : A, Q a f: foralla : A, P a
(funb : A => h b (f b)) = g <~>
(forallx : A, h x (f x) = g x)
apply equiv_apD10.Defined.(** ** Fibers of constant functions *)Definitionhfiber_constA {B} (yy' : B)
: hfiber (fun_ : A => y) y' <~> A * (y = y')
:= equiv_sigma_prod0 A (y = y').Instanceistruncmap_constn {AB} `{!IsTrunc n A}
(y : B) `{!forally', IsTrunc n (y = y')}
: IsTruncMap n (fun_ : A => y)
:= funy' => _.(** ** [IsTruncMap n.+1 f <-> IsTruncMap n (ap f)] *)Instanceistruncmap_ap {AB} n (f:A -> B) `{!IsTruncMap n.+1 f}
: forallxy, IsTruncMap n (@ap _ _ f x y)
:= funxx'y =>
istrunc_equiv_istrunc _ (hfiber_ap y)^-1.
A, B: Type n: trunc_index f: A -> B H: forallxy : A, IsTruncMap n (ap f)
IsTruncMap n.+1 f
A, B: Type n: trunc_index f: A -> B H: forallxy : A, IsTruncMap n (ap f)
IsTruncMap n.+1 f
A, B: Type n: trunc_index f: A -> B H: forallxy : A, IsTruncMap n (ap f) y: B
forallxy0 : hfiber f y, IsTrunc n (x = y0)
intros [a p] [b q];
destruct q;
exact (istrunc_equiv_istrunc _ (hfiber_ap p)).Defined.Definitionequiv_istruncmap_ap `{Funext} {A B} n (f:A -> B)
: IsTruncMap n.+1 f <~> (forallxy, 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
forallxy : A, IsEquiv (ap f)
A, B: Type f: A -> B IsEmbedding0: IsEmbedding f
forallxy : A, IsEquiv (ap f)
A, B: Type f: A -> B IsEmbedding0: IsEmbedding f x, y: A
IsEquiv (ap f)
apply isequiv_contr_map,_.Defined.Definitionequiv_ap_isembedding {AB} (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: forallxy : A, IsEquiv (ap f)
IsEmbedding f
A, B: Type f: A -> B H: forallxy : A, IsEquiv (ap f)
IsEmbedding f
rapply istruncmap_from_ap.Defined.
H: Funext A, B: Type f: A -> B
IsEmbedding f <~> (forallxy : A, IsEquiv (ap f))
H: Funext A, B: Type f: A -> B
IsEmbedding f <~> (forallxy : 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
forallp : 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
forallp : 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