-- definition equiv_whiskerL {A} {x y z : A} (p : x = y) (q r : y = z)
-- : (q = r) ≃ (p ⬝ q = p ⬝ r) :=
-- equiv.mk _ _ (whisker_left p) _.
-- definition equiv_cancelL {A} {x y z : A} (p : x = y) (q r : y = z)
-- : (p ⬝ q = p ⬝ r) ≃ (q = r) :=
-- equiv_inverse (equiv_whiskerL p q r).
-- definition isequiv_cancelL {A} {x y z : A} (p : x = y) (q r : y = z)
-- : is_equiv (cancel_left p q r).
-- /-begin
-- change (is_equiv (equiv_cancelL p q r)); exact _.
-- end-/
-- definition isequiv_whiskerR [instance] {A} {x y z : A} {p q : x = y} (r : y = z)
-- : is_equiv (λh, @whisker_right A x y z p q h r).
-- /-begin
-- refine (isequiv_adjointify _ _ _ _).
-- - apply cancelR.
-- - intros k. unfold cancelR.
-- rewrite !whiskerR_pp.
-- refine ((_ @@ 1 @@ _) ⬝ whiskerR_VpR k r).
-- + destruct p, r; reflexivity.
-- + destruct q, r; reflexivity.
-- - intros k. unfold cancelR.
-- refine ((_ @@ 1 @@ _) ⬝ whiskerR_pVR k r).
-- + destruct p, r; reflexivity.
-- + destruct q, r; reflexivity.
-- end-/
-- definition equiv_whiskerR {A} {x y z : A} (p q : x = y) (r : y = z)
-- : (p = q) ≃ (p ⬝ r = q ⬝ r) :=
-- equiv.mk _ _ (λh, whisker_right h r) _.
-- definition equiv_cancelR {A} {x y z : A} (p q : x = y) (r : y = z)
-- : (p ⬝ r = q ⬝ r) ≃ (p = q) :=
-- equiv_inverse (equiv_whiskerR p q r).
-- definition isequiv_cancelR {A} {x y z : A} (p q : x = y) (r : y = z)
-- : is_equiv (cancel_right p q r).
-- /-begin
-- change (is_equiv (equiv_cancelR p q r)); exact _.
-- end-/
-- /- 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? -/
-- Global Instance isequiv_moveR_Mp
-- {A : Type} {x y z : A} (p : x = z) (q : y = z) (r : y = x)
-- {A : Type} {x y z : A} (p : z = x) (q : y = z) (r : y = x)
-- : q ⬝ p = r ≃ q = r ⬝ p⁻¹ :=
-- equiv.mk _ _ (eq_con_inv_of_con_eq p q r) _.
-- definition isequiv_moveL_1M {A : Type} {x y : A} (p q : x = y)
-- : is_equiv (eq_of_con_inv_eq_idp p q).
-- /-begin
-- destruct q. apply isequiv_concat_l.
-- end-/
-- definition isequiv_moveL_M1 {A : Type} {x y : A} (p q : x = y)
-- : is_equiv (eq_of_inv_con_eq_idp p q).
-- /-begin
-- destruct q. apply isequiv_concat_l.
-- end-/
-- definition isequiv_moveL_1V {A : Type} {x y : A} (p : x = y) (q : y = x)
-- : is_equiv (eq_inv_of_con_eq_idp' p q).
-- /-begin
-- destruct q. apply isequiv_concat_l.
-- end-/
-- definition isequiv_moveL_V1 {A : Type} {x y : A} (p : x = y) (q : y = x)
-- : is_equiv (eq_inv_of_con_eq_idp p q).
-- /-begin
-- destruct q. apply isequiv_concat_l.
-- end-/
-- definition isequiv_moveR_M1 {A : Type} {x y : A} (p q : x = y)
-- : is_equiv (eq_of_idp_eq_inv_con p q).
-- /-begin
-- destruct p. apply isequiv_concat_r.
-- end-/
-- definition isequiv_moveR_1M {A : Type} {x y : A} (p q : x = y)
-- : is_equiv (eq_of_idp_eq_con_inv p q).
-- /-begin
-- destruct p. apply isequiv_concat_r.
-- end-/
-- definition isequiv_moveR_1V {A : Type} {x y : A} (p : x = y) (q : y = x)
-- : is_equiv (inv_eq_of_idp_eq_con p q).
-- /-begin
-- destruct p. apply isequiv_concat_r.
-- end-/
-- definition isequiv_moveR_V1 {A : Type} {x y : A} (p : x = y) (q : y = x)
-- : is_equiv (inv_eq_of_idp_eq_con' p q).
-- /-begin
-- destruct p. apply isequiv_concat_r.
-- end-/
-- definition isequiv_moveR_transport_p [instance] {A : Type} (P : A → Type) {x y : A}
-- (p : x = y) (u : P x) (v : P y)
-- : is_equiv (tr_eq_of_eq_inv_tr P p u v).
-- /-begin
-- destruct p. apply isequiv_idmap.
-- end-/
-- definition equiv_moveR_transport_p {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 :=
-- equiv.mk _ _ (tr_eq_of_eq_inv_tr P p u v) _.
-- definition isequiv_moveR_transport_V [instance] {A : Type} (P : A → Type) {x y : A}
-- (p : y = x) (u : P x) (v : P y)
-- : is_equiv (inv_tr_eq_of_eq_tr P p u v).
-- /-begin
-- destruct p. apply isequiv_idmap.
-- end-/
-- definition equiv_moveR_transport_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 :=
-- equiv.mk _ _ (inv_tr_eq_of_eq_tr P p u v) _.
-- definition isequiv_moveL_transport_V [instance] {A : Type} (P : A → Type) {x y : A}
-- (p : x = y) (u : P x) (v : P y)
-- : is_equiv (eq_inv_tr_of_tr_eq P p u v).
-- /-begin
-- destruct p. apply isequiv_idmap.
-- end-/
-- definition equiv_moveL_transport_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 :=
-- equiv.mk _ _ (eq_inv_tr_of_tr_eq P p u v) _.
-- definition isequiv_moveL_transport_p [instance] {A : Type} (P : A → Type) {x y : A}
-- (p : y = x) (u : P x) (v : P y)
-- : is_equiv (eq_tr_of_inv_tr_eq P p u v).
-- /-begin
-- destruct p. apply isequiv_idmap.
-- end-/
-- definition equiv_moveL_transport_p {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 :=
-- equiv.mk _ _ (eq_tr_of_inv_tr_eq P p u v) _.
-- definition isequiv_moveR_equiv_M [instance] [H : is_equiv A B f] (x : A) (y : B)
-- : is_equiv (@moveR_equiv_M A B f _ x y).
-- /-begin
-- unfold moveR_equiv_M.
-- refine (@isequiv_compose _ _ (ap f) _ _ (λq, q ⬝ retr f y) _).
-- end-/
-- definition equiv_moveR_equiv_M [H : is_equiv A B f] (x : A) (y : B)
-- : (x = f⁻¹ y) ≃ (f x = y) :=
-- equiv.mk _ _ (@moveR_equiv_M A B f _ x y) _.
-- definition isequiv_moveR_equiv_V [instance] [H : is_equiv A B f] (x : B) (y : A)
-- : is_equiv (@moveR_equiv_V A B f _ x y).
-- /-begin
-- unfold moveR_equiv_V.
-- refine (@isequiv_compose _ _ (ap f⁻¹) _ _ (λq, q ⬝ sect f y) _).
-- end-/
-- definition equiv_moveR_equiv_V [H : is_equiv A B f] (x : B) (y : A)
-- : (x = f y) ≃ (f⁻¹ x = y) :=
-- equiv.mk _ _ (@moveR_equiv_V A B f _ x y) _.
-- definition isequiv_moveL_equiv_M [instance] [H : is_equiv A B f] (x : A) (y : B)
-- : is_equiv (@moveL_equiv_M A B f _ x y).
-- /-begin
-- unfold moveL_equiv_M.
-- refine (@isequiv_compose _ _ (ap f) _ _ (λq, (retr f y)⁻¹ ⬝ q) _).
-- end-/
-- definition equiv_moveL_equiv_M [H : is_equiv A B f] (x : A) (y : B)
-- : (f⁻¹ y = x) ≃ (y = f x) :=
-- equiv.mk _ _ (@moveL_equiv_M A B f _ x y) _.
-- definition isequiv_moveL_equiv_V [instance] [H : is_equiv A B f] (x : B) (y : A)
-- : is_equiv (@moveL_equiv_V A B f _ x y).
-- /-begin
-- unfold moveL_equiv_V.
-- refine (@isequiv_compose _ _ (ap f⁻¹) _ _ (λq, (sect f y)⁻¹ ⬝ q) _).
-- end-/
-- definition equiv_moveL_equiv_V [H : is_equiv A B f] (x : B) (y : A)
-- : (f y = x) ≃ (y = f⁻¹ x) :=
-- equiv.mk _ _ (@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. -/