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.
(* -*- mode: coq; mode: visual-line -*- *)

[Loading ML file number_string_notation_plugin.cmxs (using legacy method) ... done]
Local Open Scope nat_scope. Local Open Scope path_scope. Generalizable Variables A B f. Section AssumeFunext. Context `{Funext}. (** * n-Path-split maps. A map is n-path-split if its induced maps on the first n iterated path-spaces are split surjections. Thus every map is 0-path-split, the 1-path-split maps are the split surjections, and so on. It turns out that for n>1, being n-path-split is the same as being an equivalence. *) Fixpoint PathSplit (n : nat) `(f : A -> B) : Type := match n with | 0 => Unit | S n => (forall a, hfiber f a) * forall (x y : A), PathSplit n (@ap _ _ f x y) end.
H: Funext
n: nat
A, B: Type
f: A -> B

PathSplit n.+2 f -> IsEquiv f
H: Funext
n: nat
A, B: Type
f: A -> B

PathSplit n.+2 f -> IsEquiv f
H: Funext
n: nat
A, B: Type
f: A -> B
g: forall a : B, hfiber f a
k: forall x y : A, PathSplit n.+1 (ap f)

IsEquiv f
H: Funext
n: nat
A, B: Type
f: A -> B
g: forall a : B, hfiber f a
k: forall x y : A, PathSplit n.+1 (ap f)
h:= fun (x y : A) (p : f x = f y) => (fst (k x y) p).1: forall x y : A, f x = f y -> x = y

IsEquiv f
H: Funext
n: nat
A, B: Type
f: A -> B
g: forall a : B, hfiber f a
k: forall x y : A, PathSplit n.+1 (ap f)
h:= fun (x y : A) (p : f x = f y) => (fst (k x y) p).1: forall x y : A, f x = f y -> x = y
hs:= fun x y : A => (fun p : f x = f y => (fst (k x y) p).2) : ap f o h x y == idmap: forall x y : A, ap f o h x y == idmap

IsEquiv f
H: Funext
n: nat
A, B: Type
f: A -> B
g: forall a : B, hfiber f a
h: forall x y : A, f x = f y -> x = y
hs: forall x y : A, ap f o h x y == idmap

IsEquiv f
H: Funext
n: nat
A, B: Type
f: A -> B
g: forall a : B, hfiber f a
h: forall x y : A, f x = f y -> x = y
hs: forall x y : A, ap f o h x y == idmap
b: B

Contr (hfiber f b)
H: Funext
n: nat
A, B: Type
f: A -> B
g: forall a : B, hfiber f a
h: forall x y : A, f x = f y -> x = y
hs: forall x y : A, ap f o h x y == idmap
b: B

IsHProp (hfiber f b)
H: Funext
n: nat
A, B: Type
f: A -> B
g: forall a : B, hfiber f a
h: forall x y : A, f x = f y -> x = y
hs: forall x y : A, ap f o h x y == idmap
b: B
hfiber f b
H: Funext
n: nat
A, B: Type
f: A -> B
g: forall a : B, hfiber f a
h: forall x y : A, f x = f y -> x = y
hs: forall x y : A, ap f o h x y == idmap
b: B

IsHProp (hfiber f b)
H: Funext
n: nat
A, B: Type
f: A -> B
g: forall a : B, hfiber f a
h: forall x y : A, f x = f y -> x = y
hs: forall x y : A, ap f o h x y == idmap
b: B
a: A
p: f a = b
a': A
p': f a' = b

(a; p) = (a'; p')
H: Funext
n: nat
A, B: Type
f: A -> B
g: forall a : B, hfiber f a
h: forall x y : A, f x = f y -> x = y
hs: forall x y : A, ap f o h x y == idmap
b: B
a: A
p: f a = b
a': A
p': f a' = b

transport (fun x : A => f x = b) (h a a' (p @ p'^)) p = p'
H: Funext
n: nat
A, B: Type
f: A -> B
g: forall a : B, hfiber f a
h: forall x y : A, f x = f y -> x = y
hs: forall x y : A, ap f o h x y == idmap
b: B
a: A
p: f a = b
a': A
p': f a' = b

(ap f (h a a' (p @ p'^)))^ @ p = p'
H: Funext
n: nat
A, B: Type
f: A -> B
g: forall a : B, hfiber f a
h: forall x y : A, f x = f y -> x = y
hs: forall x y : A, ap f o h x y == idmap
b: B
a: A
p: f a = b
a': A
p': f a' = b

