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.
(** * Theorems about path spaces *)
[Loading ML file number_string_notation_plugin.cmxs (using legacy method) ... done]
LocalOpen Scope path_scope.Generalizable VariablesA B f x y z.(** ** Path spaces *)(** The path spaces of a path space are not, of course, determined; they are just the higher-dimensional structure of the original space. *)(** ** Transporting in path spaces *)(* There are potentially a lot of these lemmas, so we adopt a uniform naming scheme:- `l` means the left endpoint varies- `r` means the right endpoint varies- `F` means application of a function to that (varying) endpoint.Examples of usage can be found in test/Tactics/transport_paths.v *)(** *** 0 functions *)
A, B, B', C: Type f: A -> B f': A -> B' g: B -> C g': B' -> C x1, x2: A p: x1 = x2 q: g (f x1) = g' (f' x1)
transport (funx : A => g (f x) = g' (f' x)) p q =
((ap g (ap f p))^ @ q) @ ap g' (ap f' p)
A, B, B', C: Type f: A -> B f': A -> B' g: B -> C g': B' -> C x1, x2: A p: x1 = x2 q: g (f x1) = g' (f' x1)
transport (funx : A => g (f x) = g' (f' x)) p q =
((ap g (ap f p))^ @ q) @ ap g' (ap f' p)
A, B, B', C: Type f: A -> B f': A -> B' g: B -> C g': B' -> C x1: A q: g (f x1) = g' (f' x1)
q = (1 @ q) @ 1
exact ((concat_1p q)^ @ (concat_p1 (1 @ q))^).Defined.(** The above lemmas have some common rearrangements that are useful. Since these all follow the same pattern, we introduce a tactic to apply it. *)(** The most common rearrangement after applying the [transport_paths_] lemmas on the [lhs]. *)
A: Type w, x, y, z: A p: x = w q: x = y r: y = z s: w = z h: p @ s = q @ r
(p^ @ q) @ r = s
A: Type w, x, y, z: A p: x = w q: x = y r: y = z s: w = z h: p @ s = q @ r
(p^ @ q) @ r = s
A: Type w, x, y, z: A p: x = w q: x = y r: y = z s: w = z h: p @ s = q @ r
exact (H 1 q).Defined.(** ** Functorial action *)(** 'functor_path' is called [ap]. *)(** ** Equivalences between path spaces *)(** [isequiv_ap] and [equiv_ap] are in Equivalences.v *)(** ** Path operations are equivalences *)
A: Type x, y: A
IsEquiv inverse
A: Type x, y: A
IsEquiv inverse
A: Type x, y: A
forallx0 : x = y, inv_V x0^ = ap inverse (inv_V x0)
intros p; destruct p; reflexivity.Defined.Definitionequiv_path_inverse {A : Type} (xy : A)
: (x = y) <~> (y = x)
:= Build_Equiv _ _ (@inverse A x y) _.
A: Type x, y: A p: x = y z: A
IsEquiv (concat_l p)
A: Type x, y: A p: x = y z: A
IsEquiv (concat_l p)
A: Type x, y: A p: x = y z: A
forallx0 : y = z,
concat_p_Vp p (p @ x0) =
ap (concat p) (concat_V_pp p x0)
A: Type x, y, z: A p: x = y q, r: y = z k: p @ q = p @ r
whiskerL p (cancelL p q r k) = k
A: Type x, y, z: A p: x = y q, r: y = z k: p @ q = p @ r
whiskerL p
(((concat_V_pp p q)^ @ whiskerL p^ k) @
concat_V_pp p r) = k
A: Type x, y, z: A p: x = y q, r: y = z k: p @ q = p @ r
(whiskerL p (concat_V_pp p q)^ @
whiskerL p (whiskerL p^ k)) @
whiskerL p (concat_V_pp p r) = k
A: Type x, y, z: A p: x = y q, r: y = z k: p @ q = p @ r
whiskerL p (concat_V_pp p q)^ =
(concat_p_Vp p (p @ q))^
A: Type x, y, z: A p: x = y q, r: y = z k: p @ q = p @ r
whiskerL p (concat_V_pp p r) = concat_p_Vp p (p @ r)
A: Type x, y, z: A p: x = y q, r: y = z k: p @ q = p @ r
whiskerL p (concat_V_pp p q)^ =
(concat_p_Vp p (p @ q))^
destruct p, q; reflexivity.
A: Type x, y, z: A p: x = y q, r: y = z k: p @ q = p @ r
whiskerL p (concat_V_pp p r) = concat_p_Vp p (p @ r)
destruct p, r; reflexivity.
A: Type x, y, z: A p: x = y q, r: y = z
cancelL p q r o whiskerL p == idmap
A: Type x, y, z: A p: x = y q, r: y = z k: q = r
cancelL p q r (whiskerL p k) = k
A: Type x, y, z: A p: x = y q, r: y = z k: q = r
((concat_V_pp p q)^ @ whiskerL p^ (whiskerL p k)) @
concat_V_pp p r = k
A: Type x, y, z: A p: x = y q, r: y = z k: q = r
(concat_V_pp p q)^ = (concat_V_pp p q)^
A: Type x, y, z: A p: x = y q, r: y = z k: q = r
concat_V_pp p r = concat_V_pp p r
A: Type x, y, z: A p: x = y q, r: y = z k: q = r
(concat_V_pp p q)^ = (concat_V_pp p q)^
destruct p, q; reflexivity.
A: Type x, y, z: A p: x = y q, r: y = z k: q = r
concat_V_pp p r = concat_V_pp p r
destruct p, r; reflexivity.Defined.Definitionequiv_whiskerL {A} {xyz : A} (p : x = y) (qr : y = z)
: (q = r) <~> (p @ q = p @ r)
:= Build_Equiv _ _ (whiskerL p) _.Definitionequiv_cancelL {A} {xyz : A} (p : x = y) (qr : y = z)
: (p @ q = p @ r) <~> (q = r)
:= equiv_inverse (equiv_whiskerL p q r).
A: Type x, y, z: A p: x = y q, r: y = z
IsEquiv (cancelL p q r)
A: Type x, y, z: A p: x = y q, r: y = z
IsEquiv (cancelL p q r)
change (IsEquiv (equiv_cancelL p q r)); exact _.Defined.
A: Type x, y, z: A p, q: x = y r: y = z
IsEquiv (funh : p = q => whiskerR h r)
A: Type x, y, z: A p, q: x = y r: y = z
IsEquiv (funh : p = q => whiskerR h r)
A: Type x, y, z: A p, q: x = y r: y = z
p @ r = q @ r -> p = q
A: Type x, y, z: A p, q: x = y r: y = z
(funh : p = q => whiskerR h r) o ?g == idmap
A: Type x, y, z: A p, q: x = y r: y = z
?g o (funh : p = q => whiskerR h r) == idmap
A: Type x, y, z: A p, q: x = y r: y = z
p @ r = q @ r -> p = q
apply cancelR.
A: Type x, y, z: A p, q: x = y r: y = z
(funh : p = q => whiskerR h r) o cancelR p q r ==
idmap
A: Type x, y, z: A p, q: x = y r: y = z k: p @ r = q @ r
whiskerR (cancelR p q r k) r = k
A: Type x, y, z: A p, q: x = y r: y = z k: p @ r = q @ r
whiskerR
(((concat_pp_V p r)^ @ whiskerR k r^) @
concat_pp_V q r) r = k
A: Type x, y, z: A p, q: x = y r: y = z k: p @ r = q @ r
(whiskerR (concat_pp_V p r)^ r @
whiskerR (whiskerR k r^) r) @
whiskerR (concat_pp_V q r) r = k
A: Type x, y, z: A p, q: x = y r: y = z k: p @ r = q @ r
whiskerR (concat_pp_V p r)^ r =
(concat_pV_p (p @ r) r)^
A: Type x, y, z: A p, q: x = y r: y = z k: p @ r = q @ r
whiskerR (concat_pp_V q r) r = concat_pV_p (q @ r) r
A: Type x, y, z: A p, q: x = y r: y = z k: p @ r = q @ r
whiskerR (concat_pp_V p r)^ r =
(concat_pV_p (p @ r) r)^
destruct p, r; reflexivity.
A: Type x, y, z: A p, q: x = y r: y = z k: p @ r = q @ r
whiskerR (concat_pp_V q r) r = concat_pV_p (q @ r) r
destruct q, r; reflexivity.
A: Type x, y, z: A p, q: x = y r: y = z
cancelR p q r o (funh : p = q => whiskerR h r) ==
idmap
A: Type x, y, z: A p, q: x = y r: y = z k: p = q
cancelR p q r (whiskerR k r) = k
A: Type x, y, z: A p, q: x = y r: y = z k: p = q
((concat_pp_V p r)^ @ whiskerR (whiskerR k r) r^) @
concat_pp_V q r = k
A: Type x, y, z: A p, q: x = y r: y = z k: p = q
(concat_pp_V p r)^ = (concat_pp_V p r)^
A: Type x, y, z: A p, q: x = y r: y = z k: p = q
concat_pp_V q r = concat_pp_V q r
A: Type x, y, z: A p, q: x = y r: y = z k: p = q
(concat_pp_V p r)^ = (concat_pp_V p r)^
destruct p, r; reflexivity.
A: Type x, y, z: A p, q: x = y r: y = z k: p = q
concat_pp_V q r = concat_pp_V q r
destruct q, r; reflexivity.Defined.Definitionequiv_whiskerR {A} {xyz : A} (pq : x = y) (r : y = z)
: (p = q) <~> (p @ r = q @ r)
:= Build_Equiv _ _ (funh => whiskerR h r) _.Definitionequiv_cancelR {A} {xyz : A} (pq : x = y) (r : y = z)
: (p @ r = q @ r) <~> (p = q)
:= equiv_inverse (equiv_whiskerR p q r).
A: Type x, y, z: A p, q: x = y r: y = z
IsEquiv (cancelR p q r)
A: Type x, y, z: A p, q: x = y r: y = z
IsEquiv (cancelR p q r)
change (IsEquiv (equiv_cancelR p q r)); exact _.Defined.(** We can use these to build up more complicated equivalences.In particular, all of the [move] family are equivalences.(Note: currently, some but not all of these [isequiv_] lemmas have corresponding [equiv_] lemmas. Also, they do *not* currently contain the computational content that e.g. the inverse of [moveR_Mp] is [moveL_Vp]; perhaps it would be useful if they did? *)
A: Type x, y, z: A p: x = z q: y = z r: y = x
IsEquiv (moveR_Mp p q r)
A: Type x, y, z: A p: x = z q: y = z r: y = x
IsEquiv (moveR_Mp p q r)
destruct r; apply isequiv_concat_lr.(* [isequiv_concat_lr] is also found by typeclass search, but this is clearer to the reader. *)Defined.Definitionequiv_moveR_Mp
{A : Type} {xyz : A} (p : x = z) (q : y = z) (r : y = x)
: (p = r^ @ q) <~> (r @ p = q)
:= Build_Equiv _ _ (moveR_Mp p q r) _.
A: Type x, y, z: A p: x = z q: y = z r: y = x
IsEquiv (moveR_pM p q r)
A: Type x, y, z: A p: x = z q: y = z r: y = x
IsEquiv (moveR_pM p q r)
destruct p; apply isequiv_concat_lr.Defined.Definitionequiv_moveR_pM
{A : Type} {xyz : A} (p : x = z) (q : y = z) (r : y = x)
: (r = q @ p^) <~> (r @ p = q)
:= Build_Equiv _ _ (moveR_pM p q r) _.
A: Type x, y, z: A p: x = z q: y = z r: x = y
IsEquiv (moveR_Vp p q r)
A: Type x, y, z: A p: x = z q: y = z r: x = y
IsEquiv (moveR_Vp p q r)
destruct r; apply isequiv_concat_lr.Defined.Definitionequiv_moveR_Vp
{A : Type} {xyz : A} (p : x = z) (q : y = z) (r : x = y)
: (p = r @ q) <~> (r^ @ p = q)
:= Build_Equiv _ _ (moveR_Vp p q r) _.
A: Type P: A -> Type x, y: A p: x = y u: P x v: P y q: transport P p u = v
moveR_transport_p P p u v
(moveL_transport_V P p u v q) = q
A: Type P: A -> Type x, y: A p: x = y u: P x v: P y q: transport P p u = v
moveR_transport_p P p u v
(moveL_transport_V P p u v q) = q
destruct p; reflexivity.Defined.
A: Type P: A -> Type x, y: A p: x = y u: P x v: P y q: u = transport P p^ v
moveL_transport_V P p u v
(moveR_transport_p P p u v q) = q
A: Type P: A -> Type x, y: A p: x = y u: P x v: P y q: u = transport P p^ v
moveL_transport_V P p u v
(moveR_transport_p P p u v q) = q
destruct p; reflexivity.Defined.
A: Type P: A -> Type x, y: A p: x = y u: P x v: P y
IsEquiv (moveR_transport_p P p u v)
A: Type P: A -> Type x, y: A p: x = y u: P x v: P y
IsEquiv (moveR_transport_p P p u v)
A: Type P: A -> Type x, y: A p: x = y u: P x v: P y
transport P p u = v -> u = transport P p^ v
A: Type P: A -> Type x, y: A p: x = y u: P x v: P y
moveR_transport_p P p u v o ?g == idmap
A: Type P: A -> Type x, y: A p: x = y u: P x v: P y
?g o moveR_transport_p P p u v == idmap
A: Type P: A -> Type x, y: A p: x = y u: P x v: P y
transport P p u = v -> u = transport P p^ v
apply moveL_transport_V.
A: Type P: A -> Type x, y: A p: x = y u: P x v: P y
moveR_transport_p P p u v o moveL_transport_V P p u v ==
idmap
intro q; apply moveR_moveL_transport_V.
A: Type P: A -> Type x, y: A p: x = y u: P x v: P y
moveL_transport_V P p u v o moveR_transport_p P p u v ==
idmap
intro q; apply moveL_moveR_transport_p.Defined.Definitionequiv_moveR_transport_p {A : Type} (P : A -> Type) {xy : A}
(p : x = y) (u : P x) (v : P y)
: u = transport P p^ v <~> transport P p u = v
:= Build_Equiv _ _ (moveR_transport_p P p u v) _.
A: Type P: A -> Type x, y: A p: y = x u: P x v: P y q: transport P p^ u = v
moveR_transport_V P p u v
(moveL_transport_p P p u v q) = q
A: Type P: A -> Type x, y: A p: y = x u: P x v: P y q: transport P p^ u = v
moveR_transport_V P p u v
(moveL_transport_p P p u v q) = q
destruct p; reflexivity.Defined.
A: Type P: A -> Type x, y: A p: y = x u: P x v: P y q: u = transport P p v
moveL_transport_p P p u v
(moveR_transport_V P p u v q) = q
A: Type P: A -> Type x, y: A p: y = x u: P x v: P y q: u = transport P p v
moveL_transport_p P p u v
(moveR_transport_V P p u v q) = q
destruct p; reflexivity.Defined.
A: Type P: A -> Type x, y: A p: y = x u: P x v: P y
IsEquiv (moveR_transport_V P p u v)
A: Type P: A -> Type x, y: A p: y = x u: P x v: P y
IsEquiv (moveR_transport_V P p u v)
A: Type P: A -> Type x, y: A p: y = x u: P x v: P y
transport P p^ u = v -> u = transport P p v
A: Type P: A -> Type x, y: A p: y = x u: P x v: P y
moveR_transport_V P p u v o ?g == idmap
A: Type P: A -> Type x, y: A p: y = x u: P x v: P y
?g o moveR_transport_V P p u v == idmap
A: Type P: A -> Type x, y: A p: y = x u: P x v: P y
transport P p^ u = v -> u = transport P p v
apply moveL_transport_p.
A: Type P: A -> Type x, y: A p: y = x u: P x v: P y
moveR_transport_V P p u v o moveL_transport_p P p u v ==
idmap
intro q; apply moveR_moveL_transport_p.
A: Type P: A -> Type x, y: A p: y = x u: P x v: P y
moveL_transport_p P p u v o moveR_transport_V P p u v ==
idmap
intro q; apply moveL_moveR_transport_V.Defined.Definitionequiv_moveR_transport_V {A : Type} (P : A -> Type) {xy : A}
(p : y = x) (u : P x) (v : P y)
: u = transport P p v <~> transport P p^ u = v
:= Build_Equiv _ _ (moveR_transport_V P p u v) _.
A: Type P: A -> Type x, y: A p: x = y u: P x v: P y
IsEquiv (moveL_transport_V P p u v)
A: Type P: A -> Type x, y: A p: x = y u: P x v: P y
IsEquiv (moveL_transport_V P p u v)
A: Type P: A -> Type x, y: A p: x = y u: P x v: P y
u = transport P p^ v -> transport P p u = v
A: Type P: A -> Type x, y: A p: x = y u: P x v: P y
moveL_transport_V P p u v o ?g == idmap
A: Type P: A -> Type x, y: A p: x = y u: P x v: P y
?g o moveL_transport_V P p u v == idmap
A: Type P: A -> Type x, y: A p: x = y u: P x v: P y
u = transport P p^ v -> transport P p u = v
apply moveR_transport_p.
A: Type P: A -> Type x, y: A p: x = y u: P x v: P y
moveL_transport_V P p u v o moveR_transport_p P p u v ==
idmap
intro q; apply moveL_moveR_transport_p.
A: Type P: A -> Type x, y: A p: x = y u: P x v: P y
moveR_transport_p P p u v o moveL_transport_V P p u v ==
idmap
intro q; apply moveR_moveL_transport_V.Defined.Definitionequiv_moveL_transport_V {A : Type} (P : A -> Type) {xy : A}
(p : x = y) (u : P x) (v : P y)
: transport P p u = v <~> u = transport P p^ v
:= Build_Equiv _ _ (moveL_transport_V P p u v) _.
A: Type P: A -> Type x, y: A p: y = x u: P x v: P y
IsEquiv (moveL_transport_p P p u v)
A: Type P: A -> Type x, y: A p: y = x u: P x v: P y
IsEquiv (moveL_transport_p P p u v)
A: Type P: A -> Type x, y: A p: y = x u: P x v: P y
u = transport P p v -> transport P p^ u = v
A: Type P: A -> Type x, y: A p: y = x u: P x v: P y
moveL_transport_p P p u v o ?g == idmap
A: Type P: A -> Type x, y: A p: y = x u: P x v: P y
?g o moveL_transport_p P p u v == idmap
A: Type P: A -> Type x, y: A p: y = x u: P x v: P y
u = transport P p v -> transport P p^ u = v
apply moveR_transport_V.
A: Type P: A -> Type x, y: A p: y = x u: P x v: P y
moveL_transport_p P p u v o moveR_transport_V P p u v ==
idmap
intro q; apply moveL_moveR_transport_V.
A: Type P: A -> Type x, y: A p: y = x u: P x v: P y
moveR_transport_V P p u v o moveL_transport_p P p u v ==
idmap
intro q; apply moveR_moveL_transport_p.Defined.Definitionequiv_moveL_transport_p {A : Type} (P : A -> Type) {xy : A}
(p : y = x) (u : P x) (v : P y)
: transport P p^ u = v <~> u = transport P p v
:= Build_Equiv _ _ (moveL_transport_p P p u v) _.
A, B: Type f: A -> B H: IsEquiv f x: A y: B
IsEquiv (moveR_equiv_M x y)
A, B: Type f: A -> B H: IsEquiv f x: A y: B
IsEquiv (moveR_equiv_M x y)
A, B: Type f: A -> B H: IsEquiv f x: A y: B
IsEquiv (funp : x = f^-1 y => ap f p @ eisretr f y)
exact (isequiv_compose (ap f) (funq => q @ eisretr f y)).Defined.Definitionequiv_moveR_equiv_M `{IsEquiv A B f} (x : A) (y : B)
: (x = f^-1 y) <~> (f x = y)
:= Build_Equiv _ _ (@moveR_equiv_M A B f _ x y) _.
A, B: Type f: A -> B H: IsEquiv f x: B y: A
IsEquiv (moveR_equiv_V x y)
A, B: Type f: A -> B H: IsEquiv f x: B y: A
IsEquiv (moveR_equiv_V x y)
A, B: Type f: A -> B H: IsEquiv f x: B y: A
IsEquiv (funp : x = f y => ap f^-1 p @ eissect f y)
exact (isequiv_compose (ap f^-1) (funq => q @ eissect f y)).Defined.Definitionequiv_moveR_equiv_V `{IsEquiv A B f} (x : B) (y : A)
: (x = f y) <~> (f^-1 x = y)
:= Build_Equiv _ _ (@moveR_equiv_V A B f _ x y) _.
A, B: Type f: A -> B H: IsEquiv f x: A y: B
IsEquiv (moveL_equiv_M x y)
A, B: Type f: A -> B H: IsEquiv f x: A y: B
IsEquiv (moveL_equiv_M x y)
A, B: Type f: A -> B H: IsEquiv f x: A y: B
IsEquiv
(funp : f^-1 y = x => (eisretr f y)^ @ ap f p)
exact (isequiv_compose (ap f) (funq => (eisretr f y)^ @ q)).Defined.Definitionequiv_moveL_equiv_M `{IsEquiv A B f} (x : A) (y : B)
: (f^-1 y = x) <~> (y = f x)
:= Build_Equiv _ _ (@moveL_equiv_M A B f _ x y) _.
A, B: Type f: A -> B H: IsEquiv f x: B y: A
IsEquiv (moveL_equiv_V x y)
A, B: Type f: A -> B H: IsEquiv f x: B y: A
IsEquiv (moveL_equiv_V x y)
A, B: Type f: A -> B H: IsEquiv f x: B y: A
IsEquiv
(funp : f y = x => (eissect f y)^ @ ap f^-1 p)
exact (isequiv_compose (ap f^-1) (funq => (eissect f y)^ @ q)).Defined.Definitionequiv_moveL_equiv_V `{IsEquiv A B f} (x : B) (y : A)
: (f y = x) <~> (y = f^-1 x)
:= Build_Equiv _ _ (@moveL_equiv_V A B f _ x y) _.(** *** Dependent paths *)(** Usually, a dependent path over [p:x1=x2] in [P:A->Type] between [y1:P x1] and [y2:P x2] is a path [transport P p y1 = y2] in [P x2]. However, when [P] is a path space, these dependent paths have a more convenient description: rather than transporting the left side both forwards and backwards, we transport both sides of the equation forwards, forming a sort of "naturality square". We use the same naming scheme as for the transport lemmas. *)
A: Type x1, x2, y: A p: x1 = x2 q: x1 = y r: x2 = y
q = p @ r <~> transport (funx : A => x = y) p q = r
A: Type x1, x2, y: A p: x1 = x2 q: x1 = y r: x2 = y
q = p @ r <~> transport (funx : A => x = y) p q = r
A: Type x1, y: A q, r: x1 = y
q = 1 @ r <~> q = r
exact (equiv_concat_r (concat_1p r) q).Defined.
A: Type x, y1, y2: A p: y1 = y2 q: x = y1 r: x = y2
q @ p = r <~> transport (funy : A => x = y) p q = r
A: Type x, y1, y2: A p: y1 = y2 q: x = y1 r: x = y2
q @ p = r <~> transport (funy : A => x = y) p q = r
A: Type x, y1: A q, r: x = y1
q @ 1 = r <~> q = r
exact (equiv_concat_l (concat_p1 q)^ r).Defined.
A: Type x1, x2: A p: x1 = x2 q: x1 = x1 r: x2 = x2
q @ p = p @ r <~>
transport (funx : A => x = x) p q = r
A: Type x1, x2: A p: x1 = x2 q: x1 = x1 r: x2 = x2
q @ p = p @ r <~>
transport (funx : A => x = x) p q = r
A: Type x1: A q, r: x1 = x1
q @ 1 = 1 @ r <~> q = r
symmetry; apply equiv_p1_1q.Defined.
A, B: Type f: A -> B x1, x2: A y: B p: x1 = x2 q: f x1 = y r: f x2 = y
q = ap f p @ r <~>
transport (funx : A => f x = y) p q = r
A, B: Type f: A -> B x1, x2: A y: B p: x1 = x2 q: f x1 = y r: f x2 = y
q = ap f p @ r <~>
transport (funx : A => f x = y) p q = r
A, B: Type f: A -> B x1: A y: B q, r: f x1 = y
q = 1 @ r <~> q = r
exact (equiv_concat_r (concat_1p r) q).Defined.
A, B: Type g: A -> B x: B y1, y2: A p: y1 = y2 q: x = g y1 r: x = g y2
q @ ap g p = r <~>
transport (funy : A => x = g y) p q = r
A, B: Type g: A -> B x: B y1, y2: A p: y1 = y2 q: x = g y1 r: x = g y2
q @ ap g p = r <~>
transport (funy : A => x = g y) p q = r
A, B: Type g: A -> B x: B y1: A q, r: x = g y1
q @ 1 = r <~> q = r
exact (equiv_concat_l (concat_p1 q)^ r).Defined.
A, B: Type f, g: A -> B x1, x2: A p: x1 = x2 q: f x1 = g x1 r: f x2 = g x2
q @ ap g p = ap f p @ r <~>
transport (funx : A => f x = g x) p q = r
A, B: Type f, g: A -> B x1, x2: A p: x1 = x2 q: f x1 = g x1 r: f x2 = g x2
q @ ap g p = ap f p @ r <~>
transport (funx : A => f x = g x) p q = r
A, B: Type f, g: A -> B x1: A q, r: f x1 = g x1
q @ 1 = 1 @ r <~> q = r
A, B: Type f, g: A -> B x1: A q, r: f x1 = g x1
q @ 1 = 1 @ r <~> q @ 1 = r
A, B: Type f, g: A -> B x1: A q, r: f x1 = g x1
q @ 1 = r <~> q = r
A, B: Type f, g: A -> B x1: A q, r: f x1 = g x1
q @ 1 = 1 @ r <~> q @ 1 = r
exact (equiv_concat_r (concat_1p r) (q @ 1)).
A, B: Type f, g: A -> B x1: A q, r: f x1 = g x1
q @ 1 = r <~> q = r
exact (equiv_concat_l (concat_p1 q)^ r).Defined.
A, B: Type f: A -> B g: B -> A x1, x2: A p: x1 = x2 q: g (f x1) = x1 r: g (f x2) = x2
q @ p = ap g (ap f p) @ r <~>
transport (funx : A => g (f x) = x) p q = r
A, B: Type f: A -> B g: B -> A x1, x2: A p: x1 = x2 q: g (f x1) = x1 r: g (f x2) = x2
q @ p = ap g (ap f p) @ r <~>
transport (funx : A => g (f x) = x) p q = r
A, B: Type f: A -> B g: B -> A x1: A q, r: g (f x1) = x1
q @ 1 = 1 @ r <~> q = r
symmetry; apply equiv_p1_1q.Defined.
A, B: Type f: A -> B g: B -> A x1, x2: A p: x1 = x2 q: x1 = g (f x1) r: x2 = g (f x2)
q @ ap g (ap f p) = p @ r <~>
transport (funx : A => x = g (f x)) p q = r
A, B: Type f: A -> B g: B -> A x1, x2: A p: x1 = x2 q: x1 = g (f x1) r: x2 = g (f x2)
q @ ap g (ap f p) = p @ r <~>
transport (funx : A => x = g (f x)) p q = r
A, B: Type f: A -> B g: B -> A x1: A q, r: x1 = g (f x1)
q @ 1 = 1 @ r <~> q = r
symmetry; apply equiv_p1_1q.Defined.
A: Type x, y: A p: x = y q, r: 1 = 1
((concat_1p p)^ @ whiskerR q p) @ concat_1p p =
((concat_p1 p)^ @ whiskerL p r) @ concat_p1 p <~>
transport (funa : A => 1 = 1) p q = r
A: Type x, y: A p: x = y q, r: 1 = 1
((concat_1p p)^ @ whiskerR q p) @ concat_1p p =
((concat_p1 p)^ @ whiskerL p r) @ concat_p1 p <~>
transport (funa : A => 1 = 1) p q = r
H: Funext A: Type a: A P: forallx : A, a = x -> Type
IsEquiv (paths_ind a P)
H: Funext A: Type a: A P: forallx : A, a = x -> Type
IsEquiv (paths_ind a P)
H: Funext A: Type a: A P: forallx : A, a = x -> Type
(funx : forall (y : A) (p : a = y), P y p =>
paths_ind a P (x a 1)) == idmap
H: Funext A: Type a: A P: forallx : A, a = x -> Type
(funx : P a 1 => paths_ind a P x a 1) == idmap
H: Funext A: Type a: A P: forallx : A, a = x -> Type
(funx : forall (y : A) (p : a = y), P y p =>
paths_ind a P (x a 1)) == idmap
H: Funext A: Type a: A P: forallx : A, a = x -> Type f: forall (y : A) (p : a = y), P y p
paths_ind a P (f a 1) = f
H: Funext A: Type a: A P: forallx : A, a = x -> Type f: forall (y : A) (p : a = y), P y p x: A
paths_ind a P (f a 1) x = f x
H: Funext A: Type a: A P: forallx : A, a = x -> Type f: forall (y : A) (p : a = y), P y p x: A p: a = x
paths_ind a P (f a 1) x p = f x p
destruct p; reflexivity.
H: Funext A: Type a: A P: forallx : A, a = x -> Type
(funx : P a 1 => paths_ind a P x a 1) == idmap
H: Funext A: Type a: A P: forallx : A, a = x -> Type u: P a 1
paths_ind a P u a 1 = u
reflexivity.Defined.Definitionequiv_paths_ind `{Funext} {A : Type} (a : A)
(P : forallx, (a = x) -> Type)
: P a 1 <~> forallxp, P x p
:= Build_Equiv _ _ (paths_ind a P) _.
H: Funext A: Type a: A P: forallx : A, x = a -> Type
IsEquiv (paths_ind_r a P)
H: Funext A: Type a: A P: forallx : A, x = a -> Type
IsEquiv (paths_ind_r a P)
H: Funext A: Type a: A P: forallx : A, x = a -> Type
(funx : forall (y : A) (p : y = a), P y p =>
paths_ind_r a P (x a 1)) == idmap
H: Funext A: Type a: A P: forallx : A, x = a -> Type
(funx : P a 1 => paths_ind_r a P x a 1) == idmap
H: Funext A: Type a: A P: forallx : A, x = a -> Type
(funx : forall (y : A) (p : y = a), P y p =>
paths_ind_r a P (x a 1)) == idmap
H: Funext A: Type a: A P: forallx : A, x = a -> Type f: forall (y : A) (p : y = a), P y p
paths_ind_r a P (f a 1) = f
H: Funext A: Type a: A P: forallx : A, x = a -> Type f: forall (y : A) (p : y = a), P y p x: A
paths_ind_r a P (f a 1) x = f x
H: Funext A: Type a: A P: forallx : A, x = a -> Type f: forall (y : A) (p : y = a), P y p x: A p: x = a
paths_ind_r a P (f a 1) x p = f x p
destruct p; reflexivity.
H: Funext A: Type a: A P: forallx : A, x = a -> Type
(funx : P a 1 => paths_ind_r a P x a 1) == idmap
H: Funext A: Type a: A P: forallx : A, x = a -> Type u: P a 1
paths_ind_r a P u a 1 = u
reflexivity.Defined.Definitionequiv_paths_ind_r `{Funext} {A : Type} (a : A)
(P : forallx, (x = a) -> Type)
: P a 1 <~> forallxp, P x p
:= Build_Equiv _ _ (paths_ind_r a P) _.(** ** Truncation *)(** Paths reduce truncation level by one. This is essentially the definition of [IsTrunc_internal]. *)