\func idpe {A : \Type} (a : A) : a = a => idp
\func pmap {A B : \Type} (f : A -> B) {a a' : A} (p : a = a') : f a = f a' => path (\lam i => f (p @ i))
\func pmap2 {A B C : \Type} (f : A -> B -> C) {a a' : A} (p : a = a') {b b' : B} (q : b = b') : f a b = f a' b'
=> path (\lam i => f (p @ i) (q @ i))
\func transport {A : \Type} (B : A -> \Type) {a a' : A} (p : a = a') (b : B a) : B a'
=> coe (\lam i => B (p @ i)) b right
\func transportInv {A : \Type} (B : A -> \Type) {a a' : A} (p : a = a') (b : B a') : B a \elim p
| idp => b
\func transport2 {A B : \Type} (C : A -> B -> \Type) {a a' : A} {b b' : B} (p : a = a') (q : b = b') (c : C a b) : C a' b' \elim p, q
| idp, idp => c
\func inv {A : \Type} {a a' : A} (p : a = a') : a' = a \elim p
| idp => idp
\func \infixr 9 *> {A : \Type} {a a' a'' : A} (p : a = a') (q : a' = a'') : a = a'' \elim q
| idp => p
\where
\func concat {A : I -> \Type} {a : A left} {a' a'' : A right} (p : Path A a a') (q : a' = a'') : Path A a a'' \elim q
| idp => p
\func \infixr 9 <* {A : \Type} {a a' a'' : A} (p : a = a') (q : a' = a'') : a = a'' \elim p
| idp => q
\where
\func concat {A : I -> \Type} {a a' : A left} {a'' : A right} (p : a = a') (q : Path A a' a'') : Path A a a'' \elim p
| idp => q
\func psqueeze {A : \Type} {a a' : A} (p : a = a') (i : I) : a = p @ i => path (p @ I.squeeze i __)
\func Jl {A : \Type} {a : A} (B : \Pi (a' : A) -> a = a' -> \Type) (b : B a idp) {a' : A} (p : a = a') : B a' p \elim p
| idp => b
\where {
\func Jr {A : \Type} {a' : A} (B : \Pi (a : A) -> a = a' -> \Type) (b : B a' idp) {a : A} (p : a = a') : B a p \elim p
| idp => b
-- | J can be defined in terms of coe
\func def {A : \Type} {a : A} (B : \Pi (a' : A) -> a = a' -> \Type) (b : B a idp) {a' : A} (p : a = a') : B a' p =>
coe (\lam i => B (p @ i) (psqueeze p i)) b right
}
\func pmap_*>-comm {A B : \Type} (f : A -> B) {a a' a'' : A} (p : a = a') (q : a' = a'')
: pmap f (p *> q) = pmap f p *> pmap f q \elim q
| idp => idp
\func pmap_<*-comm {A B : \Type} (f : A -> B) {a a' a'' : A} (p : a = a') (q : a' = a'')
: pmap f (p <* q) = pmap f p <* pmap f q \elim p
| idp => idp
\func pmap2_*>-comm {A B C : \Type} (f : A -> B -> C) {a a' a'' : A} (p : a = a') (q : a' = a'') {b b' b'' : B} (s : b = b') (t : b' = b'')
: pmap2 f (p *> q) (s *> t) = pmap2 f p s *> pmap2 f q t \elim q, t
| idp, idp => idp
\func inv_inv {A : \Type} {a a' : A} (p : a = a') : inv (inv p) = p
| idp => idp
\func inv_*> {A : \Type} {a a' : A} (p : a = a') : inv p *> p = idp
| idp => idp
\func *>_inv {A : \Type} {a a' : A} (p : a = a') : p *> inv p = idp
| idp => idp
\func idp_*> {A : \Type} {a a' : A} (p : a = a') : idp *> p = p
| idp => idp
\where
\func idp_concat {A : \Type} {a a' : A} (p : a = a') : *>.concat idp p = p \elim p
| idp => idp
\func <*_idp {A : \Type} {a a' : A} (p : a = a') : p <* idp = p
| idp => idp
\func <*_*> {A : \Type} {a a' a'' : A} (p : a = a') (q : a' = a'') : p <* q = p *> q
| idp, idp => idp
\func *>_inv-comm {A : \Type} {a a' a'' : A} (p : a = a') (q : a' = a'') : inv (p *> q) = inv q *> inv p
| idp, idp => idp
\func pmap_inv-comm {A B : \Type} {a a' : A} (f : A -> B) (p : a = a') : pmap f (inv p) = inv (pmap f p) \elim p
| idp => idp
\func *>-assoc {A : \Type} {a1 a2 a3 a4 : A} (p : a1 = a2) (q : a2 = a3) (r : a3 = a4) : (p *> q) *> r = p *> (q *> r) \elim r
| idp => idp
\func \fix 2 qed {A : \Type} (a : A) : a = a => idp
\func \infixr 1 >== {A : \Type} {a a' a'' : A} (p : a = a') (q : a' = a'') => p *> q
\func \infix 2 ==< {A : \Type} (a : A) {a' : A} (p : a = a') => p
\func idpOver (A : I -> \Type) (a : A left) : Path A a (coe A a right) => path (coe A a)
\func pathOver {A : I -> \Type} {a : A left} {a' : A right} (p : coe A a right = a') : Path A a a'
=> *>.concat (idpOver A a) p
\func coe_path {A : \Type} {a1 a2 a3 a4 : A} (p : a2 = a1) (q : a2 = a3) (r : a3 = a4)
: coe (\lam i => p @ i = r @ i) q right = inv p *> q *> r
=> coe (\lam j => coe (\lam i => p @ i = r @ i) q j = inv (psqueeze p j) *> q *> psqueeze r j) (inv (idp_*> q)) right
\where
\func alt {A : \Type} {a1 a2 a3 a4 : A} (p : a1 = a2) (q : a2 = a3) (r : a4 = a3)
: coe (\lam i => p @ i = r @ i) (p *> q *> inv r) right = q
| idp, idp, idp => idp
\func path-sym {A : \Type} (a a' : A) : (a = a') = (a' = a) => path (iso inv inv inv_inv inv_inv)
\func rotatePathLeft {A : \Type} {a a' a'' : A} {p : a' = a} {q : a' = a''} {r : a = a''} (t : q = p *> r)
: inv p *> q = r \elim p, r, t
| idp, idp, idp => idp
\func homotopy-isNatural {A B : \Type} (f g : A -> B) (h : \Pi (a : A) -> f a = g a) {a a' : A} (p : a = a')
: pmap f p *> h a' = h a *> pmap g p \elim p
| idp => idp_*> (h a)
\func homotopy_app-comm {A : \Type} (f : A -> A) (h : \Pi (a : A) -> f a = a) (a : A) : h (f a) = pmap f (h a) =>
h (f a) ==< pmap (h (f a) *>) (inv (*>_inv (h a))) >==
h (f a) *> (h a *> inv (h a)) ==< inv (*>-assoc (h (f a)) (h a) (inv (h a))) >==
(h (f a) *> h a) *> inv (h a) ==< pmap (`*> inv (h a)) (inv (homotopy-isNatural f (\lam a => a) h (h a))) >==
(pmap f (h a) *> h a) *> inv (h a) ==< *>-assoc (pmap f (h a)) (h a) (inv (h a)) >==
pmap f (h a) *> (h a *> inv (h a)) ==< pmap (pmap f (h a) *>) (*>_inv (h a)) >==
pmap f (h a) `qed
\func pmapd {A : \Type} {B : A -> \Type} (f : \Pi (x : A) -> B x) {a a' : A} (p : a = a')
: transport B p (f a) = f a' \elim p
| idp => idp
\func pmapd_pathOver {A : \Type} (B : A -> \Type) (f : \Pi (x : A) -> B x) {a a' : A} (p : a = a') (s : transport B p (f a) = f a')
(t : path (\lam i => f (p @ i)) = {Path (\lam i => B (p @ i)) (f a) (f a')} pathOver s) : pmapd f p = s \elim p
| idp => t *> idp_*>.idp_concat s
\func transport_*> {A : \Type} (B : A -> \Type) {a a' a'' : A} (p : a = a') (q : a' = a'') (x : B a)
: transport B (p *> q) x = transport B q (transport B p x) \elim q
| idp => idp
\func transport_pi {A : \Type} (B C : A -> \Type) {a a' : A} (p : a = a') (f : B a -> C a) (x : B a')
: transport (\lam y => B y -> C y) p f x = transport C p (f (transport B (inv p) x)) \elim p
| idp => idp
\func transport_pi2 {A : \Type} (B C : A -> \Type) {a a' : A} (p : a = a') (f : B a -> C a) (g : B a' -> C a') (t : \Pi (x : B a) -> transport C p (f x) = g (transport B p x))
: transport (\lam y => B y -> C y) p f = g \elim p
| idp => path (\lam i x => t x @ i)
\func transport_depPi {A B : \Type} (C : A -> B -> \Type) {a a' : A} (p : a = a') (f : \Pi (b : B) -> C a b) (x : B)
: transport (\lam y => \Pi (b : B) -> C y b) p f x = transport (C __ x) p (f x) \elim p
| idp => idp
\func transport_path-right {A : \Type} {a0 a b : A} (p : a = b) (q : a0 = a)
: transport (a0 =) p q = q *> p
| idp, idp => idp
\func transport_path-left {A : \Type} {a0 a b : A} (p : a = b) (q : a = a0)
: transport (`= a0) p q = inv p *> q
| idp, idp => idp
\func transport_path_pmap {A B : \Type} (f g : A -> B) {a a' : A} (p : a = a') (q : f a = g a) (s : f a' = g a') (h : q *> pmap g p = pmap f p *> s) : transport (\lam x => f x = g x) p q = s \elim p
| idp => h *> idp_*> s
\where {
\func conv {A B : \Type} (f g : A -> B) {a a' : A} (p : a = a') (q : f a = g a) (s : f a' = g a') (h : transport (\lam x => f x = g x) p q = s) : q *> pmap g p = pmap f p *> s \elim p
| idp => h *> inv (idp_*> s)
}
\func transport_path_pmap-right {A B : \Type} (b : B) (g : A -> B) {a a' : A} (p : a = a') (q : b = g a) (s : b = g a') (h : q *> pmap g p = s) : transport (\lam x => b = g x) p q = s \elim p
| idp => h
\where {
\func conv {A B : \Type} (b : B) (g : A -> B) {a a' : A} (p : a = a') (q : b = g a) (s : b = g a') (h : transport (\lam x => b = g x) p q = s) : q *> pmap g p = s \elim p
| idp => h
}
\func transport_inv_id {A : \Type} (B : A -> \Type) {a b : A} (p : a = b) (x : B a)
: transport B (inv p) (transport B p x) = x \elim p
| idp => idp
\func transport_id_inv {A : \Type} (B : A -> \Type) {a b : A} (p : a = b) (x : B b)
: transport B p (transport B (inv p) x) = x \elim p
| idp => idp
\func transport-rotate {A : \Type} (B : A -> \Type) {a a' : A} (p : a = a') {x : B a} {y : B a'} (t : transport B p x = y)
: x = transport B (inv p) y \elim p
| idp => t
\func transport_inv_func {A : \Type} (B : A -> \Type) {a a' : A} (p : a = a') (g : B a' -> B a) (gf : \Pi (x : B a) -> g (transport B p x) = x) (b : B a')
: transport B (inv p) b = g b \elim p
| idp => inv (gf b)
\func coe_sigma {A : I -> \Type} (B : \Pi (i : I) -> A i -> \Type) (p : \Sigma (a : A left) (B left a)) (j : I)
: coe (\lam i => \Sigma (a : A i) (B i a)) p j = (coe A p.1 j, coe (\lam i => B i (coe A p.1 i)) p.2 j)
=> coe (\lam k => coe (\lam i => \Sigma (a : A i) (B i a)) p (I.squeeze j k) =
(coe A p.1 (I.squeeze j k), coe (\lam i => B i (coe A p.1 i)) p.2 (I.squeeze j k))) idp right
\func coe_pi {B C : I -> \Type} {f : B left -> C left}
: coe (\lam i => B i -> C i) f right = \lam x => coe C (f (coe2 B right x left)) right
=> coe (\lam j => coe (\lam i => B i -> C i) f j = \lam x => coe C (f (coe2 B j x left)) j) idp right