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 the universe, including the Univalence Axiom. *)
[Loading ML file number_string_notation_plugin.cmxs (using legacy method) ... done]
Require Import Types.Sigma Types.Forall Types.Arrow Types.Paths Types.Equiv Types.Bool Types.Prod.LocalOpen Scope path_scope.Generalizable VariablesA B f.(** ** Paths *)Definitionequiv_path (AB : Type@{u}) (p : A = B) : A <~> B
:= equiv_transport (funX => X) p.
H: Funext A, B: Type p: A = B
equiv_path B A p^ = (equiv_path A B p)^-1%equiv
H: Funext A, B: Type p: A = B
equiv_path B A p^ = (equiv_path A B p)^-1%equiv
H: Funext A, B: Type p: A = B
equiv_path B A p^ = (equiv_path A B p)^-1%equiv
reflexivity.Defined.(** See the note by [Funext] in Overture.v *)MonomorphicAxiomUnivalence : Type0.Existing ClassUnivalence.(** Mark this axiom as a "global axiom", which some of our tactics will automatically handle. *)Instanceis_global_axiom_univalence : IsGlobalAxiom Univalence := {}.Axiomisequiv_equiv_path : forall `{Univalence} (A B : Type@{u}), IsEquiv (equiv_path A B).Existing Instanceisequiv_equiv_path.(** A proof that univalence implies function extensionality can be found in the metatheory file [UnivalenceImpliesFunext], but that actual proof can't be used on our dummy typeclasses. So we assert the following axiomatic instance. *)
H: Univalence
Funext
Admitted.SectionUnivalence.Context `{Univalence}.Definitionpath_universe_uncurried {AB : Type} (f : A <~> B) : A = B
:= (equiv_path A B)^-1 f.Definitionpath_universe {AB : Type} (f : A -> B) {feq : IsEquiv f} : (A = B)
:= path_universe_uncurried (Build_Equiv _ _ f feq).GlobalArguments path_universe {A B}%_type_scope f%_function_scope {feq}.Definitioneta_path_universe {AB : Type} (p : A = B)
: path_universe (equiv_path A B p) = p
:= eissect (equiv_path A B) p.Definitioneta_path_universe_uncurried {AB : Type} (p : A = B)
: path_universe_uncurried (equiv_path A B p) = p
:= eissect (equiv_path A B) p.Definitionisequiv_path_universe {AB : Type}
: IsEquiv (@path_universe_uncurried A B)
:= _.Definitionequiv_path_universe (AB : Type) : (A <~> B) <~> (A = B)
:= Build_Equiv _ _ (@path_universe_uncurried A B) isequiv_path_universe.Definitionequiv_equiv_path (AB : Type) : (A = B) <~> (A <~> B)
:= (equiv_path_universe A B)^-1%equiv.(** These operations have too many names, making [rewrite] a pain. So we give lots of names to the computation laws. *)Definitionpath_universe_equiv_path {AB : Type} (p : A = B)
: path_universe (equiv_path A B p) = p
:= eissect (equiv_path A B) p.Definitionpath_universe_uncurried_equiv_path {AB : Type} (p : A = B)
: path_universe_uncurried (equiv_path A B p) = p
:= eissect (equiv_path A B) p.Definitionpath_universe_transport_idmap {AB : Type} (p : A = B)
: path_universe (transport idmap p) = p
:= eissect (equiv_path A B) p.Definitionpath_universe_uncurried_transport_idmap {AB : Type} (p : A = B)
: path_universe_uncurried (equiv_transport idmap p) = p
:= eissect (equiv_path A B) p.Definitionequiv_path_path_universe {AB : Type} (f : A <~> B)
: equiv_path A B (path_universe f) = f
:= eisretr (equiv_path A B) f.Definitionequiv_path_path_universe_uncurried {AB : Type} (f : A <~> B)
: equiv_path A B (path_universe_uncurried f) = f
:= eisretr (equiv_path A B) f.Definitiontransport_idmap_path_universe {AB : Type} (f : A <~> B)
: transport idmap (path_universe f) = f
:= ap equiv_fun (eisretr (equiv_path A B) f).Definitiontransport_idmap_path_universe_uncurried {AB : Type} (f : A <~> B)
: transport idmap (path_universe_uncurried f) = f
:= ap equiv_fun (eisretr (equiv_path A B) f).(** ** Behavior on path operations *)(* We explicitly assume [Funext] here, since this result doesn't use [Univalence]. *)
H: Univalence H0: Funext A, B, C: Type p: A = B q: B = C
equiv_path A C (p @ q) =
equiv_path B C q oE equiv_path A B p
H: Univalence H0: Funext A, B, C: Type p: A = B q: B = C
equiv_path A C (p @ q) =
equiv_path B C q oE equiv_path A B p
H: Univalence H0: Funext A, B, C: Type p: A = B q: B = C
equiv_path A C (p @ q) ==
equiv_path B C q oE equiv_path A B p
napply transport_pp.Defined.
H: Univalence A, B, C: Type f: A <~> B g: B <~> C
path_universe_uncurried (equiv_compose g f) =
path_universe_uncurried f @ path_universe_uncurried g
H: Univalence A, B, C: Type f: A <~> B g: B <~> C
path_universe_uncurried (equiv_compose g f) =
path_universe_uncurried f @ path_universe_uncurried g
H: Univalence A, B, C: Type g: B <~> C
forallf : A <~> B,
path_universe_uncurried (equiv_compose g f) =
path_universe_uncurried f @ path_universe_uncurried g
H: Univalence A, B, C: Type g: B <~> C f: A = B
path_universe_uncurried
(equiv_compose g (equiv_path A B f)) =
path_universe_uncurried (equiv_path A B f) @
path_universe_uncurried g
H: Univalence A, B, C: Type f: A = B
forallg : B <~> C,
path_universe_uncurried
(equiv_compose g (equiv_path A B f)) =
path_universe_uncurried (equiv_path A B f) @
path_universe_uncurried g
H: Univalence A, B, C: Type f: A = B g: B = C
path_universe_uncurried
(equiv_compose (equiv_path B C g) (equiv_path A B f)) =
path_universe_uncurried (equiv_path A B f) @
path_universe_uncurried (equiv_path B C g)
H: Univalence A, B, C: Type f: A = B g: B = C
path_universe_uncurried (equiv_path A C (f @ g)) =
path_universe_uncurried (equiv_path A B f) @
path_universe_uncurried (equiv_path B C g)
H: Univalence A, B, C: Type f: A = B g: B = C
f @ g =
path_universe_uncurried (equiv_path A B f) @
path_universe_uncurried (equiv_path B C g)
apply concat2; symmetry; apply eta_path_universe.Defined.Definitionpath_universe_compose {ABC : Type}
(f : A <~> B) (g : B <~> C)
: path_universe (g o f) = path_universe f @ path_universe g
:= path_universe_compose_uncurried f g.Definitionpath_universe_1 {A : Type}
: path_universe (equiv_idmap A) = 1
:= eta_path_universe 1.
forallf : A <~> B,
path_universe_uncurried f^-1 =
(path_universe_uncurried f)^
H: Univalence A, B: Type p: A = B
path_universe_uncurried
((equiv_path_universe A B)^-1%function p)^-1 =
(path_universe_uncurried
((equiv_path_universe A B)^-1%function p))^
H: Univalence A, B: Type p: A = B
path_universe_uncurried (equiv_path A B p)^-1 =
(path_universe_uncurried (equiv_path A B p))^
H: Univalence A, B: Type p: A = B
path_universe_uncurried (equiv_path A B p)^-1 = p^
H: Univalence A, B: Type p: A = B
p^ = (path_universe_uncurried (equiv_path A B p))^
H: Univalence A, B: Type p: A = B
path_universe_uncurried (equiv_path A B p)^-1 = p^
H: Univalence A, B: Type p: A = B
path_universe_uncurried (equiv_path A B p)^-1 =
path_universe_uncurried (equiv_path B A p^)
H: Univalence A, B: Type p: A = B
path_universe_uncurried (equiv_path B A p^) = p^
H: Univalence A, B: Type p: A = B
path_universe_uncurried (equiv_path A B p)^-1 =
path_universe_uncurried (equiv_path B A p^)
byexact (ap _ (equiv_path_V A B p)^).
H: Univalence A, B: Type p: A = B
path_universe_uncurried (equiv_path B A p^) = p^
byexact (eissect (equiv_path B A) p^).Defined.Definitionpath_universe_V `(f : A -> B) `{IsEquiv A B f}
: path_universe (f^-1) = (path_universe f)^
:= path_universe_V_uncurried (Build_Equiv A B f _).(** ** Path operations vs Type operations *)(** [ap (Equiv A)] behaves like postcomposition. *)
H: Univalence A, B, C: Type f: B <~> C
equiv_path (A <~> B) (A <~> C)
(ap (Equiv A) (path_universe f)) =
equiv_functor_equiv 1 f
H: Univalence A, B, C: Type f: B <~> C
equiv_path (A <~> B) (A <~> C)
(ap (Equiv A) (path_universe f)) =
equiv_functor_equiv 1 f
H: Univalence A, B, C: Type
forallf : B <~> C,
equiv_path (A <~> B) (A <~> C)
(ap (Equiv A) (path_universe f)) =
equiv_functor_equiv 1 f
H: Univalence A, B, C: Type f: B = C
equiv_path (A <~> B) (A <~> C)
(ap (Equiv A) (path_universe (equiv_path B C f))) =
equiv_functor_equiv 1 (equiv_path B C f)
H: Univalence A, B, C: Type f: B = C
equiv_path (A <~> B) (A <~> C) (ap (Equiv A) f) =
equiv_functor_equiv 1 (equiv_path B C f)
H: Univalence A, B: Type
equiv_path (A <~> B) (A <~> B) 1 =
equiv_functor_equiv 1 (equiv_path B B 1)
H: Univalence A, B: Type g: A <~> B
equiv_path (A <~> B) (A <~> B) 1 g =
equiv_functor_equiv 1 (equiv_path B B 1) g
H: Univalence A, B: Type g: A <~> B a: A
equiv_path (A <~> B) (A <~> B) 1 g a =
equiv_functor_equiv 1 (equiv_path B B 1) g a
reflexivity.Defined.(** [ap (prod A)] behaves like [equiv_functor_prod_l]. *)
H: Univalence A, B, C: Type f: B <~> C
equiv_path (A * B) (A * C)
(ap (prod A) (path_universe f)) =
equiv_functor_prod_l f
H: Univalence A, B, C: Type f: B <~> C
equiv_path (A * B) (A * C)
(ap (prod A) (path_universe f)) =
equiv_functor_prod_l f
H: Univalence A, B, C: Type
forallf : B <~> C,
equiv_path (A * B) (A * C)
(ap (prod A) (path_universe f)) =
equiv_functor_prod_l f
H: Univalence A, B, C: Type f: B = C
equiv_path (A * B) (A * C)
(ap (prod A) (path_universe (equiv_path B C f))) =
equiv_functor_prod_l (equiv_path B C f)
H: Univalence A, B, C: Type f: B = C
equiv_path (A * B) (A * C) (ap (prod A) f) =
equiv_functor_prod_l (equiv_path B C f)
H: Univalence A, B: Type
equiv_path (A * B) (A * B) (ap (prod A) 1) =
equiv_functor_prod_l (equiv_path B B 1)
apply path_equiv, path_arrow; intros x; reflexivity.Defined.(** [ap (fun Z => Z * A)] behaves like [equiv_functor_prod_r]. *)
H: Univalence A, B, C: Type f: B <~> C
equiv_path (B * A) (C * A)
(ap (funZ : Type => Z * A) (path_universe f)) =
equiv_functor_prod_r f
H: Univalence A, B, C: Type f: B <~> C
equiv_path (B * A) (C * A)
(ap (funZ : Type => Z * A) (path_universe f)) =
equiv_functor_prod_r f
H: Univalence A, B, C: Type
forallf : B <~> C,
equiv_path (B * A) (C * A)
(ap (funZ : Type => Z * A) (path_universe f)) =
equiv_functor_prod_r f
H: Univalence A, B, C: Type f: B = C
equiv_path (B * A) (C * A)
(ap (funZ : Type => Z * A)
(path_universe (equiv_path B C f))) =
equiv_functor_prod_r (equiv_path B C f)
H: Univalence A, B, C: Type f: B = C
equiv_path (B * A) (C * A)
(ap (funZ : Type => Z * A) f) =
equiv_functor_prod_r (equiv_path B C f)
H: Univalence A, B: Type
equiv_path (B * A) (B * A)
(ap (funZ : Type => Z * A) 1) =
equiv_functor_prod_r (equiv_path B B 1)
apply path_equiv, path_arrow; intros x; reflexivity.Defined.(** ** Transport *)(** There are two ways we could define [transport_path_universe]: we could give an explicit definition, or we could reduce it to paths by [equiv_ind] and give an explicit definition there. The two should be equivalent, but we choose the second for now as it makes the currently needed coherence lemmas easier to prove. *)
H: Univalence A, B: Type f: A <~> B z: A
transport idmap (path_universe_uncurried f) z = f z
H: Univalence A, B: Type f: A <~> B z: A
transport idmap (path_universe_uncurried f) z = f z
H: Univalence A, B: Type z: A
forallf : A <~> B,
transport idmap (path_universe_uncurried f) z = f z
H: Univalence A, B: Type z: A p: A = B
transport idmap
(path_universe_uncurried (equiv_path A B p)) z =
equiv_path A B p z
exact (ap (funs => transport idmap s z) (eissect _ p)).Defined.(* Alternatively, [apply ap10, transport_idmap_path_universe_uncurried.], but then some later proofs would have to change. *)Definitiontransport_path_universe
{AB : Type} (f : A -> B) {feq : IsEquiv f} (z : A)
: transport (funX:Type => X) (path_universe f) z = f z
:= transport_path_universe_uncurried (Build_Equiv A B f feq) z.(* Alternatively, [ap10_equiv (eisretr (equiv_path A B) (Build_Equiv _ _ f feq)) z]. *)Definitiontransport_path_universe_equiv_path
{AB : Type} (p : A = B) (z : A)
: transport_path_universe (equiv_path A B p) z =
(ap (funs => transport idmap s z) (eissect _ p))
:= equiv_ind_comp _ _ _.(* This somewhat fancier version is useful when working with HITs. *)Definitiontransport_path_universe'
{A : Type} (P : A -> Type) {xy : A} (p : x = y)
(f : P x <~> P y) (q : ap P p = path_universe f) (u : P x)
: transport P p u = f u
:= transport_compose idmap P p u
@ ap10 (ap (transport idmap) q) u
@ transport_path_universe f u.(** And a version for transporting backwards. *)
H: Univalence A, B: Type f: A <~> B z: B
transport idmap (path_universe_uncurried f)^ z =
f^-1 z
H: Univalence A, B: Type f: A <~> B z: B
transport idmap (path_universe_uncurried f)^ z =
f^-1 z
H: Univalence A, B: Type z: B
forallf : A <~> B,
transport idmap (path_universe_uncurried f)^ z =
f^-1 z
H: Univalence A, B: Type z: B p: A = B
transport idmap
(path_universe_uncurried (equiv_path A B p))^ z =
(equiv_path A B p)^-1 z
exact (ap (funs => transport idmap s z) (inverse2 (eissect _ p))).Defined.Definitiontransport_path_universe_V
{AB : Type} (f : A -> B) {feq : IsEquiv f} (z : B)
: transport (funX:Type => X) (path_universe f)^ z = f^-1 z
:= transport_path_universe_V_uncurried (Build_Equiv _ _ f feq) z.(* Alternatively, [(transport2 idmap (path_universe_V f) z)^ @ (transport_path_universe (f^-1) z)]. *)Definitiontransport_path_universe_V_equiv_path
{AB : Type} (p : A = B) (z : B)
: transport_path_universe_V (equiv_path A B p) z
= ap (funs => transport idmap s z) (inverse2 (eissect _ p))
:= equiv_ind_comp _ _ _.(** And some coherence for it. *)
H: Univalence A, B: Type f: A <~> B z: A
(ap (transport idmap (path_universe f)^)
(transport_path_universe f z) @
transport_path_universe_V f (f z)) @ eissect f z =
transport_Vp idmap (path_universe f) z
H: Univalence A, B: Type f: A <~> B z: A
(ap (transport idmap (path_universe f)^)
(transport_path_universe f z) @
transport_path_universe_V f (f z)) @ eissect f z =
transport_Vp idmap (path_universe f) z
H: Univalence A, B: Type f: A <~> B z: A
(fune : A <~> B =>
(ap (transport idmap (path_universe e)^)
(transport_path_universe e z) @
transport_path_universe_V e (e z)) @ eissect e z =
transport_Vp idmap (path_universe e) z) f
H: Univalence A, B: Type f: A <~> B z: A p: A = B
(ap
(transport idmap
(path_universe (equiv_path A B p))^)
(transport_path_universe (equiv_path A B p) z) @
transport_path_universe_V (equiv_path A B p)
(equiv_path A B p z)) @
eissect (equiv_path A B p) z =
transport_Vp idmap (path_universe (equiv_path A B p))
z
(* Something slightly sneaky happens here: by definition of [equiv_path], [eissect (equiv_path A B p)] is judgmentally equal to [transport_Vp idmap p]. Thus, we can apply [ap_transport_Vp_idmap]. *)
H: Univalence A, B: Type f: A <~> B z: A p: A = B
(ap
(transport idmap
(path_universe (equiv_path A B p))^)
(transport_path_universe (equiv_path A B p) z) @
transport_path_universe_V (equiv_path A B p)
(equiv_path A B p z)) @
eissect (equiv_path A B p) z =
(ap
(transport idmap
(path_universe (equiv_path A B p))^)
(ap (funs : A = B => transport idmap s z)
(eissect (equiv_path A B) p)) @
ap
(funs : B = A =>
transport idmap s (transport idmap p z))
(inverse2 (eissect (equiv_path A B) p))) @
transport_Vp idmap p z
H: Univalence A, B: Type f: A <~> B z: A p: A = B
ap
(transport idmap (path_universe (equiv_path A B p))^)
(transport_path_universe (equiv_path A B p) z) @
transport_path_universe_V (equiv_path A B p)
(equiv_path A B p z) =
ap
(transport idmap (path_universe (equiv_path A B p))^)
(ap (funs : A = B => transport idmap s z)
(eissect (equiv_path A B) p)) @
ap
(funs : B = A =>
transport idmap s (transport idmap p z))
(inverse2 (eissect (equiv_path A B) p))
H: Univalence A, B: Type f: A <~> B z: A p: A = B
ap
(transport idmap (path_universe (equiv_path A B p))^)
(transport_path_universe (equiv_path A B p) z) =
ap
(transport idmap (path_universe (equiv_path A B p))^)
(ap (funs : A = B => transport idmap s z)
(eissect (equiv_path A B) p))
H: Univalence A, B: Type f: A <~> B z: A p: A = B
transport_path_universe_V (equiv_path A B p)
(equiv_path A B p z) =
ap
(funs : B = A =>
transport idmap s (transport idmap p z))
(inverse2 (eissect (equiv_path A B) p))
H: Univalence A, B: Type f: A <~> B z: A p: A = B
ap
(transport idmap (path_universe (equiv_path A B p))^)
(transport_path_universe (equiv_path A B p) z) =
ap
(transport idmap (path_universe (equiv_path A B p))^)
(ap (funs : A = B => transport idmap s z)
(eissect (equiv_path A B) p))
H: Univalence A, B: Type f: A <~> B z: A p: A = B
transport_path_universe (equiv_path A B p) z =
ap (funs : A = B => transport idmap s z)
(eissect (equiv_path A B) p)
apply transport_path_universe_equiv_path.
H: Univalence A, B: Type f: A <~> B z: A p: A = B
transport_path_universe_V (equiv_path A B p)
(equiv_path A B p z) =
ap
(funs : B = A =>
transport idmap s (transport idmap p z))
(inverse2 (eissect (equiv_path A B) p))
apply transport_path_universe_V_equiv_path.Defined.Definitiontransport_path_universe_Vp
{AB : Type} (f : A -> B) {feq : IsEquiv f} (z : A)
: ap (transport idmap (path_universe f)^) (transport_path_universe f z)
@ transport_path_universe_V f (f z)
@ eissect f z
= transport_Vp idmap (path_universe f) z
:= transport_path_universe_Vp_uncurried (Build_Equiv A B f feq) z.(** *** Transporting in particular type families *)
H: Univalence A, U, V: Type w: U <~> V
forallf : U -> A,
transport (funE : Type => E -> A) (path_universe w) f =
f o w^-1
H: Univalence A, U, V: Type w: U <~> V
forallf : U -> A,
transport (funE : Type => E -> A) (path_universe w) f =
f o w^-1
H: Univalence A, U, V: Type w: U <~> V f: U -> A
transport (funE : Type => E -> A) (path_universe w) f =
f o w^-1
H: Univalence A, U, V: Type w: U <~> V f: U -> A y: V
transport (funE : Type => E -> A) (path_universe w) f
y = f (w^-1 y)
H: Univalence A, U, V: Type w: U <~> V f: U -> A y: V
f (transport idmap (path_universe w)^ y) = f (w^-1 y)
H: Univalence A, U, V: Type w: U <~> V f: U -> A y: V
transport idmap (path_universe w)^ y = w^-1 y
apply transport_path_universe_V.Defined.(** Transporting along an equivalence with univalence. *)Definitionunivalent_transport (S : Type -> Type) {XY} (e : X <~> Y) (s : S X)
: S Y
:= (path_universe e) # s.(** Transporting along the identity equivalence is the identity. *)
H: Univalence S: Type -> Type X: Type
univalent_transport S 1 == idmap
H: Univalence S: Type -> Type X: Type
univalent_transport S 1 == idmap
H: Univalence S: Type -> Type X: Type s: S X
univalent_transport S 1 s = s
apply (transport2 S path_universe_1).Defined.(** ** 2-paths *)
H: Univalence A, B: Type f, g: A <~> B
f == g <~> path_universe f = path_universe g
H: Univalence A, B: Type f, g: A <~> B
f == g <~> path_universe f = path_universe g
H: Univalence A, B: Type f, g: A <~> B
f = g <~> path_universe f = path_universe g
H: Univalence A, B: Type f, g: A <~> B
f = g <~> path_universe f = path_universe g
exact (equiv_ap (equiv_path A B)^-1 _ _).Defined.Definitionpath2_universe
{AB : Type} {fg : A <~> B}
: (f == g) -> (path_universe f = path_universe g)
:= equiv_path2_universe f g.
H: Univalence A, B: Type f: A <~> B
equiv_path2_universe f f (funx : A => 1) = 1
H: Univalence A, B: Type f: A <~> B
equiv_path2_universe f f (funx : A => 1) = 1
H: Univalence A, B: Type f: A <~> B
ap (equiv_path A B)^-1
((1 @
ap
(funu : {f : A -> B & IsEquiv f} =>
{| equiv_fun := u.1; equiv_isequiv := u.2 |})
(path_sigma_hprop (f; equiv_isequiv f)
(f; equiv_isequiv f)
(path_forall f f (funx : A => 1)))) @ 1) = 1
H: Univalence A, B: Type f: A <~> B
ap (equiv_path A B)^-1
(ap
(funu : {f : A -> B & IsEquiv f} =>
{| equiv_fun := u.1; equiv_isequiv := u.2 |}) 1) =
1
reflexivity.Qed.Definitionpath2_universe_1
{AB : Type} (f : A <~> B)
: @path2_universe _ _ f f (funx => 1) = 1
:= equiv_path2_universe_1 f.(** There ought to be a lemma which says something like this:<<Definition path2_universe_postcompose {A B C : Type} {f1 f2 : A <~> B} (p : f1 == f2) (g : B <~> C): equiv_path2_universe (g o f1) (g o f2) (fun a => ap g (p a)) = path_universe_compose f1 g @ whiskerR (path2_universe p) (path_universe g) @ (path_universe_compose f2 g)^.>>and similarly<<Definition path2_universe_precompose {A B C : Type} {f1 f2 : B <~> C} (p : f1 == f2) (g : A <~> B): equiv_path2_universe (f1 o g) (f2 o g) (fun a => (p (g a))) = path_universe_compose g f1 @ whiskerL (path_universe g) (path2_universe p) @ (path_universe_compose g f2)^.>>but I haven't managed to prove them yet. Fortunately, for existing applications what we actually need is the following rather different-looking version that applies only when [f1] and [f2] are identities. *)(** Coq is too eager about unfolding [equiv_path_equiv] in the following proofs, so we tell it not to. We go into a section in order to limit the scope of the [simpl never] command. *)SectionPathEquivSimplNever.LocalArguments equiv_path_equiv : simpl never.
H: Univalence A, C: Type p: foralla : A, a = a g: A <~> C
equiv_path2_universe g g (funa : A => ap g (p a)) =
((((concat_1p (path_universe g))^ @
whiskerR path_universe_1^ (path_universe g)) @
whiskerR (equiv_path2_universe 11 p)
(path_universe g)) @
whiskerR path_universe_1 (path_universe g)) @
concat_1p (path_universe g)
H: Univalence A, C: Type p: foralla : A, a = a g: A <~> C
equiv_path2_universe g g (funa : A => ap g (p a)) =
((((concat_1p (path_universe g))^ @
whiskerR path_universe_1^ (path_universe g)) @
whiskerR (equiv_path2_universe 11 p)
(path_universe g)) @
whiskerR path_universe_1 (path_universe g)) @
concat_1p (path_universe g)
H: Univalence A, C: Type p: foralla : A, a = a g: A <~> C
equiv_path2_universe g g (funa : A => ap g (p a)) =
((eta_path_universe (path_universe g))^ @
equiv_path2_universe
(equiv_path A C (path_universe g))
(equiv_path A C (path_universe g))
(funa : A =>
ap (equiv_path A C (path_universe g)) (p a))) @
eta_path_universe (path_universe g)
H: Univalence A, C: Type p: foralla : A, a = a g: A <~> C
((eta_path_universe (path_universe g))^ @
equiv_path2_universe
(equiv_path A C (path_universe g))
(equiv_path A C (path_universe g))
(funa : A =>
ap (equiv_path A C (path_universe g)) (p a))) @
eta_path_universe (path_universe g) =
((((concat_1p (path_universe g))^ @
whiskerR path_universe_1^ (path_universe g)) @
whiskerR (equiv_path2_universe 11 p)
(path_universe g)) @
whiskerR path_universe_1 (path_universe g)) @
concat_1p (path_universe g)
H: Univalence A, C: Type p: foralla : A, a = a g: A <~> C
equiv_path2_universe g g (funa : A => ap g (p a)) =
((eta_path_universe (path_universe g))^ @
equiv_path2_universe
(equiv_path A C (path_universe g))
(equiv_path A C (path_universe g))
(funa : A =>
ap (equiv_path A C (path_universe g)) (p a))) @
eta_path_universe (path_universe g)
H: Univalence A, C: Type p: foralla : A, a = a g: A <~> C
transport
(fung' : A <~> C =>
path_universe g' = path_universe g')
(eisretr (equiv_path A C) g)
(equiv_path2_universe
(equiv_path A C ((equiv_path A C)^-1 g))
(equiv_path A C ((equiv_path A C)^-1 g))
(funa : A =>
ap (equiv_path A C ((equiv_path A C)^-1 g))
(p a))) =
((eta_path_universe (path_universe g))^ @
equiv_path2_universe
(equiv_path A C (path_universe g))
(equiv_path A C (path_universe g))
(funa : A =>
ap (equiv_path A C (path_universe g)) (p a))) @
eta_path_universe (path_universe g)
H: Univalence A, C: Type p: foralla : A, a = a g: A <~> C
((ap path_universe_uncurried
(eisretr (equiv_path A C) g))^ @
equiv_path2_universe
(equiv_path A C ((equiv_path A C)^-1 g))
(equiv_path A C ((equiv_path A C)^-1 g))
(funa : A =>
ap (equiv_path A C ((equiv_path A C)^-1 g)) (p a))) @
ap path_universe_uncurried
(eisretr (equiv_path A C) g) =
((eta_path_universe (path_universe g))^ @
equiv_path2_universe
(equiv_path A C (path_universe g))
(equiv_path A C (path_universe g))
(funa : A =>
ap (equiv_path A C (path_universe g)) (p a))) @
eta_path_universe (path_universe g)
H: Univalence A, C: Type p: foralla : A, a = a g: A <~> C
(ap path_universe_uncurried
(eisretr (equiv_path A C) g))^ @
equiv_path2_universe
(equiv_path A C ((equiv_path A C)^-1 g))
(equiv_path A C ((equiv_path A C)^-1 g))
(funa : A =>
ap (equiv_path A C ((equiv_path A C)^-1 g)) (p a)) =
(eta_path_universe (path_universe g))^ @
equiv_path2_universe
(equiv_path A C (path_universe g))
(equiv_path A C (path_universe g))
(funa : A =>
ap (equiv_path A C (path_universe g)) (p a))
H: Univalence A, C: Type p: foralla : A, a = a g: A <~> C
ap path_universe_uncurried
(eisretr (equiv_path A C) g) =
eta_path_universe (path_universe g)
H: Univalence A, C: Type p: foralla : A, a = a g: A <~> C
(ap path_universe_uncurried
(eisretr (equiv_path A C) g))^ @
equiv_path2_universe
(equiv_path A C ((equiv_path A C)^-1 g))
(equiv_path A C ((equiv_path A C)^-1 g))
(funa : A =>
ap (equiv_path A C ((equiv_path A C)^-1 g)) (p a)) =
(eta_path_universe (path_universe g))^ @
equiv_path2_universe
(equiv_path A C (path_universe g))
(equiv_path A C (path_universe g))
(funa : A =>
ap (equiv_path A C (path_universe g)) (p a))
H: Univalence A, C: Type p: foralla : A, a = a g: A <~> C
(ap path_universe_uncurried
(eisretr (equiv_path A C) g))^ =
(eta_path_universe (path_universe g))^
H: Univalence A, C: Type p: foralla : A, a = a g: A <~> C
eta_path_universe (path_universe g) =
ap path_universe_uncurried
(eisretr (equiv_path A C) g)
exact (eisadj (equiv_path A C)^-1 g).
H: Univalence A, C: Type p: foralla : A, a = a g: A <~> C
ap path_universe_uncurried
(eisretr (equiv_path A C) g) =
eta_path_universe (path_universe g)
symmetry; exact (eisadj (equiv_path A C)^-1 g).
H: Univalence A, C: Type p: foralla : A, a = a g: A <~> C
((eta_path_universe (path_universe g))^ @
equiv_path2_universe
(equiv_path A C (path_universe g))
(equiv_path A C (path_universe g))
(funa : A =>
ap (equiv_path A C (path_universe g)) (p a))) @
eta_path_universe (path_universe g) =
((((concat_1p (path_universe g))^ @
whiskerR path_universe_1^ (path_universe g)) @
whiskerR (equiv_path2_universe 11 p)
(path_universe g)) @
whiskerR path_universe_1 (path_universe g)) @
concat_1p (path_universe g)
H: Univalence A, C: Type p: foralla : A, a = a g: A <~> C
forallp0 : A = C,
((eta_path_universe p0)^ @
equiv_path2_universe (equiv_path A C p0)
(equiv_path A C p0)
(funa : A => ap (equiv_path A C p0) (p a))) @
eta_path_universe p0 =
((((concat_1p p0)^ @ whiskerR path_universe_1^ p0) @
whiskerR (equiv_path2_universe 11 p) p0) @
whiskerR path_universe_1 p0) @ concat_1p p0
H: Univalence A, C: Type p: foralla : A, a = a g: A <~> C h: A = C
((eta_path_universe h)^ @
equiv_path2_universe (equiv_path A C h)
(equiv_path A C h)
(funa : A => ap (equiv_path A C h) (p a))) @
eta_path_universe h =
((((concat_1p h)^ @ whiskerR path_universe_1^ h) @
whiskerR (equiv_path2_universe 11 p) h) @
whiskerR path_universe_1 h) @ concat_1p h
H: Univalence A: Type p: foralla : A, a = a g: A <~> A
((eta_path_universe 1)^ @
equiv_path2_universe (equiv_path A A 1)
(equiv_path A A 1)
(funa : A => ap (equiv_path A A 1) (p a))) @
eta_path_universe 1 =
((((concat_1p 1)^ @ whiskerR path_universe_1^ 1) @
whiskerR (equiv_path2_universe 11 p) 1) @
whiskerR path_universe_1 1) @ concat_1p 1
H: Univalence A: Type p: foralla : A, a = a g: A <~> A
((eta_path_universe 1)^ @
ap (equiv_path A A)^-1
(equiv_path_equiv (equiv_path A A 1)
(equiv_path A A 1)
(path_forall (transport idmap 1)
(transport idmap 1)
(funa : A => ap (transport idmap 1) (p a))))) @
eta_path_universe 1 =
(((1 @ whiskerR path_universe_1^ 1) @
whiskerR
(ap (equiv_path A A)^-1
(equiv_path_equiv 11
(path_forall idmap idmap p))) 1) @
whiskerR path_universe_1 1) @ 1
H: Univalence A: Type p: foralla : A, a = a g: A <~> A
((eta_path_universe 1)^ @
ap (equiv_path A A)^-1
(equiv_path_equiv (equiv_path A A 1)
(equiv_path A A 1)
(path_forall (transport idmap 1)
(transport idmap 1)
(funa : A => ap (transport idmap 1) (p a))))) @
eta_path_universe 1 =
(whiskerR path_universe_1^ 1 @
whiskerR
(ap (equiv_path A A)^-1
(equiv_path_equiv 11
(path_forall idmap idmap p))) 1) @
whiskerR path_universe_1 1
H: Univalence A: Type p: foralla : A, a = a g: A <~> A
((eta_path_universe 1)^ @
ap (equiv_path A A)^-1
(equiv_path_equiv (equiv_path A A 1)
(equiv_path A A 1)
(path_forall (transport idmap 1)
(transport idmap 1)
(funa : A => ap (transport idmap 1) (p a))))) @
eta_path_universe 1 =
whiskerR
(path_universe_1^ @
ap (equiv_path A A)^-1
(equiv_path_equiv 11 (path_forall idmap idmap p)))
1 @ whiskerR path_universe_1 1
H: Univalence A: Type p: foralla : A, a = a g: A <~> A
((eta_path_universe 1)^ @
ap (equiv_path A A)^-1
(equiv_path_equiv (equiv_path A A 1)
(equiv_path A A 1)
(path_forall (transport idmap 1)
(transport idmap 1)
(funa : A => ap (transport idmap 1) (p a))))) @
eta_path_universe 1 =
whiskerR
((path_universe_1^ @
ap (equiv_path A A)^-1
(equiv_path_equiv 11
(path_forall idmap idmap p))) @
path_universe_1) 1
H: Univalence A: Type p: foralla : A, a = a g: A <~> A
((eta_path_universe 1)^ @
ap (equiv_path A A)^-1
(equiv_path_equiv (equiv_path A A 1)
(equiv_path A A 1)
(path_forall (transport idmap 1)
(transport idmap 1)
(funa : A => ap (transport idmap 1) (p a))))) @
eta_path_universe 1 =
(path_universe_1^ @
ap (equiv_path A A)^-1
(equiv_path_equiv 11 (path_forall idmap idmap p))) @
path_universe_1
H: Univalence A: Type p: foralla : A, a = a g: A <~> A
H: Univalence A, B: Type p: forallb : B, b = b g: A <~> B
equiv_path2_universe g g (funa : A => p (g a)) =
((((concat_p1 (path_universe g))^ @
whiskerL (path_universe g) path_universe_1^) @
whiskerL (path_universe g)
(equiv_path2_universe 11 p)) @
whiskerL (path_universe g) path_universe_1) @
concat_p1 (path_universe g)
H: Univalence A, B: Type p: forallb : B, b = b g: A <~> B
equiv_path2_universe g g (funa : A => p (g a)) =
((((concat_p1 (path_universe g))^ @
whiskerL (path_universe g) path_universe_1^) @
whiskerL (path_universe g)
(equiv_path2_universe 11 p)) @
whiskerL (path_universe g) path_universe_1) @
concat_p1 (path_universe g)
H: Univalence A, B: Type p: forallb : B, b = b g: A <~> B
equiv_path2_universe g g (funa : A => p (g a)) =
((eta_path_universe (path_universe g))^ @
equiv_path2_universe
(equiv_path A B (path_universe g))
(equiv_path A B (path_universe g))
(funa : A =>
p (equiv_path A B (path_universe g) a))) @
eta_path_universe (path_universe g)
H: Univalence A, B: Type p: forallb : B, b = b g: A <~> B
((eta_path_universe (path_universe g))^ @
equiv_path2_universe
(equiv_path A B (path_universe g))
(equiv_path A B (path_universe g))
(funa : A =>
p (equiv_path A B (path_universe g) a))) @
eta_path_universe (path_universe g) =
((((concat_p1 (path_universe g))^ @
whiskerL (path_universe g) path_universe_1^) @
whiskerL (path_universe g)
(equiv_path2_universe 11 p)) @
whiskerL (path_universe g) path_universe_1) @
concat_p1 (path_universe g)
H: Univalence A, B: Type p: forallb : B, b = b g: A <~> B
equiv_path2_universe g g (funa : A => p (g a)) =
((eta_path_universe (path_universe g))^ @
equiv_path2_universe
(equiv_path A B (path_universe g))
(equiv_path A B (path_universe g))
(funa : A =>
p (equiv_path A B (path_universe g) a))) @
eta_path_universe (path_universe g)
H: Univalence A, B: Type p: forallb : B, b = b g: A <~> B
transport
(fung' : A <~> B =>
path_universe g' = path_universe g')
(eisretr (equiv_path A B) g)
(equiv_path2_universe
(equiv_path A B ((equiv_path A B)^-1 g))
(equiv_path A B ((equiv_path A B)^-1 g))
(funa : A =>
p (equiv_path A B ((equiv_path A B)^-1 g) a))) =
((eta_path_universe (path_universe g))^ @
equiv_path2_universe
(equiv_path A B (path_universe g))
(equiv_path A B (path_universe g))
(funa : A =>
p (equiv_path A B (path_universe g) a))) @
eta_path_universe (path_universe g)
H: Univalence A, B: Type p: forallb : B, b = b g: A <~> B
((ap path_universe_uncurried
(eisretr (equiv_path A B) g))^ @
equiv_path2_universe
(equiv_path A B ((equiv_path A B)^-1 g))
(equiv_path A B ((equiv_path A B)^-1 g))
(funa : A =>
p (equiv_path A B ((equiv_path A B)^-1 g) a))) @
ap path_universe_uncurried
(eisretr (equiv_path A B) g) =
((eta_path_universe (path_universe g))^ @
equiv_path2_universe
(equiv_path A B (path_universe g))
(equiv_path A B (path_universe g))
(funa : A =>
p (equiv_path A B (path_universe g) a))) @
eta_path_universe (path_universe g)
H: Univalence A, B: Type p: forallb : B, b = b g: A <~> B
(ap path_universe_uncurried
(eisretr (equiv_path A B) g))^ @
equiv_path2_universe
(equiv_path A B ((equiv_path A B)^-1 g))
(equiv_path A B ((equiv_path A B)^-1 g))
(funa : A =>
p (equiv_path A B ((equiv_path A B)^-1 g) a)) =
(eta_path_universe (path_universe g))^ @
equiv_path2_universe
(equiv_path A B (path_universe g))
(equiv_path A B (path_universe g))
(funa : A => p (equiv_path A B (path_universe g) a))
H: Univalence A, B: Type p: forallb : B, b = b g: A <~> B
ap path_universe_uncurried
(eisretr (equiv_path A B) g) =
eta_path_universe (path_universe g)
H: Univalence A, B: Type p: forallb : B, b = b g: A <~> B
(ap path_universe_uncurried
(eisretr (equiv_path A B) g))^ @
equiv_path2_universe
(equiv_path A B ((equiv_path A B)^-1 g))
(equiv_path A B ((equiv_path A B)^-1 g))
(funa : A =>
p (equiv_path A B ((equiv_path A B)^-1 g) a)) =
(eta_path_universe (path_universe g))^ @
equiv_path2_universe
(equiv_path A B (path_universe g))
(equiv_path A B (path_universe g))
(funa : A => p (equiv_path A B (path_universe g) a))
H: Univalence A, B: Type p: forallb : B, b = b g: A <~> B
(ap path_universe_uncurried
(eisretr (equiv_path A B) g))^ =
(eta_path_universe (path_universe g))^
H: Univalence A, B: Type p: forallb : B, b = b g: A <~> B
eta_path_universe (path_universe g) =
ap path_universe_uncurried
(eisretr (equiv_path A B) g)
exact (eisadj (equiv_path A B)^-1 g).
H: Univalence A, B: Type p: forallb : B, b = b g: A <~> B
ap path_universe_uncurried
(eisretr (equiv_path A B) g) =
eta_path_universe (path_universe g)
symmetry; exact (eisadj (equiv_path A B)^-1 g).
H: Univalence A, B: Type p: forallb : B, b = b g: A <~> B
((eta_path_universe (path_universe g))^ @
equiv_path2_universe
(equiv_path A B (path_universe g))
(equiv_path A B (path_universe g))
(funa : A =>
p (equiv_path A B (path_universe g) a))) @
eta_path_universe (path_universe g) =
((((concat_p1 (path_universe g))^ @
whiskerL (path_universe g) path_universe_1^) @
whiskerL (path_universe g)
(equiv_path2_universe 11 p)) @
whiskerL (path_universe g) path_universe_1) @
concat_p1 (path_universe g)
H: Univalence A, B: Type p: forallb : B, b = b g: A <~> B
forallp0 : A = B,
((eta_path_universe p0)^ @
equiv_path2_universe (equiv_path A B p0)
(equiv_path A B p0)
(funa : A => p (equiv_path A B p0 a))) @
eta_path_universe p0 =
((((concat_p1 p0)^ @ whiskerL p0 path_universe_1^) @
whiskerL p0 (equiv_path2_universe 11 p)) @
whiskerL p0 path_universe_1) @ concat_p1 p0
H: Univalence A, B: Type p: forallb : B, b = b g: A <~> B h: A = B
((eta_path_universe h)^ @
equiv_path2_universe (equiv_path A B h)
(equiv_path A B h)
(funa : A => p (equiv_path A B h a))) @
eta_path_universe h =
((((concat_p1 h)^ @ whiskerL h path_universe_1^) @
whiskerL h (equiv_path2_universe 11 p)) @
whiskerL h path_universe_1) @ concat_p1 h
H: Univalence A: Type p: forallb : A, b = b g: A <~> A
((eta_path_universe 1)^ @
equiv_path2_universe (equiv_path A A 1)
(equiv_path A A 1)
(funa : A => p (equiv_path A A 1 a))) @
eta_path_universe 1 =
((((concat_p1 1)^ @ whiskerL 1 path_universe_1^) @
whiskerL 1 (equiv_path2_universe 11 p)) @
whiskerL 1 path_universe_1) @ concat_p1 1
H: Univalence A: Type p: forallb : A, b = b g: A <~> A
((eta_path_universe 1)^ @
ap (equiv_path A A)^-1
(equiv_path_equiv (equiv_path A A 1)
(equiv_path A A 1)
(path_forall (transport idmap 1)
(transport idmap 1) (funa : A => p a)))) @
eta_path_universe 1 =
(((1 @ whiskerL 1 path_universe_1^) @
whiskerL 1
(ap (equiv_path A A)^-1
(equiv_path_equiv 11
(path_forall idmap idmap p)))) @
whiskerL 1 path_universe_1) @ 1
H: Univalence A: Type p: forallb : A, b = b g: A <~> A
((eta_path_universe 1)^ @
ap (equiv_path A A)^-1
(equiv_path_equiv (equiv_path A A 1)
(equiv_path A A 1)
(path_forall (transport idmap 1)
(transport idmap 1) (funa : A => p a)))) @
eta_path_universe 1 =
((1 @ whiskerL 1 path_universe_1^) @
whiskerL 1
(ap (equiv_path A A)^-1
(equiv_path_equiv 11
(path_forall idmap idmap p)))) @
whiskerL 1 path_universe_1
H: Univalence A: Type p: forallb : A, b = b g: A <~> A
((eta_path_universe 1)^ @
ap (equiv_path A A)^-1
(equiv_path_equiv (equiv_path A A 1)
(equiv_path A A 1)
(path_forall (transport idmap 1)
(transport idmap 1) (funa : A => p a)))) @
eta_path_universe 1 =
(whiskerL 1 path_universe_1^ @
whiskerL 1
(ap (equiv_path A A)^-1
(equiv_path_equiv 11
(path_forall idmap idmap p)))) @
whiskerL 1 path_universe_1
H: Univalence A: Type p: forallb : A, b = b g: A <~> A
((eta_path_universe 1)^ @
ap (equiv_path A A)^-1
(equiv_path_equiv (equiv_path A A 1)
(equiv_path A A 1)
(path_forall (transport idmap 1)
(transport idmap 1) (funa : A => p a)))) @
eta_path_universe 1 =
whiskerL 1
(path_universe_1^ @
ap (equiv_path A A)^-1
(equiv_path_equiv 11 (path_forall idmap idmap p))) @
whiskerL 1 path_universe_1
H: Univalence A: Type p: forallb : A, b = b g: A <~> A
((eta_path_universe 1)^ @
ap (equiv_path A A)^-1
(equiv_path_equiv (equiv_path A A 1)
(equiv_path A A 1)
(path_forall (transport idmap 1)
(transport idmap 1) (funa : A => p a)))) @
eta_path_universe 1 =
whiskerL 1
((path_universe_1^ @
ap (equiv_path A A)^-1
(equiv_path_equiv 11
(path_forall idmap idmap p))) @
path_universe_1)
H: Univalence A, B: Type f, g: A <~> B p, q: f == g
p == q <~> path2_universe p = path2_universe q
H: Univalence A, B: Type f, g: A <~> B p, q: f == g
p == q <~> path2_universe p = path2_universe q
H: Univalence A, B: Type f, g: A <~> B p, q: f == g
p = q <~> path2_universe p = path2_universe q
H: Univalence A, B: Type f, g: A <~> B p, q: f == g
equiv_path_arrow f g p = equiv_path_arrow f g q <~>
path2_universe p = path2_universe q
H: Univalence A, B: Type f, g: A <~> B p, q: f == g
equiv_path_equiv f g (equiv_path_arrow f g p) =
equiv_path_equiv f g (equiv_path_arrow f g q) <~>
path2_universe p = path2_universe q
H: Univalence A, B: Type f, g: A <~> B p, q: f == g
equiv_path_equiv f g (equiv_path_arrow f g p) =
equiv_path_equiv f g (equiv_path_arrow f g q) <~>
(equiv_ap (equiv_path A B)^-1 f g
oE equiv_path_equiv f g oE equiv_path_arrow f g) p =
(equiv_ap (equiv_path A B)^-1 f g
oE equiv_path_equiv f g oE equiv_path_arrow f g) q
H: Univalence A, B: Type f, g: A <~> B p, q: f == g
(1 @
ap
(funu : {f : A -> B & IsEquiv f} =>
{| equiv_fun := u.1; equiv_isequiv := u.2 |})
(path_sigma_hprop (f; equiv_isequiv f)
(g; equiv_isequiv g) (path_forall f g p))) @ 1 =
(1 @
ap
(funu : {f : A -> B & IsEquiv f} =>
{| equiv_fun := u.1; equiv_isequiv := u.2 |})
(path_sigma_hprop (f; equiv_isequiv f)
(g; equiv_isequiv g) (path_forall f g q))) @ 1 <~>
ap (equiv_path A B)^-1
((1 @
ap
(funu : {f : A -> B & IsEquiv f} =>
{| equiv_fun := u.1; equiv_isequiv := u.2 |})
(path_sigma_hprop (f; equiv_isequiv f)
(g; equiv_isequiv g) (path_forall f g p))) @
1) =
ap (equiv_path A B)^-1
((1 @
ap
(funu : {f : A -> B & IsEquiv f} =>
{| equiv_fun := u.1; equiv_isequiv := u.2 |})
(path_sigma_hprop (f; equiv_isequiv f)
(g; equiv_isequiv g) (path_forall f g q))) @
1)
exact (equiv_ap (ap (equiv_path A B)^-1) _ _).Defined.Definitionpath3_universe
{AB : Type} {fg : A <~> B} {pq : f == g}
: (p == q) -> (path2_universe p = path2_universe q)
:= equiv_path3_universe p q.
H: Univalence A, B: Type f: A <~> B z: B
(transport_path_universe f
(transport idmap (path_universe f)^ z) @
ap f (transport_path_universe_V f z)) @ eisretr f z =
transport_pV idmap (path_universe f) z
H: Univalence A, B: Type f: A <~> B z: B
(transport_path_universe f
(transport idmap (path_universe f)^ z) @
ap f (transport_path_universe_V f z)) @ eisretr f z =
transport_pV idmap (path_universe f) z
H: Univalence A, B: Type f: A <~> B z: B
(fune : A <~> B =>
(transport_path_universe e
(transport idmap (path_universe e)^ z) @
ap e (transport_path_universe_V e z)) @ eisretr e z =
transport_pV idmap (path_universe e) z) f
H: Univalence A, B: Type f: A <~> B z: B p: A = B
(transport_path_universe (equiv_path A B p)
(transport idmap
(path_universe (equiv_path A B p))^ z) @
ap (equiv_path A B p)
(transport_path_universe_V (equiv_path A B p) z)) @
eisretr (equiv_path A B p) z =
transport_pV idmap (path_universe (equiv_path A B p))
z
H: Univalence A, B: Type f: A <~> B z: B p: A = B
(transport_path_universe (equiv_path A B p)
(transport idmap
(path_universe (equiv_path A B p))^ z) @
ap (equiv_path A B p)
(transport_path_universe_V (equiv_path A B p) z)) @
eisretr (equiv_path A B p) z =
(ap
(transport idmap (path_universe (equiv_path A B p)))
(ap (funs : A = B => transport idmap s^ z)
(eissect (equiv_path A B) p)) @
ap
(funs : A = B =>
transport idmap s (transport idmap p^ z))
(eissect (equiv_path A B) p)) @
transport_pV idmap p z
H: Univalence A, B: Type f: A <~> B z: B p: A = B
transport_path_universe (equiv_path A B p)
(transport idmap (path_universe (equiv_path A B p))^
z) @
ap (equiv_path A B p)
(transport_path_universe_V (equiv_path A B p) z) =
ap
(transport idmap (path_universe (equiv_path A B p)))
(ap (funs : A = B => transport idmap s^ z)
(eissect (equiv_path A B) p)) @
ap
(funs : A = B =>
transport idmap s (transport idmap p^ z))
(eissect (equiv_path A B) p)
H: Univalence A, B: Type f: A <~> B z: B p: A = B
ap
(transport idmap (path_universe (equiv_path A B p)))
(transport_path_universe_V (equiv_path A B p) z) @
transport_path_universe (equiv_path A B p)
((equiv_path A B p)^-1 z) =
ap
(transport idmap (path_universe (equiv_path A B p)))
(ap (funs : A = B => transport idmap s^ z)
(eissect (equiv_path A B) p)) @
ap
(funs : A = B =>
transport idmap s (transport idmap p^ z))
(eissect (equiv_path A B) p)
H: Univalence A, B: Type f: A <~> B z: B p: A = B
ap
(transport idmap (path_universe (equiv_path A B p)))
(transport_path_universe_V (equiv_path A B p) z) =
ap
(transport idmap (path_universe (equiv_path A B p)))
(ap (funs : A = B => transport idmap s^ z)
(eissect (equiv_path A B) p))
H: Univalence A, B: Type f: A <~> B z: B p: A = B
transport_path_universe (equiv_path A B p)
((equiv_path A B p)^-1 z) =
ap
(funs : A = B =>
transport idmap s (transport idmap p^ z))
(eissect (equiv_path A B) p)
H: Univalence A, B: Type f: A <~> B z: B p: A = B
ap
(transport idmap (path_universe (equiv_path A B p)))
(transport_path_universe_V (equiv_path A B p) z) =
ap
(transport idmap (path_universe (equiv_path A B p)))
(ap (funs : A = B => transport idmap s^ z)
(eissect (equiv_path A B) p))
H: Univalence A, B: Type f: A <~> B z: B p: A = B
transport_path_universe_V (equiv_path A B p) z =
ap (funs : A = B => transport idmap s^ z)
(eissect (equiv_path A B) p)
H: Univalence A, B: Type f: A <~> B z: B p: A = B
ap (funs : B = A => transport idmap s z)
(inverse2 (eissect (equiv_path A B) p)) =
ap (funs : A = B => transport idmap s^ z)
(eissect (equiv_path A B) p)
H: Univalence A, B: Type f: A <~> B z: B p: A = B
ap (funs : B = A => transport idmap s z)
(ap inverse (eissect (equiv_path A B) p)) =
ap (funs : A = B => transport idmap s^ z)
(eissect (equiv_path A B) p)
symmetry; apply (ap_compose inverse (funs => transport idmap s z)).
H: Univalence A, B: Type f: A <~> B z: B p: A = B
transport_path_universe (equiv_path A B p)
((equiv_path A B p)^-1 z) =
ap
(funs : A = B =>
transport idmap s (transport idmap p^ z))
(eissect (equiv_path A B) p)
apply transport_path_universe_equiv_path.Defined.Definitiontransport_path_universe_pV
{AB : Type} (f : A -> B) {feq : IsEquiv f } (z : B)
: transport_path_universe f (transport idmap (path_universe f)^ z)
@ ap f (transport_path_universe_V f z)
@ eisretr f z
= transport_pV idmap (path_universe f) z
:= transport_path_universe_pV_uncurried (Build_Equiv A B f feq) z.(** ** Equivalence induction *)(** Paulin-Mohring style *)
H: Univalence U: Type P: forallV : Type, U <~> V -> Type
P U 1%equiv -> forall (V : Type) (w : U <~> V), P V w
H: Univalence U: Type P: forallV : Type, U <~> V -> Type
P U 1%equiv -> forall (V : Type) (w : U <~> V), P V w
H: Univalence U: Type P: forallV : Type, U <~> V -> Type H0: P U 1%equiv V: Type
forallw : U <~> V, P V w
H: Univalence U: Type P: forallV : Type, U <~> V -> Type H0: P U 1%equiv V: Type
forallx : U = V, P V (equiv_path U V x)
intro p; induction p; exact H0.Defined.Definitionequiv_induction_comp {U : Type} (P : forallV, U <~> V -> Type)
(didmap : P U (equiv_idmap U))
: equiv_induction P didmap U (equiv_idmap U) = didmap
:= (equiv_ind_comp (P U) _ 1).(** Martin-Löf style *)
H: Univalence P: forallUV : Type, U <~> V -> Type
(forallT : Type, P T T 1%equiv) ->
forall (UV : Type) (w : U <~> V), P U V w
H: Univalence P: forallUV : Type, U <~> V -> Type
(forallT : Type, P T T 1%equiv) ->
forall (UV : Type) (w : U <~> V), P U V w
H: Univalence P: forallUV : Type, U <~> V -> Type H0: forallT : Type, P T T 1%equiv U, V: Type w: U <~> V
P U V w
H: Univalence P: forallUV : Type, U <~> V -> Type H0: forallT : Type, P T T 1%equiv U, V: Type w: U <~> V
forallx : U = V, P U V (equiv_path U V x)
intro p; induction p; apply H0.Defined.Definitionequiv_induction'_comp (P : forallUV, U <~> V -> Type)
(didmap : forallT, P T T (equiv_idmap T)) (U : Type)
: equiv_induction' P didmap U U (equiv_idmap U) = didmap U
:= (equiv_ind_comp (P U U) _ 1).
H: Univalence U: Type P: forallV : Type, V <~> U -> Type
P U 1%equiv -> forall (V : Type) (w : V <~> U), P V w
H: Univalence U: Type P: forallV : Type, V <~> U -> Type
P U 1%equiv -> forall (V : Type) (w : V <~> U), P V w
H: Univalence U: Type P: forallV : Type, V <~> U -> Type H0: P U 1%equiv V: Type
forallw : V <~> U, P V w
H: Univalence U: Type P: forallV : Type, V <~> U -> Type H0: P U 1%equiv V: Type
forallx : V = U, P V (equiv_path V U x)
(* We manually apply [paths_ind_r] to reduce universe levels. *)revert V; rapply paths_ind_r; exact H0.Defined.Definitionequiv_induction_inv_comp {U : Type} (P : forallV, V <~> U -> Type)
(didmap : P U (equiv_idmap U))
: equiv_induction_inv P didmap U (equiv_idmap U) = didmap
:= (equiv_ind_comp (P U) _ 1).(** ** Based equivalence types *)
exact (equiv_induction_inv _ idpath).Defined.(** Any two functions that act like transport along an equivalence, i.e. maps of the type [T : forall X Y, X <~> Y -> S X -> S Y] with a computation rule of type [Trefl : forall X, (T (equiv_idmap X) == idmap)], are homotopic. This can be useful when we want to transport along an equivalence, but [univalent_transport] does not have the computational properties that we want. *)
H: Univalence S: Type -> Type X, Y: Type T, T': forallXY : Type, X <~> Y -> S X -> S Y Trefl: forallX : Type, T X X 1%equiv == idmap T'refl: forallX : Type, T' X X 1%equiv == idmap e: X <~> Y
T X Y e == T' X Y e
H: Univalence S: Type -> Type X, Y: Type T, T': forallXY : Type, X <~> Y -> S X -> S Y Trefl: forallX : Type, T X X 1%equiv == idmap T'refl: forallX : Type, T' X X 1%equiv == idmap e: X <~> Y
T X Y e == T' X Y e
H: Univalence S: Type -> Type X: Type T, T': forallXY : Type, X <~> Y -> S X -> S Y Trefl: forallX : Type, T X X 1%equiv == idmap T'refl: forallX : Type, T' X X 1%equiv == idmap
forall (Y : Type) (e : X <~> Y), T X Y e == T' X Y e
H: Univalence S: Type -> Type X: Type T, T': forallXY : Type, X <~> Y -> S X -> S Y Trefl: forallX : Type, T X X 1%equiv == idmap T'refl: forallX : Type, T' X X 1%equiv == idmap
T X X 1%equiv == T' X X 1%equiv
H: Univalence S: Type -> Type X: Type T, T': forallXY : Type, X <~> Y -> S X -> S Y Trefl: forallX : Type, T X X 1%equiv == idmap T'refl: forallX : Type, T' X X 1%equiv == idmap
idmap == T' X X 1%equiv
symmetry; apply T'refl.Defined.(** ** Truncations *)(** Truncatedness of the universe is a subtle question, but with univalence we can conclude things about truncations of certain of its path-spaces. *)
H: Univalence n: trunc_index A, B: Type IsTrunc0: IsTrunc n.+1 B
IsTrunc n.+1 (A = B)
H: Univalence n: trunc_index A, B: Type IsTrunc0: IsTrunc n.+1 B
IsTrunc n.+1 (A = B)
exact (istrunc_isequiv_istrunc _ path_universe_uncurried).Defined.(** We can also say easily that the universe is not a set. *)