(p @ p'^)^ @ p = p'
H: Funext
n: nat
A, B: Type
f: A -> B
g: forall a : B, hfiber f a
h: forall x y : A, f x = f y -> x = y
hs: forall x y : A, ap f o h x y == idmap
b: B
a: A
p: f a = b
a': A
p': f a' = b

((p'^)^ @ p^) @ p = p'
H: Funext
n: nat
A, B: Type
f: A -> B
g: forall a : B, hfiber f a
h: forall x y : A, f x = f y -> x = y
hs: forall x y : A, ap f o h x y == idmap
b: B
a: A
p: f a = b
a': A
p': f a' = b

(p'^)^ @ (p^ @ p) = p'
H: Funext
n: nat
A, B: Type
f: A -> B
g: forall a : B, hfiber f a
h: forall x y : A, f x = f y -> x = y
hs: forall x y : A, ap f o h x y == idmap
b: B
a: A
p: f a = b
a': A
p': f a' = b

(p'^)^ @ 1 = p'
exact ((inv_V p' @@ 1) @ concat_p1 _). Defined.
H: Funext
n: nat
A, B: Type
f: A -> B
H0: IsEquiv f

Contr (PathSplit n f)
H: Funext
n: nat
A, B: Type
f: A -> B
H0: IsEquiv f

Contr (PathSplit n f)
H: Funext
n: nat

forall (A B : Type) (f : A -> B), IsEquiv f -> Contr (PathSplit n f)
H: Funext
A, B: Type
f: A -> B
H0: IsEquiv f

Contr (PathSplit 0 f)
H: Funext
n: nat
IHn: forall (A B : Type) (f : A -> B), IsEquiv f -> Contr (PathSplit n f)
A, B: Type
f: A -> B
H0: IsEquiv f
Contr (PathSplit n.+1 f)
H: Funext
A, B: Type
f: A -> B
H0: IsEquiv f

Contr (PathSplit 0 f)
exact _.
H: Funext
n: nat
IHn: forall (A B : Type) (f : A -> B), IsEquiv f -> Contr (PathSplit n f)
A, B: Type
f: A -> B
H0: IsEquiv f

Contr (PathSplit n.+1 f)
apply contr_prod. Defined.
H: Funext
n: nat
A, B: Type
f: A -> B

IsHProp (PathSplit n.+2 f)
H: Funext
n: nat
A, B: Type
f: A -> B

IsHProp (PathSplit n.+2 f)
H: Funext
n: nat
A, B: Type
f: A -> B
ps: PathSplit n.+2 f

Contr (PathSplit n.+2 f)
H: Funext
n: nat
A, B: Type
f: A -> B
ps: PathSplit n.+2 f
i:= isequiv_pathsplit n ps: IsEquiv f

Contr (PathSplit n.+2 f)
exact _. Defined.
H: Funext
n: nat
A, B: Type
f: A -> B

PathSplit n.+2 f <~> IsEquiv f
H: Funext
n: nat
A, B: Type
f: A -> B

PathSplit n.+2 f <~> IsEquiv f
H: Funext
n: nat
A, B: Type
f: A -> B

PathSplit n.+2 f -> IsEquiv f
H: Funext
n: nat
A, B: Type
f: A -> B
IsEquiv f -> PathSplit n.+2 f
H: Funext
n: nat
A, B: Type
f: A -> B

PathSplit n.+2 f -> IsEquiv f
apply isequiv_pathsplit.
H: Funext
n: nat
A, B: Type
f: A -> B

IsEquiv f -> PathSplit n.+2 f
intros ?; refine (center _). Defined. (** Path-splitness transfers across commutative squares of equivalences. *)
H: Funext
n: nat
A, B, C, D: Type
f: A -> B
g: C -> D
h: A <~> C
k: B <~> D
p: g o h == k o f

PathSplit n f <~> PathSplit n g
H: Funext
n: nat
A, B, C, D: Type
f: A -> B
g: C -> D
h: A <~> C
k: B <~> D
p: g o h == k o f

PathSplit n f <~> PathSplit n g
H: Funext
A, B, C, D: Type
f: A -> B
g: C -> D
h: A <~> C
k: B <~> D
p: g o h == k o f

PathSplit 0 f <~> PathSplit 0 g
H: Funext
n: nat
A, B, C, D: Type
f: A -> B
g: C -> D
h: A <~> C
k: B <~> D
p: g o h == k o f
PathSplit n.+1 f <~> PathSplit n.+1 g
H: Funext
n: nat
A, B, C, D: Type
f: A -> B
g: C -> D
h: A <~> C
k: B <~> D
p: g o h == k o f

PathSplit n.+1 f <~> PathSplit n.+1 g
H: Funext
A, B, C, D: Type
f: A -> B
g: C -> D
h: A <~> C
k: B <~> D
p: g o h == k o f

PathSplit 1 f <~> PathSplit 1 g
H: Funext
n: nat
A, B, C, D: Type
f: A -> B
g: C -> D
h: A <~> C
k: B <~> D
p: g o h == k o f
PathSplit n.+2 f <~> PathSplit n.+2 g
H: Funext
A, B, C, D: Type
f: A -> B
g: C -> D
h: A <~> C
k: B <~> D
p: g o h == k o f

PathSplit 1 f <~> PathSplit 1 g
H: Funext
A, B, C, D: Type
f: A -> B
g: C -> D
h: A <~> C
k: B <~> D
p: g o h == k o f

(forall a : B, hfiber f a) * (A -> A -> Unit) <~> (forall a : D, hfiber g a) * (C -> C -> Unit)
H: Funext
A, B, C, D: Type
f: A -> B
g: C -> D
h: A <~> C
k: B <~> D
p: g o h == k o f

(forall a : B, hfiber f a) <~> (forall a : D, hfiber g a)
H: Funext
A, B, C, D: Type
f: A -> B
g: C -> D
h: A <~> C
k: B <~> D
p: g o h == k o f
d: D

hfiber f ((k^-1)%equiv d) <~> hfiber g d
H: Funext
A, B, C, D: Type
f: A -> B
g: C -> D
h: A <~> C
k: B <~> D
p: g o h == k o f
d: D

{x : A & f x = (k^-1)%equiv d} <~> {x : C & g x = d}
H: Funext
A, B, C, D: Type
f: A -> B
g: C -> D
h: A <~> C
k: B <~> D
p: g o h == k o f
d: D
a: A

f a = (k^-1)%equiv d <~> g (h a) = d
H: Funext
A, B, C, D: Type
f: A -> B
g: C -> D
h: A <~> C
k: B <~> D
p: g o h == k o f
d: D
a: A

f a = (k^-1)%equiv d <~> k (f a) = d
simpl; apply equiv_moveR_equiv_M.
H: Funext
n: nat
A, B, C, D: Type
f: A -> B
g: C -> D
h: A <~> C
k: B <~> D
p: g o h == k o f

PathSplit n.+2 f <~> PathSplit n.+2 g
H: Funext
n: nat
A, B, C, D: Type
f: A -> B
g: C -> D
h: A <~> C
k: B <~> D
p: g o h == k o f

IsEquiv f <~> PathSplit n.+2 g
H: Funext
n: nat
A, B, C, D: Type
f: A -> B
g: C -> D
h: A <~> C
k: B <~> D
p: g o h == k o f

IsEquiv f <~> IsEquiv g
H: Funext
n: nat
A, B, C, D: Type
f: A -> B
g: C -> D
h: A <~> C
k: B <~> D
p: g o h == k o f
e: IsEquiv f

IsEquiv g
H: Funext
n: nat
A, B, C, D: Type
f: A -> B
g: C -> D
h: A <~> C
k: B <~> D
p: g o h == k o f
e: IsEquiv g
IsEquiv f
H: Funext
n: nat
A, B, C, D: Type
f: A -> B
g: C -> D
h: A <~> C
k: B <~> D
p: g o h == k o f
e: IsEquiv f

IsEquiv g
refine (isequiv_commsq f g h k (fun a => (p a)^)).
H: Funext
n: nat
A, B, C, D: Type
f: A -> B
g: C -> D
h: A <~> C
k: B <~> D
p: g o h == k o f
e: IsEquiv g

IsEquiv f
refine (isequiv_commsq' f g h k p). Defined. (** A map is oo-path-split if it is n-path-split for all n. This is also equivalent to being an equivalence. *) Definition ooPathSplit `(f : A -> B) : Type := forall n, PathSplit n f. Definition isequiv_oopathsplit `{f : A -> B} : ooPathSplit f -> IsEquiv f := fun ps => isequiv_pathsplit 0 (ps 2).
H: Funext
A, B: Type
f: A -> B
H0: IsEquiv f

Contr (ooPathSplit f)
H: Funext
A, B: Type
f: A -> B
H0: IsEquiv f

Contr (ooPathSplit f)
apply contr_forall. Defined.
H: Funext
A, B: Type
f: A -> B

IsHProp (ooPathSplit f)
H: Funext
A, B: Type
f: A -> B

IsHProp (ooPathSplit f)
H: Funext
A, B: Type
f: A -> B
ps: ooPathSplit f

Contr (ooPathSplit f)
H: Funext
A, B: Type
f: A -> B
ps: ooPathSplit f
i:= isequiv_oopathsplit ps: IsEquiv f

Contr (ooPathSplit f)
exact _. Defined.
H: Funext
A, B: Type
f: A -> B

ooPathSplit f <~> IsEquiv f
H: Funext
A, B: Type
f: A -> B

ooPathSplit f <~> IsEquiv f
H: Funext
A, B: Type
f: A -> B

ooPathSplit f -> IsEquiv f
H: Funext
A, B: Type
f: A -> B
IsEquiv f -> ooPathSplit f
H: Funext
A, B: Type
f: A -> B

ooPathSplit f -> IsEquiv f
apply isequiv_oopathsplit.
H: Funext
A, B: Type
f: A -> B

IsEquiv f -> ooPathSplit f
intros ?; refine (center _). Defined. End AssumeFunext.