Library UniMath.Ktheory.Utilities

Utilities concerning paths, hlevel, and logic

Null homotopies, an aid for proving things about propositional truncation


Local Open Scope transport.

Definition nullHomotopyTo {X Y} (f:XY) (y:Y) := x:X, f x = y.
Definition NullHomotopyTo {X Y} (f:XY) := total2 (nullHomotopyTo f).
Definition NullHomotopyTo_center {X Y} (f:XY) : NullHomotopyTo f Y := pr1.
Definition NullHomotopyTo_path {X Y} {f:XY} (r:NullHomotopyTo f) := pr2 r.

Definition nullHomotopyFrom {X Y} (f:XY) (y:Y) := x:X, y = f x.
Definition NullHomotopyFrom {X Y} (f:XY) := total2 (nullHomotopyFrom f).
Definition NullHomotopyFrom_center {X Y} (f:XY) : NullHomotopyFrom f Y := pr1.
Definition NullHomotopyFrom_path {X Y} {f:XY} (r:NullHomotopyFrom f) := pr2 r.

Definition nullHomotopyTo_transport {X Y} {f:XY} {y:Y} (h : nullHomotopyTo f y)
           {y':Y} (p:y = y') (x:X) : (p # h) x = h x @ p.
Proof. intros. induction p. apply pathsinv0. apply pathscomp0rid. Defined.

Lemma isaset_NullHomotopyTo {X Y} (i:isaset Y) (f:XY) : isaset (NullHomotopyTo f).
Proof. intros. apply (isofhleveltotal2 2). { apply i. }
       intros y. apply impred; intros x. apply isasetaprop. apply i. Defined.

Lemma isaprop_nullHomotopyTo {X Y} (is:isaset Y) (f:XY) (y:Y) :
  isaprop (nullHomotopyTo f y).
Proof. apply impred; intros x. apply is. Defined.

Lemma isaprop_NullHomotopyTo_0 {X} {Y} (is:isaset Y) (f:XY) :
  X isaprop (NullHomotopyTo f).
The point of X is needed, for when X is empty, then NullHomotopyTo f is equivalent to Y.
Proof. intros x. apply invproofirrelevance. intros [r i] [s j].
       apply subtypePairEquality.
       - intros n. apply (isaprop_nullHomotopyTo is).
       - exact (!i x @ j x).
Defined.

Variants on paths and coconus


Definition paths_from {X} (x:X) := coconusfromt X x.
Definition point_to {X} {x:X} : paths_from x X := coconusfromtpr1 _ _.
Definition paths_from_path {X} {x:X} (w:paths_from x) := pr2 w.
Definition paths' {X} (x:X) := λ y, y = x.
Definition idpath' {X} (x:X) := idpath x : paths' x x.
Definition paths_to {X} (x:X) := coconustot X x.
Definition point_from {X} {x:X} : paths_to x X := coconustotpr1 _ _.
Definition paths_to_path {X} {x:X} (w:paths_to x) := pr2 w.

Lemma iscontr_paths_to {X} (x:X) : iscontr (paths_to x).
Proof. apply iscontrcoconustot. Defined.
Lemma iscontr_paths_from {X} (x:X) : iscontr (paths_from x).
Proof. apply iscontrcoconusfromt. Defined.
Definition paths_to_prop {X} (x:X) :=
  hProppair (paths_to x) (isapropifcontr (iscontr_paths_to x)).
Definition paths_from_prop {X} (x:X) :=
  hProppair (paths_from x) (isapropifcontr (iscontr_paths_from x)).

Squashing


Notation squash_fun := hinhfun (only parsing).
Notation squash_fun2 := hinhfun2 (only parsing).
Notation squash_element := hinhpr (only parsing).

Lemma squash_path {X} (x y:X) : squash_element x = squash_element y.
Proof. intros. apply propproperty. Defined.

Lemma isaprop_NullHomotopyTo {X} {Y} (is:isaset Y) (f:XY) :
   X isaprop (NullHomotopyTo f).
Proof. apply factor_through_squash.
       apply isapropisaprop.
       apply isaprop_NullHomotopyTo_0. exact is. Defined.

We can get a map from '∥ X ∥' to any type 'Y' provided paths are given that allow us to map first into a cone in 'Y'.

Definition cone_squash_map {X Y} (f:XY) (y:Y) :
  nullHomotopyTo f y X Y.
Proof. intros e h.
       exact (point_from (h (paths_to_prop y) (λ x, f x,,e x))). Defined.

Goal X Y (y:Y) (f:XY) (e: m:X, f m = y),
       f = funcomp squash_element (cone_squash_map f y e).
Proof. reflexivity. Qed.

Factoring maps through squash


Lemma squash_uniqueness {X} (x:X) (h: X ) : squash_element x = h.
Proof. intros. apply propproperty. Qed.

Goal X Q (i:isaprop Q) (f:X Q) (x:X),
   factor_through_squash i f (squash_element x) = f x.
Proof. reflexivity. Defined.

Lemma factor_dep_through_squash {X} {Q: X UU} :
  ( h, isaprop (Q h))
  ( x, Q(squash_element x))
  ( h, Q h).
Proof.
  intros i f ?. apply (h (hProppair (Q h) (i h))).
  intro x. simpl. induction (squash_uniqueness x h). exact (f x).
Defined.

Lemma factor_through_squash_hProp {X} : hQ:hProp, (X hQ) X hQ.
Proof. intros [Q i] f h. refine (h _ _). assumption. Defined.

Lemma funspace_isaset {X Y} : isaset Y isaset (X Y).
Proof. intros is. apply (impredfun 2). assumption. Defined.

Lemma squash_map_uniqueness {X S} (ip : isaset S) (g g' : X S) :
  g squash_element ¬ g' squash_element g ¬ g'.
Proof.
  intros h.
  set ( Q := λ y, g y = g' y ).
  unfold homot.
  apply (@factor_dep_through_squash X). intros y. apply ip.
  intro x. apply h.
Qed.

Lemma squash_map_epi {X S} (ip : isaset S) (g g' : X S) :
  g squash_element = g' squash_element g = g'.
Proof.
  intros e.
  apply funextsec.
  apply squash_map_uniqueness. exact ip.
  intro x. induction e. apply idpath.
Qed.

Notation ap := maponpaths.
Definition funcomp' { X Y Z : UU } ( g : Y Z ) ( f : X Y ) := λ x : X, g ( f x ) .
Local Open Scope transport.

Goal X (i:isaprop X) (x x':X), x = x'.
Proof. apply proofirrelevance. Defined.

Goal X (i:iscontr X) (x x':X), x = x'.
Proof. intros. apply proofirrelevancecontr. assumption. Defined.


Definition an_inclusion_is_injective {X Y} (f:XY) (inj:isincl f) x x': f x = f x' x = x'.
Proof. exact (invmaponpathsincl _ inj _ _). Defined.

Definition confun T {Y} (y:Y) := λ _:T, y.
Definition path_type {X} {x x':X} (p:x = x') := X.
Definition path_start {X} {x x':X} (p:x = x') := x.
Definition path_end {X} {x x':X} (p:x = x') := x'.

Definition thePoint {T} : iscontr T T.
Proof. intros is. exact (pr1 is). Defined.

Definition uniqueness {T} (i:iscontr T) (t:T) : t = thePoint i.
Proof. intros. exact (pr2 i t). Defined.

Definition uniqueness' {T} (i:iscontr T) (t:T) : thePoint i = t.
Proof. intros. exact (! (pr2 i t)). Defined.

Definition path_inverse_to_right {X} {x y:X} (p q:x = y) : p = q !q@p = idpath _.
Proof. intros e. induction e. induction p. reflexivity. Defined.

Definition path_inverse_to_right' {X} {x y:X} (p q:x = y) : p = q p@!q = idpath _.
Proof. intros e. induction e. induction p. reflexivity. Defined.

Definition cast {T U:Type} : T = U T U.
Proof. intros p t. induction p. exact t. Defined.

Definition app {X} {P:XType} {x x':X} {e e':x = x'} (q:e = e') (p:P x) :
   e#p = e'#p.
Proof. intros. induction q. reflexivity. Defined.

Paths


Definition pathsinv0_to_right {X} {x y z:X} (p:y = x) (q:y = z) (r:x = z) :
  q = p @ r !p @ q = r.
Proof. intros e. induction p, q. exact e. Defined.

Definition pathsinv0_to_right' {X} {x y:X} (p:y = x) (r:x = y) :
  idpath _ = p @ r !p = r.
Proof. intros e. induction p. exact e. Defined.

Definition pathsinv0_to_right'' {X} {x:X} (p:x = x) :
  idpath _ = p !p = idpath _.
Proof. intros e. apply pathsinv0_to_right'. rewrite pathscomp0rid.
       exact e. Defined.

Definition loop_power_nat {Y} {y:Y} (l:y = y) (n:nat) : y = y.
Proof. intros. induction n as [|n p].
       { exact (idpath _). } { exact (p@l). } Defined.

Definition pathscomp0_linj {X} {x y z:X} {p:x = y} {q q':y = z} (r:p@q = p@q') : q = q'.
Proof. intros. induction p. exact r. Defined.

Definition pathscomp0_rinj {X} {x y z:X} {p p':x = y} {q:y = z} (r:p@q = p'@q) : p = p'.
Proof. intros. induction q. exact (! pathscomp0rid p @ r @ pathscomp0rid p').
Defined.

Lemma irrel_paths {X} (irr: x y:X, x = y) {x y:X} (p q:x = y) : p = q.
Proof. intros.
       assert (k : z:X, r:x = z, r @ irr z z = irr x z).
       { intros. induction r. reflexivity. }
       exact (pathscomp0_rinj (k y p @ !k y q)). Defined.

Definition path_inv_rotate_2 {X} {a b c d:X} (p:a = b) (p':c = d) (q:a = c) (q':b = d) :
  q @ p' = p @ q' p' @ ! q' = !q @ p.
Proof. induction q,q'. simpl.
       repeat rewrite pathscomp0rid. apply idfun. Defined.

Definition maponpaths_naturality {X Y : UU} {f : X Y}
           {x x' x'' : X} {p : x = x'} {q : x' = x''}
           {p': f x = f x'} {q': f x' = f x''}
           (r : maponpaths f p = p') (s : maponpaths f q = q') :
  maponpaths f (p @ q) = p' @ q'.
Proof.
  intros. induction r, s. apply maponpathscomp0.
Defined.

Definition maponpaths_naturality' {X Y : UU} {f : X Y}
           {x x' x'' : X} {p : x' = x} {q : x' = x''}
           {p' : f x' = f x} {q' : f x' = f x''}
           (r : maponpaths f p = p') (s : maponpaths f q = q') :
  maponpaths f (!p @ q) = (!p') @ q'.
Proof.
  intros. induction r, s, p, q. reflexivity.
Defined.

Pairs


Definition pr2_of_hfiberpair {X Y} {f:XY} {x:X} {y:Y} {e:f x = y} :
  pr2 (hfiberpair f x e) = e.
Proof. reflexivity. Defined.

Definition pr2_of_pair {X} {P:XType} (x:X) (p:P x) : pr2 (tpair P x p) = p.
Proof. reflexivity. Defined.

Definition pr2_of_weqpair {X Y} (f:XY) (i:isweq f) : pr2 (weqpair f i) = i.
Proof. reflexivity. Defined.

Paths between pairs


Definition pair_path_props {X} {P:XType} {x y:X} {p:P x} {q:P y} :
  x = y ( z, isaprop (P z)) x,,p = y,,q.
Proof. intros e is. now apply subtypePairEquality. Abort.

Definition pair_path2 {A} {B:AUU} {a a1 a2} {b1:B a1} {b2:B a2}
           (p:a1 = a) (q:a2 = a) (e:p#b1 = q#b2) : a1,,b1 = a2,,b2.
Proof. intros. induction p,q; compute in e. induction e. reflexivity. Defined.

Lemma simple_pair_path {X Y} {x x':X} {y y':Y} (p : x = x') (q : y = y') :
  x,,y = x',,y'.
Proof. intros. induction p. induction q. apply idpath. Defined.

Projections from pair types


Definition pair_path_in2_comp1 {X} (P:XType) {x:X} {p q:P x} (e:p = q) :
  ap pr1 (maponpaths (tpair P _) e) = idpath x.
Proof. intros. induction e. reflexivity. Defined.

Definition total2_paths2_comp1 {X} {Y:XType} {x} {y:Y x} {x'} {y':Y x'}
           (p:x = x') (q:p#y = y') : ap pr1 (two_arg_paths_f (f := tpair Y) p q) = p.
Proof. intros. induction p. induction q. reflexivity. Defined.

Definition total2_paths2_comp2 {X} {Y:XType} {x} {y:Y x} {x'} {y':Y x'}
           (p:x = x') (q:p#y = y') :
  ! app (total2_paths2_comp1 p q) y @ fiber_paths (two_arg_paths_f p q) = q.
Proof. intros. induction p, q. reflexivity. Defined.

Maps from pair types


Definition from_total2 {X} {P:XType} {Y} : ( x, P xY) total2 P Y.
Proof. intros f [x p]. exact (f x p). Defined.

Sections and functions


Notation homotsec := homot.

Definition evalat {T} {P:TUU} (t:T) (f: t:T, P t) := f t.

Definition apfun {X Y} {f f':XY} (p:f = f') {x x'} (q:x = x') : f x = f' x'.
  intros. induction q. exact (eqtohomot p x). Defined.

Definition aptwice {X Y Z} (f:XYZ) {a a' b b'} (p:a = a') (q:b = b') : f a b = f a' b'.
  intros. exact (apfun (ap f p) q). Defined.

Definition fromemptysec { X : empty UU } (nothing:empty) : X nothing.
Proof. induction nothing. Defined.

Definition maponpaths_idpath {X Y} {f:XY} {x:X} : ap f (idpath x) = idpath (f x).
Proof. intros. reflexivity. Defined.

Transport


Definition transport_type_path {X Y:Type} (p:X = Y) (x:X) :
  transportf (λ T:Type, T) p x = cast p x.
Proof. intros. induction p. reflexivity. Defined.

Definition transport_fun_path {X Y} {f g:XY} {x x':X} {p:x = x'} {e:f x = g x} {e':f x' = g x'} :
  e @ ap g p = ap f p @ e'
  transportf (λ x, f x = g x) p e = e'.
Proof. intros k. induction p. rewrite maponpaths_idpath in k. rewrite maponpaths_idpath in k.
       rewrite pathscomp0rid in k. exact k. Defined.

Definition transportf_pathsinv0' {X} (P:XUU) {x y:X} (p:x = y) (u:P x) (v:P y) :
  p # u = v !p # v = u.
Proof. intros e. induction p, e. reflexivity. Defined.

Lemma transport_idfun {X} (P:XUU) {x y:X} (p:x = y) (u:P x) :
  transportf P p u = transportf (idfun UU) (ap P p) u.
Proof. intros. induction p. reflexivity. Defined.

Lemma transport_functions {X} {Y:XType} {Z: x (y:Y x), Type}
      {f f': x : X, Y x} (p:f = f') (z: x, Z x (f x)) x :
    transportf (λ f, x, Z x (f x)) p z x =
    transportf (Z x) (toforallpaths _ _ _ p x) (z x).
Proof. intros. induction p. reflexivity. Defined.

Definition transport_funapp {T} {X Y:TType}
           (f: t, X t Y t) (x: t, X t)
           {t t':T} (p:t = t') :
  transportf _ p ((f t)(x t))
  = (transportf (λ t, X t Y t) p (f t)) (transportf _ p (x t)).
Proof. intros. induction p. reflexivity. Defined.

Definition helper_A {T} {Y} (P:TYType) {y y':Y} (k: t, P t y) (e:y = y') t :
  transportf (λ y, P t y) e (k t)
  =
  (transportf (λ y, t, P t y) e k) t.
Proof. intros. induction e. reflexivity. Defined.

Definition helper_B {T} {Y} (f:TY) {y y':Y} (k: t, y = f t) (e:y = y') t :
  transportf (λ y, y = f t) e (k t)
  =
  (transportf (λ y, t, y = f t) e k) t.
Proof. intros. exact (helper_A _ k e t). Defined.

Definition transport_invweq {T} {X Y:TType} (f: t, (X t) (Y t))
           {t t':T} (p:t = t') :
  transportf (λ t, (Y t) (X t)) p (invweq (f t))
  =
  invweq (transportf (λ t, (X t) (Y t)) p (f t)).
Proof. intros. induction p. reflexivity. Defined.

Definition transport_invmap {T} {X Y:TType} (f: t, (X t) (Y t))
           {t t':T} (p:t=t') :
  transportf (λ t, Y t X t) p (invmap (f t))
  =
  invmap (transportf (λ t, (X t) (Y t)) p (f t)).
Proof. intros. induction p. reflexivity. Defined.

Double transport


  Definition transportf2 {X} {Y:XType} (Z: x, Y xType)
             {x x'} (p:x = x')
             (y:Y x) (z:Z x y) : Z x' (p#y).
  Proof. intros. induction p. exact z. Defined.

  Definition transportb2 {X} {Y:XType} (Z: x, Y xType)
             {x x'} (p:x=x')
             (y':Y x') (z':Z x' y') : Z x (p#'y').
  Proof. intros. induction p. exact z'. Defined.

  Definition maponpaths_pr1_pr2 {X} {P:XUU} {Q: x, P xType}
             {w w': x p, Q x p}
             (p : w = w') :
    transportf P (ap pr1 p) (pr1 (pr2 w)) = pr1 (pr2 w').
  Proof. intros. induction p. reflexivity. Defined.

Transport a pair


  Definition transportf_pair X (Y:XType) (Z: x, Y xType)
             x x' (p:x = x') (y:Y x) (z:Z x y) :
    transportf (λ x, total2 (Z x)) p (tpair (Z x) y z)
    =
    tpair (Z x') (transportf Y p y) (transportf2 _ p y z).
  Proof. intros. induction p. reflexivity. Defined.

  Definition transportb_pair X (Y:XType) (Z: x, Y xType)
             x x' (p:x = x')
             (y':Y x') (z':Z x' y')
             (z'' : (Z x' y')) :
    transportb (λ x, total2 (Z x)) p (tpair (Z x') y' z')
    =
    tpair (Z x) (transportb Y p y') (transportb2 _ p y' z').
  Proof. intros. induction p. reflexivity. Defined.

h-levels and paths


Lemma isaprop_wma_inhab X : (X isaprop X) isaprop X.
Proof. intros f. apply invproofirrelevance. intros x y. apply (f x). Qed.

Lemma isaprop_wma_inhab' X : (X iscontr X) isaprop X.
Proof. intros f. apply isaprop_wma_inhab. intro x. apply isapropifcontr.
       apply (f x). Qed.

Goal (X:hSet) (x y:X) (p q:x = y), p = q.
Proof. intros. apply setproperty. Defined.

Goal (X:Type) (x y:X) (p q:x = y), isaset X p = q.
Proof. intros × is. apply is. Defined.

Definition funset X (Y:hSet) : hSet
  := hSetpair (XY) (impredfun 2 _ _ (setproperty Y)).

Connected types


Definition isconnected X := (x y:X), nonempty (x = y).

Lemma base_connected {X} (t:X) : ( y:X, nonempty (t = y)) isconnected X.
Proof. intros p x y. assert (a := p x). assert (b := p y). clear p.
       apply (squash_to_prop a). apply propproperty. clear a. intros a.
       apply (squash_to_prop b). apply propproperty. clear b. intros b.
       apply hinhpr. exact (!a@b). Defined.

Applications of univalence

Compare the following two definitions with transport_type_path.

Require Import UniMath.Foundations.UnivalenceAxiom.

Definition pr1_eqweqmap { X Y } ( e: X = Y ) : cast e = pr1 (eqweqmap e).
Proof. intros. induction e. reflexivity. Defined.

Definition pr1_eqweqmap2 { X Y } ( e: X = Y ) :
  pr1 (eqweqmap e) = transportf (λ T:Type, T) e.
Proof. intros. induction e. reflexivity. Defined.

Definition weqonsec {X Y} (P:XType) (Q:YType)
           (f:X Y) (g: x, weq (P x) (Q (f x))) :
  ( x:X, P x) ( y:Y, Q y).
Proof. intros.
       exact (weqcomp (weqonsecfibers P (λ x, Q(f x)) g)
                      (invweq (weqonsecbase Q f))). Defined.

Definition weq_transportf {X} (P:XType) {x y:X} (p:x = y) : (P x) (P y).
Proof. intros. induction p. apply idweq. Defined.

Definition weq_transportf_comp {X} (P:XType) {x y:X} (p:x = y) (f: x, P x) :
  weq_transportf P p (f x) = f y.
Proof. intros. induction p. reflexivity. Defined.

Definition weqonpaths2 {X Y} (w:X Y) {x x':X} {y y':Y} :
  w x = y w x' = y' (x = x') (y = y').
Proof. intros p q. induction p,q. apply weqonpaths. Defined.

Definition eqweqmap_ap {T} (P:TType) {t t':T} (e:t = t') (f: t:T, P t) :
  eqweqmap (ap P e) (f t) = f t'. Proof. intros. induction e. reflexivity. Defined.

Definition eqweqmap_ap' {T} (P:TType) {t t':T} (e:t = t') (f: t:T, P t) :
  invmap (eqweqmap (ap P e)) (f t') = f t. Proof. intros. induction e. reflexivity. Defined.

Definition weqpath_transport {X Y} (w : X Y) :
  transportf (idfun UU) (weqtopaths w) = pr1 w.
Proof. intros. exact (!pr1_eqweqmap2 _ @ ap pr1 (weqpathsweq w)). Defined.

Definition weqpath_cast {X Y} (w : X Y) : cast (weqtopaths w) = w.
Proof. intros. exact (pr1_eqweqmap _ @ ap pr1 (weqpathsweq w)). Defined.

Definition switch_weq {X Y} (f:X Y) {x y} : y = f x invweq f y = x.
Proof. intros p. exact (ap (invweq f) p @ homotinvweqweq f x). Defined.

Definition switch_weq' {X Y} (f:X Y) {x y} : invweq f y = x y = f x.
Proof. intros p. exact (! homotweqinvweq f y @ ap f p). Defined.

Definition weqbandfrel {X Y T}
           (e:YT) (t:T) (f : X Y)
           (P:X Type) (Q: Y Type)
           (g: x:X, weq (P x) (Q (f x))) :
  weq (hfiber (λ xp:total2 P, e(f(pr1 xp))) t)
      (hfiber (λ yq:total2 Q, e( pr1 yq )) t).
Proof. intros. refine (weqbandf (weqbandf f _ _ g) _ _ _).
       intros [x p]. simpl. apply idweq. Defined.

Definition weq_over_sections {S T} (w:S T)
           {s0:S} {t0:T} (k:w s0 = t0)
           {P:TType}
           (p0:P t0) (pw0:P(w s0)) (l:k#pw0 = p0)
           (H:( t, P t) UU)
           (J:( s, P(w s)) UU)
           (g: f:( t, P t), weq (H f) (J (maponsec1 P w f))) :
  weq (hfiber (λ fh:total2 H, pr1 fh t0) p0 )
      (hfiber (λ fh:total2 J, pr1 fh s0) pw0).
Proof. intros. simple refine (weqbandf _ _ _ _).
       { simple refine (weqbandf _ _ _ _).
         { exact (weqonsecbase P w). }
         { unfold weqonsecbase; simpl. exact g. } }
       { intros [f h]. simpl. unfold maponsec1; simpl.
         induction k, l; simpl. unfold transportf; simpl.
         unfold idfun; simpl. apply idweq. } Defined.

Definition weq_total2_prod {X Y} (Z:YType) : ( y, X × Z y) (X × y, Z y).
Proof.        intros. simple refine (weqpair _ (isweq_iso _ _ _ _)).
       { intros [y [x z]]. exact (x,,y,,z). }
       { intros [x [y z]]. exact (y,,x,,z). }
       { intros [y [x z]]. reflexivity. }
       { intros [x [y z]]. reflexivity. } Defined.

Definition totalAssociativity {X:UU} {Y: (x:X), UU} (Z: (x:X) (y:Y x), UU) : ( (x:X) (y:Y x), Z x y) ( (p: (x:X), Y x), Z (pr1 p) (pr2 p)).
Proof.   intros. simple refine (_,,isweq_iso _ _ _ _).
  { intros [x [y z]]. exact ((x,,y),,z). }
  { intros [[x y] z]. exact (x,,(y,,z)). }
  { intros [x [y z]]. reflexivity. }
  { intros [[x y] z]. reflexivity. } Defined.

Pointed types


Definition PointedType := X, X.

Definition pointedType X x := X,,x : PointedType.

Definition underlyingType (X:PointedType) := pr1 X.

Coercion underlyingType : PointedType >-> UU.

Definition basepoint (X:PointedType) := pr2 X.

Definition loopSpace (X:PointedType) :=
  pointedType (basepoint X = basepoint X) (idpath _).

Definition underlyingLoop {X:PointedType} (l:loopSpace X) : basepoint X = basepoint X.
Proof. intros. exact l. Defined.

Definition Ω := loopSpace.

Direct products with several factors


Definition paths3 {X Y Z} {x x':X} {y y':Y} {z z':Z} :
  x = x' y = y' z = z' @paths (_×_×_) (x,,y,,z) (x',,y',,z').
Proof. intros p q r. induction p, q, r. reflexivity.
Defined.

Definition paths4 {W X Y Z} {w w':W} {x x':X} {y y':Y} {z z':Z} :
  w = w' x = x' y = y' z = z' @paths (_×_×_×_) (w,,x,,y,,z) (w',,x',,y',,z').
Proof. intros o p q r. induction o, p, q, r. reflexivity.
Defined.