$$\def\mapright#1{\xrightarrow{{#1}}} \def\mapleft#1{\xleftarrow{{#1}}} \def\mapup#1{\Big\uparrow\rlap{\raise2pt{\scriptstyle{#1}}}} \def\mapupl#1{\Big\uparrow\llap{\raise2pt{\scriptstyle{#1}}}} \def\mapdown#1{\Big\downarrow\rlap{\raise2pt{\scriptstyle{#1}}}} \def\mapdownl#1{\Big\downarrow\llap{\raise2pt{\scriptstyle{#1}}}} \def\mapdiagl#1{\vcenter{\searrow}\rlap{\raise2pt{\scriptstyle{#1}}}} \def\mapdiagr#1{\vcenter{\swarrow}\rlap{\raise2pt{\scriptstyle{#1}}}} $$

Path package contains basic theorems about general homotopy path types. In the core cubical has heterogeneous PathP type,

HeteroPath (A B: U) (a: A) (b: B) (P: Path U A B) : U = PathP P a b

so you can easily define homogeneous Path:

Path (A: U) (a b: A) : U = PathP (<i> A) a b

The Path identity type defines a Path space with elements and values. Elements of that space are functions from interval $[0,1]$ to a values of that path space. This ctt file reflects CCHM2 cubicaltt model with connections. For ABCFHL4 yacctt model with variables please refer to ytt file. You may also want to read BCH1, AFH5. There is a PO3 paper about CCHM axiomatic in a topos.

1 — Bezem, Coquand, Huber (2014)
2 — Cohen, Coquand, Huber, MoĢˆrtberg (2015)
3 — Pitts, Orton (2016)
4 — Angiuli, Brunerie, Coquand, Favonia, Harper, Licata (2017)
5 — Angiuli, Favonia, Harper (2018)



refl (A: U) (a: A) : Path A a a

Returns a reflexivity path space for a given value of the type. The inhabitant of that path space is the lambda on the homotopy interval $[0,1]$ that returns a constant value a. Written in syntax as <i> a.


app1 (A: U) (a b: A) (p: Path A a b): A = p @ 0 app2 (A: U) (a b: A) (p: Path A a b): A = p @ 1


Connections allows you to build square with given only one element of path: i) $\\(i,j:I) \rightarrow p\ @\ min(i,j)$; ii) $\\(i,j:I)\rightarrow p\ @\ max(i,j)$.

$$ \begin{array}{ccc} b & \mapright{\\(i:I) \rightarrow b} & b \\ \mapupl{p} & & \mapup{\\(i:I)\rightarrow b} \\ a & \mapright{p} & b \\ \end{array} $$ $$ \begin{array}{ccc} a & \mapright{p} & b \\ \mapupl{\\(i:I)\rightarrow a} & & \mapup{p} \\ a & \mapright{\\(i:I)\rightarrow a} & a \\ \end{array} $$
connection1 (A: U) (a b: A) (p: Path A a b) : PathP (<x> Path A ([email protected]) b) p (<i> b) = <y x> p @ (x \/ y) connection2 (A: U) (a b: A) (p: Path A a b) : PathP (<x> Path A a ([email protected])) (<i> a) p = <x y> p @ (x /\ y)



ap (A B: U) (f: A -> B) (a b: A) (p: Path A a b) : Path B (f a) (f b) apd (A: U) (a x:A) (B:A->U) (f: A->B a) (b: B a) (p: Path A a x) : Path (B a) (f a) (f x)

Maps a given path space between values of one type to path space of another type by an encode function between types. Implemented as lambda defined on $[0,1]$ that returns application of encode function to path application of the given path to lamda argument <i> f (p @ i) for both cases.


trans (A B: U) (p: Path U A B) (a: A) : B

Transports a value of the left type to the value of the right type by a given path element of the path space between left and right type. Defined as path composition with $[]$ of a over a path p comp p a [].


subst (A: U) (P: A -> U) (a b: A) (p: Path A a b) (u: P a) : P b

Acts like transport of mapOnPath value, representing the dependent function transport or substitution.


$$ \begin{array}{ccc} a & \mapright{comp} & c \\ \mapupl{\\(i:I) \rightarrow a} & & \mapup{q} \\ a & \mapright{p\ @\ i} & b \\ \end{array} $$
composition (A: U) (a b c: A) (p: Path A a b) (q: Path A b c): Path A a c

Composition operation allows to build a new path by given to paths in a connected point. The proofterm is comp (<i>Path A a (q @ i)) p [].

Contractability of Singleton

singl (A: U) (a: A) : U = (x: A) * Path A a x contrSingl (A: U) (a b: A) (p: Path A a b) : Path (singl A a) (a,refl A a) (b,p)

Proof that singleton is contractible space. Implemented as <i> (p @ i, p @ i/\j).


J by Paulin-Mohring

J (A: U) (a b: A) (P: singl A a -> U) (u: P (a,refl A a)) (p: Path A a b) : P (b,p)

J is formulated in a form of Paulin-Mohring and implemented using two facts that singleton are contractible and dependent function transport.

Dependent Eliminator (HoTT)

J (A: U) (a: A) (C: (x: A) -> Path A a x -> U) (d: C a (refl A a)) (x: A) (p: Path A a x) : C x p

J from HoTT book.

Diagonal Version

D (A: U) : U = (x y: A) -> Path A x y -> U J (A: U) (x: A) (C: D A) (d: C x x (refl A x)) (y: A) (p: Path A x y) : C x y p


Beta Equality

trans_comp (A: U) (a: A) : Path A a (trans A A (<_> A) a) subst_comp (A: U) (P: A -> U) (a: A) (e: P a) : Path (P a) e (subst A P a a (refl A a) e) J_comp (A: U) (a: A) (C: (x: A) -> Path A a x -> U) (d: C a (refl A a)) : Path (C a (refl A a)) d (J A a C d a (refl A a))

Note that in HoTT there is no Eta rule, otherwise Path between element would requested to be unique applying UIP at any Path level which is prohibited. UIP in HoTT is defined only as instance of n-groupoid, the PROP type.

Function Extensionality


funext (A B: U) (f g: A -> B) (p: (x:A) -> Path B (f x) (g x)) : Path (A -> B) f g


happly (A B: U) (f g: A -> B) (p: Path (A -> B) f g) (x: A) : Path B (f x) (g x)


funext_Beta (A B: U) (f g: A -> B) (p: (x:A) -> Path B (f x) (g x)) : (x:A) -> Path B (f x) (g x)


funext_Eta (A B: U) (f g: A -> B) (p: Path (A -> B) f g) : Path (Path (A -> B) f g) (funext A B f g (happly A B f g p)) p

Dependent Version

piext (A: U) (B: A -> U) (f g: (x: A) -> B x) (p: (x: A) -> Path (B x) (f x) (g x)) : Path ((y: A) -> B y) f g