Built with Alectryon, running Coq+SerAPI v8.18.0+0.18.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.
[Loading ML file number_string_notation_plugin.cmxs (using legacy method) ... done]
Require Import Cubical.DPath. Require Import Cubical.PathSquare. Require Import Cubical.DPathSquare. Require Import Types.Paths Types.Prod. Declare Scope cube_scope. Delimit Scope cube_scope with cube. Local Unset Elimination Schemes. Generalizable All Variables. Local Open Scope square_scope. (* x001----pi01----x101 x001----pi01----x101 | \ \ | | \ | p00i ==si0i=> p10i | | p10i p0i1 \ \ p0i1 ==sii1=> p1i1 \ | x000----pi00----x100 | | x100 |s0ii | | ===> | | s1ii| x011 | | x011----pi11----x111 | \ p0i0 ==sii0=> p1i0 \ \ p1i0 p01i | | p01i ==si1i=> p11i | \ | | \ \ | x010----pi10----x110 x010----pi10----x110 *) (* Contents: * Definition of PathCube * PathCube reflexivity * PathCube face rewriting * PathCubes from paths between squares * PathCubes from squres * PathCube flipping * Kan fillers * PathCube concatenation * natural cubes from ap *) (* Homogeneous cubes *) (* PathCube left right top bottom front back *) Cumulative Inductive PathCube {A} : forall x000 {x010 x100 x110 x001 x011 x101 x111 : A} {p0i0 : x000 = x010} {p1i0 : x100 = x110} {pi00 : x000 = x100} {pi10 : x010 = x110} {p0i1 : x001 = x011} {p1i1 : x101 = x111} {pi01 : x001 = x101} {pi11 : x011 = x111} {p00i : x000 = x001} {p01i : x010 = x011} {p10i : x100 = x101} {p11i : x110 = x111} (s0ii : PathSquare p0i0 p0i1 p00i p01i) (s1ii : PathSquare p1i0 p1i1 p10i p11i) (sii0 : PathSquare p0i0 p1i0 pi00 pi10) (sii1 : PathSquare p0i1 p1i1 pi01 pi11) (si0i : PathSquare p00i p10i pi00 pi01) (si1i : PathSquare p01i p11i pi10 pi11), Type := idcube : forall x, PathCube x 1 1 1 1 1 1. Arguments PathCube {_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _}. Scheme PathCube_ind := Induction for PathCube Sort Type. Arguments PathCube_ind {A} P f {_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _}. Scheme PathCube_rec := Minimality for PathCube Sort Type. Arguments PathCube_rec {A} P f {_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _}. (* These notations make it easier to write our lemmas *) Local Notation hr := (sq_refl_h _). Local Notation vr := (sq_refl_v _). Local Notation tr := sq_tr. Local Notation fv := sq_flip_v. (* PathCubes form a path of squares up to retyping *)
A: Type
x000, x010, x100, x110, x001, x011, x101, x111: A
p0i0: x000 = x010
p1i0: x100 = x110
pi00: x000 = x100
pi10: x010 = x110
p0i1: x001 = x011
p1i1: x101 = x111
pi01: x001 = x101
pi11: x011 = x111
p00i: x000 = x001
p01i: x010 = x011
p10i: x100 = x101
p11i: x110 = x111
s0ii: PathSquare p0i0 p0i1 p00i p01i
s1ii: PathSquare p1i0 p1i1 p10i p11i
sii0: PathSquare p0i0 p1i0 pi00 pi10
sii1: PathSquare p0i1 p1i1 pi01 pi11
si0i: PathSquare p00i p10i pi00 pi01
si1i: PathSquare p01i p11i pi10 pi11

sq_concat_h (tr (fv s0ii)) (sq_concat_h si0i (tr s1ii)) = sq_ccGG (moveL_Vp (pi00 @ p1i0) pi10 p0i0 (sq_path^-1 sii0)) (moveL_Vp (pi01 @ p1i1) pi11 p0i1 (sq_path^-1 sii1)) si1i <~> PathCube s0ii s1ii sii0 sii1 si0i si1i
A: Type
x000, x010, x100, x110, x001, x011, x101, x111: A
p0i0: x000 = x010
p1i0: x100 = x110
pi00: x000 = x100
pi10: x010 = x110
p0i1: x001 = x011
p1i1: x101 = x111
pi01: x001 = x101
pi11: x011 = x111
p00i: x000 = x001
p01i: x010 = x011
p10i: x100 = x101
p11i: x110 = x111
s0ii: PathSquare p0i0 p0i1 p00i p01i
s1ii: PathSquare p1i0 p1i1 p10i p11i
sii0: PathSquare p0i0 p1i0 pi00 pi10
sii1: PathSquare p0i1 p1i1 pi01 pi11
si0i: PathSquare p00i p10i pi00 pi01
si1i: PathSquare p01i p11i pi10 pi11

sq_concat_h (tr (fv s0ii)) (sq_concat_h si0i (tr s1ii)) = sq_ccGG (moveL_Vp (pi00 @ p1i0) pi10 p0i0 (sq_path^-1 sii0)) (moveL_Vp (pi01 @ p1i1) pi11 p0i1 (sq_path^-1 sii1)) si1i <~> PathCube s0ii s1ii sii0 sii1 si0i si1i
A: Type
x000, x010, x100, x110, x001, x011, x101, x111: A
p0i0: x000 = x010
p1i0: x100 = x110
pi00: x000 = x100
pi10: x010 = x110
p0i1: x001 = x011
p1i1: x101 = x111
pi01: x001 = x101
pi11: x011 = x111
p00i: x000 = x001
p01i: x010 = x011
p10i: x100 = x101
p11i: x110 = x111
s0ii: PathSquare p0i0 p0i1 p00i p01i
s1ii: PathSquare p1i0 p1i1 p10i p11i
sii0: PathSquare p0i0 p1i0 pi00 pi10
sii1: PathSquare p0i1 p1i1 pi01 pi11
si0i: PathSquare p00i p10i pi00 pi01
si1i: PathSquare p01i p11i pi10 pi11

sq_concat_h (tr (fv s0ii)) (sq_concat_h si0i (tr s1ii)) = sq_ccGG (moveL_Vp (pi00 @ p1i0) pi10 p0i0 (sq_path^-1 sii0)) (moveL_Vp (pi01 @ p1i1) pi11 p0i1 (sq_path^-1 sii1)) si1i -> PathCube s0ii s1ii sii0 sii1 si0i si1i
A: Type
x000, x010, x100, x110, x001, x011, x101, x111: A
p0i0: x000 = x010
p1i0: x100 = x110
pi00: x000 = x100
pi10: x010 = x110
p0i1: x001 = x011
p1i1: x101 = x111
pi01: x001 = x101
pi11: x011 = x111
p00i: x000 = x001
p01i: x010 = x011
p10i: x100 = x101
p11i: x110 = x111
s0ii: PathSquare p0i0 p0i1 p00i p01i
s1ii: PathSquare p1i0 p1i1 p10i p11i
sii0: PathSquare p0i0 p1i0 pi00 pi10
sii1: PathSquare p0i1 p1i1 pi01 pi11
si0i: PathSquare p00i p10i pi00 pi01
si1i: PathSquare p01i p11i pi10 pi11
PathCube s0ii s1ii sii0 sii1 si0i si1i -> sq_concat_h (tr (fv s0ii)) (sq_concat_h si0i (tr s1ii)) = sq_ccGG (moveL_Vp (pi00 @ p1i0) pi10 p0i0 (sq_path^-1 sii0)) (moveL_Vp (pi01 @ p1i1) pi11 p0i1 (sq_path^-1 sii1)) si1i
A: Type
x000, x010, x100, x110, x001, x011, x101, x111: A
p0i0: x000 = x010
p1i0: x100 = x110
pi00: x000 = x100
pi10: x010 = x110
p0i1: x001 = x011
p1i1: x101 = x111
pi01: x001 = x101
pi11: x011 = x111
p00i: x000 = x001
p01i: x010 = x011
p10i: x100 = x101
p11i: x110 = x111
s0ii: PathSquare p0i0 p0i1 p00i p01i
s1ii: PathSquare p1i0 p1i1 p10i p11i
sii0: PathSquare p0i0 p1i0 pi00 pi10
sii1: PathSquare p0i1 p1i1 pi01 pi11
si0i: PathSquare p00i p10i pi00 pi01
si1i: PathSquare p01i p11i pi10 pi11
?f o ?g == idmap
A: Type
x000, x010, x100, x110, x001, x011, x101, x111: A
p0i0: x000 = x010
p1i0: x100 = x110
pi00: x000 = x100
pi10: x010 = x110
p0i1: x001 = x011
p1i1: x101 = x111
pi01: x001 = x101
pi11: x011 = x111
p00i: x000 = x001
p01i: x010 = x011
p10i: x100 = x101
p11i: x110 = x111
s0ii: PathSquare p0i0 p0i1 p00i p01i
s1ii: PathSquare p1i0 p1i1 p10i p11i
sii0: PathSquare p0i0 p1i0 pi00 pi10
sii1: PathSquare p0i1 p1i1 pi01 pi11
si0i: PathSquare p00i p10i pi00 pi01
si1i: PathSquare p01i p11i pi10 pi11
?g o ?f == idmap
A: Type
x000, x010, x100, x110, x001, x011, x101, x111: A
p0i0: x000 = x010
p1i0: x100 = x110
pi00: x000 = x100
pi10: x010 = x110
p0i1: x001 = x011
p1i1: x101 = x111
pi01: x001 = x101
pi11: x011 = x111
p00i: x000 = x001
p01i: x010 = x011
p10i: x100 = x101
p11i: x110 = x111
s0ii: PathSquare p0i0 p0i1 p00i p01i
s1ii: PathSquare p1i0 p1i1 p10i p11i
sii0: PathSquare p0i0 p1i0 pi00 pi10
sii1: PathSquare p0i1 p1i1 pi01 pi11
si0i: PathSquare p00i p10i pi00 pi01
si1i: PathSquare p01i p11i pi10 pi11

sq_concat_h (tr (fv s0ii)) (sq_concat_h si0i (tr s1ii)) = sq_ccGG (moveL_Vp (pi00 @ p1i0) pi10 p0i0 (sq_path^-1 sii0)) (moveL_Vp (pi01 @ p1i1) pi11 p0i1 (sq_path^-1 sii1)) si1i -> PathCube s0ii s1ii sii0 sii1 si0i si1i
A: Type
x, x0: A
p00i, p01i, p10i, p11i: x = x0
s0ii: PathSquare 1 1 p00i p01i
s1ii: PathSquare 1 1 p10i p11i
si0i: PathSquare p00i p10i 1 1
si1i: PathSquare p01i p11i 1 1

sq_concat_h (PathSquare.tr (match p01i as p in (_ = a) return (forall px1 : a = x0, 1 @ p00i = p @ px1 -> PathSquare 1 px1 p p00i) with | 1%path => fun px1 : x = x0 => match p00i as p in (_ = a) return (forall px2 : x = a, 1 @ p = 1 @ px2 -> PathSquare 1 px2 1 p) with | 1%path => fun (px2 : x = x) (e : 1%path = 1 @ px2) => match e @ concat_1p px2 in (_ = p) return (1%path = 1 @ p -> PathSquare 1 p 1 1) with | 1%path => fun _ : 1%path = 1%path => 1 end e end px1 end 1%path ((concat_1p p00i @ ((((concat_1p p01i)^ @ (match s0ii in (@PathSquare _ a00 a10 a01 a11 p p0 p1 p2) return (p @ p2 = p1 @ p0) with | @sq_id _ x => 1 end @ ((concat_p1 p00i)^)^))^)^)^) @ (concat_p1 p01i)^))) (sq_concat_h si0i (PathSquare.tr s1ii)) = si1i -> PathCube s0ii s1ii 1 1 si0i si1i
A: Type
x, x0: A
p00i, p01i, p10i, p11i: x = x0
s0ii: PathSquare 1 1 p00i p01i
s1ii: PathSquare 1 1 p10i p11i
si0i: PathSquare p00i p10i 1 1
si1i: PathSquare p01i p11i 1 1

sq_concat_h (PathSquare.tr (match p01i as p in (_ = a) return (forall px1 : a = x0, 1 @ p00i = p @ px1 -> PathSquare 1 px1 p p00i) with | 1%path => fun px1 : x = x0 => match p00i as p in (_ = a) return (forall px2 : x = a, 1 @ p = 1 @ px2 -> PathSquare 1 px2 1 p) with | 1%path => fun (px2 : x = x) (e : 1%path = 1 @ px2) => match e @ concat_1p px2 in (_ = p) return (1%path = 1 @ p -> PathSquare 1 p 1 1) with | 1%path => fun _ : 1%path = 1%path => 1 end e end px1 end 1%path ((concat_1p p00i @ ((((concat_1p p01i)^ @ (match sq_1G (sq_1G^-1 s0ii) in (@PathSquare _ a00 a10 a01 a11 p p0 p1 p2) return (p @ p2 = p1 @ p0) with | @sq_id _ x => 1 end @ ((concat_p1 p00i)^)^))^)^)^) @ (concat_p1 p01i)^))) (sq_concat_h (sq_G1 (sq_G1^-1 si0i)) (PathSquare.tr (sq_1G (sq_1G^-1 s1ii)))) = si1i -> PathCube (sq_1G (sq_1G^-1 s0ii)) (sq_1G (sq_1G^-1 s1ii)) 1 1 (sq_G1 (sq_G1^-1 si0i)) si1i
A: Type
x, x0: A
p00i, p01i, p10i, p11i: x = x0
s0ii: PathSquare 1 1 p00i p01i
s1ii: PathSquare 1 1 p10i p11i
si0i: PathSquare p00i p10i 1 1
si1i: PathSquare p01i p11i 1 1
X: sq_concat_h (PathSquare.tr (match p01i as p in (_ = a) return (forall px1 : a = x0, 1 @ p00i = p @ px1 -> PathSquare 1 px1 p p00i) with | 1%path => fun px1 : x = x0 => match p00i as p in (_ = a) return (forall px2 : x = a, 1 @ p = 1 @ px2 -> PathSquare 1 px2 1 p) with | 1%path => fun (px2 : x = x) (e : 1%path = 1 @ px2) => match e @ concat_1p px2 in (_ = p) return (1%path = 1 @ p -> PathSquare 1 p 1 1) with | 1%path => fun _ : 1%path = 1%path => 1 end e end px1 end 1%path ((concat_1p p00i @ ((((concat_1p p01i)^ @ (match sq_1G (sq_1G^-1 s0ii) in (@PathSquare _ a00 a10 a01 a11 p p0 p1 p2) return (p @ p2 = p1 @ p0) with | @sq_id _ x => 1 end @ ((concat_p1 p00i)^)^))^)^)^) @ (concat_p1 p01i)^))) (sq_concat_h (sq_G1 (sq_G1^-1 si0i)) (PathSquare.tr (sq_1G (sq_1G^-1 s1ii)))) = si1i

PathCube (sq_1G (sq_1G^-1 s0ii)) (sq_1G (sq_1G^-1 s1ii)) 1 1 (sq_G1 (sq_G1^-1 si0i)) si1i
by destruct (sq_G1^-1 si0i), (sq_1G^-1 s0ii), (sq_1G^-1 s1ii), X, p00i.
A: Type
x000, x010, x100, x110, x001, x011, x101, x111: A
p0i0: x000 = x010
p1i0: x100 = x110
pi00: x000 = x100
pi10: x010 = x110
p0i1: x001 = x011
p1i1: x101 = x111
pi01: x001 = x101
pi11: x011 = x111
p00i: x000 = x001
p01i: x010 = x011
p10i: x100 = x101
p11i: x110 = x111
s0ii: PathSquare p0i0 p0i1 p00i p01i
s1ii: PathSquare p1i0 p1i1 p10i p11i
sii0: PathSquare p0i0 p1i0 pi00 pi10
sii1: PathSquare p0i1 p1i1 pi01 pi11
si0i: PathSquare p00i p10i pi00 pi01
si1i: PathSquare p01i p11i pi10 pi11

PathCube s0ii s1ii sii0 sii1 si0i si1i -> sq_concat_h (tr (fv s0ii)) (sq_concat_h si0i (tr s1ii)) = sq_ccGG (moveL_Vp (pi00 @ p1i0) pi10 p0i0 (sq_path^-1 sii0)) (moveL_Vp (pi01 @ p1i1) pi11 p0i1 (sq_path^-1 sii1)) si1i
A: Type
x000, x010, x100, x110, x001, x011, x101, x111: A
p0i0: x000 = x010
p1i0: x100 = x110
pi00: x000 = x100
pi10: x010 = x110
p0i1: x001 = x011
p1i1: x101 = x111
pi01: x001 = x101
pi11: x011 = x111
p00i: x000 = x001
p01i: x010 = x011
p10i: x100 = x101
p11i: x110 = x111
s0ii: PathSquare p0i0 p0i1 p00i p01i
s1ii: PathSquare p1i0 p1i1 p10i p11i
sii0: PathSquare p0i0 p1i0 pi00 pi10
sii1: PathSquare p0i1 p1i1 pi01 pi11
si0i: PathSquare p00i p10i pi00 pi01
si1i: PathSquare p01i p11i pi10 pi11
match sii0 as p3 in (@PathSquare _ a00 a10 a01 a11 p p0 p1 p2) return (forall (p00i : a00 = x001) (p01i : a10 = x011) (p10i : a01 = x101) (p11i : a11 = x111) (s0ii : PathSquare p p0i1 p00i p01i) (s1ii : PathSquare p0 p1i1 p10i p11i) (si0i : PathSquare p00i p10i p1 pi01) (si1i : PathSquare p01i p11i p2 pi11), sq_concat_h (tr (fv s0ii)) (sq_concat_h si0i (tr s1ii)) = sq_ccGG (moveL_Vp (p1 @ p0) p2 p (sq_path^-1 p3)) (moveL_Vp (pi01 @ p1i1) pi11 p0i1 (sq_path^-1 sii1)) si1i -> PathCube s0ii s1ii p3 sii1 si0i si1i) with | @sq_id _ x => (fun (x0 : A) (p00i : x0 = x001) (p01i : x0 = x011) (p10i : x0 = x101) (p11i : x0 = x111) (s0ii : PathSquare 1 p0i1 p00i p01i) (s1ii : PathSquare 1 p1i1 p10i p11i) (si0i : PathSquare p00i p10i 1 pi01) (si1i : PathSquare p01i p11i 1 pi11) => match sii1 as p3 in (@PathSquare _ a00 a10 a01 a11 p p0 p1 p2) return (forall (p00i0 : x0 = a00) (p01i0 : x0 = a10) (p10i0 : x0 = a01) (p11i0 : x0 = a11) (s0ii0 : PathSquare 1 p p00i0 p01i0) (s1ii0 : PathSquare 1 p0 p10i0 p11i0) (si0i0 : PathSquare p00i0 p10i0 1 p1) (si1i0 : PathSquare p01i0 p11i0 1 p2), sq_concat_h (tr (fv s0ii0)) (sq_concat_h si0i0 (tr s1ii0)) = sq_ccGG (moveL_Vp (1 @ 1) 1 1 (sq_path^-1 1)) (moveL_Vp (p1 @ p0) p2 p (sq_path^-1 p3)) si1i0 -> PathCube s0ii0 s1ii0 1 p3 si0i0 si1i0) with | @sq_id _ x1 => (fun (x2 : A) (p00i0 p01i0 p10i0 p11i0 : x0 = x2) (s0ii0 : PathSquare 1 1 p00i0 p01i0) (s1ii0 : PathSquare 1 1 p10i0 p11i0) (si0i0 : PathSquare p00i0 p10i0 1 1) (si1i0 : PathSquare p01i0 p11i0 1 1) => internal_paths_rew_r (fun si0i1 : PathSquare p00i0 p10i0 1 1 => sq_concat_h (PathSquare.tr (match ... with | ... ... end 1%path (... @ ...^))) (sq_concat_h si0i1 (PathSquare.tr s1ii0)) = si1i0 -> PathCube s0ii0 s1ii0 1 1 si0i1 si1i0) (internal_paths_rew_r (fun s0ii1 : PathSquare 1 1 p00i0 p01i0 => sq_concat_h (PathSquare.tr (... 1%path ...)) (sq_concat_h (sq_G1 ...) (PathSquare.tr s1ii0)) = si1i0 -> PathCube s0ii1 s1ii0 1 1 (sq_G1 (sq_G1^-1 si0i0)) si1i0) (internal_paths_rew_r (fun s1ii1 : PathSquare 1 1 p10i0 p11i0 => sq_concat_h (PathSquare.tr ...) (sq_concat_h ... ...) = si1i0 -> PathCube (sq_1G (...)) s1ii1 1 1 (sq_G1 (...)) si1i0) (fun X : sq_concat_h (...) (...) = si1i0 => let p := sq_G1^-1 si0i0 in match ... ... with | ... => ... => ... end s1ii0 si0i0 X) (eisretr sq_1G s1ii0)^) (eisretr sq_1G s0ii0)^) (eisretr sq_G1 si0i0)^ : sq_concat_h (tr (fv s0ii0)) (sq_concat_h si0i0 (tr s1ii0)) = sq_ccGG (moveL_Vp (1 @ 1) 1 1 (sq_path^-1 1)) (moveL_Vp (1 @ 1) 1 1 (sq_path^-1 1)) si1i0 -> PathCube s0ii0 s1ii0 1 1 si0i0 si1i0) x1 end p00i p01i p10i p11i s0ii s1ii si0i si1i) x end p00i p01i p10i p11i s0ii s1ii si0i si1i o ?g == idmap
A: Type
x000, x010, x100, x110, x001, x011, x101, x111: A
p0i0: x000 = x010
p1i0: x100 = x110
pi00: x000 = x100
pi10: x010 = x110
p0i1: x001 = x011
p1i1: x101 = x111
pi01: x001 = x101
pi11: x011 = x111
p00i: x000 = x001
p01i: x010 = x011
p10i: x100 = x101
p11i: x110 = x111
s0ii: PathSquare p0i0 p0i1 p00i p01i
s1ii: PathSquare p1i0 p1i1 p10i p11i
sii0: PathSquare p0i0 p1i0 pi00 pi10
sii1: PathSquare p0i1 p1i1 pi01 pi11
si0i: PathSquare p00i p10i pi00 pi01
si1i: PathSquare p01i p11i pi10 pi11
?g o match sii0 as p3 in (@PathSquare _ a00 a10 a01 a11 p p0 p1 p2) return (forall (p00i : a00 = x001) (p01i : a10 = x011) (p10i : a01 = x101) (p11i : a11 = x111) (s0ii : PathSquare p p0i1 p00i p01i) (s1ii : PathSquare p0 p1i1 p10i p11i) (si0i : PathSquare p00i p10i p1 pi01) (si1i : PathSquare p01i p11i p2 pi11), sq_concat_h (tr (fv s0ii)) (sq_concat_h si0i (tr s1ii)) = sq_ccGG (moveL_Vp (p1 @ p0) p2 p (sq_path^-1 p3)) (moveL_Vp (pi01 @ p1i1) pi11 p0i1 (sq_path^-1 sii1)) si1i -> PathCube s0ii s1ii p3 sii1 si0i si1i) with | @sq_id _ x => (fun (x0 : A) (p00i : x0 = x001) (p01i : x0 = x011) (p10i : x0 = x101) (p11i : x0 = x111) (s0ii : PathSquare 1 p0i1 p00i p01i) (s1ii : PathSquare 1 p1i1 p10i p11i) (si0i : PathSquare p00i p10i 1 pi01) (si1i : PathSquare p01i p11i 1 pi11) => match sii1 as p3 in (@PathSquare _ a00 a10 a01 a11 p p0 p1 p2) return (forall (p00i0 : x0 = a00) (p01i0 : x0 = a10) (p10i0 : x0 = a01) (p11i0 : x0 = a11) (s0ii0 : PathSquare 1 p p00i0 p01i0) (s1ii0 : PathSquare 1 p0 p10i0 p11i0) (si0i0 : PathSquare p00i0 p10i0 1 p1) (si1i0 : PathSquare p01i0 p11i0 1 p2), sq_concat_h (tr (fv s0ii0)) (sq_concat_h si0i0 (tr s1ii0)) = sq_ccGG (moveL_Vp (1 @ 1) 1 1 (sq_path^-1 1)) (moveL_Vp (p1 @ p0) p2 p (sq_path^-1 p3)) si1i0 -> PathCube s0ii0 s1ii0 1 p3 si0i0 si1i0) with | @sq_id _ x1 => (fun (x2 : A) (p00i0 p01i0 p10i0 p11i0 : x0 = x2) (s0ii0 : PathSquare 1 1 p00i0 p01i0) (s1ii0 : PathSquare 1 1 p10i0 p11i0) (si0i0 : PathSquare p00i0 p10i0 1 1) (si1i0 : PathSquare p01i0 p11i0 1 1) => internal_paths_rew_r (fun si0i1 : PathSquare p00i0 p10i0 1 1 => sq_concat_h (PathSquare.tr (match ... with | ... ... end 1%path (... @ ...^))) (sq_concat_h si0i1 (PathSquare.tr s1ii0)) = si1i0 -> PathCube s0ii0 s1ii0 1 1 si0i1 si1i0) (internal_paths_rew_r (fun s0ii1 : PathSquare 1 1 p00i0 p01i0 => sq_concat_h (PathSquare.tr (... 1%path ...)) (sq_concat_h (sq_G1 ...) (PathSquare.tr s1ii0)) = si1i0 -> PathCube s0ii1 s1ii0 1 1 (sq_G1 (sq_G1^-1 si0i0)) si1i0) (internal_paths_rew_r (fun s1ii1 : PathSquare 1 1 p10i0 p11i0 => sq_concat_h (PathSquare.tr ...) (sq_concat_h ... ...) = si1i0 -> PathCube (sq_1G (...)) s1ii1 1 1 (sq_G1 (...)) si1i0) (fun X : sq_concat_h (...) (...) = si1i0 => let p := sq_G1^-1 si0i0 in match ... ... with | ... => ... => ... end s1ii0 si0i0 X) (eisretr sq_1G s1ii0)^) (eisretr sq_1G s0ii0)^) (eisretr sq_G1 si0i0)^ : sq_concat_h (tr (fv s0ii0)) (sq_concat_h si0i0 (tr s1ii0)) = sq_ccGG (moveL_Vp (1 @ 1) 1 1 (sq_path^-1 1)) (moveL_Vp (1 @ 1) 1 1 (sq_path^-1 1)) si1i0 -> PathCube s0ii0 s1ii0 1 1 si0i0 si1i0) x1 end p00i p01i p10i p11i s0ii s1ii si0i si1i) x end p00i p01i p10i p11i s0ii s1ii si0i si1i == idmap
A: Type
x000, x010, x100, x110, x001, x011, x101, x111: A
p0i0: x000 = x010
p1i0: x100 = x110
pi00: x000 = x100
pi10: x010 = x110
p0i1: x001 = x011
p1i1: x101 = x111
pi01: x001 = x101
pi11: x011 = x111
p00i: x000 = x001
p01i: x010 = x011
p10i: x100 = x101
p11i: x110 = x111
s0ii: PathSquare p0i0 p0i1 p00i p01i
s1ii: PathSquare p1i0 p1i1 p10i p11i
sii0: PathSquare p0i0 p1i0 pi00 pi10
sii1: PathSquare p0i1 p1i1 pi01 pi11
si0i: PathSquare p00i p10i pi00 pi01
si1i: PathSquare p01i p11i pi10 pi11

(fun X : PathCube s0ii s1ii sii0 sii1 si0i si1i => match X in (@PathCube _ x000 x010 x100 x110 x001 x011 x101 x111 p0i0 p1i0 pi00 pi10 p0i1 p1i1 pi01 pi11 p00i p01i p10i p11i s0ii s1ii sii0 sii1 si0i si1i) return (sq_concat_h (tr (fv s0ii)) (sq_concat_h si0i (tr s1ii)) = sq_ccGG (moveL_Vp (pi00 @ p1i0) pi10 p0i0 (sq_path^-1 sii0)) (moveL_Vp (pi01 @ p1i1) pi11 p0i1 (sq_path^-1 sii1)) si1i) with | idcube x => (fun x0 : A => 1%path) x end) o match sii0 as p3 in (@PathSquare _ a00 a10 a01 a11 p p0 p1 p2) return (forall (p00i : a00 = x001) (p01i : a10 = x011) (p10i : a01 = x101) (p11i : a11 = x111) (s0ii : PathSquare p p0i1 p00i p01i) (s1ii : PathSquare p0 p1i1 p10i p11i) (si0i : PathSquare p00i p10i p1 pi01) (si1i : PathSquare p01i p11i p2 pi11), sq_concat_h (tr (fv s0ii)) (sq_concat_h si0i (tr s1ii)) = sq_ccGG (moveL_Vp (p1 @ p0) p2 p (sq_path^-1 p3)) (moveL_Vp (pi01 @ p1i1) pi11 p0i1 (sq_path^-1 sii1)) si1i -> PathCube s0ii s1ii p3 sii1 si0i si1i) with | @sq_id _ x => (fun (x0 : A) (p00i : x0 = x001) (p01i : x0 = x011) (p10i : x0 = x101) (p11i : x0 = x111) (s0ii : PathSquare 1 p0i1 p00i p01i) (s1ii : PathSquare 1 p1i1 p10i p11i) (si0i : PathSquare p00i p10i 1 pi01) (si1i : PathSquare p01i p11i 1 pi11) => match sii1 as p3 in (@PathSquare _ a00 a10 a01 a11 p p0 p1 p2) return (forall (p00i0 : x0 = a00) (p01i0 : x0 = a10) (p10i0 : x0 = a01) (p11i0 : x0 = a11) (s0ii0 : PathSquare 1 p p00i0 p01i0) (s1ii0 : PathSquare 1 p0 p10i0 p11i0) (si0i0 : PathSquare p00i0 p10i0 1 p1) (si1i0 : PathSquare p01i0 p11i0 1 p2), sq_concat_h (tr (fv s0ii0)) (sq_concat_h si0i0 (tr s1ii0)) = sq_ccGG (moveL_Vp (1 @ 1) 1 1 (sq_path^-1 1)) (moveL_Vp (p1 @ p0) p2 p (sq_path^-1 p3)) si1i0 -> PathCube s0ii0 s1ii0 1 p3 si0i0 si1i0) with | @sq_id _ x1 => (fun (x2 : A) (p00i0 p01i0 p10i0 p11i0 : x0 = x2) (s0ii0 : PathSquare 1 1 p00i0 p01i0) (s1ii0 : PathSquare 1 1 p10i0 p11i0) (si0i0 : PathSquare p00i0 p10i0 1 1) (si1i0 : PathSquare p01i0 p11i0 1 1) => internal_paths_rew_r (fun si0i1 : PathSquare p00i0 p10i0 1 1 => sq_concat_h (PathSquare.tr (match ... with | ... ... end 1%path (... @ ...^))) (sq_concat_h si0i1 (PathSquare.tr s1ii0)) = si1i0 -> PathCube s0ii0 s1ii0 1 1 si0i1 si1i0) (internal_paths_rew_r (fun s0ii1 : PathSquare 1 1 p00i0 p01i0 => sq_concat_h (PathSquare.tr (... 1%path ...)) (sq_concat_h (sq_G1 ...) (PathSquare.tr s1ii0)) = si1i0 -> PathCube s0ii1 s1ii0 1 1 (sq_G1 (sq_G1^-1 si0i0)) si1i0) (internal_paths_rew_r (fun s1ii1 : PathSquare 1 1 p10i0 p11i0 => sq_concat_h (PathSquare.tr ...) (sq_concat_h ... ...) = si1i0 -> PathCube (sq_1G (...)) s1ii1 1 1 (sq_G1 (...)) si1i0) (fun X : sq_concat_h (...) (...) = si1i0 => let p := sq_G1^-1 si0i0 in match ... ... with | ... => ... => ... end s1ii0 si0i0 X) (eisretr sq_1G s1ii0)^) (eisretr sq_1G s0ii0)^) (eisretr sq_G1 si0i0)^ : sq_concat_h (tr (fv s0ii0)) (sq_concat_h si0i0 (tr s1ii0)) = sq_ccGG (moveL_Vp (1 @ 1) 1 1 (sq_path^-1 1)) (moveL_Vp (1 @ 1) 1 1 (sq_path^-1 1)) si1i0 -> PathCube s0ii0 s1ii0 1 1 si0i0 si1i0) x1 end p00i p01i p10i p11i s0ii s1ii si0i si1i) x end p00i p01i p10i p11i s0ii s1ii si0i si1i == idmap
A: Type
x, x0: A
p00i, p01i, p10i, p11i: x = x0
s0ii: PathSquare 1 1 p00i p01i
s1ii: PathSquare 1 1 p10i p11i
si0i: PathSquare p00i p10i 1 1
si1i: PathSquare p01i p11i 1 1

(fun x1 : sq_concat_h (tr (fv s0ii)) (sq_concat_h si0i (tr s1ii)) = sq_ccGG (moveL_Vp (1 @ 1) 1 1 (sq_path^-1 1)) (moveL_Vp (1 @ 1) 1 1 (sq_path^-1 1)) si1i => match internal_paths_rew_r (fun si0i : PathSquare p00i p10i 1 1 => sq_concat_h (PathSquare.tr (match p01i as p in (_ = a) return (forall px1 : a = x0, 1 @ p00i = p @ px1 -> PathSquare 1 px1 p p00i) with | 1%path => fun px1 : x = x0 => match p00i as p in (_ = a) return (forall ..., ...) with | 1%path => fun (px2 : x = x) (e : 1%path = ...) => match ... with | ... ... end e end px1 end 1%path ((concat_1p p00i @ ((((concat_1p p01i)^ @ (... @ ...^))^)^)^) @ (concat_p1 p01i)^))) (sq_concat_h si0i (PathSquare.tr s1ii)) = si1i -> PathCube s0ii s1ii 1 1 si0i si1i) (internal_paths_rew_r (fun s0ii : PathSquare 1 1 p00i p01i => sq_concat_h (PathSquare.tr (match p01i as p in (_ = a) return (forall px1 : a = x0, ... = ... -> PathSquare 1 px1 p p00i) with | 1%path => fun px1 : x = x0 => match p00i as p in ... return ... with | 1%path => fun ... ... => ... e end px1 end 1%path ((concat_1p p00i @ (((...^ @ ...)^)^)^) @ (concat_p1 p01i)^))) (sq_concat_h (sq_G1 (sq_G1^-1 si0i)) (PathSquare.tr s1ii)) = si1i -> PathCube s0ii s1ii 1 1 (sq_G1 (sq_G1^-1 si0i)) si1i) (internal_paths_rew_r (fun s1ii : PathSquare 1 1 p10i p11i => sq_concat_h (PathSquare.tr (match p01i as p in (_ = a) return (forall ..., ...) with | 1%path => fun px1 : x = x0 => match ... with | ... ... end px1 end 1%path ((concat_1p p00i @ ((...^)^)^) @ (concat_p1 p01i)^))) (sq_concat_h (sq_G1 (sq_G1^-1 si0i)) (PathSquare.tr s1ii)) = si1i -> PathCube (sq_1G (sq_1G^-1 s0ii)) s1ii 1 1 (sq_G1 (sq_G1^-1 si0i)) si1i) (fun X : sq_concat_h (PathSquare.tr (match p01i as p in (...) return (...) with | 1%path => fun px1 : ... => ... ... end px1 end 1%path ((concat_1p p00i @ (...^)^) @ (concat_p1 p01i)^))) (sq_concat_h (sq_G1 (sq_G1^-1 si0i)) (PathSquare.tr (sq_1G (sq_1G^-1 s1ii)))) = si1i => let p := sq_G1^-1 si0i in match p as p1 in (_ = p0) return (forall s1ii : PathSquare 1 1 p0 p11i, PathSquare p00i p0 1 1 -> sq_concat_h (...) (...) = si1i -> PathCube (sq_1G ...) (sq_1G ...) 1 1 (sq_G1 p1) si1i) with | 1%path => fun (s1ii : PathSquare 1 1 p00i p11i) (si0i : PathSquare p00i p00i 1 1) (X0 : sq_concat_h (PathSquare.tr (... 1%path ...)) (sq_concat_h (sq_G1 1%path) (PathSquare.tr ...)) = si1i) => let p0 := sq_1G^-1 s0ii in match p0 as p2 in (_ = p1) return (... -> ...) with | 1%path => fun (s0ii : PathSquare 1 1 p00i p00i) (si1i : PathSquare p00i p11i 1 1) (X1 : ... = si1i) => let p1 := sq_1G^-1 s1ii in ... ... end s1ii si1i X1 end s0ii si1i X0 end s1ii si0i X) (eisretr sq_1G s1ii)^) (eisretr sq_1G s0ii)^) (eisretr sq_G1 si0i)^ x1 in (@PathCube _ x000 x010 x100 x110 x001 x011 x101 x111 p0i0 p1i0 pi00 pi10 p0i1 p1i1 pi01 pi11 p00i p01i p10i p11i s0ii s1ii sii0 sii1 si0i si1i) return (sq_concat_h (tr (fv s0ii)) (sq_concat_h si0i (tr s1ii)) = sq_ccGG (moveL_Vp (pi00 @ p1i0) pi10 p0i0 (sq_path^-1 sii0)) (moveL_Vp (pi01 @ p1i1) pi11 p0i1 (sq_path^-1 sii1)) si1i) with | idcube x => 1%path end) == idmap
A: Type
x, x0: A
p00i, p01i, p10i, p11i: x = x0
s0ii: PathSquare 1 1 p00i p01i
s1ii: PathSquare 1 1 p10i p11i
si0i: PathSquare p00i p10i 1 1
si1i: PathSquare p01i p11i 1 1

(fun x1 : sq_concat_h (PathSquare.tr (match p01i as p in (_ = a) return (forall px1 : a = x0, 1 @ p00i = p @ px1 -> PathSquare 1 px1 p p00i) with | 1%path => fun px1 : x = x0 => match p00i as p in (_ = a) return (forall px2 : x = a, 1 @ p = 1 @ px2 -> PathSquare 1 px2 1 p) with | 1%path => fun (px2 : x = x) (e : 1%path = 1 @ px2) => match e @ concat_1p px2 in (_ = p) return (1%path = 1 @ p -> PathSquare 1 p 1 1) with | 1%path => fun _ : 1%path = 1%path => 1 end e end px1 end 1%path ((concat_1p p00i @ ((((concat_1p p01i)^ @ (match s0ii in (@PathSquare _ a00 a10 a01 a11 p p0 p1 p2) return (... = ...) with | @sq_id _ x => 1 end @ ((concat_p1 p00i)^)^))^)^)^) @ (concat_p1 p01i)^))) (sq_concat_h si0i (PathSquare.tr s1ii)) = si1i => match internal_paths_rew_r (fun si0i : PathSquare p00i p10i 1 1 => sq_concat_h (PathSquare.tr (match p01i as p in (_ = a) return (forall px1 : a = x0, 1 @ p00i = p @ px1 -> PathSquare 1 px1 p p00i) with | 1%path => fun px1 : x = x0 => match p00i as p in (_ = a) return (forall ..., ...) with | 1%path => fun (px2 : x = x) (e : 1%path = ...) => match ... with | ... ... end e end px1 end 1%path ((concat_1p p00i @ ((((concat_1p p01i)^ @ (... @ ...^))^)^)^) @ (concat_p1 p01i)^))) (sq_concat_h si0i (PathSquare.tr s1ii)) = si1i -> PathCube s0ii s1ii 1 1 si0i si1i) (internal_paths_rew_r (fun s0ii : PathSquare 1 1 p00i p01i => sq_concat_h (PathSquare.tr (match p01i as p in (_ = a) return (forall px1 : a = x0, ... = ... -> PathSquare 1 px1 p p00i) with | 1%path => fun px1 : x = x0 => match p00i as p in ... return ... with | 1%path => fun ... ... => ... e end px1 end 1%path ((concat_1p p00i @ (((...^ @ ...)^)^)^) @ (concat_p1 p01i)^))) (sq_concat_h (match ((...) @ (...)^) @ concat_1p p10i in (_ = p) return (p00i @ 1 = 1 @ p -> PathSquare p00i p 1 1) with | 1%path => fun e : p00i @ 1 = 1 @ (...) => match p00i as p in ... return ... with | 1%path => fun ... => 1 end e end ((concat_p1 p00i @ ((concat_p1 p00i)^ @ (... @ ...^))) @ (concat_1p p10i)^)) (PathSquare.tr s1ii)) = si1i -> PathCube s0ii s1ii 1 1 (match ((concat_p1 p00i @ (...^ @ ...)) @ (concat_1p p10i)^) @ concat_1p p10i in (_ = p) return (p00i @ 1 = 1 @ p -> PathSquare p00i p 1 1) with | 1%path => fun e : p00i @ 1 = 1 @ (p00i @ 1) => match p00i as p in (_ = a) return (... = ... -> PathSquare p ... 1 1) with | 1%path => fun _ : 1%path = 1%path => 1 end e end ((concat_p1 p00i @ ((concat_p1 p00i)^ @ (match ... ... with | ... => 1 end @ ((concat_1p p10i)^)^))) @ (concat_1p p10i)^)) si1i) (internal_paths_rew_r (fun s1ii : PathSquare 1 1 p10i p11i => sq_concat_h (PathSquare.tr (match p01i as p in (_ = a) return (forall ..., ...) with | 1%path => fun px1 : x = x0 => match ... with | ... ... end px1 end 1%path ((concat_1p p00i @ ((...^)^)^) @ (concat_p1 p01i)^))) (sq_concat_h (match (...) @ concat_1p p10i in (_ = p) return (... -> ...) with | 1%path => fun e : ... = ... => match ... with | ... ... end e end ((concat_p1 p00i @ (...^ @ ...)) @ (concat_1p p10i)^)) (PathSquare.tr s1ii)) = si1i -> PathCube (match p00i as p in (_ = a) return (forall px1 : a = x0, 1 @ p01i = p @ px1 -> PathSquare 1 px1 p p01i) with | 1%path => fun px1 : x = x0 => match p01i as p in (...) return (...) with | 1%path => fun (px2 : ...) (e : ...) => ... ... end e end px1 end 1%path ((concat_1p p01i @ (((concat_1p p01i)^ @ (... @ ...^))^)^) @ (concat_p1 p00i)^)) s1ii 1 1 (match ((... @ ...) @ (concat_1p p10i)^) @ concat_1p p10i in (_ = p) return (p00i @ 1 = 1 @ p -> PathSquare p00i p 1 1) with | 1%path => fun e : p00i @ 1 = 1 @ (p00i @ 1) => match p00i as p in (...) return (...) with | 1%path => fun _ : ... => 1 end e end ((concat_p1 p00i @ ((concat_p1 p00i)^ @ (... ... end @ (...^)^))) @ (concat_1p p10i)^)) si1i) (fun X : sq_concat_h (PathSquare.tr (match p01i as p in (...) return (...) with | 1%path => fun px1 : ... => ... ... end px1 end 1%path ((concat_1p p00i @ (...^)^) @ (concat_p1 p01i)^))) (sq_concat_h (match ... @ ... in (...) return (...) with | 1%path => fun e : ... => ... ... end e end ((concat_p1 p00i @ (...)) @ (concat_1p p10i)^)) (PathSquare.tr (match ... ... with | ... => ... => ... end 1%path ((...) @ (...)^)))) = si1i => match (concat_p1 p00i)^ @ (match si0i in (@PathSquare _ a00 a10 a01 a11 p p0 p1 p2) return (...) with | @sq_id _ x => 1 end @ ((concat_1p p10i)^)^) as p0 in (_ = p) return (forall s1ii : PathSquare 1 1 p p11i, PathSquare p00i p 1 1 -> sq_concat_h (PathSquare.tr ...) (sq_concat_h ... ...) = si1i -> PathCube (... ... end 1%path (...)) (... ... end 1%path (...)) 1 1 (... ... end (...)) si1i) with | 1%path => fun (s1ii : PathSquare 1 1 p00i p11i) (si0i : PathSquare p00i p00i 1 1) (X0 : sq_concat_h (PathSquare.tr (... ... end 1%path (...))) (sq_concat_h (... ... end (...)) (PathSquare.tr (...))) = si1i) => match ((concat_1p p01i)^ @ (... @ ...^))^ as p0 in (_ = p) return (PathSquare 1 1 p00i p -> forall si1i : ..., ... -> ...) with | 1%path => fun (s0ii : PathSquare 1 1 p00i p00i) (si1i : PathSquare p00i p11i 1 1) (X1 : sq_concat_h (...) (...) = si1i) => match ...^ as p0 in ... return ... with | 1%path => fun ... ... ... => ... ... end end s1ii si1i X1 end s0ii si1i X0 end s1ii si0i X) (ap (fun x2 : p11i = p10i => match p10i as p in (_ = a) return (forall px1 : a = x0, 1 @ p11i = p @ px1 -> PathSquare 1 px1 p p11i) with | 1 => fun px1 : x = x0 => match p11i as p in (...) return (...) with | 1 => fun (px2 : ...) (e : ...) => ... ... end e end px1 end 1 ((concat_1p p11i @ x2) @ (concat_p1 p10i)^)) (inv_V ((concat_1p p11i)^ @ (match s1ii in (@PathSquare _ a00 a10 a01 a11 p p0 p1 p2) return (... = ...) with | @sq_id _ x => 1 end @ ((concat_p1 p10i)^)^))) @ (ap (match p10i as p in (_ = a) return (forall px1 : a = x0, ... = ... -> PathSquare 1 px1 p p11i) with | 1 => fun px1 : x = x0 => match p11i as p in ... return ... with | 1 => fun ... ... => ... e end px1 end 1) (ap (fun r : 1 @ p11i = p10i => r @ (concat_p1 p10i)^) (concat_p_Vp (concat_1p p11i) (match ... ... with | ... => 1 end @ ((concat_p1 p10i)^)^)) @ concat_pV_p match s1ii in (@PathSquare _ a00 a10 a01 a11 p p0 p1 p2) return (p @ p2 = p1 @ p0) with | @sq_id _ x => 1 end (concat_p1 p10i)^) @ match s1ii as p3 in (@PathSquare _ a00 a10 a01 a11 p p0 p1 p2) return (match p1 as p4 in ... return ... with | 1 => fun ... => ... px1 end p0 match p3 in ... return ... with | @sq_id _ x => 1 end = p3) with | @sq_id _ x => 1 end))^) (ap (fun x2 : p01i = p00i => match p00i as p in (_ = a) return (forall px1 : a = x0, 1 @ p01i = p @ px1 -> PathSquare 1 px1 p p01i) with | 1 => fun px1 : x = x0 => match p01i as p in (_ = a) return (forall px2 : ..., ... -> ...) with | 1 => fun (px2 : x = x) (e : 1 = 1 @ px2) => match ... ... with | ... => ... => 1%square end e end px1 end 1 ((concat_1p p01i @ x2) @ (concat_p1 p00i)^)) (inv_V ((concat_1p p01i)^ @ (match s0ii in (@PathSquare _ a00 a10 a01 a11 p p0 p1 p2) return (p @ p2 = p1 @ p0) with | @sq_id _ x => 1 end @ ((concat_p1 p00i)^)^))) @ (ap (match p00i as p in (_ = a) return (forall px1 : a = x0, 1 @ p01i = p @ px1 -> PathSquare 1 px1 p p01i) with | 1 => fun px1 : x = x0 => match p01i as p in (_ = a) return (forall ..., ...) with | 1 => fun (px2 : x = x) (e : 1 = ...) => match ... with | ... ... end e end px1 end 1) (ap (fun r : 1 @ p01i = p00i => r @ (concat_p1 p00i)^) (concat_p_Vp (concat_1p p01i) (match s0ii in (@PathSquare _ a00 a10 a01 a11 p p0 p1 p2) return (...) with | @sq_id _ x => 1 end @ ((concat_p1 p00i)^)^)) @ concat_pV_p match s0ii in (@PathSquare _ a00 a10 a01 a11 p p0 p1 p2) return (p @ p2 = p1 @ p0) with | @sq_id _ x => 1 end (concat_p1 p00i)^) @ match s0ii as p3 in (@PathSquare _ a00 a10 a01 a11 p p0 p1 p2) return (match p1 as p4 in (_ = a) return (forall ..., ...) with | 1 => fun px1 : a00 = a11 => match ... with | ... ... end px1 end p0 match p3 in (@PathSquare _ a02 a12 a03 a13 p4 p5 p6 p7) return (... = ...) with | @sq_id _ x => 1 end = p3) with | @sq_id _ x => 1 end))^) (ap (fun e : p00i @ 1 = 1 @ p10i => match e @ concat_1p p10i in (_ = p) return (p00i @ 1 = 1 @ p -> PathSquare p00i p 1 1) with | 1 => fun e0 : p00i @ 1 = 1 @ (p00i @ 1) => match p00i as p in (_ = a) return (p @ 1 = 1 @ (...) -> PathSquare p (p @ 1) 1 1) with | 1 => fun _ : 1 = 1 => 1%square end e0 end e) (ap (fun r : p00i @ 1 = p10i => r @ (concat_1p p10i)^) (concat_p_Vp (concat_p1 p00i) (match si0i in (@PathSquare _ a00 a10 a01 a11 p p0 p1 p2) return (p @ p2 = p1 @ p0) with | @sq_id _ x => 1 end @ ((concat_1p p10i)^)^)) @ concat_pV_p match si0i in (@PathSquare _ a00 a10 a01 a11 p p0 p1 p2) return (p @ p2 = p1 @ p0) with | @sq_id _ x => 1 end (concat_1p p10i)^) @ match si0i as p3 in (@PathSquare _ a00 a10 a01 a11 p p0 p1 p2) return (match p1 as p4 in (_ = a) return (forall px1 : a = a11, p @ p2 = p4 @ px1 -> PathSquare p px1 p4 p2) with | 1 => fun px1 : a00 = a11 => match p2 as p4 in (_ = a) return (forall ..., ...) with | 1 => fun (px2 : a00 = a10) (e : ... = ...) => match ... with | ... ... end e end px1 end p0 match p3 in (@PathSquare _ a02 a12 a03 a13 p4 p5 p6 p7) return (p4 @ p7 = p6 @ p5) with | @sq_id _ x => 1 end = p3) with | @sq_id _ x => 1 end)^ x1 in (@PathCube _ x000 x010 x100 x110 x001 x011 x101 x111 p0i0 p1i0 pi00 pi10 p0i1 p1i1 pi01 pi11 p00i p01i p10i p11i s0ii s1ii sii0 sii1 si0i si1i) return (sq_concat_h (PathSquare.tr (fv s0ii)) (sq_concat_h si0i (PathSquare.tr s1ii)) = match moveL_Vp (pi00 @ p1i0) pi10 p0i0 match sii0 in (@PathSquare _ a00 a10 a01 a11 p p0 p1 p2) return (p @ p2 = p1 @ p0) with | @sq_id _ x => 1 end in (_ = p) return (PathSquare p01i p11i pi10 pi11 <~> PathSquare p01i p11i p (p0i1^ @ (pi01 @ p1i1))) with | 1%path => match moveL_Vp (pi01 @ p1i1) pi11 p0i1 match sii1 in (@PathSquare _ a00 a10 a01 a11 p p0 p1 p2) return (p @ p2 = p1 @ p0) with | @sq_id _ x => 1 end in (_ = p) return (PathSquare p01i p11i pi10 pi11 <~> PathSquare p01i p11i pi10 p) with | 1%path => 1%equiv end end si1i) with | idcube x => 1%path end) == idmap
A: Type
x, x0: A
p00i, p01i, p10i, p11i: x = x0
s0ii: PathSquare 1 1 p00i p01i
s1ii: PathSquare 1 1 p10i p11i
si0i: PathSquare p00i p10i 1 1
si1i: PathSquare p01i p11i 1 1

(fun x1 : sq_concat_h (PathSquare.tr (match p01i as p in (_ = a) return (forall px1 : a = x0, 1 @ p00i = p @ px1 -> PathSquare 1 px1 p p00i) with | 1%path => fun px1 : x = x0 => match p00i as p in (_ = a) return (forall px2 : x = a, 1 @ p = 1 @ px2 -> PathSquare 1 px2 1 p) with | 1%path => fun (px2 : x = x) (e : 1%path = 1 @ px2) => match e @ concat_1p px2 in (_ = p) return (1%path = 1 @ p -> PathSquare 1 p 1 1) with | 1%path => fun _ : 1%path = 1%path => 1 end e end px1 end 1%path ((concat_1p p00i @ ((((concat_1p p01i)^ @ (match s0ii in (@PathSquare _ a00 a10 a01 a11 p p0 p1 p2) return (... = ...) with | @sq_id _ x => 1 end @ ((concat_p1 p00i)^)^))^)^)^) @ (concat_p1 p01i)^))) (sq_concat_h (sq_G1 (sq_G1^-1 si0i)) (PathSquare.tr s1ii)) = si1i => match internal_paths_rew_r (fun si0i : PathSquare p00i p10i 1 1 => sq_concat_h (PathSquare.tr (match p01i as p in (_ = a) return (forall px1 : a = x0, 1 @ p00i = p @ px1 -> PathSquare 1 px1 p p00i) with | 1%path => fun px1 : x = x0 => match p00i as p in (_ = a) return (forall ..., ...) with | 1%path => fun (px2 : x = x) (e : 1%path = ...) => match ... with | ... ... end e end px1 end 1%path ((concat_1p p00i @ ((((concat_1p p01i)^ @ (... @ ...^))^)^)^) @ (concat_p1 p01i)^))) (sq_concat_h si0i (PathSquare.tr s1ii)) = si1i -> PathCube s0ii s1ii 1 1 si0i si1i) (internal_paths_rew_r (fun s0ii : PathSquare 1 1 p00i p01i => sq_concat_h (PathSquare.tr (match p01i as p in (_ = a) return (forall px1 : a = x0, ... = ... -> PathSquare 1 px1 p p00i) with | 1%path => fun px1 : x = x0 => match p00i as p in ... return ... with | 1%path => fun ... ... => ... e end px1 end 1%path ((concat_1p p00i @ (((...^ @ ...)^)^)^) @ (concat_p1 p01i)^))) (sq_concat_h (match ((...) @ (...)^) @ concat_1p p10i in (_ = p) return (p00i @ 1 = 1 @ p -> PathSquare p00i p 1 1) with | 1%path => fun e : p00i @ 1 = 1 @ (...) => match p00i as p in ... return ... with | 1%path => fun ... => 1 end e end ((concat_p1 p00i @ ((concat_p1 p00i)^ @ (... @ ...^))) @ (concat_1p p10i)^)) (PathSquare.tr s1ii)) = si1i -> PathCube s0ii s1ii 1 1 (match ((concat_p1 p00i @ (...^ @ ...)) @ (concat_1p p10i)^) @ concat_1p p10i in (_ = p) return (p00i @ 1 = 1 @ p -> PathSquare p00i p 1 1) with | 1%path => fun e : p00i @ 1 = 1 @ (p00i @ 1) => match p00i as p in (_ = a) return (... = ... -> PathSquare p ... 1 1) with | 1%path => fun _ : 1%path = 1%path => 1 end e end ((concat_p1 p00i @ ((concat_p1 p00i)^ @ (match ... ... with | ... => 1 end @ ((concat_1p p10i)^)^))) @ (concat_1p p10i)^)) si1i) (internal_paths_rew_r (fun s1ii : PathSquare 1 1 p10i p11i => sq_concat_h (PathSquare.tr (match p01i as p in (_ = a) return (forall ..., ...) with | 1%path => fun px1 : x = x0 => match ... with | ... ... end px1 end 1%path ((concat_1p p00i @ ((...^)^)^) @ (concat_p1 p01i)^))) (sq_concat_h (match (...) @ concat_1p p10i in (_ = p) return (... -> ...) with | 1%path => fun e : ... = ... => match ... with | ... ... end e end ((concat_p1 p00i @ (...^ @ ...)) @ (concat_1p p10i)^)) (PathSquare.tr s1ii)) = si1i -> PathCube (match p00i as p in (_ = a) return (forall px1 : a = x0, 1 @ p01i = p @ px1 -> PathSquare 1 px1 p p01i) with | 1%path => fun px1 : x = x0 => match p01i as p in (...) return (...) with | 1%path => fun (px2 : ...) (e : ...) => ... ... end e end px1 end 1%path ((concat_1p p01i @ (((concat_1p p01i)^ @ (... @ ...^))^)^) @ (concat_p1 p00i)^)) s1ii 1 1 (match ((... @ ...) @ (concat_1p p10i)^) @ concat_1p p10i in (_ = p) return (p00i @ 1 = 1 @ p -> PathSquare p00i p 1 1) with | 1%path => fun e : p00i @ 1 = 1 @ (p00i @ 1) => match p00i as p in (...) return (...) with | 1%path => fun _ : ... => 1 end e end ((concat_p1 p00i @ ((concat_p1 p00i)^ @ (... ... end @ (...^)^))) @ (concat_1p p10i)^)) si1i) (fun X : sq_concat_h (PathSquare.tr (match p01i as p in (...) return (...) with | 1%path => fun px1 : ... => ... ... end px1 end 1%path ((concat_1p p00i @ (...^)^) @ (concat_p1 p01i)^))) (sq_concat_h (match ... @ ... in (...) return (...) with | 1%path => fun e : ... => ... ... end e end ((concat_p1 p00i @ (...)) @ (concat_1p p10i)^)) (PathSquare.tr (match ... ... with | ... => ... => ... end 1%path ((...) @ (...)^)))) = si1i => match (concat_p1 p00i)^ @ (match sq_G1 ... in (@PathSquare _ a00 a10 a01 a11 p p0 p1 p2) return (...) with | @sq_id _ x => 1 end @ ((concat_1p p10i)^)^) as p0 in (_ = p) return (forall s1ii : PathSquare 1 1 p p11i, PathSquare p00i p 1 1 -> sq_concat_h (PathSquare.tr ...) (sq_concat_h ... ...) = si1i -> PathCube (... ... end 1%path (...)) (... ... end 1%path (...)) 1 1 (... ... end (...)) si1i) with | 1%path => fun (s1ii : PathSquare 1 1 p00i p11i) (si0i : PathSquare p00i p00i 1 1) (X0 : sq_concat_h (PathSquare.tr (... ... end 1%path (...))) (sq_concat_h (... ... end (...)) (PathSquare.tr (...))) = si1i) => match ((concat_1p p01i)^ @ (... @ ...^))^ as p0 in (_ = p) return (PathSquare 1 1 p00i p -> forall si1i : ..., ... -> ...) with | 1%path => fun (s0ii : PathSquare 1 1 p00i p00i) (si1i : PathSquare p00i p11i 1 1) (X1 : sq_concat_h (...) (...) = si1i) => match ...^ as p0 in ... return ... with | 1%path => fun ... ... ... => ... ... end end s1ii si1i X1 end s0ii si1i X0 end s1ii (sq_G1 (sq_G1^-1 si0i)) X) (ap (fun x2 : p11i = p10i => match p10i as p in (_ = a) return (forall px1 : a = x0, 1 @ p11i = p @ px1 -> PathSquare 1 px1 p p11i) with | 1 => fun px1 : x = x0 => match p11i as p in (...) return (...) with | 1 => fun (px2 : ...) (e : ...) => ... ... end e end px1 end 1 ((concat_1p p11i @ x2) @ (concat_p1 p10i)^)) (inv_V ((concat_1p p11i)^ @ (match s1ii in (@PathSquare _ a00 a10 a01 a11 p p0 p1 p2) return (... = ...) with | @sq_id _ x => 1 end @ ((concat_p1 p10i)^)^))) @ (ap (match p10i as p in (_ = a) return (forall px1 : a = x0, ... = ... -> PathSquare 1 px1 p p11i) with | 1 => fun px1 : x = x0 => match p11i as p in ... return ... with | 1 => fun ... ... => ... e end px1 end 1) (ap (fun r : 1 @ p11i = p10i => r @ (concat_p1 p10i)^) (concat_p_Vp (concat_1p p11i) (match ... ... with | ... => 1 end @ ((concat_p1 p10i)^)^)) @ concat_pV_p match s1ii in (@PathSquare _ a00 a10 a01 a11 p p0 p1 p2) return (p @ p2 = p1 @ p0) with | @sq_id _ x => 1 end (concat_p1 p10i)^) @ match s1ii as p3 in (@PathSquare _ a00 a10 a01 a11 p p0 p1 p2) return (match p1 as p4 in ... return ... with | 1 => fun ... => ... px1 end p0 match p3 in ... return ... with | @sq_id _ x => 1 end = p3) with | @sq_id _ x => 1 end))^) (ap (fun x2 : p01i = p00i => match p00i as p in (_ = a) return (forall px1 : a = x0, 1 @ p01i = p @ px1 -> PathSquare 1 px1 p p01i) with | 1 => fun px1 : x = x0 => match p01i as p in (_ = a) return (forall px2 : ..., ... -> ...) with | 1 => fun (px2 : x = x) (e : 1 = 1 @ px2) => match ... ... with | ... => ... => 1%square end e end px1 end 1 ((concat_1p p01i @ x2) @ (concat_p1 p00i)^)) (inv_V ((concat_1p p01i)^ @ (match s0ii in (@PathSquare _ a00 a10 a01 a11 p p0 p1 p2) return (p @ p2 = p1 @ p0) with | @sq_id _ x => 1 end @ ((concat_p1 p00i)^)^))) @ (ap (match p00i as p in (_ = a) return (forall px1 : a = x0, 1 @ p01i = p @ px1 -> PathSquare 1 px1 p p01i) with | 1 => fun px1 : x = x0 => match p01i as p in (_ = a) return (forall ..., ...) with | 1 => fun (px2 : x = x) (e : 1 = ...) => match ... with | ... ... end e end px1 end 1) (ap (fun r : 1 @ p01i = p00i => r @ (concat_p1 p00i)^) (concat_p_Vp (concat_1p p01i) (match s0ii in (@PathSquare _ a00 a10 a01 a11 p p0 p1 p2) return (...) with | @sq_id _ x => 1 end @ ((concat_p1 p00i)^)^)) @ concat_pV_p match s0ii in (@PathSquare _ a00 a10 a01 a11 p p0 p1 p2) return (p @ p2 = p1 @ p0) with | @sq_id _ x => 1 end (concat_p1 p00i)^) @ match s0ii as p3 in (@PathSquare _ a00 a10 a01 a11 p p0 p1 p2) return (match p1 as p4 in (_ = a) return (forall ..., ...) with | 1 => fun px1 : a00 = a11 => match ... with | ... ... end px1 end p0 match p3 in (@PathSquare _ a02 a12 a03 a13 p4 p5 p6 p7) return (... = ...) with | @sq_id _ x => 1 end = p3) with | @sq_id _ x => 1 end))^) (ap (fun e : p00i @ 1 = 1 @ p10i => match e @ concat_1p p10i in (_ = p) return (p00i @ 1 = 1 @ p -> PathSquare p00i p 1 1) with | 1 => fun e0 : p00i @ 1 = 1 @ (p00i @ 1) => match p00i as p in (_ = a) return (p @ 1 = 1 @ (...) -> PathSquare p (p @ 1) 1 1) with | 1 => fun _ : 1 = 1 => 1%square end e0 end e) (ap (fun r : p00i @ 1 = p10i => r @ (concat_1p p10i)^) (concat_p_Vp (concat_p1 p00i) (match sq_G1 (sq_G1^-1 si0i) in (@PathSquare _ a00 a10 a01 a11 p p0 p1 p2) return (p @ p2 = p1 @ p0) with | @sq_id _ x => 1 end @ ((concat_1p p10i)^)^)) @ concat_pV_p match sq_G1 (sq_G1^-1 si0i) in (@PathSquare _ a00 a10 a01 a11 p p0 p1 p2) return (p @ p2 = p1 @ p0) with | @sq_id _ x => 1 end (concat_1p p10i)^) @ match sq_G1 (sq_G1^-1 si0i) as p3 in (@PathSquare _ a00 a10 a01 a11 p p0 p1 p2) return (match p1 as p4 in (_ = a) return (forall px1 : a = a11, p @ p2 = p4 @ px1 -> PathSquare p px1 p4 p2) with | 1 => fun px1 : a00 = a11 => match p2 as p4 in (_ = a) return (forall ..., ...) with | 1 => fun (px2 : a00 = a10) (e : ... = ...) => match ... with | ... ... end e end px1 end p0 match p3 in (@PathSquare _ a02 a12 a03 a13 p4 p5 p6 p7) return (p4 @ p7 = p6 @ p5) with | @sq_id _ x => 1 end = p3) with | @sq_id _ x => 1 end)^ x1 in (@PathCube _ x000 x010 x100 x110 x001 x011 x101 x111 p0i0 p1i0 pi00 pi10 p0i1 p1i1 pi01 pi11 p00i p01i p10i p11i s0ii s1ii sii0 sii1 si0i si1i) return (sq_concat_h (PathSquare.tr (fv s0ii)) (sq_concat_h si0i (PathSquare.tr s1ii)) = match moveL_Vp (pi00 @ p1i0) pi10 p0i0 match sii0 in (@PathSquare _ a00 a10 a01 a11 p p0 p1 p2) return (p @ p2 = p1 @ p0) with | @sq_id _ x => 1 end in (_ = p) return (PathSquare p01i p11i pi10 pi11 <~> PathSquare p01i p11i p (p0i1^ @ (pi01 @ p1i1))) with | 1%path => match moveL_Vp (pi01 @ p1i1) pi11 p0i1 match sii1 in (@PathSquare _ a00 a10 a01 a11 p p0 p1 p2) return (p @ p2 = p1 @ p0) with | @sq_id _ x => 1 end in (_ = p) return (PathSquare p01i p11i pi10 pi11 <~> PathSquare p01i p11i pi10 p) with | 1%path => 1%equiv end end si1i) with | idcube x => 1%path end) == idmap
A: Type
x, x0: A
p00i, p01i, p10i, p11i: x = x0
s0ii: PathSquare 1 1 p00i p01i
s1ii: PathSquare 1 1 p10i p11i
si0i: PathSquare p00i p10i 1 1
si1i: PathSquare p01i p11i 1 1

(fun x1 : sq_concat_h (PathSquare.tr (match p01i as p in (_ = a) return (forall px1 : a = x0, 1 @ p00i = p @ px1 -> PathSquare 1 px1 p p00i) with | 1%path => fun px1 : x = x0 => match p00i as p in (_ = a) return (forall px2 : x = a, 1 @ p = 1 @ px2 -> PathSquare 1 px2 1 p) with | 1%path => fun (px2 : x = x) (e : 1%path = 1 @ px2) => match e @ concat_1p px2 in (_ = p) return (1%path = 1 @ p -> PathSquare 1 p 1 1) with | 1%path => fun _ : 1%path = 1%path => 1 end e end px1 end 1%path ((concat_1p p00i @ ((((concat_1p p01i)^ @ (match sq_1G (...) in (@PathSquare _ a00 a10 a01 a11 p p0 p1 p2) return (... = ...) with | @sq_id _ x => 1 end @ ((concat_p1 p00i)^)^))^)^)^) @ (concat_p1 p01i)^))) (sq_concat_h (sq_G1 (sq_G1^-1 si0i)) (PathSquare.tr s1ii)) = si1i => match internal_paths_rew_r (fun si0i : PathSquare p00i p10i 1 1 => sq_concat_h (PathSquare.tr (match p01i as p in (_ = a) return (forall px1 : a = x0, 1 @ p00i = p @ px1 -> PathSquare 1 px1 p p00i) with | 1%path => fun px1 : x = x0 => match p00i as p in (_ = a) return (forall ..., ...) with | 1%path => fun (px2 : x = x) (e : 1%path = ...) => match ... with | ... ... end e end px1 end 1%path ((concat_1p p00i @ ((((concat_1p p01i)^ @ (... @ ...^))^)^)^) @ (concat_p1 p01i)^))) (sq_concat_h si0i (PathSquare.tr s1ii)) = si1i -> PathCube (sq_1G (sq_1G^-1 s0ii)) s1ii 1 1 si0i si1i) (internal_paths_rew_r (fun s0ii : PathSquare 1 1 p00i p01i => sq_concat_h (PathSquare.tr (match p01i as p in (_ = a) return (forall px1 : a = x0, ... = ... -> PathSquare 1 px1 p p00i) with | 1%path => fun px1 : x = x0 => match p00i as p in ... return ... with | 1%path => fun ... ... => ... e end px1 end 1%path ((concat_1p p00i @ (((...^ @ ...)^)^)^) @ (concat_p1 p01i)^))) (sq_concat_h (match ((...) @ (...)^) @ concat_1p p10i in (_ = p) return (p00i @ 1 = 1 @ p -> PathSquare p00i p 1 1) with | 1%path => fun e : p00i @ 1 = 1 @ (...) => match p00i as p in ... return ... with | 1%path => fun ... => 1 end e end ((concat_p1 p00i @ ((concat_p1 p00i)^ @ (... @ ...^))) @ (concat_1p p10i)^)) (PathSquare.tr s1ii)) = si1i -> PathCube s0ii s1ii 1 1 (match ((concat_p1 p00i @ (...^ @ ...)) @ (concat_1p p10i)^) @ concat_1p p10i in (_ = p) return (p00i @ 1 = 1 @ p -> PathSquare p00i p 1 1) with | 1%path => fun e : p00i @ 1 = 1 @ (p00i @ 1) => match p00i as p in (_ = a) return (... = ... -> PathSquare p ... 1 1) with | 1%path => fun _ : 1%path = 1%path => 1 end e end ((concat_p1 p00i @ ((concat_p1 p00i)^ @ (match ... ... with | ... => 1 end @ ((concat_1p p10i)^)^))) @ (concat_1p p10i)^)) si1i) (internal_paths_rew_r (fun s1ii : PathSquare 1 1 p10i p11i => sq_concat_h (PathSquare.tr (match p01i as p in (_ = a) return (forall ..., ...) with | 1%path => fun px1 : x = x0 => match ... with | ... ... end px1 end 1%path ((concat_1p p00i @ ((...^)^)^) @ (concat_p1 p01i)^))) (sq_concat_h (match (...) @ concat_1p p10i in (_ = p) return (... -> ...) with | 1%path => fun e : ... = ... => match ... with | ... ... end e end ((concat_p1 p00i @ (...^ @ ...)) @ (concat_1p p10i)^)) (PathSquare.tr s1ii)) = si1i -> PathCube (match p00i as p in (_ = a) return (forall px1 : a = x0, 1 @ p01i = p @ px1 -> PathSquare 1 px1 p p01i) with | 1%path => fun px1 : x = x0 => match p01i as p in (...) return (...) with | 1%path => fun (px2 : ...) (e : ...) => ... ... end e end px1 end 1%path ((concat_1p p01i @ (((concat_1p p01i)^ @ (... @ ...^))^)^) @ (concat_p1 p00i)^)) s1ii 1 1 (match ((... @ ...) @ (concat_1p p10i)^) @ concat_1p p10i in (_ = p) return (p00i @ 1 = 1 @ p -> PathSquare p00i p 1 1) with | 1%path => fun e : p00i @ 1 = 1 @ (p00i @ 1) => match p00i as p in (...) return (...) with | 1%path => fun _ : ... => 1 end e end ((concat_p1 p00i @ ((concat_p1 p00i)^ @ (... ... end @ (...^)^))) @ (concat_1p p10i)^)) si1i) (fun X : sq_concat_h (PathSquare.tr (match p01i as p in (...) return (...) with | 1%path => fun px1 : ... => ... ... end px1 end 1%path ((concat_1p p00i @ (...^)^) @ (concat_p1 p01i)^))) (sq_concat_h (match ... @ ... in (...) return (...) with | 1%path => fun e : ... => ... ... end e end ((concat_p1 p00i @ (...)) @ (concat_1p p10i)^)) (PathSquare.tr (match ... ... with | ... => ... => ... end 1%path ((...) @ (...)^)))) = si1i => match (concat_p1 p00i)^ @ (match sq_G1 ... in (@PathSquare _ a00 a10 a01 a11 p p0 p1 p2) return (...) with | @sq_id _ x => 1 end @ ((concat_1p p10i)^)^) as p0 in (_ = p) return (forall s1ii : PathSquare 1 1 p p11i, PathSquare p00i p 1 1 -> sq_concat_h (PathSquare.tr ...) (sq_concat_h ... ...) = si1i -> PathCube (... ... end 1%path (...)) (... ... end 1%path (...)) 1 1 (... ... end (...)) si1i) with | 1%path => fun (s1ii : PathSquare 1 1 p00i p11i) (si0i : PathSquare p00i p00i 1 1) (X0 : sq_concat_h (PathSquare.tr (... ... end 1%path (...))) (sq_concat_h (... ... end (...)) (PathSquare.tr (...))) = si1i) => match ((concat_1p p01i)^ @ (... @ ...^))^ as p0 in (_ = p) return (PathSquare 1 1 p00i p -> forall si1i : ..., ... -> ...) with | 1%path => fun (s0ii : PathSquare 1 1 p00i p00i) (si1i : PathSquare p00i p11i 1 1) (X1 : sq_concat_h (...) (...) = si1i) => match ...^ as p0 in ... return ... with | 1%path => fun ... ... ... => ... ... end end s1ii si1i X1 end (sq_1G (sq_1G^-1 s0ii)) si1i X0 end s1ii (sq_G1 (sq_G1^-1 si0i)) X) (ap (fun x2 : p11i = p10i => match p10i as p in (_ = a) return (forall px1 : a = x0, 1 @ p11i = p @ px1 -> PathSquare 1 px1 p p11i) with | 1 => fun px1 : x = x0 => match p11i as p in (...) return (...) with | 1 => fun (px2 : ...) (e : ...) => ... ... end e end px1 end 1 ((concat_1p p11i @ x2) @ (concat_p1 p10i)^)) (inv_V ((concat_1p p11i)^ @ (match s1ii in (@PathSquare _ a00 a10 a01 a11 p p0 p1 p2) return (... = ...) with | @sq_id _ x => 1 end @ ((concat_p1 p10i)^)^))) @ (ap (match p10i as p in (_ = a) return (forall px1 : a = x0, ... = ... -> PathSquare 1 px1 p p11i) with | 1 => fun px1 : x = x0 => match p11i as p in ... return ... with | 1 => fun ... ... => ... e end px1 end 1) (ap (fun r : 1 @ p11i = p10i => r @ (concat_p1 p10i)^) (concat_p_Vp (concat_1p p11i) (match ... ... with | ... => 1 end @ ((concat_p1 p10i)^)^)) @ concat_pV_p match s1ii in (@PathSquare _ a00 a10 a01 a11 p p0 p1 p2) return (p @ p2 = p1 @ p0) with | @sq_id _ x => 1 end (concat_p1 p10i)^) @ match s1ii as p3 in (@PathSquare _ a00 a10 a01 a11 p p0 p1 p2) return (match p1 as p4 in ... return ... with | 1 => fun ... => ... px1 end p0 match p3 in ... return ... with | @sq_id _ x => 1 end = p3) with | @sq_id _ x => 1 end))^) (ap (fun x2 : p01i = p00i => match p00i as p in (_ = a) return (forall px1 : a = x0, 1 @ p01i = p @ px1 -> PathSquare 1 px1 p p01i) with | 1 => fun px1 : x = x0 => match p01i as p in (_ = a) return (forall px2 : ..., ... -> ...) with | 1 => fun (px2 : x = x) (e : 1 = 1 @ px2) => match ... ... with | ... => ... => 1%square end e end px1 end 1 ((concat_1p p01i @ x2) @ (concat_p1 p00i)^)) (inv_V ((concat_1p p01i)^ @ (match sq_1G (sq_1G^-1 s0ii) in (@PathSquare _ a00 a10 a01 a11 p p0 p1 p2) return (p @ p2 = p1 @ p0) with | @sq_id _ x => 1 end @ ((concat_p1 p00i)^)^))) @ (ap (match p00i as p in (_ = a) return (forall px1 : a = x0, 1 @ p01i = p @ px1 -> PathSquare 1 px1 p p01i) with | 1 => fun px1 : x = x0 => match p01i as p in (_ = a) return (forall ..., ...) with | 1 => fun (px2 : x = x) (e : 1 = ...) => match ... with | ... ... end e end px1 end 1) (ap (fun r : 1 @ p01i = p00i => r @ (concat_p1 p00i)^) (concat_p_Vp (concat_1p p01i) (match sq_1G ... in (@PathSquare _ a00 a10 a01 a11 p p0 p1 p2) return (...) with | @sq_id _ x => 1 end @ ((concat_p1 p00i)^)^)) @ concat_pV_p match sq_1G (sq_1G^-1 s0ii) in (@PathSquare _ a00 a10 a01 a11 p p0 p1 p2) return (p @ p2 = p1 @ p0) with | @sq_id _ x => 1 end (concat_p1 p00i)^) @ match sq_1G (sq_1G^-1 s0ii) as p3 in (@PathSquare _ a00 a10 a01 a11 p p0 p1 p2) return (match p1 as p4 in (_ = a) return (forall ..., ...) with | 1 => fun px1 : a00 = a11 => match ... with | ... ... end px1 end p0 match p3 in (@PathSquare _ a02 a12 a03 a13 p4 p5 p6 p7) return (... = ...) with | @sq_id _ x => 1 end = p3) with | @sq_id _ x => 1 end))^) (ap (fun e : p00i @ 1 = 1 @ p10i => match e @ concat_1p p10i in (_ = p) return (p00i @ 1 = 1 @ p -> PathSquare p00i p 1 1) with | 1 => fun e0 : p00i @ 1 = 1 @ (p00i @ 1) => match p00i as p in (_ = a) return (p @ 1 = 1 @ (...) -> PathSquare p (p @ 1) 1 1) with | 1 => fun _ : 1 = 1 => 1%square end e0 end e) (ap (fun r : p00i @ 1 = p10i => r @ (concat_1p p10i)^) (concat_p_Vp (concat_p1 p00i) (match sq_G1 (sq_G1^-1 si0i) in (@PathSquare _ a00 a10 a01 a11 p p0 p1 p2) return (p @ p2 = p1 @ p0) with | @sq_id _ x => 1 end @ ((concat_1p p10i)^)^)) @ concat_pV_p match sq_G1 (sq_G1^-1 si0i) in (@PathSquare _ a00 a10 a01 a11 p p0 p1 p2) return (p @ p2 = p1 @ p0) with | @sq_id _ x => 1 end (concat_1p p10i)^) @ match sq_G1 (sq_G1^-1 si0i) as p3 in (@PathSquare _ a00 a10 a01 a11 p p0 p1 p2) return (match p1 as p4 in (_ = a) return (forall px1 : a = a11, p @ p2 = p4 @ px1 -> PathSquare p px1 p4 p2) with | 1 => fun px1 : a00 = a11 => match p2 as p4 in (_ = a) return (forall ..., ...) with | 1 => fun (px2 : a00 = a10) (e : ... = ...) => match ... with | ... ... end e end px1 end p0 match p3 in (@PathSquare _ a02 a12 a03 a13 p4 p5 p6 p7) return (p4 @ p7 = p6 @ p5) with | @sq_id _ x => 1 end = p3) with | @sq_id _ x => 1 end)^ x1 in (@PathCube _ x000 x010 x100 x110 x001 x011 x101 x111 p0i0 p1i0 pi00 pi10 p0i1 p1i1 pi01 pi11 p00i p01i p10i p11i s0ii s1ii sii0 sii1 si0i si1i) return (sq_concat_h (PathSquare.tr (fv s0ii)) (sq_concat_h si0i (PathSquare.tr s1ii)) = match moveL_Vp (pi00 @ p1i0) pi10 p0i0 match sii0 in (@PathSquare _ a00 a10 a01 a11 p p0 p1 p2) return (p @ p2 = p1 @ p0) with | @sq_id _ x => 1 end in (_ = p) return (PathSquare p01i p11i pi10 pi11 <~> PathSquare p01i p11i p (p0i1^ @ (pi01 @ p1i1))) with | 1%path => match moveL_Vp (pi01 @ p1i1) pi11 p0i1 match sii1 in (@PathSquare _ a00 a10 a01 a11 p p0 p1 p2) return (p @ p2 = p1 @ p0) with | @sq_id _ x => 1 end in (_ = p) return (PathSquare p01i p11i pi10 pi11 <~> PathSquare p01i p11i pi10 p) with | 1%path => 1%equiv end end si1i) with | idcube x => 1%path end) == idmap
A: Type
x, x0: A
p00i, p01i, p10i, p11i: x = x0
s0ii: PathSquare 1 1 p00i p01i
s1ii: PathSquare 1 1 p10i p11i
si0i: PathSquare p00i p10i 1 1
si1i: PathSquare p01i p11i 1 1

(fun x1 : sq_concat_h (PathSquare.tr (match p01i as p in (_ = a) return (forall px1 : a = x0, 1 @ p00i = p @ px1 -> PathSquare 1 px1 p p00i) with | 1%path => fun px1 : x = x0 => match p00i as p in (_ = a) return (forall px2 : x = a, 1 @ p = 1 @ px2 -> PathSquare 1 px2 1 p) with | 1%path => fun (px2 : x = x) (e : 1%path = 1 @ px2) => match e @ concat_1p px2 in (_ = p) return (1%path = 1 @ p -> PathSquare 1 p 1 1) with | 1%path => fun _ : 1%path = 1%path => 1 end e end px1 end 1%path ((concat_1p p00i @ ((((concat_1p p01i)^ @ (match sq_1G (...) in (@PathSquare _ a00 a10 a01 a11 p p0 p1 p2) return (... = ...) with | @sq_id _ x => 1 end @ ((concat_p1 p00i)^)^))^)^)^) @ (concat_p1 p01i)^))) (sq_concat_h (sq_G1 (sq_G1^-1 si0i)) (PathSquare.tr (sq_1G (sq_1G^-1 s1ii)))) = si1i => match internal_paths_rew_r (fun si0i : PathSquare p00i p10i 1 1 => sq_concat_h (PathSquare.tr (match p01i as p in (_ = a) return (forall px1 : a = x0, 1 @ p00i = p @ px1 -> PathSquare 1 px1 p p00i) with | 1%path => fun px1 : x = x0 => match p00i as p in (_ = a) return (forall ..., ...) with | 1%path => fun (px2 : x = x) (e : 1%path = ...) => match ... with | ... ... end e end px1 end 1%path ((concat_1p p00i @ ((((concat_1p p01i)^ @ (... @ ...^))^)^)^) @ (concat_p1 p01i)^))) (sq_concat_h si0i (PathSquare.tr (sq_1G (sq_1G^-1 s1ii)))) = si1i -> PathCube (sq_1G (sq_1G^-1 s0ii)) (sq_1G (sq_1G^-1 s1ii)) 1 1 si0i si1i) (internal_paths_rew_r (fun s0ii : PathSquare 1 1 p00i p01i => sq_concat_h (PathSquare.tr (match p01i as p in (_ = a) return (forall px1 : a = x0, ... = ... -> PathSquare 1 px1 p p00i) with | 1%path => fun px1 : x = x0 => match p00i as p in ... return ... with | 1%path => fun ... ... => ... e end px1 end 1%path ((concat_1p p00i @ (((...^ @ ...)^)^)^) @ (concat_p1 p01i)^))) (sq_concat_h (match ((...) @ (...)^) @ concat_1p p10i in (_ = p) return (p00i @ 1 = 1 @ p -> PathSquare p00i p 1 1) with | 1%path => fun e : p00i @ 1 = 1 @ (...) => match p00i as p in ... return ... with | 1%path => fun ... => 1 end e end ((concat_p1 p00i @ ((concat_p1 p00i)^ @ (... @ ...^))) @ (concat_1p p10i)^)) (PathSquare.tr (sq_1G (sq_1G^-1 s1ii)))) = si1i -> PathCube s0ii (sq_1G (sq_1G^-1 s1ii)) 1 1 (match ((concat_p1 p00i @ (...^ @ ...)) @ (concat_1p p10i)^) @ concat_1p p10i in (_ = p) return (p00i @ 1 = 1 @ p -> PathSquare p00i p 1 1) with | 1%path => fun e : p00i @ 1 = 1 @ (p00i @ 1) => match p00i as p in (_ = a) return (... = ... -> PathSquare p ... 1 1) with | 1%path => fun _ : 1%path = 1%path => 1 end e end ((concat_p1 p00i @ ((concat_p1 p00i)^ @ (match ... ... with | ... => 1 end @ ((concat_1p p10i)^)^))) @ (concat_1p p10i)^)) si1i) (internal_paths_rew_r (fun s1ii : PathSquare 1 1 p10i p11i => sq_concat_h (PathSquare.tr (match p01i as p in (_ = a) return (forall ..., ...) with | 1%path => fun px1 : x = x0 => match ... with | ... ... end px1 end 1%path ((concat_1p p00i @ ((...^)^)^) @ (concat_p1 p01i)^))) (sq_concat_h (match (...) @ concat_1p p10i in (_ = p) return (... -> ...) with | 1%path => fun e : ... = ... => match ... with | ... ... end e end ((concat_p1 p00i @ (...^ @ ...)) @ (concat_1p p10i)^)) (PathSquare.tr s1ii)) = si1i -> PathCube (match p00i as p in (_ = a) return (forall px1 : a = x0, 1 @ p01i = p @ px1 -> PathSquare 1 px1 p p01i) with | 1%path => fun px1 : x = x0 => match p01i as p in (...) return (...) with | 1%path => fun (px2 : ...) (e : ...) => ... ... end e end px1 end 1%path ((concat_1p p01i @ (((concat_1p p01i)^ @ (... @ ...^))^)^) @ (concat_p1 p00i)^)) s1ii 1 1 (match ((... @ ...) @ (concat_1p p10i)^) @ concat_1p p10i in (_ = p) return (p00i @ 1 = 1 @ p -> PathSquare p00i p 1 1) with | 1%path => fun e : p00i @ 1 = 1 @ (p00i @ 1) => match p00i as p in (...) return (...) with | 1%path => fun _ : ... => 1 end e end ((concat_p1 p00i @ ((concat_p1 p00i)^ @ (... ... end @ (...^)^))) @ (concat_1p p10i)^)) si1i) (fun X : sq_concat_h (PathSquare.tr (match p01i as p in (...) return (...) with | 1%path => fun px1 : ... => ... ... end px1 end 1%path ((concat_1p p00i @ (...^)^) @ (concat_p1 p01i)^))) (sq_concat_h (match ... @ ... in (...) return (...) with | 1%path => fun e : ... => ... ... end e end ((concat_p1 p00i @ (...)) @ (concat_1p p10i)^)) (PathSquare.tr (match ... ... with | ... => ... => ... end 1%path ((...) @ (...)^)))) = si1i => match (concat_p1 p00i)^ @ (match sq_G1 ... in (@PathSquare _ a00 a10 a01 a11 p p0 p1 p2) return (...) with | @sq_id _ x => 1 end @ ((concat_1p p10i)^)^) as p0 in (_ = p) return (forall s1ii : PathSquare 1 1 p p11i, PathSquare p00i p 1 1 -> sq_concat_h (PathSquare.tr ...) (sq_concat_h ... ...) = si1i -> PathCube (... ... end 1%path (...)) (... ... end 1%path (...)) 1 1 (... ... end (...)) si1i) with | 1%path => fun (s1ii : PathSquare 1 1 p00i p11i) (si0i : PathSquare p00i p00i 1 1) (X0 : sq_concat_h (PathSquare.tr (... ... end 1%path (...))) (sq_concat_h (... ... end (...)) (PathSquare.tr (...))) = si1i) => match ((concat_1p p01i)^ @ (... @ ...^))^ as p0 in (_ = p) return (PathSquare 1 1 p00i p -> forall si1i : ..., ... -> ...) with | 1%path => fun (s0ii : PathSquare 1 1 p00i p00i) (si1i : PathSquare p00i p11i 1 1) (X1 : sq_concat_h (...) (...) = si1i) => match ...^ as p0 in ... return ... with | 1%path => fun ... ... ... => ... ... end end s1ii si1i X1 end (sq_1G (sq_1G^-1 s0ii)) si1i X0 end (sq_1G (sq_1G^-1 s1ii)) (sq_G1 (sq_G1^-1 si0i)) X) (ap (fun x2 : p11i = p10i => match p10i as p in (_ = a) return (forall px1 : a = x0, 1 @ p11i = p @ px1 -> PathSquare 1 px1 p p11i) with | 1 => fun px1 : x = x0 => match p11i as p in (...) return (...) with | 1 => fun (px2 : ...) (e : ...) => ... ... end e end px1 end 1 ((concat_1p p11i @ x2) @ (concat_p1 p10i)^)) (inv_V ((concat_1p p11i)^ @ (match sq_1G (...) in (@PathSquare _ a00 a10 a01 a11 p p0 p1 p2) return (... = ...) with | @sq_id _ x => 1 end @ ((concat_p1 p10i)^)^))) @ (ap (match p10i as p in (_ = a) return (forall px1 : a = x0, ... = ... -> PathSquare 1 px1 p p11i) with | 1 => fun px1 : x = x0 => match p11i as p in ... return ... with | 1 => fun ... ... => ... e end px1 end 1) (ap (fun r : 1 @ p11i = p10i => r @ (concat_p1 p10i)^) (concat_p_Vp (concat_1p p11i) (match ... ... with | ... => 1 end @ ((concat_p1 p10i)^)^)) @ concat_pV_p match sq_1G (sq_1G^-1 s1ii) in (@PathSquare _ a00 a10 a01 a11 p p0 p1 p2) return (p @ p2 = p1 @ p0) with | @sq_id _ x => 1 end (concat_p1 p10i)^) @ match sq_1G (sq_1G^-1 s1ii) as p3 in (@PathSquare _ a00 a10 a01 a11 p p0 p1 p2) return (match p1 as p4 in ... return ... with | 1 => fun ... => ... px1 end p0 match p3 in ... return ... with | @sq_id _ x => 1 end = p3) with | @sq_id _ x => 1 end))^) (ap (fun x2 : p01i = p00i => match p00i as p in (_ = a) return (forall px1 : a = x0, 1 @ p01i = p @ px1 -> PathSquare 1 px1 p p01i) with | 1 => fun px1 : x = x0 => match p01i as p in (_ = a) return (forall px2 : ..., ... -> ...) with | 1 => fun (px2 : x = x) (e : 1 = 1 @ px2) => match ... ... with | ... => ... => 1%square end e end px1 end 1 ((concat_1p p01i @ x2) @ (concat_p1 p00i)^)) (inv_V ((concat_1p p01i)^ @ (match sq_1G (sq_1G^-1 s0ii) in (@PathSquare _ a00 a10 a01 a11 p p0 p1 p2) return (p @ p2 = p1 @ p0) with | @sq_id _ x => 1 end @ ((concat_p1 p00i)^)^))) @ (ap (match p00i as p in (_ = a) return (forall px1 : a = x0, 1 @ p01i = p @ px1 -> PathSquare 1 px1 p p01i) with | 1 => fun px1 : x = x0 => match p01i as p in (_ = a) return (forall ..., ...) with | 1 => fun (px2 : x = x) (e : 1 = ...) => match ... with | ... ... end e end px1 end 1) (ap (fun r : 1 @ p01i = p00i => r @ (concat_p1 p00i)^) (concat_p_Vp (concat_1p p01i) (match sq_1G ... in (@PathSquare _ a00 a10 a01 a11 p p0 p1 p2) return (...) with | @sq_id _ x => 1 end @ ((concat_p1 p00i)^)^)) @ concat_pV_p match sq_1G (sq_1G^-1 s0ii) in (@PathSquare _ a00 a10 a01 a11 p p0 p1 p2) return (p @ p2 = p1 @ p0) with | @sq_id _ x => 1 end (concat_p1 p00i)^) @ match sq_1G (sq_1G^-1 s0ii) as p3 in (@PathSquare _ a00 a10 a01 a11 p p0 p1 p2) return (match p1 as p4 in (_ = a) return (forall ..., ...) with | 1 => fun px1 : a00 = a11 => match ... with | ... ... end px1 end p0 match p3 in (@PathSquare _ a02 a12 a03 a13 p4 p5 p6 p7) return (... = ...) with | @sq_id _ x => 1 end = p3) with | @sq_id _ x => 1 end))^) (ap (fun e : p00i @ 1 = 1 @ p10i => match e @ concat_1p p10i in (_ = p) return (p00i @ 1 = 1 @ p -> PathSquare p00i p 1 1) with | 1 => fun e0 : p00i @ 1 = 1 @ (p00i @ 1) => match p00i as p in (_ = a) return (p @ 1 = 1 @ (...) -> PathSquare p (p @ 1) 1 1) with | 1 => fun _ : 1 = 1 => 1%square end e0 end e) (ap (fun r : p00i @ 1 = p10i => r @ (concat_1p p10i)^) (concat_p_Vp (concat_p1 p00i) (match sq_G1 (sq_G1^-1 si0i) in (@PathSquare _ a00 a10 a01 a11 p p0 p1 p2) return (p @ p2 = p1 @ p0) with | @sq_id _ x => 1 end @ ((concat_1p p10i)^)^)) @ concat_pV_p match sq_G1 (sq_G1^-1 si0i) in (@PathSquare _ a00 a10 a01 a11 p p0 p1 p2) return (p @ p2 = p1 @ p0) with | @sq_id _ x => 1 end (concat_1p p10i)^) @ match sq_G1 (sq_G1^-1 si0i) as p3 in (@PathSquare _ a00 a10 a01 a11 p p0 p1 p2) return (match p1 as p4 in (_ = a) return (forall px1 : a = a11, p @ p2 = p4 @ px1 -> PathSquare p px1 p4 p2) with | 1 => fun px1 : a00 = a11 => match p2 as p4 in (_ = a) return (forall ..., ...) with | 1 => fun (px2 : a00 = a10) (e : ... = ...) => match ... with | ... ... end e end px1 end p0 match p3 in (@PathSquare _ a02 a12 a03 a13 p4 p5 p6 p7) return (p4 @ p7 = p6 @ p5) with | @sq_id _ x => 1 end = p3) with | @sq_id _ x => 1 end)^ x1 in (@PathCube _ x000 x010 x100 x110 x001 x011 x101 x111 p0i0 p1i0 pi00 pi10 p0i1 p1i1 pi01 pi11 p00i p01i p10i p11i s0ii s1ii sii0 sii1 si0i si1i) return (sq_concat_h (PathSquare.tr (fv s0ii)) (sq_concat_h si0i (PathSquare.tr s1ii)) = match moveL_Vp (pi00 @ p1i0) pi10 p0i0 match sii0 in (@PathSquare _ a00 a10 a01 a11 p p0 p1 p2) return (p @ p2 = p1 @ p0) with | @sq_id _ x => 1 end in (_ = p) return (PathSquare p01i p11i pi10 pi11 <~> PathSquare p01i p11i p (p0i1^ @ (pi01 @ p1i1))) with | 1%path => match moveL_Vp (pi01 @ p1i1) pi11 p0i1 match sii1 in (@PathSquare _ a00 a10 a01 a11 p p0 p1 p2) return (p @ p2 = p1 @ p0) with | @sq_id _ x => 1 end in (_ = p) return (PathSquare p01i p11i pi10 pi11 <~> PathSquare p01i p11i pi10 p) with | 1%path => 1%equiv end end si1i) with | idcube x => 1%path end) == idmap
A: Type
x, x0: A
p00i, p01i, p11i: x = x0
s0ii: PathSquare 1 1 p00i p01i
s1ii: PathSquare 1 1 p00i p11i
si0i: PathSquare p00i p00i 1 1
si1i: PathSquare p01i p11i 1 1

(fun x1 : sq_concat_h (PathSquare.tr (match p01i as p in (_ = a) return (forall px1 : a = x0, 1 @ p00i = p @ px1 -> PathSquare 1 px1 p p00i) with | 1%path => fun px1 : x = x0 => match p00i as p in (_ = a) return (forall px2 : x = a, 1 @ p = 1 @ px2 -> PathSquare 1 px2 1 p) with | 1%path => fun (px2 : x = x) (e : 1%path = 1 @ px2) => match e @ concat_1p px2 in (_ = p) return (1%path = 1 @ p -> PathSquare 1 p 1 1) with | 1%path => fun _ : 1%path = 1%path => 1 end e end px1 end 1%path ((concat_1p p00i @ ((((concat_1p p01i)^ @ (match sq_1G (...) in (@PathSquare _ a00 a10 a01 a11 p p0 p1 p2) return (... = ...) with | @sq_id _ x => 1 end @ ((concat_p1 p00i)^)^))^)^)^) @ (concat_p1 p01i)^))) (sq_concat_h (sq_G1 1%path) (PathSquare.tr (sq_1G (sq_1G^-1 s1ii)))) = si1i => match internal_paths_rew_r (fun si0i : PathSquare p00i p00i 1 1 => sq_concat_h (PathSquare.tr (match p01i as p in (_ = a) return (forall px1 : a = x0, 1 @ p00i = p @ px1 -> PathSquare 1 px1 p p00i) with | 1%path => fun px1 : x = x0 => match p00i as p in (_ = a) return (forall ..., ...) with | 1%path => fun (px2 : x = x) (e : 1%path = ...) => match ... with | ... ... end e end px1 end 1%path ((concat_1p p00i @ ((((concat_1p p01i)^ @ (... @ ...^))^)^)^) @ (concat_p1 p01i)^))) (sq_concat_h si0i (PathSquare.tr (sq_1G (sq_1G^-1 s1ii)))) = si1i -> PathCube (sq_1G (sq_1G^-1 s0ii)) (sq_1G (sq_1G^-1 s1ii)) 1 1 si0i si1i) (internal_paths_rew_r (fun s0ii : PathSquare 1 1 p00i p01i => sq_concat_h (PathSquare.tr (match p01i as p in (_ = a) return (forall px1 : a = x0, ... = ... -> PathSquare 1 px1 p p00i) with | 1%path => fun px1 : x = x0 => match p00i as p in ... return ... with | 1%path => fun ... ... => ... e end px1 end 1%path ((concat_1p p00i @ (((...^ @ ...)^)^)^) @ (concat_p1 p01i)^))) (sq_concat_h (match ((...) @ (...)^) @ concat_1p p00i in (_ = p) return (p00i @ 1 = 1 @ p -> PathSquare p00i p 1 1) with | 1%path => fun e : p00i @ 1 = 1 @ (...) => match p00i as p in ... return ... with | 1%path => fun ... => 1 end e end ((concat_p1 p00i @ ((concat_p1 p00i)^ @ (... @ ...^))) @ (concat_1p p00i)^)) (PathSquare.tr (sq_1G (sq_1G^-1 s1ii)))) = si1i -> PathCube s0ii (sq_1G (sq_1G^-1 s1ii)) 1 1 (match ((concat_p1 p00i @ (...^ @ ...)) @ (concat_1p p00i)^) @ concat_1p p00i in (_ = p) return (p00i @ 1 = 1 @ p -> PathSquare p00i p 1 1) with | 1%path => fun e : p00i @ 1 = 1 @ (p00i @ 1) => match p00i as p in (_ = a) return (... = ... -> PathSquare p ... 1 1) with | 1%path => fun _ : 1%path = 1%path => 1 end e end ((concat_p1 p00i @ ((concat_p1 p00i)^ @ (match ... ... with | ... => 1 end @ ((concat_1p p00i)^)^))) @ (concat_1p p00i)^)) si1i) (internal_paths_rew_r (fun s1ii : PathSquare 1 1 p00i p11i => sq_concat_h (PathSquare.tr (match p01i as p in (_ = a) return (forall ..., ...) with | 1%path => fun px1 : x = x0 => match ... with | ... ... end px1 end 1%path ((concat_1p p00i @ ((...^)^)^) @ (concat_p1 p01i)^))) (sq_concat_h (match (...) @ concat_1p p00i in (_ = p) return (... -> ...) with | 1%path => fun e : ... = ... => match ... with | ... ... end e end ((concat_p1 p00i @ (...^ @ ...)) @ (concat_1p p00i)^)) (PathSquare.tr s1ii)) = si1i -> PathCube (match p00i as p in (_ = a) return (forall px1 : a = x0, 1 @ p01i = p @ px1 -> PathSquare 1 px1 p p01i) with | 1%path => fun px1 : x = x0 => match p01i as p in (...) return (...) with | 1%path => fun (px2 : ...) (e : ...) => ... ... end e end px1 end 1%path ((concat_1p p01i @ (((concat_1p p01i)^ @ (... @ ...^))^)^) @ (concat_p1 p00i)^)) s1ii 1 1 (match ((... @ ...) @ (concat_1p p00i)^) @ concat_1p p00i in (_ = p) return (p00i @ 1 = 1 @ p -> PathSquare p00i p 1 1) with | 1%path => fun e : p00i @ 1 = 1 @ (p00i @ 1) => match p00i as p in (...) return (...) with | 1%path => fun _ : ... => 1 end e end ((concat_p1 p00i @ ((concat_p1 p00i)^ @ (... ... end @ (...^)^))) @ (concat_1p p00i)^)) si1i) (fun X : sq_concat_h (PathSquare.tr (match p01i as p in (...) return (...) with | 1%path => fun px1 : ... => ... ... end px1 end 1%path ((concat_1p p00i @ (...^)^) @ (concat_p1 p01i)^))) (sq_concat_h (match ... @ ... in (...) return (...) with | 1%path => fun e : ... => ... ... end e end ((concat_p1 p00i @ (...)) @ (concat_1p p00i)^)) (PathSquare.tr (match ... ... with | ... => ... => ... end 1%path ((...) @ (...)^)))) = si1i => match (concat_p1 p00i)^ @ (match sq_G1 1 in (@PathSquare _ a00 a10 a01 a11 p p0 p1 p2) return (...) with | @sq_id _ x => 1 end @ ((concat_1p p00i)^)^) as p0 in (_ = p) return (forall s1ii : PathSquare 1 1 p p11i, PathSquare p00i p 1 1 -> sq_concat_h (PathSquare.tr ...) (sq_concat_h ... ...) = si1i -> PathCube (... ... end 1%path (...)) (... ... end 1%path (...)) 1 1 (... ... end (...)) si1i) with | 1%path => fun (s1ii : PathSquare 1 1 p00i p11i) (si0i : PathSquare p00i p00i 1 1) (X0 : sq_concat_h (PathSquare.tr (... ... end 1%path (...))) (sq_concat_h (... ... end (...)) (PathSquare.tr (...))) = si1i) => match ((concat_1p p01i)^ @ (... @ ...^))^ as p0 in (_ = p) return (PathSquare 1 1 p00i p -> forall si1i : ..., ... -> ...) with | 1%path => fun (s0ii : PathSquare 1 1 p00i p00i) (si1i : PathSquare p00i p11i 1 1) (X1 : sq_concat_h (...) (...) = si1i) => match ...^ as p0 in ... return ... with | 1%path => fun ... ... ... => ... ... end end s1ii si1i X1 end (sq_1G (sq_1G^-1 s0ii)) si1i X0 end (sq_1G (sq_1G^-1 s1ii)) (sq_G1 1%path) X) (ap (fun x2 : p11i = p00i => match p00i as p in (_ = a) return (forall px1 : a = x0, 1 @ p11i = p @ px1 -> PathSquare 1 px1 p p11i) with | 1 => fun px1 : x = x0 => match p11i as p in (...) return (...) with | 1 => fun (px2 : ...) (e : ...) => ... ... end e end px1 end 1 ((concat_1p p11i @ x2) @ (concat_p1 p00i)^)) (inv_V ((concat_1p p11i)^ @ (match sq_1G (...) in (@PathSquare _ a00 a10 a01 a11 p p0 p1 p2) return (... = ...) with | @sq_id _ x => 1 end @ ((concat_p1 p00i)^)^))) @ (ap (match p00i as p in (_ = a) return (forall px1 : a = x0, ... = ... -> PathSquare 1 px1 p p11i) with | 1 => fun px1 : x = x0 => match p11i as p in ... return ... with | 1 => fun ... ... => ... e end px1 end 1) (ap (fun r : 1 @ p11i = p00i => r @ (concat_p1 p00i)^) (concat_p_Vp (concat_1p p11i) (match ... ... with | ... => 1 end @ ((concat_p1 p00i)^)^)) @ concat_pV_p match sq_1G (sq_1G^-1 s1ii) in (@PathSquare _ a00 a10 a01 a11 p p0 p1 p2) return (p @ p2 = p1 @ p0) with | @sq_id _ x => 1 end (concat_p1 p00i)^) @ match sq_1G (sq_1G^-1 s1ii) as p3 in (@PathSquare _ a00 a10 a01 a11 p p0 p1 p2) return (match p1 as p4 in ... return ... with | 1 => fun ... => ... px1 end p0 match p3 in ... return ... with | @sq_id _ x => 1 end = p3) with | @sq_id _ x => 1 end))^) (ap (fun x2 : p01i = p00i => match p00i as p in (_ = a) return (forall px1 : a = x0, 1 @ p01i = p @ px1 -> PathSquare 1 px1 p p01i) with | 1 => fun px1 : x = x0 => match p01i as p in (_ = a) return (forall px2 : ..., ... -> ...) with | 1 => fun (px2 : x = x) (e : 1 = 1 @ px2) => match ... ... with | ... => ... => 1%square end e end px1 end 1 ((concat_1p p01i @ x2) @ (concat_p1 p00i)^)) (inv_V ((concat_1p p01i)^ @ (match sq_1G (sq_1G^-1 s0ii) in (@PathSquare _ a00 a10 a01 a11 p p0 p1 p2) return (p @ p2 = p1 @ p0) with | @sq_id _ x => 1 end @ ((concat_p1 p00i)^)^))) @ (ap (match p00i as p in (_ = a) return (forall px1 : a = x0, 1 @ p01i = p @ px1 -> PathSquare 1 px1 p p01i) with | 1 => fun px1 : x = x0 => match p01i as p in (_ = a) return (forall ..., ...) with | 1 => fun (px2 : x = x) (e : 1 = ...) => match ... with | ... ... end e end px1 end 1) (ap (fun r : 1 @ p01i = p00i => r @ (concat_p1 p00i)^) (concat_p_Vp (concat_1p p01i) (match sq_1G ... in (@PathSquare _ a00 a10 a01 a11 p p0 p1 p2) return (...) with | @sq_id _ x => 1 end @ ((concat_p1 p00i)^)^)) @ concat_pV_p match sq_1G (sq_1G^-1 s0ii) in (@PathSquare _ a00 a10 a01 a11 p p0 p1 p2) return (p @ p2 = p1 @ p0) with | @sq_id _ x => 1 end (concat_p1 p00i)^) @ match sq_1G (sq_1G^-1 s0ii) as p3 in (@PathSquare _ a00 a10 a01 a11 p p0 p1 p2) return (match p1 as p4 in (_ = a) return (forall ..., ...) with | 1 => fun px1 : a00 = a11 => match ... with | ... ... end px1 end p0 match p3 in (@PathSquare _ a02 a12 a03 a13 p4 p5 p6 p7) return (... = ...) with | @sq_id _ x => 1 end = p3) with | @sq_id _ x => 1 end))^) (ap (fun e : p00i @ 1 = 1 @ p00i => match e @ concat_1p p00i in (_ = p) return (p00i @ 1 = 1 @ p -> PathSquare p00i p 1 1) with | 1 => fun e0 : p00i @ 1 = 1 @ (p00i @ 1) => match p00i as p in (_ = a) return (p @ 1 = 1 @ (...) -> PathSquare p (p @ 1) 1 1) with | 1 => fun _ : 1 = 1 => 1%square end e0 end e) (ap (fun r : p00i @ 1 = p00i => r @ (concat_1p p00i)^) (concat_p_Vp (concat_p1 p00i) (match sq_G1 1 in (@PathSquare _ a00 a10 a01 a11 p p0 p1 p2) return (p @ p2 = p1 @ p0) with | @sq_id _ x => 1 end @ ((concat_1p p00i)^)^)) @ concat_pV_p match sq_G1 1 in (@PathSquare _ a00 a10 a01 a11 p p0 p1 p2) return (p @ p2 = p1 @ p0) with | @sq_id _ x => 1 end (concat_1p p00i)^) @ match sq_G1 1 as p3 in (@PathSquare _ a00 a10 a01 a11 p p0 p1 p2) return (match p1 as p4 in (_ = a) return (forall px1 : a = a11, p @ p2 = p4 @ px1 -> PathSquare p px1 p4 p2) with | 1 => fun px1 : a00 = a11 => match p2 as p4 in (_ = a) return (forall ..., ...) with | 1 => fun (px2 : a00 = a10) (e : ... = ...) => match ... with | ... ... end e end px1 end p0 match p3 in (@PathSquare _ a02 a12 a03 a13 p4 p5 p6 p7) return (p4 @ p7 = p6 @ p5) with | @sq_id _ x => 1 end = p3) with | @sq_id _ x => 1 end)^ x1 in (@PathCube _ x000 x010 x100 x110 x001 x011 x101 x111 p0i0 p1i0 pi00 pi10 p0i1 p1i1 pi01 pi11 p00i p01i p10i p11i s0ii s1ii sii0 sii1 si0i si1i) return (sq_concat_h (PathSquare.tr (fv s0ii)) (sq_concat_h si0i (PathSquare.tr s1ii)) = match moveL_Vp (pi00 @ p1i0) pi10 p0i0 match sii0 in (@PathSquare _ a00 a10 a01 a11 p p0 p1 p2) return (p @ p2 = p1 @ p0) with | @sq_id _ x => 1 end in (_ = p) return (PathSquare p01i p11i pi10 pi11 <~> PathSquare p01i p11i p (p0i1^ @ (pi01 @ p1i1))) with | 1%path => match moveL_Vp (pi01 @ p1i1) pi11 p0i1 match sii1 in (@PathSquare _ a00 a10 a01 a11 p p0 p1 p2) return (p @ p2 = p1 @ p0) with | @sq_id _ x => 1 end in (_ = p) return (PathSquare p01i p11i pi10 pi11 <~> PathSquare p01i p11i pi10 p) with | 1%path => 1%equiv end end si1i) with | idcube x => 1%path end) == idmap
A: Type
x, x0: A
p00i, p11i: x = x0
s0ii: PathSquare 1 1 p00i p00i
s1ii: PathSquare 1 1 p00i p11i
si0i: PathSquare p00i p00i 1 1
si1i: PathSquare p00i p11i 1 1

(fun x1 : sq_concat_h (PathSquare.tr (match p00i as p in (_ = a) return (forall px1 : a = x0, 1 @ p00i = p @ px1 -> PathSquare 1 px1 p p00i) with | 1%path => fun px1 : x = x0 => match p00i as p in (_ = a) return (forall px2 : x = a, 1 @ p = 1 @ px2 -> PathSquare 1 px2 1 p) with | 1%path => fun (px2 : x = x) (e : 1%path = 1 @ px2) => match e @ concat_1p px2 in (_ = p) return (1%path = 1 @ p -> PathSquare 1 p 1 1) with | 1%path => fun _ : 1%path = 1%path => 1 end e end px1 end 1%path ((concat_1p p00i @ ((((concat_1p p00i)^ @ (match sq_1G 1 in (@PathSquare _ a00 a10 a01 a11 p p0 p1 p2) return (... = ...) with | @sq_id _ x => 1 end @ ((concat_p1 p00i)^)^))^)^)^) @ (concat_p1 p00i)^))) (sq_concat_h (sq_G1 1%path) (PathSquare.tr (sq_1G (sq_1G^-1 s1ii)))) = si1i => match internal_paths_rew_r (fun si0i : PathSquare p00i p00i 1 1 => sq_concat_h (PathSquare.tr (match p00i as p in (_ = a) return (forall px1 : a = x0, 1 @ p00i = p @ px1 -> PathSquare 1 px1 p p00i) with | 1%path => fun px1 : x = x0 => match p00i as p in (_ = a) return (forall ..., ...) with | 1%path => fun (px2 : x = x) (e : 1%path = ...) => match ... with | ... ... end e end px1 end 1%path ((concat_1p p00i @ ((((concat_1p p00i)^ @ (... @ ...^))^)^)^) @ (concat_p1 p00i)^))) (sq_concat_h si0i (PathSquare.tr (sq_1G (sq_1G^-1 s1ii)))) = si1i -> PathCube (sq_1G 1%path) (sq_1G (sq_1G^-1 s1ii)) 1 1 si0i si1i) (internal_paths_rew_r (fun s0ii : PathSquare 1 1 p00i p00i => sq_concat_h (PathSquare.tr (match p00i as p in (_ = a) return (forall px1 : a = x0, ... = ... -> PathSquare 1 px1 p p00i) with | 1%path => fun px1 : x = x0 => match p00i as p in ... return ... with | 1%path => fun ... ... => ... e end px1 end 1%path ((concat_1p p00i @ (((...^ @ ...)^)^)^) @ (concat_p1 p00i)^))) (sq_concat_h (match ((...) @ (...)^) @ concat_1p p00i in (_ = p) return (p00i @ 1 = 1 @ p -> PathSquare p00i p 1 1) with | 1%path => fun e : p00i @ 1 = 1 @ (...) => match p00i as p in ... return ... with | 1%path => fun ... => 1 end e end ((concat_p1 p00i @ ((concat_p1 p00i)^ @ (... @ ...^))) @ (concat_1p p00i)^)) (PathSquare.tr (sq_1G (sq_1G^-1 s1ii)))) = si1i -> PathCube s0ii (sq_1G (sq_1G^-1 s1ii)) 1 1 (match ((concat_p1 p00i @ (...^ @ ...)) @ (concat_1p p00i)^) @ concat_1p p00i in (_ = p) return (p00i @ 1 = 1 @ p -> PathSquare p00i p 1 1) with | 1%path => fun e : p00i @ 1 = 1 @ (p00i @ 1) => match p00i as p in (_ = a) return (... = ... -> PathSquare p ... 1 1) with | 1%path => fun _ : 1%path = 1%path => 1 end e end ((concat_p1 p00i @ ((concat_p1 p00i)^ @ (match ... ... with | ... => 1 end @ ((concat_1p p00i)^)^))) @ (concat_1p p00i)^)) si1i) (internal_paths_rew_r (fun s1ii : PathSquare 1 1 p00i p11i => sq_concat_h (PathSquare.tr (match p00i as p in (_ = a) return (forall ..., ...) with | 1%path => fun px1 : x = x0 => match ... with | ... ... end px1 end 1%path ((concat_1p p00i @ ((...^)^)^) @ (concat_p1 p00i)^))) (sq_concat_h (match (...) @ concat_1p p00i in (_ = p) return (... -> ...) with | 1%path => fun e : ... = ... => match ... with | ... ... end e end ((concat_p1 p00i @ (...^ @ ...)) @ (concat_1p p00i)^)) (PathSquare.tr s1ii)) = si1i -> PathCube (match p00i as p in (_ = a) return (forall px1 : a = x0, 1 @ p00i = p @ px1 -> PathSquare 1 px1 p p00i) with | 1%path => fun px1 : x = x0 => match p00i as p in (...) return (...) with | 1%path => fun (px2 : ...) (e : ...) => ... ... end e end px1 end 1%path ((concat_1p p00i @ (((concat_1p p00i)^ @ (... @ ...^))^)^) @ (concat_p1 p00i)^)) s1ii 1 1 (match ((... @ ...) @ (concat_1p p00i)^) @ concat_1p p00i in (_ = p) return (p00i @ 1 = 1 @ p -> PathSquare p00i p 1 1) with | 1%path => fun e : p00i @ 1 = 1 @ (p00i @ 1) => match p00i as p in (...) return (...) with | 1%path => fun _ : ... => 1 end e end ((concat_p1 p00i @ ((concat_p1 p00i)^ @ (... ... end @ (...^)^))) @ (concat_1p p00i)^)) si1i) (fun X : sq_concat_h (PathSquare.tr (match p00i as p in (...) return (...) with | 1%path => fun px1 : ... => ... ... end px1 end 1%path ((concat_1p p00i @ (...^)^) @ (concat_p1 p00i)^))) (sq_concat_h (match ... @ ... in (...) return (...) with | 1%path => fun e : ... => ... ... end e end ((concat_p1 p00i @ (...)) @ (concat_1p p00i)^)) (PathSquare.tr (match ... ... with | ... => ... => ... end 1%path ((...) @ (...)^)))) = si1i => match (concat_p1 p00i)^ @ (match sq_G1 1 in (@PathSquare _ a00 a10 a01 a11 p p0 p1 p2) return (...) with | @sq_id _ x => 1 end @ ((concat_1p p00i)^)^) as p0 in (_ = p) return (forall s1ii : PathSquare 1 1 p p11i, PathSquare p00i p 1 1 -> sq_concat_h (PathSquare.tr ...) (sq_concat_h ... ...) = si1i -> PathCube (... ... end 1%path (...)) (... ... end 1%path (...)) 1 1 (... ... end (...)) si1i) with | 1%path => fun (s1ii : PathSquare 1 1 p00i p11i) (si0i : PathSquare p00i p00i 1 1) (X0 : sq_concat_h (PathSquare.tr (... ... end 1%path (...))) (sq_concat_h (... ... end (...)) (PathSquare.tr (...))) = si1i) => match ((concat_1p p00i)^ @ (... @ ...^))^ as p0 in (_ = p) return (PathSquare 1 1 p00i p -> forall si1i : ..., ... -> ...) with | 1%path => fun (s0ii : PathSquare 1 1 p00i p00i) (si1i : PathSquare p00i p11i 1 1) (X1 : sq_concat_h (...) (...) = si1i) => match ...^ as p0 in ... return ... with | 1%path => fun ... ... ... => ... ... end end s1ii si1i X1 end (sq_1G 1%path) si1i X0 end (sq_1G (sq_1G^-1 s1ii)) (sq_G1 1%path) X) (ap (fun x2 : p11i = p00i => match p00i as p in (_ = a) return (forall px1 : a = x0, 1 @ p11i = p @ px1 -> PathSquare 1 px1 p p11i) with | 1 => fun px1 : x = x0 => match p11i as p in (...) return (...) with | 1 => fun (px2 : ...) (e : ...) => ... ... end e end px1 end 1 ((concat_1p p11i @ x2) @ (concat_p1 p00i)^)) (inv_V ((concat_1p p11i)^ @ (match sq_1G (...) in (@PathSquare _ a00 a10 a01 a11 p p0 p1 p2) return (... = ...) with | @sq_id _ x => 1 end @ ((concat_p1 p00i)^)^))) @ (ap (match p00i as p in (_ = a) return (forall px1 : a = x0, ... = ... -> PathSquare 1 px1 p p11i) with | 1 => fun px1 : x = x0 => match p11i as p in ... return ... with | 1 => fun ... ... => ... e end px1 end 1) (ap (fun r : 1 @ p11i = p00i => r @ (concat_p1 p00i)^) (concat_p_Vp (concat_1p p11i) (match ... ... with | ... => 1 end @ ((concat_p1 p00i)^)^)) @ concat_pV_p match sq_1G (sq_1G^-1 s1ii) in (@PathSquare _ a00 a10 a01 a11 p p0 p1 p2) return (p @ p2 = p1 @ p0) with | @sq_id _ x => 1 end (concat_p1 p00i)^) @ match sq_1G (sq_1G^-1 s1ii) as p3 in (@PathSquare _ a00 a10 a01 a11 p p0 p1 p2) return (match p1 as p4 in ... return ... with | 1 => fun ... => ... px1 end p0 match p3 in ... return ... with | @sq_id _ x => 1 end = p3) with | @sq_id _ x => 1 end))^) (ap (fun x2 : p00i = p00i => match p00i as p in (_ = a) return (forall px1 : a = x0, 1 @ p00i = p @ px1 -> PathSquare 1 px1 p p00i) with | 1 => fun px1 : x = x0 => match p00i as p in (_ = a) return (forall px2 : ..., ... -> ...) with | 1 => fun (px2 : x = x) (e : 1 = 1 @ px2) => match ... ... with | ... => ... => 1%square end e end px1 end 1 ((concat_1p p00i @ x2) @ (concat_p1 p00i)^)) (inv_V ((concat_1p p00i)^ @ (match sq_1G 1 in (@PathSquare _ a00 a10 a01 a11 p p0 p1 p2) return (p @ p2 = p1 @ p0) with | @sq_id _ x => 1 end @ ((concat_p1 p00i)^)^))) @ (ap (match p00i as p in (_ = a) return (forall px1 : a = x0, 1 @ p00i = p @ px1 -> PathSquare 1 px1 p p00i) with | 1 => fun px1 : x = x0 => match p00i as p in (_ = a) return (forall ..., ...) with | 1 => fun (px2 : x = x) (e : 1 = ...) => match ... with | ... ... end e end px1 end 1) (ap (fun r : 1 @ p00i = p00i => r @ (concat_p1 p00i)^) (concat_p_Vp (concat_1p p00i) (match sq_1G 1 in (@PathSquare _ a00 a10 a01 a11 p p0 p1 p2) return (...) with | @sq_id _ x => 1 end @ ((concat_p1 p00i)^)^)) @ concat_pV_p match sq_1G 1 in (@PathSquare _ a00 a10 a01 a11 p p0 p1 p2) return (p @ p2 = p1 @ p0) with | @sq_id _ x => 1 end (concat_p1 p00i)^) @ match sq_1G 1 as p3 in (@PathSquare _ a00 a10 a01 a11 p p0 p1 p2) return (match p1 as p4 in (_ = a) return (forall ..., ...) with | 1 => fun px1 : a00 = a11 => match ... with | ... ... end px1 end p0 match p3 in (@PathSquare _ a02 a12 a03 a13 p4 p5 p6 p7) return (... = ...) with | @sq_id _ x => 1 end = p3) with | @sq_id _ x => 1 end))^) (ap (fun e : p00i @ 1 = 1 @ p00i => match e @ concat_1p p00i in (_ = p) return (p00i @ 1 = 1 @ p -> PathSquare p00i p 1 1) with | 1 => fun e0 : p00i @ 1 = 1 @ (p00i @ 1) => match p00i as p in (_ = a) return (p @ 1 = 1 @ (...) -> PathSquare p (p @ 1) 1 1) with | 1 => fun _ : 1 = 1 => 1%square end e0 end e) (ap (fun r : p00i @ 1 = p00i => r @ (concat_1p p00i)^) (concat_p_Vp (concat_p1 p00i) (match sq_G1 1 in (@PathSquare _ a00 a10 a01 a11 p p0 p1 p2) return (p @ p2 = p1 @ p0) with | @sq_id _ x => 1 end @ ((concat_1p p00i)^)^)) @ concat_pV_p match sq_G1 1 in (@PathSquare _ a00 a10 a01 a11 p p0 p1 p2) return (p @ p2 = p1 @ p0) with | @sq_id _ x => 1 end (concat_1p p00i)^) @ match sq_G1 1 as p3 in (@PathSquare _ a00 a10 a01 a11 p p0 p1 p2) return (match p1 as p4 in (_ = a) return (forall px1 : a = a11, p @ p2 = p4 @ px1 -> PathSquare p px1 p4 p2) with | 1 => fun px1 : a00 = a11 => match p2 as p4 in (_ = a) return (forall ..., ...) with | 1 => fun (px2 : a00 = a10) (e : ... = ...) => match ... with | ... ... end e end px1 end p0 match p3 in (@PathSquare _ a02 a12 a03 a13 p4 p5 p6 p7) return (p4 @ p7 = p6 @ p5) with | @sq_id _ x => 1 end = p3) with | @sq_id _ x => 1 end)^ x1 in (@PathCube _ x000 x010 x100 x110 x001 x011 x101 x111 p0i0 p1i0 pi00 pi10 p0i1 p1i1 pi01 pi11 p00i p01i p10i p11i s0ii s1ii sii0 sii1 si0i si1i) return (sq_concat_h (PathSquare.tr (fv s0ii)) (sq_concat_h si0i (PathSquare.tr s1ii)) = match moveL_Vp (pi00 @ p1i0) pi10 p0i0 match sii0 in (@PathSquare _ a00 a10 a01 a11 p p0 p1 p2) return (p @ p2 = p1 @ p0) with | @sq_id _ x => 1 end in (_ = p) return (PathSquare p01i p11i pi10 pi11 <~> PathSquare p01i p11i p (p0i1^ @ (pi01 @ p1i1))) with | 1%path => match moveL_Vp (pi01 @ p1i1) pi11 p0i1 match sii1 in (@PathSquare _ a00 a10 a01 a11 p p0 p1 p2) return (p @ p2 = p1 @ p0) with | @sq_id _ x => 1 end in (_ = p) return (PathSquare p01i p11i pi10 pi11 <~> PathSquare p01i p11i pi10 p) with | 1%path => 1%equiv end end si1i) with | idcube x => 1%path end) == idmap
A: Type
x, x0: A
p00i: x = x0
s0ii, s1ii: PathSquare 1 1 p00i p00i
si0i, si1i: PathSquare p00i p00i 1 1

(fun x1 : sq_concat_h (PathSquare.tr (match p00i as p in (_ = a) return (forall px1 : a = x0, 1 @ p00i = p @ px1 -> PathSquare 1 px1 p p00i) with | 1%path => fun px1 : x = x0 => match p00i as p in (_ = a) return (forall px2 : x = a, 1 @ p = 1 @ px2 -> PathSquare 1 px2 1 p) with | 1%path => fun (px2 : x = x) (e : 1%path = 1 @ px2) => match e @ concat_1p px2 in (_ = p) return (1%path = 1 @ p -> PathSquare 1 p 1 1) with | 1%path => fun _ : 1%path = 1%path => 1 end e end px1 end 1%path ((concat_1p p00i @ ((((concat_1p p00i)^ @ (match sq_1G 1 in (@PathSquare _ a00 a10 a01 a11 p p0 p1 p2) return (... = ...) with | @sq_id _ x => 1 end @ ((concat_p1 p00i)^)^))^)^)^) @ (concat_p1 p00i)^))) (sq_concat_h (sq_G1 1%path) (PathSquare.tr (sq_1G 1%path))) = si1i => match internal_paths_rew_r (fun si0i : PathSquare p00i p00i 1 1 => sq_concat_h (PathSquare.tr (match p00i as p in (_ = a) return (forall px1 : a = x0, 1 @ p00i = p @ px1 -> PathSquare 1 px1 p p00i) with | 1%path => fun px1 : x = x0 => match p00i as p in (_ = a) return (forall ..., ...) with | 1%path => fun (px2 : x = x) (e : 1%path = ...) => match ... with | ... ... end e end px1 end 1%path ((concat_1p p00i @ ((((concat_1p p00i)^ @ (... @ ...^))^)^)^) @ (concat_p1 p00i)^))) (sq_concat_h si0i (PathSquare.tr (sq_1G 1%path))) = si1i -> PathCube (sq_1G 1%path) (sq_1G 1%path) 1 1 si0i si1i) (internal_paths_rew_r (fun s0ii : PathSquare 1 1 p00i p00i => sq_concat_h (PathSquare.tr (match p00i as p in (_ = a) return (forall px1 : a = x0, ... = ... -> PathSquare 1 px1 p p00i) with | 1%path => fun px1 : x = x0 => match p00i as p in ... return ... with | 1%path => fun ... ... => ... e end px1 end 1%path ((concat_1p p00i @ (((...^ @ ...)^)^)^) @ (concat_p1 p00i)^))) (sq_concat_h (match ((...) @ (...)^) @ concat_1p p00i in (_ = p) return (p00i @ 1 = 1 @ p -> PathSquare p00i p 1 1) with | 1%path => fun e : p00i @ 1 = 1 @ (...) => match p00i as p in ... return ... with | 1%path => fun ... => 1 end e end ((concat_p1 p00i @ ((concat_p1 p00i)^ @ (... @ ...^))) @ (concat_1p p00i)^)) (PathSquare.tr (sq_1G 1%path))) = si1i -> PathCube s0ii (sq_1G 1%path) 1 1 (match ((concat_p1 p00i @ (...^ @ ...)) @ (concat_1p p00i)^) @ concat_1p p00i in (_ = p) return (p00i @ 1 = 1 @ p -> PathSquare p00i p 1 1) with | 1%path => fun e : p00i @ 1 = 1 @ (p00i @ 1) => match p00i as p in (_ = a) return (... = ... -> PathSquare p ... 1 1) with | 1%path => fun _ : 1%path = 1%path => 1 end e end ((concat_p1 p00i @ ((concat_p1 p00i)^ @ (match ... ... with | ... => 1 end @ ((concat_1p p00i)^)^))) @ (concat_1p p00i)^)) si1i) (internal_paths_rew_r (fun s1ii : PathSquare 1 1 p00i p00i => sq_concat_h (PathSquare.tr (match p00i as p in (_ = a) return (forall ..., ...) with | 1%path => fun px1 : x = x0 => match ... with | ... ... end px1 end 1%path ((concat_1p p00i @ ((...^)^)^) @ (concat_p1 p00i)^))) (sq_concat_h (match (...) @ concat_1p p00i in (_ = p) return (... -> ...) with | 1%path => fun e : ... = ... => match ... with | ... ... end e end ((concat_p1 p00i @ (...^ @ ...)) @ (concat_1p p00i)^)) (PathSquare.tr s1ii)) = si1i -> PathCube (match p00i as p in (_ = a) return (forall px1 : a = x0, 1 @ p00i = p @ px1 -> PathSquare 1 px1 p p00i) with | 1%path => fun px1 : x = x0 => match p00i as p in (...) return (...) with | 1%path => fun (px2 : ...) (e : ...) => ... ... end e end px1 end 1%path ((concat_1p p00i @ (((concat_1p p00i)^ @ (... @ ...^))^)^) @ (concat_p1 p00i)^)) s1ii 1 1 (match ((... @ ...) @ (concat_1p p00i)^) @ concat_1p p00i in (_ = p) return (p00i @ 1 = 1 @ p -> PathSquare p00i p 1 1) with | 1%path => fun e : p00i @ 1 = 1 @ (p00i @ 1) => match p00i as p in (...) return (...) with | 1%path => fun _ : ... => 1 end e end ((concat_p1 p00i @ ((concat_p1 p00i)^ @ (... ... end @ (...^)^))) @ (concat_1p p00i)^)) si1i) (fun X : sq_concat_h (PathSquare.tr (match p00i as p in (...) return (...) with | 1%path => fun px1 : ... => ... ... end px1 end 1%path ((concat_1p p00i @ (...^)^) @ (concat_p1 p00i)^))) (sq_concat_h (match ... @ ... in (...) return (...) with | 1%path => fun e : ... => ... ... end e end ((concat_p1 p00i @ (...)) @ (concat_1p p00i)^)) (PathSquare.tr (match ... ... with | ... => ... => ... end 1%path ((...) @ (...)^)))) = si1i => match (concat_p1 p00i)^ @ (match sq_G1 1 in (@PathSquare _ a00 a10 a01 a11 p p0 p1 p2) return (...) with | @sq_id _ x => 1 end @ ((concat_1p p00i)^)^) as p0 in (_ = p) return (forall s1ii : PathSquare 1 1 p p00i, PathSquare p00i p 1 1 -> sq_concat_h (PathSquare.tr ...) (sq_concat_h ... ...) = si1i -> PathCube (... ... end 1%path (...)) (... ... end 1%path (...)) 1 1 (... ... end (...)) si1i) with | 1%path => fun (s1ii : PathSquare 1 1 p00i p00i) (si0i : PathSquare p00i p00i 1 1) (X0 : sq_concat_h (PathSquare.tr (... ... end 1%path (...))) (sq_concat_h (... ... end (...)) (PathSquare.tr (...))) = si1i) => match ((concat_1p p00i)^ @ (... @ ...^))^ as p0 in (_ = p) return (PathSquare 1 1 p00i p -> forall si1i : ..., ... -> ...) with | 1%path => fun (s0ii : PathSquare 1 1 p00i p00i) (si1i : PathSquare p00i p00i 1 1) (X1 : sq_concat_h (...) (...) = si1i) => match ...^ as p0 in ... return ... with | 1%path => fun ... ... ... => ... ... end end s1ii si1i X1 end (sq_1G 1%path) si1i X0 end (sq_1G 1%path) (sq_G1 1%path) X) (ap (fun x2 : p00i = p00i => match p00i as p in (_ = a) return (forall px1 : a = x0, 1 @ p00i = p @ px1 -> PathSquare 1 px1 p p00i) with | 1 => fun px1 : x = x0 => match p00i as p in (...) return (...) with | 1 => fun (px2 : ...) (e : ...) => ... ... end e end px1 end 1 ((concat_1p p00i @ x2) @ (concat_p1 p00i)^)) (inv_V ((concat_1p p00i)^ @ (match sq_1G 1 in (@PathSquare _ a00 a10 a01 a11 p p0 p1 p2) return (... = ...) with | @sq_id _ x => 1 end @ ((concat_p1 p00i)^)^))) @ (ap (match p00i as p in (_ = a) return (forall px1 : a = x0, ... = ... -> PathSquare 1 px1 p p00i) with | 1 => fun px1 : x = x0 => match p00i as p in ... return ... with | 1 => fun ... ... => ... e end px1 end 1) (ap (fun r : 1 @ p00i = p00i => r @ (concat_p1 p00i)^) (concat_p_Vp (concat_1p p00i) (match ... ... with | ... => 1 end @ ((concat_p1 p00i)^)^)) @ concat_pV_p match sq_1G 1 in (@PathSquare _ a00 a10 a01 a11 p p0 p1 p2) return (p @ p2 = p1 @ p0) with | @sq_id _ x => 1 end (concat_p1 p00i)^) @ match sq_1G 1 as p3 in (@PathSquare _ a00 a10 a01 a11 p p0 p1 p2) return (match p1 as p4 in ... return ... with | 1 => fun ... => ... px1 end p0 match p3 in ... return ... with | @sq_id _ x => 1 end = p3) with | @sq_id _ x => 1 end))^) (ap (fun x2 : p00i = p00i => match p00i as p in (_ = a) return (forall px1 : a = x0, 1 @ p00i = p @ px1 -> PathSquare 1 px1 p p00i) with | 1 => fun px1 : x = x0 => match p00i as p in (_ = a) return (forall px2 : ..., ... -> ...) with | 1 => fun (px2 : x = x) (e : 1 = 1 @ px2) => match ... ... with | ... => ... => 1%square end e end px1 end 1 ((concat_1p p00i @ x2) @ (concat_p1 p00i)^)) (inv_V ((concat_1p p00i)^ @ (match sq_1G 1 in (@PathSquare _ a00 a10 a01 a11 p p0 p1 p2) return (p @ p2 = p1 @ p0) with | @sq_id _ x => 1 end @ ((concat_p1 p00i)^)^))) @ (ap (match p00i as p in (_ = a) return (forall px1 : a = x0, 1 @ p00i = p @ px1 -> PathSquare 1 px1 p p00i) with | 1 => fun px1 : x = x0 => match p00i as p in (_ = a) return (forall ..., ...) with | 1 => fun (px2 : x = x) (e : 1 = ...) => match ... with | ... ... end e end px1 end 1) (ap (fun r : 1 @ p00i = p00i => r @ (concat_p1 p00i)^) (concat_p_Vp (concat_1p p00i) (match sq_1G 1 in (@PathSquare _ a00 a10 a01 a11 p p0 p1 p2) return (...) with | @sq_id _ x => 1 end @ ((concat_p1 p00i)^)^)) @ concat_pV_p match sq_1G 1 in (@PathSquare _ a00 a10 a01 a11 p p0 p1 p2) return (p @ p2 = p1 @ p0) with | @sq_id _ x => 1 end (concat_p1 p00i)^) @ match sq_1G 1 as p3 in (@PathSquare _ a00 a10 a01 a11 p p0 p1 p2) return (match p1 as p4 in (_ = a) return (forall ..., ...) with | 1 => fun px1 : a00 = a11 => match ... with | ... ... end px1 end p0 match p3 in (@PathSquare _ a02 a12 a03 a13 p4 p5 p6 p7) return (... = ...) with | @sq_id _ x => 1 end = p3) with | @sq_id _ x => 1 end))^) (ap (fun e : p00i @ 1 = 1 @ p00i => match e @ concat_1p p00i in (_ = p) return (p00i @ 1 = 1 @ p -> PathSquare p00i p 1 1) with | 1 => fun e0 : p00i @ 1 = 1 @ (p00i @ 1) => match p00i as p in (_ = a) return (p @ 1 = 1 @ (...) -> PathSquare p (p @ 1) 1 1) with | 1 => fun _ : 1 = 1 => 1%square end e0 end e) (ap (fun r : p00i @ 1 = p00i => r @ (concat_1p p00i)^) (concat_p_Vp (concat_p1 p00i) (match sq_G1 1 in (@PathSquare _ a00 a10 a01 a11 p p0 p1 p2) return (p @ p2 = p1 @ p0) with | @sq_id _ x => 1 end @ ((concat_1p p00i)^)^)) @ concat_pV_p match sq_G1 1 in (@PathSquare _ a00 a10 a01 a11 p p0 p1 p2) return (p @ p2 = p1 @ p0) with | @sq_id _ x => 1 end (concat_1p p00i)^) @ match sq_G1 1 as p3 in (@PathSquare _ a00 a10 a01 a11 p p0 p1 p2) return (match p1 as p4 in (_ = a) return (forall px1 : a = a11, p @ p2 = p4 @ px1 -> PathSquare p px1 p4 p2) with | 1 => fun px1 : a00 = a11 => match p2 as p4 in (_ = a) return (forall ..., ...) with | 1 => fun (px2 : a00 = a10) (e : ... = ...) => match ... with | ... ... end e end px1 end p0 match p3 in (@PathSquare _ a02 a12 a03 a13 p4 p5 p6 p7) return (p4 @ p7 = p6 @ p5) with | @sq_id _ x => 1 end = p3) with | @sq_id _ x => 1 end)^ x1 in (@PathCube _ x000 x010 x100 x110 x001 x011 x101 x111 p0i0 p1i0 pi00 pi10 p0i1 p1i1 pi01 pi11 p00i p01i p10i p11i s0ii s1ii sii0 sii1 si0i si1i) return (sq_concat_h (PathSquare.tr (fv s0ii)) (sq_concat_h si0i (PathSquare.tr s1ii)) = match moveL_Vp (pi00 @ p1i0) pi10 p0i0 match sii0 in (@PathSquare _ a00 a10 a01 a11 p p0 p1 p2) return (p @ p2 = p1 @ p0) with | @sq_id _ x => 1 end in (_ = p) return (PathSquare p01i p11i pi10 pi11 <~> PathSquare p01i p11i p (p0i1^ @ (pi01 @ p1i1))) with | 1%path => match moveL_Vp (pi01 @ p1i1) pi11 p0i1 match sii1 in (@PathSquare _ a00 a10 a01 a11 p p0 p1 p2) return (p @ p2 = p1 @ p0) with | @sq_id _ x => 1 end in (_ = p) return (PathSquare p01i p11i pi10 pi11 <~> PathSquare p01i p11i pi10 p) with | 1%path => 1%equiv end end si1i) with | idcube x => 1%path end) == idmap
A: Type
x: A
s0ii, s1ii, si0i, si1i: PathSquare 1 1 1 1

(fun x0 : sq_concat_h (PathSquare.tr (match ((concat_1p 1 @ ((((concat_1p 1)^ @ (... ... end @ (...^)^))^)^)^) @ (concat_p1 1)^) @ concat_1p 1 in (_ = p) return (1%path = 1 @ p -> PathSquare 1 p 1 1) with | 1%path => fun _ : 1%path = 1%path => 1 end ((concat_1p 1 @ ((((concat_1p 1)^ @ (match sq_1G 1 in (@PathSquare _ a00 a10 a01 a11 p p0 p1 p2) return (... = ...) with | @sq_id _ x => 1 end @ ((concat_p1 1)^)^))^)^)^) @ (concat_p1 1)^))) (sq_concat_h (sq_G1 1%path) (PathSquare.tr (sq_1G 1%path))) = si1i => match internal_paths_rew_r (fun si0i : PathSquare 1 1 1 1 => sq_concat_h (PathSquare.tr (match ((concat_1p 1 @ (...^)^) @ (concat_p1 1)^) @ concat_1p 1 in (_ = p) return (1%path = 1 @ p -> PathSquare 1 p 1 1) with | 1%path => fun _ : 1%path = 1%path => 1 end ((concat_1p 1 @ ((((concat_1p 1)^ @ (... @ ...^))^)^)^) @ (concat_p1 1)^))) (sq_concat_h si0i (PathSquare.tr (sq_1G 1%path))) = si1i -> PathCube (sq_1G 1%path) (sq_1G 1%path) 1 1 si0i si1i) (internal_paths_rew_r (fun s0ii : PathSquare 1 1 1 1 => sq_concat_h (PathSquare.tr (match ((...) @ (...)^) @ concat_1p 1 in (_ = p) return (1%path = 1 @ p -> PathSquare 1 p 1 1) with | 1%path => fun _ : 1%path = 1%path => 1 end ((concat_1p 1 @ (((...^ @ ...)^)^)^) @ (concat_p1 1)^))) (sq_concat_h (match ((...) @ (...)^) @ concat_1p 1 in (_ = p) return (1 @ 1 = 1 @ p -> PathSquare 1 p 1 1) with | 1%path => fun _ : 1 @ 1 = 1 @ (...) => 1 end ((concat_p1 1 @ ((concat_p1 1)^ @ (... @ ...^))) @ (concat_1p 1)^)) (PathSquare.tr (sq_1G 1%path))) = si1i -> PathCube s0ii (sq_1G 1%path) 1 1 (match ((concat_p1 1 @ (...^ @ ...)) @ (concat_1p 1)^) @ concat_1p 1 in (_ = p) return (1 @ 1 = 1 @ p -> PathSquare 1 p 1 1) with | 1%path => fun _ : 1 @ 1 = 1 @ (1 @ 1) => 1 end ((concat_p1 1 @ ((concat_p1 1)^ @ (match ... ... with | ... => 1 end @ ((concat_1p 1)^)^))) @ (concat_1p 1)^)) si1i) (internal_paths_rew_r (fun s1ii : PathSquare 1 1 1 1 => sq_concat_h (PathSquare.tr (match (...) @ concat_1p 1 in (_ = p) return (... -> ...) with | 1%path => fun _ : 1%path = 1%path => 1 end ((concat_1p 1 @ ((...^)^)^) @ (concat_p1 1)^))) (sq_concat_h (match (...) @ concat_1p 1 in (_ = p) return (... -> ...) with | 1%path => fun _ : ... = ... => 1 end ((concat_p1 1 @ (...^ @ ...)) @ (concat_1p 1)^)) (PathSquare.tr s1ii)) = si1i -> PathCube (match ((... @ ...^) @ (concat_p1 1)^) @ concat_1p 1 in (_ = p) return (1%path = 1 @ p -> PathSquare 1 p 1 1) with | 1%path => fun _ : 1%path = 1%path => 1 end ((concat_1p 1 @ (((concat_1p 1)^ @ (... @ ...^))^)^) @ (concat_p1 1)^)) s1ii 1 1 (match ((... @ ...) @ (concat_1p 1)^) @ concat_1p 1 in (_ = p) return (1 @ 1 = 1 @ p -> PathSquare 1 p 1 1) with | 1%path => fun _ : 1 @ 1 = 1 @ (1 @ 1) => 1 end ((concat_p1 1 @ ((concat_p1 1)^ @ (... ... end @ (...^)^))) @ (concat_1p 1)^)) si1i) (fun X : sq_concat_h (PathSquare.tr (match ... @ ... in (...) return (...) with | 1%path => fun _ : ... => 1 end ((concat_1p 1 @ (...^)^) @ (concat_p1 1)^))) (sq_concat_h (match ... @ ... in (...) return (...) with | 1%path => fun _ : ... => 1 end ((concat_p1 1 @ (...)) @ (concat_1p 1)^)) (PathSquare.tr (match ... ... with | ... => ... => 1 end ((...) @ (...)^)))) = si1i => match (concat_p1 1)^ @ (match sq_G1 1 in (@PathSquare _ a00 a10 a01 a11 p p0 p1 p2) return (...) with | @sq_id _ x => 1 end @ ((concat_1p 1)^)^) as p0 in (_ = p) return (forall s1ii : PathSquare 1 1 p 1, PathSquare 1 p 1 1 -> sq_concat_h (PathSquare.tr ...) (sq_concat_h ... ...) = si1i -> PathCube (... ... end (...)) (... ... end 1%path (...)) 1 1 (... ... end (...)) si1i) with | 1%path => fun (s1ii _ : PathSquare 1 1 1 1) (X0 : sq_concat_h (PathSquare.tr (... ... end (...))) (sq_concat_h (... ... end (...)) (PathSquare.tr (...))) = si1i) => match ((concat_1p 1)^ @ (... @ ...^))^ as p0 in (_ = p) return (PathSquare 1 1 1 p -> forall si1i : ..., ... -> ...) with | 1%path => fun (_ si1i : PathSquare 1 1 1 1) (X1 : sq_concat_h (...) (...) = si1i) => match ...^ as p0 in ... return ... with | 1%path => fun ... ... => ... ... end end s1ii si1i X1 end (sq_1G 1%path) si1i X0 end (sq_1G 1%path) (sq_G1 1%path) X) (ap (fun x1 : 1 = 1 => match ((... @ x1) @ (concat_p1 1)^) @ concat_1p 1 in (_ = p) return (1 = 1 @ p -> PathSquare 1 p 1 1) with | 1 => fun _ : 1 = 1 => 1%square end ((concat_1p 1 @ x1) @ (concat_p1 1)^)) (inv_V ((concat_1p 1)^ @ (match sq_1G 1 in (@PathSquare _ a00 a10 a01 a11 p p0 p1 p2) return (... = ...) with | @sq_id _ x => 1 end @ ((concat_p1 1)^)^))) @ (ap (fun e : 1 = 1 @ 1 => match e @ concat_1p 1 in (_ = p) return (1 = ... -> PathSquare 1 p 1 1) with | 1 => fun _ : 1 = 1 => 1%square end e) (ap (fun r : 1 @ 1 = 1 => r @ (concat_p1 1)^) (concat_p_Vp (concat_1p 1) (match ... ... with | ... => 1 end @ ((concat_p1 1)^)^)) @ concat_pV_p match sq_1G 1 in (@PathSquare _ a00 a10 a01 a11 p p0 p1 p2) return (p @ p2 = p1 @ p0) with | @sq_id _ x => 1 end (concat_p1 1)^) @ match sq_1G 1 as p3 in (@PathSquare _ a00 a10 a01 a11 p p0 p1 p2) return (match p1 as p4 in ... return ... with | 1 => fun ... => ... px1 end p0 match p3 in ... return ... with | @sq_id _ x => 1 end = p3) with | @sq_id _ x => 1 end))^) (ap (fun x1 : 1 = 1 => match ((concat_1p 1 @ x1) @ (concat_p1 1)^) @ concat_1p 1 in (_ = p) return (1 = 1 @ p -> PathSquare 1 p 1 1) with | 1 => fun _ : 1 = 1 => 1%square end ((concat_1p 1 @ x1) @ (concat_p1 1)^)) (inv_V ((concat_1p 1)^ @ (match sq_1G 1 in (@PathSquare _ a00 a10 a01 a11 p p0 p1 p2) return (p @ p2 = p1 @ p0) with | @sq_id _ x => 1 end @ ((concat_p1 1)^)^))) @ (ap (fun e : 1 = 1 @ 1 => match e @ concat_1p 1 in (_ = p) return (1 = 1 @ p -> PathSquare 1 p 1 1) with | 1 => fun _ : 1 = 1 => 1%square end e) (ap (fun r : 1 @ 1 = 1 => r @ (concat_p1 1)^) (concat_p_Vp (concat_1p 1) (match sq_1G 1 in (@PathSquare _ a00 a10 a01 a11 p p0 p1 p2) return (...) with | @sq_id _ x => 1 end @ ((concat_p1 1)^)^)) @ concat_pV_p match sq_1G 1 in (@PathSquare _ a00 a10 a01 a11 p p0 p1 p2) return (p @ p2 = p1 @ p0) with | @sq_id _ x => 1 end (concat_p1 1)^) @ match sq_1G 1 as p3 in (@PathSquare _ a00 a10 a01 a11 p p0 p1 p2) return (match p1 as p4 in (_ = a) return (forall ..., ...) with | 1 => fun px1 : a00 = a11 => match ... with | ... ... end px1 end p0 match p3 in (@PathSquare _ a02 a12 a03 a13 p4 p5 p6 p7) return (... = ...) with | @sq_id _ x => 1 end = p3) with | @sq_id _ x => 1 end))^) (ap (fun e : 1 @ 1 = 1 @ 1 => match e @ concat_1p 1 in (_ = p) return (1 @ 1 = 1 @ p -> PathSquare 1 p 1 1) with | 1 => fun _ : 1 @ 1 = 1 @ (1 @ 1) => 1%square end e) (ap (fun r : 1 @ 1 = 1 => r @ (concat_1p 1)^) (concat_p_Vp (concat_p1 1) (match sq_G1 1 in (@PathSquare _ a00 a10 a01 a11 p p0 p1 p2) return (p @ p2 = p1 @ p0) with | @sq_id _ x => 1 end @ ((concat_1p 1)^)^)) @ concat_pV_p match sq_G1 1 in (@PathSquare _ a00 a10 a01 a11 p p0 p1 p2) return (p @ p2 = p1 @ p0) with | @sq_id _ x => 1 end (concat_1p 1)^) @ match sq_G1 1 as p3 in (@PathSquare _ a00 a10 a01 a11 p p0 p1 p2) return (match p1 as p4 in (_ = a) return (forall px1 : a = a11, p @ p2 = p4 @ px1 -> PathSquare p px1 p4 p2) with | 1 => fun px1 : a00 = a11 => match p2 as p4 in (_ = a) return (forall ..., ...) with | 1 => fun (px2 : a00 = a10) (e : ... = ...) => match ... with | ... ... end e end px1 end p0 match p3 in (@PathSquare _ a02 a12 a03 a13 p4 p5 p6 p7) return (p4 @ p7 = p6 @ p5) with | @sq_id _ x => 1 end = p3) with | @sq_id _ x => 1 end)^ x0 in (@PathCube _ x000 x010 x100 x110 x001 x011 x101 x111 p0i0 p1i0 pi00 pi10 p0i1 p1i1 pi01 pi11 p00i p01i p10i p11i s0ii s1ii sii0 sii1 si0i si1i) return (sq_concat_h (PathSquare.tr (fv s0ii)) (sq_concat_h si0i (PathSquare.tr s1ii)) = match moveL_Vp (pi00 @ p1i0) pi10 p0i0 match sii0 in (@PathSquare _ a00 a10 a01 a11 p p0 p1 p2) return (p @ p2 = p1 @ p0) with | @sq_id _ x => 1 end in (_ = p) return (PathSquare p01i p11i pi10 pi11 <~> PathSquare p01i p11i p (p0i1^ @ (pi01 @ p1i1))) with | 1%path => match moveL_Vp (pi01 @ p1i1) pi11 p0i1 match sii1 in (@PathSquare _ a00 a10 a01 a11 p p0 p1 p2) return (p @ p2 = p1 @ p0) with | @sq_id _ x => 1 end in (_ = p) return (PathSquare p01i p11i pi10 pi11 <~> PathSquare p01i p11i pi10 p) with | 1%path => 1%equiv end end si1i) with | idcube x => 1%path end) == idmap
A: Type
x: A
s0ii, s1ii, si0i, si1i: PathSquare 1 1 1 1
X: sq_concat_h (PathSquare.tr (match ((concat_1p 1 @ ((((concat_1p 1)^ @ (match sq_1G 1 in (@PathSquare _ a00 a10 a01 a11 p p0 p1 p2) return (... = ...) with | @sq_id _ x => 1 end @ ((concat_p1 1)^)^))^)^)^) @ (concat_p1 1)^) @ concat_1p 1 in (_ = p) return (1%path = 1 @ p -> PathSquare 1 p 1 1) with | 1%path => fun _ : 1%path = 1%path => 1 end ((concat_1p 1 @ ((((concat_1p 1)^ @ (match sq_1G 1 in (@PathSquare _ a00 a10 a01 a11 p p0 p1 p2) return (p @ p2 = p1 @ p0) with | @sq_id _ x => 1 end @ ((concat_p1 1)^)^))^)^)^) @ (concat_p1 1)^))) (sq_concat_h (sq_G1 1%path) (PathSquare.tr (sq_1G 1%path))) = si1i

match internal_paths_rew_r (fun si0i : PathSquare 1 1 1 1 => sq_concat_h (PathSquare.tr (match ((concat_1p 1 @ (((...)^)^)^) @ (concat_p1 1)^) @ concat_1p 1 in (_ = p) return (1%path = 1 @ p -> PathSquare 1 p 1 1) with | 1%path => fun _ : 1%path = 1%path => 1 end ((concat_1p 1 @ ((((concat_1p 1)^ @ (match ... with | ... 1 end @ ((...)^)^))^)^)^) @ (concat_p1 1)^))) (sq_concat_h si0i (PathSquare.tr (sq_1G 1%path))) = si1i -> PathCube (sq_1G 1%path) (sq_1G 1%path) 1 1 si0i si1i) (internal_paths_rew_r (fun s0ii : PathSquare 1 1 1 1 => sq_concat_h (PathSquare.tr (match ((concat_1p 1 @ (...^)^) @ (concat_p1 1)^) @ concat_1p 1 in (_ = p) return (1%path = 1 @ p -> PathSquare 1 p 1 1) with | 1%path => fun _ : 1%path = 1%path => 1 end ((concat_1p 1 @ ((((concat_1p 1)^ @ (... @ ...^))^)^)^) @ (concat_p1 1)^))) (sq_concat_h (match ((concat_p1 1 @ (...)) @ (concat_1p 1)^) @ concat_1p 1 in (_ = p) return (1 @ 1 = 1 @ p -> PathSquare 1 p 1 1) with | 1%path => fun _ : 1 @ 1 = 1 @ (1 @ 1) => 1 end ((concat_p1 1 @ ((concat_p1 1)^ @ (match ... with | ... 1 end @ ((...)^)^))) @ (concat_1p 1)^)) (PathSquare.tr (sq_1G 1%path))) = si1i -> PathCube s0ii (sq_1G 1%path) 1 1 (match ((concat_p1 1 @ ((concat_p1 1)^ @ (... @ ...^))) @ (concat_1p 1)^) @ concat_1p 1 in (_ = p) return (1 @ 1 = 1 @ p -> PathSquare 1 p 1 1) with | 1%path => fun _ : 1 @ 1 = 1 @ (1 @ 1) => 1 end ((concat_p1 1 @ ((concat_p1 1)^ @ (match sq_G1 1 in (@PathSquare _ a00 a10 a01 a11 p p0 p1 p2) return (...) with | @sq_id _ x => 1 end @ ((concat_1p 1)^)^))) @ (concat_1p 1)^)) si1i) (internal_paths_rew_r (fun s1ii : PathSquare 1 1 1 1 => sq_concat_h (PathSquare.tr (match ((...) @ (...)^) @ concat_1p 1 in (_ = p) return (1%path = 1 @ p -> PathSquare 1 p 1 1) with | 1%path => fun _ : 1%path = 1%path => 1 end ((concat_1p 1 @ (((...^ @ ...)^)^)^) @ (concat_p1 1)^))) (sq_concat_h (match ((...) @ (...)^) @ concat_1p 1 in (_ = p) return (1 @ 1 = 1 @ p -> PathSquare 1 p 1 1) with | 1%path => fun _ : 1 @ 1 = 1 @ (...) => 1 end ((concat_p1 1 @ ((concat_p1 1)^ @ (... @ ...^))) @ (concat_1p 1)^)) (PathSquare.tr s1ii)) = si1i -> PathCube (match ((concat_1p 1 @ ((...)^)^) @ (concat_p1 1)^) @ concat_1p 1 in (_ = p) return (1%path = 1 @ p -> PathSquare 1 p 1 1) with | 1%path => fun _ : 1%path = 1%path => 1 end ((concat_1p 1 @ (((concat_1p 1)^ @ (match ... with | ... 1 end @ ((...)^)^))^)^) @ (concat_p1 1)^)) s1ii 1 1 (match ((concat_p1 1 @ (...^ @ ...)) @ (concat_1p 1)^) @ concat_1p 1 in (_ = p) return (1 @ 1 = 1 @ p -> PathSquare 1 p 1 1) with | 1%path => fun _ : 1 @ 1 = 1 @ (1 @ 1) => 1 end ((concat_p1 1 @ ((concat_p1 1)^ @ (match ... ... with | ... => 1 end @ ((concat_1p 1)^)^))) @ (concat_1p 1)^)) si1i) (fun X : sq_concat_h (PathSquare.tr (match (... @ ...^) @ concat_1p 1 in (_ = p) return (1%path = ... -> PathSquare 1 p 1 1) with | 1%path => fun _ : 1%path = 1%path => 1 end ((concat_1p 1 @ (((...)^)^)^) @ (concat_p1 1)^))) (sq_concat_h (match (... @ ...^) @ concat_1p 1 in (_ = p) return (... = ... -> PathSquare 1 p 1 1) with | 1%path => fun _ : 1 @ 1 = 1 @ ... => 1 end ((concat_p1 1 @ ((...)^ @ (...))) @ (concat_1p 1)^)) (PathSquare.tr (match ... @ ... in (...) return (...) with | 1%path => fun _ : ... => 1 end ((concat_1p 1 @ (...^)^) @ (concat_p1 1)^)))) = si1i => match (concat_p1 1)^ @ (match sq_G1 1 in (@PathSquare _ a00 a10 a01 a11 p p0 p1 p2) return (p @ p2 = p1 @ p0) with | @sq_id _ x => 1 end @ ((concat_1p 1)^)^) as p0 in (_ = p) return (forall s1ii : PathSquare 1 1 p 1, PathSquare 1 p 1 1 -> sq_concat_h (PathSquare.tr (... ...)) (sq_concat_h (... ...) (PathSquare.tr ...)) = si1i -> PathCube (match ... ... with | ... => ... => 1 end ((...) @ (...)^)) (match ... ... with | ... => ... => ... end 1%path ((...) @ (...)^)) 1 1 (match ... ... with | ... => ... => 1 end ((...) @ (...)^)) si1i) with | 1%path => fun (s1ii _ : PathSquare 1 1 1 1) (X0 : sq_concat_h (PathSquare.tr (match ... ... with | ... => ... => 1 end ((...) @ (...)^))) (sq_concat_h (match ... ... with | ... => ... => 1 end ((...) @ (...)^)) (PathSquare.tr (... ... end (...)))) = si1i) => match ((concat_1p 1)^ @ (match ... with | ... 1 end @ ((...)^)^))^ as p0 in (_ = p) return (PathSquare 1 1 1 p -> forall si1i : PathSquare p 1 1 1, sq_concat_h ... ... = si1i -> PathCube (...) (...) 1 1 (...) si1i) with | 1%path => fun (_ si1i : PathSquare 1 1 1 1) (X1 : sq_concat_h (PathSquare.tr (...)) (sq_concat_h (...) (...)) = si1i) => match (...^ @ ...)^ as p0 in (_ = p) return (... -> ...) with | 1%path => fun (_ si1i0 : PathSquare 1 1 1 1) (X2 : ... = si1i0) => match ... ... with | ... => idcube x end end s1ii si1i X1 end (sq_1G 1%path) si1i X0 end (sq_1G 1%path) (sq_G1 1%path) X) (ap (fun x0 : 1 = 1 => match ((concat_1p 1 @ x0) @ (concat_p1 1)^) @ concat_1p 1 in (_ = p) return (1 = 1 @ p -> PathSquare 1 p 1 1) with | 1 => fun _ : 1 = 1 => 1%square end ((concat_1p 1 @ x0) @ (concat_p1 1)^)) (inv_V ((concat_1p 1)^ @ (match sq_1G 1 in (@PathSquare _ a00 a10 a01 a11 p p0 p1 p2) return (p @ p2 = p1 @ p0) with | @sq_id _ x => 1 end @ ((concat_p1 1)^)^))) @ (ap (fun e : 1 = 1 @ 1 => match e @ concat_1p 1 in (_ = p) return (1 = 1 @ p -> PathSquare 1 p 1 1) with | 1 => fun _ : 1 = 1 => 1%square end e) (ap (fun r : 1 @ 1 = 1 => r @ (concat_p1 1)^) (concat_p_Vp (concat_1p 1) (match sq_1G 1 in (@PathSquare _ a00 a10 a01 a11 p p0 p1 p2) return (...) with | @sq_id _ x => 1 end @ ((concat_p1 1)^)^)) @ concat_pV_p match sq_1G 1 in (@PathSquare _ a00 a10 a01 a11 p p0 p1 p2) return (p @ p2 = p1 @ p0) with | @sq_id _ x => 1 end (concat_p1 1)^) @ match sq_1G 1 as p3 in (@PathSquare _ a00 a10 a01 a11 p p0 p1 p2) return (match p1 as p4 in (_ = a) return (forall ..., ...) with | 1 => fun px1 : a00 = a11 => match ... with | ... ... end px1 end p0 match p3 in (@PathSquare _ a02 a12 a03 a13 p4 p5 p6 p7) return (... = ...) with | @sq_id _ x => 1 end = p3) with | @sq_id _ x => 1 end))^) (ap (fun x0 : 1 = 1 => match ((concat_1p 1 @ x0) @ (concat_p1 1)^) @ concat_1p 1 in (_ = p) return (1 = 1 @ p -> PathSquare 1 p 1 1) with | 1 => fun _ : 1 = 1 => 1%square end ((concat_1p 1 @ x0) @ (concat_p1 1)^)) (inv_V ((concat_1p 1)^ @ (match sq_1G 1 in (@PathSquare _ a00 a10 a01 a11 p p0 p1 p2) return (p @ p2 = p1 @ p0) with | @sq_id _ x => 1 end @ ((concat_p1 1)^)^))) @ (ap (fun e : 1 = 1 @ 1 => match e @ concat_1p 1 in (_ = p) return (1 = 1 @ p -> PathSquare 1 p 1 1) with | 1 => fun _ : 1 = 1 => 1%square end e) (ap (fun r : 1 @ 1 = 1 => r @ (concat_p1 1)^) (concat_p_Vp (concat_1p 1) (match sq_1G 1 in (@PathSquare _ a00 a10 a01 a11 p p0 p1 p2) return (p @ p2 = p1 @ p0) with | @sq_id _ x => 1 end @ ((concat_p1 1)^)^)) @ concat_pV_p match sq_1G 1 in (@PathSquare _ a00 a10 a01 a11 p p0 p1 p2) return (p @ p2 = p1 @ p0) with | @sq_id _ x => 1 end (concat_p1 1)^) @ match sq_1G 1 as p3 in (@PathSquare _ a00 a10 a01 a11 p p0 p1 p2) return (match p1 as p4 in (_ = a) return (forall px1 : a = a11, ... = ... -> PathSquare p px1 p4 p2) with | 1 => fun px1 : a00 = a11 => match p2 as p4 in ... return ... with | 1 => fun ... ... => ... e end px1 end p0 match p3 in (@PathSquare _ a02 a12 a03 a13 p4 p5 p6 p7) return (p4 @ p7 = p6 @ p5) with | @sq_id _ x => 1 end = p3) with | @sq_id _ x => 1 end))^) (ap (fun e : 1 @ 1 = 1 @ 1 => match e @ concat_1p 1 in (_ = p) return (1 @ 1 = 1 @ p -> PathSquare 1 p 1 1) with | 1 => fun _ : 1 @ 1 = 1 @ (1 @ 1) => 1%square end e) (ap (fun r : 1 @ 1 = 1 => r @ (concat_1p 1)^) (concat_p_Vp (concat_p1 1) (match sq_G1 1 in (@PathSquare _ a00 a10 a01 a11 p p0 p1 p2) return (p @ p2 = p1 @ p0) with | @sq_id _ x => 1 end @ ((concat_1p 1)^)^)) @ concat_pV_p match sq_G1 1 in (@PathSquare _ a00 a10 a01 a11 p p0 p1 p2) return (p @ p2 = p1 @ p0) with | @sq_id _ x => 1 end (concat_1p 1)^) @ match sq_G1 1 as p3 in (@PathSquare _ a00 a10 a01 a11 p p0 p1 p2) return (match p1 as p4 in (_ = a) return (forall px1 : a = a11, p @ p2 = p4 @ px1 -> PathSquare p px1 p4 p2) with | 1 => fun px1 : a00 = a11 => match p2 as p4 in (_ = a) return (forall px2 : a00 = a, ... = ... -> PathSquare p px2 1 p4) with | 1 => fun (px2 : a00 = a10) (e : p @ 1 = 1 @ px2) => match ... in ... return ... with | 1 => fun ... => ... e0 end e end px1 end p0 match p3 in (@PathSquare _ a02 a12 a03 a13 p4 p5 p6 p7) return (p4 @ p7 = p6 @ p5) with | @sq_id _ x => 1 end = p3) with | @sq_id _ x => 1 end)^ X in (@PathCube _ x000 x010 x100 x110 x001 x011 x101 x111 p0i0 p1i0 pi00 pi10 p0i1 p1i1 pi01 pi11 p00i p01i p10i p11i s0ii s1ii sii0 sii1 si0i si1i) return (sq_concat_h (PathSquare.tr (fv s0ii)) (sq_concat_h si0i (PathSquare.tr s1ii)) = match moveL_Vp (pi00 @ p1i0) pi10 p0i0 match sii0 in (@PathSquare _ a00 a10 a01 a11 p p0 p1 p2) return (p @ p2 = p1 @ p0) with | @sq_id _ x => 1 end in (_ = p) return (PathSquare p01i p11i pi10 pi11 <~> PathSquare p01i p11i p (p0i1^ @ (pi01 @ p1i1))) with | 1%path => match moveL_Vp (pi01 @ p1i1) pi11 p0i1 match sii1 in (@PathSquare _ a00 a10 a01 a11 p p0 p1 p2) return (p @ p2 = p1 @ p0) with | @sq_id _ x => 1 end in (_ = p) return (PathSquare p01i p11i pi10 pi11 <~> PathSquare p01i p11i pi10 p) with | 1%path => 1%equiv end end si1i) with | idcube x => 1%path end = X
by destruct X. Defined. Notation cu_path := equiv_cu_path. Section Reflexivity. (* PathCube reflexivity *) Context {A} {a00 a10 a01 a11 : A} {px0 : a00 = a10} {px1 : a01 = a11} {p0x : a00 = a01} {p1x : a10 = a11}. (* Left right reflexivity *)
A: Type
a00, a10, a01, a11: A
px0: a00 = a10
px1: a01 = a11
p0x: a00 = a01
p1x: a10 = a11
s: PathSquare px0 px1 p0x p1x

PathCube s s hr hr hr hr
A: Type
a00, a10, a01, a11: A
px0: a00 = a10
px1: a01 = a11
p0x: a00 = a01
p1x: a10 = a11
s: PathSquare px0 px1 p0x p1x

PathCube s s hr hr hr hr
by destruct s. Defined. (* Top bottom reflexivity *)
A: Type
a00, a10, a01, a11: A
px0: a00 = a10
px1: a01 = a11
p0x: a00 = a01
p1x: a10 = a11
s: PathSquare px0 px1 p0x p1x

PathCube hr hr s s vr vr
A: Type
a00, a10, a01, a11: A
px0: a00 = a10
px1: a01 = a11
p0x: a00 = a01
p1x: a10 = a11
s: PathSquare px0 px1 p0x p1x

PathCube hr hr s s vr vr
by destruct s. Defined. (* Front back reflexivity *)
A: Type
a00, a10, a01, a11: A
px0: a00 = a10
px1: a01 = a11
p0x: a00 = a01
p1x: a10 = a11
s: PathSquare px0 px1 p0x p1x

PathCube vr vr vr vr s s
A: Type
a00, a10, a01, a11: A
px0: a00 = a10
px1: a01 = a11
p0x: a00 = a01
p1x: a10 = a11
s: PathSquare px0 px1 p0x p1x

PathCube vr vr vr vr s s
by destruct s. Defined. End Reflexivity. (* Lemmas for rewriting faces of cubes *) Section PathCubeRewriting. Context {A} {x000 x010 x100 x110 x001 x011 x101 x111 : A} {p0i0 : x000 = x010} {p1i0 : x100 = x110} {pi00 : x000 = x100} {pi10 : x010 = x110} {p0i1 : x001 = x011} {p1i1 : x101 = x111} {pi01 : x001 = x101} {pi11 : x011 = x111} {p00i : x000 = x001} {p01i : x010 = x011} {p10i : x100 = x101} {p11i : x110 = x111} {s0ii : PathSquare p0i0 p0i1 p00i p01i} {s1ii : PathSquare p1i0 p1i1 p10i p11i} {sii0 : PathSquare p0i0 p1i0 pi00 pi10} {sii1 : PathSquare p0i1 p1i1 pi01 pi11} {si0i : PathSquare p00i p10i pi00 pi01} {si1i : PathSquare p01i p11i pi10 pi11}. (* We write the most general version and derive special cases from this *)
A: Type
x000, x010, x100, x110, x001, x011, x101, x111: A
p0i0: x000 = x010
p1i0: x100 = x110
pi00: x000 = x100
pi10: x010 = x110
p0i1: x001 = x011
p1i1: x101 = x111
pi01: x001 = x101
pi11: x011 = x111
p00i: x000 = x001
p01i: x010 = x011
p10i: x100 = x101
p11i: x110 = x111
s0ii: PathSquare p0i0 p0i1 p00i p01i
s1ii: PathSquare p1i0 p1i1 p10i p11i
sii0: PathSquare p0i0 p1i0 pi00 pi10
sii1: PathSquare p0i1 p1i1 pi01 pi11
si0i: PathSquare p00i p10i pi00 pi01
si1i: PathSquare p01i p11i pi10 pi11
s0ii': PathSquare p0i0 p0i1 p00i p01i
s1ii': PathSquare p1i0 p1i1 p10i p11i
sii0': PathSquare p0i0 p1i0 pi00 pi10
sii1': PathSquare p0i1 p1i1 pi01 pi11
si0i': PathSquare p00i p10i pi00 pi01
si1i': PathSquare p01i p11i pi10 pi11
t0ii: s0ii = s0ii'
t1ii: s1ii = s1ii'
tii0: sii0 = sii0'
tii1: sii1 = sii1'
ti0i: si0i = si0i'
ti1i: si1i = si1i'

PathCube s0ii s1ii sii0 sii1 si0i si1i <~> PathCube s0ii' s1ii' sii0' sii1' si0i' si1i'
A: Type
x000, x010, x100, x110, x001, x011, x101, x111: A
p0i0: x000 = x010
p1i0: x100 = x110
pi00: x000 = x100
pi10: x010 = x110
p0i1: x001 = x011
p1i1: x101 = x111
pi01: x001 = x101
pi11: x011 = x111
p00i: x000 = x001
p01i: x010 = x011
p10i: x100 = x101
p11i: x110 = x111
s0ii: PathSquare p0i0 p0i1 p00i p01i
s1ii: PathSquare p1i0 p1i1 p10i p11i
sii0: PathSquare p0i0 p1i0 pi00 pi10
sii1: PathSquare p0i1 p1i1 pi01 pi11
si0i: PathSquare p00i p10i pi00 pi01
si1i: PathSquare p01i p11i pi10 pi11
s0ii': PathSquare p0i0 p0i1 p00i p01i
s1ii': PathSquare p1i0 p1i1 p10i p11i
sii0': PathSquare p0i0 p1i0 pi00 pi10
sii1': PathSquare p0i1 p1i1 pi01 pi11
si0i': PathSquare p00i p10i pi00 pi01
si1i': PathSquare p01i p11i pi10 pi11
t0ii: s0ii = s0ii'
t1ii: s1ii = s1ii'
tii0: sii0 = sii0'
tii1: sii1 = sii1'
ti0i: si0i = si0i'
ti1i: si1i = si1i'

PathCube s0ii s1ii sii0 sii1 si0i si1i <~> PathCube s0ii' s1ii' sii0' sii1' si0i' si1i'
by destruct t0ii, t1ii, tii0, tii1, ti0i, ti1i. Defined. Context {s0ii' s1ii' sii0' sii1' si0i' si1i'} (t0ii : s0ii = s0ii') (t1ii : s1ii = s1ii') (tii0 : sii0 = sii0') (tii1 : sii1 = sii1') (ti0i : si0i = si0i') (ti1i : si1i = si1i'). Definition equiv_cu_Gccccc := equiv_cu_GGGGGG t0ii 1 1 1 1 1. Definition equiv_cu_cGcccc := equiv_cu_GGGGGG 1 t1ii 1 1 1 1. Definition equiv_cu_ccGccc := equiv_cu_GGGGGG 1 1 tii0 1 1 1. Definition equiv_cu_cccGcc := equiv_cu_GGGGGG 1 1 1 tii1 1 1. Definition equiv_cu_ccccGc := equiv_cu_GGGGGG 1 1 1 1 ti0i 1. Definition equiv_cu_cccccG := equiv_cu_GGGGGG 1 1 1 1 1 ti1i. Definition equiv_cu_ccGGGG := equiv_cu_GGGGGG 1 1 tii0 tii1 ti0i ti1i. Definition equiv_cu_GGGGcc := equiv_cu_GGGGGG t0ii t1ii tii0 tii1 1 1. Definition equiv_cu_GGcccc := equiv_cu_GGGGGG t0ii t1ii 1 1 1 1. Definition equiv_cu_ccGGcc := equiv_cu_GGGGGG 1 1 tii0 tii1 1 1. Definition equiv_cu_ccccGG := equiv_cu_GGGGGG 1 1 1 1 ti0i ti1i. End PathCubeRewriting. Notation cu_GGGGGG := equiv_cu_GGGGGG. Notation cu_Gccccc := equiv_cu_Gccccc. Notation cu_cGcccc := equiv_cu_cGcccc. Notation cu_ccGccc := equiv_cu_ccGccc. Notation cu_cccGcc := equiv_cu_cccGcc. Notation cu_ccccGc := equiv_cu_ccccGc. Notation cu_cccccG := equiv_cu_cccccG. Notation cu_ccGGGG := equiv_cu_ccGGGG. Notation cu_GGGGcc := equiv_cu_GGGGcc. Notation cu_GGcccc := equiv_cu_GGcccc. Notation cu_ccGGcc := equiv_cu_ccGGcc. Notation cu_ccccGG := equiv_cu_ccccGG. (* Rotating top and bottom to front and back *)
A: Type
x000, x010, x100, x110, x001, x011, x101, x111: A
p0i0: x000 = x010
p1i0: x100 = x110
pi00: x000 = x100
pi10: x010 = x110
p0i1: x001 = x011
p1i1: x101 = x111
pi01: x001 = x101
pi11: x011 = x111
p00i: x000 = x001
p01i: x010 = x011
p10i: x100 = x101
p11i: x110 = x111
s0ii: PathSquare p0i0 p0i1 p00i p01i
s1ii: PathSquare p1i0 p1i1 p10i p11i
sii0: PathSquare p0i0 p1i0 pi00 pi10
sii1: PathSquare p0i1 p1i1 pi01 pi11
si0i: PathSquare p00i p10i pi00 pi01
si1i: PathSquare p01i p11i pi10 pi11

PathCube si0i si1i (tr s0ii) (tr s1ii) (tr sii0) (tr sii1) <~> PathCube s0ii s1ii sii0 sii1 si0i si1i
A: Type
x000, x010, x100, x110, x001, x011, x101, x111: A
p0i0: x000 = x010
p1i0: x100 = x110
pi00: x000 = x100
pi10: x010 = x110
p0i1: x001 = x011
p1i1: x101 = x111
pi01: x001 = x101
pi11: x011 = x111
p00i: x000 = x001
p01i: x010 = x011
p10i: x100 = x101
p11i: x110 = x111
s0ii: PathSquare p0i0 p0i1 p00i p01i
s1ii: PathSquare p1i0 p1i1 p10i p11i
sii0: PathSquare p0i0 p1i0 pi00 pi10
sii1: PathSquare p0i1 p1i1 pi01 pi11
si0i: PathSquare p00i p10i pi00 pi01
si1i: PathSquare p01i p11i pi10 pi11

PathCube si0i si1i (tr s0ii) (tr s1ii) (tr sii0) (tr sii1) <~> PathCube s0ii s1ii sii0 sii1 si0i si1i
A: Type
x000, x010, x100, x110, x001, x011, x101, x111: A
p0i0: x000 = x010
p1i0: x100 = x110
pi00: x000 = x100
pi10: x010 = x110
p0i1: x001 = x011
p1i1: x101 = x111
pi01: x001 = x101
pi11: x011 = x111
p00i: x000 = x001
p01i: x010 = x011
p10i: x100 = x101
p11i: x110 = x111
s0ii: PathSquare p0i0 p0i1 p00i p01i
s1ii: PathSquare p1i0 p1i1 p10i p11i
sii0: PathSquare p0i0 p1i0 pi00 pi10
sii1: PathSquare p0i1 p1i1 pi01 pi11
si0i: PathSquare p00i p10i pi00 pi01
si1i: PathSquare p01i p11i pi10 pi11

PathCube si0i si1i (tr s0ii) (tr s1ii) (tr sii0) (tr sii1) -> PathCube s0ii s1ii sii0 sii1 si0i si1i
A: Type
x000, x010, x100, x110, x001, x011, x101, x111: A
p0i0: x000 = x010
p1i0: x100 = x110
pi00: x000 = x100
pi10: x010 = x110
p0i1: x001 = x011
p1i1: x101 = x111
pi01: x001 = x101
pi11: x011 = x111
p00i: x000 = x001
p01i: x010 = x011
p10i: x100 = x101
p11i: x110 = x111
s0ii: PathSquare p0i0 p0i1 p00i p01i
s1ii: PathSquare p1i0 p1i1 p10i p11i
sii0: PathSquare p0i0 p1i0 pi00 pi10
sii1: PathSquare p0i1 p1i1 pi01 pi11
si0i: PathSquare p00i p10i pi00 pi01
si1i: PathSquare p01i p11i pi10 pi11
PathCube s0ii s1ii sii0 sii1 si0i si1i -> PathCube si0i si1i (tr s0ii) (tr s1ii) (tr sii0) (tr sii1)
A: Type
x000, x010, x100, x110, x001, x011, x101, x111: A
p0i0: x000 = x010
p1i0: x100 = x110
pi00: x000 = x100
pi10: x010 = x110
p0i1: x001 = x011
p1i1: x101 = x111
pi01: x001 = x101
pi11: x011 = x111
p00i: x000 = x001
p01i: x010 = x011
p10i: x100 = x101
p11i: x110 = x111
s0ii: PathSquare p0i0 p0i1 p00i p01i
s1ii: PathSquare p1i0 p1i1 p10i p11i
sii0: PathSquare p0i0 p1i0 pi00 pi10
sii1: PathSquare p0i1 p1i1 pi01 pi11
si0i: PathSquare p00i p10i pi00 pi01
si1i: PathSquare p01i p11i pi10 pi11
?f o ?g == idmap
A: Type
x000, x010, x100, x110, x001, x011, x101, x111: A
p0i0: x000 = x010
p1i0: x100 = x110
pi00: x000 = x100
pi10: x010 = x110
p0i1: x001 = x011
p1i1: x101 = x111
pi01: x001 = x101
pi11: x011 = x111
p00i: x000 = x001
p01i: x010 = x011
p10i: x100 = x101
p11i: x110 = x111
s0ii: PathSquare p0i0 p0i1 p00i p01i
s1ii: PathSquare p1i0 p1i1 p10i p11i
sii0: PathSquare p0i0 p1i0 pi00 pi10
sii1: PathSquare p0i1 p1i1 pi01 pi11
si0i: PathSquare p00i p10i pi00 pi01
si1i: PathSquare p01i p11i pi10 pi11
?g o ?f == idmap
A: Type
x000, x010, x100, x110, x001, x011, x101, x111: A
p0i0: x000 = x010
p1i0: x100 = x110
pi00: x000 = x100
pi10: x010 = x110
p0i1: x001 = x011
p1i1: x101 = x111
pi01: x001 = x101
pi11: x011 = x111
p00i: x000 = x001
p01i: x010 = x011
p10i: x100 = x101
p11i: x110 = x111
s0ii: PathSquare p0i0 p0i1 p00i p01i
s1ii: PathSquare p1i0 p1i1 p10i p11i
sii0: PathSquare p0i0 p1i0 pi00 pi10
sii1: PathSquare p0i1 p1i1 pi01 pi11
si0i: PathSquare p00i p10i pi00 pi01
si1i: PathSquare p01i p11i pi10 pi11

PathCube si0i si1i (tr s0ii) (tr s1ii) (tr sii0) (tr sii1) -> PathCube s0ii s1ii sii0 sii1 si0i si1i
A: Type
x000, x010, x100, x110, x001, x011, x101, x111: A
p0i0: x000 = x010
p1i0: x100 = x110
pi00: x000 = x100
pi10: x010 = x110
p0i1: x001 = x011
p1i1: x101 = x111
pi01: x001 = x101
pi11: x011 = x111
p00i: x000 = x001
p01i: x010 = x011
p10i: x100 = x101
p11i: x110 = x111
s0ii: PathSquare p0i0 p0i1 p00i p01i
s1ii: PathSquare p1i0 p1i1 p10i p11i
sii0: PathSquare p0i0 p1i0 pi00 pi10
sii1: PathSquare p0i1 p1i1 pi01 pi11
si0i: PathSquare p00i p10i pi00 pi01
si1i: PathSquare p01i p11i pi10 pi11
cube: PathCube si0i si1i (tr s0ii) (tr s1ii) (tr sii0) (tr sii1)

PathCube s0ii s1ii sii0 sii1 si0i si1i
A: Type
x000, x010, x100, x110, x001, x011, x101, x111: A
p0i0: x000 = x010
p1i0: x100 = x110
pi00: x000 = x100
pi10: x010 = x110
p0i1: x001 = x011
p1i1: x101 = x111
pi01: x001 = x101
pi11: x011 = x111
p00i: x000 = x001
p01i: x010 = x011
p10i: x100 = x101
p11i: x110 = x111
s0ii: PathSquare p0i0 p0i1 p00i p01i
s1ii: PathSquare p1i0 p1i1 p10i p11i
sii0: PathSquare p0i0 p1i0 pi00 pi10
sii1: PathSquare p0i1 p1i1 pi01 pi11
si0i: PathSquare p00i p10i pi00 pi01
si1i: PathSquare p01i p11i pi10 pi11
cube: PathCube si0i si1i (tr s0ii) (tr s1ii) (tr sii0) (tr sii1)

?Goal = s0ii
A: Type
x000, x010, x100, x110, x001, x011, x101, x111: A
p0i0: x000 = x010
p1i0: x100 = x110
pi00: x000 = x100
pi10: x010 = x110
p0i1: x001 = x011
p1i1: x101 = x111
pi01: x001 = x101
pi11: x011 = x111
p00i: x000 = x001
p01i: x010 = x011
p10i: x100 = x101
p11i: x110 = x111
s0ii: PathSquare p0i0 p0i1 p00i p01i
s1ii: PathSquare p1i0 p1i1 p10i p11i
sii0: PathSquare p0i0 p1i0 pi00 pi10
sii1: PathSquare p0i1 p1i1 pi01 pi11
si0i: PathSquare p00i p10i pi00 pi01
si1i: PathSquare p01i p11i pi10 pi11
cube: PathCube si0i si1i (tr s0ii) (tr s1ii) (tr sii0) (tr sii1)
?Goal0 = s1ii
A: Type
x000, x010, x100, x110, x001, x011, x101, x111: A
p0i0: x000 = x010
p1i0: x100 = x110
pi00: x000 = x100
pi10: x010 = x110
p0i1: x001 = x011
p1i1: x101 = x111
pi01: x001 = x101
pi11: x011 = x111
p00i: x000 = x001
p01i: x010 = x011
p10i: x100 = x101
p11i: x110 = x111
s0ii: PathSquare p0i0 p0i1 p00i p01i
s1ii: PathSquare p1i0 p1i1 p10i p11i
sii0: PathSquare p0i0 p1i0 pi00 pi10
sii1: PathSquare p0i1 p1i1 pi01 pi11
si0i: PathSquare p00i p10i pi00 pi01
si1i: PathSquare p01i p11i pi10 pi11
cube: PathCube si0i si1i (tr s0ii) (tr s1ii) (tr sii0) (tr sii1)
?Goal1 = sii0
A: Type
x000, x010, x100, x110, x001, x011, x101, x111: A
p0i0: x000 = x010
p1i0: x100 = x110
pi00: x000 = x100
pi10: x010 = x110
p0i1: x001 = x011
p1i1: x101 = x111
pi01: x001 = x101
pi11: x011 = x111
p00i: x000 = x001
p01i: x010 = x011
p10i: x100 = x101
p11i: x110 = x111
s0ii: PathSquare p0i0 p0i1 p00i p01i
s1ii: PathSquare p1i0 p1i1 p10i p11i
sii0: PathSquare p0i0 p1i0 pi00 pi10
sii1: PathSquare p0i1 p1i1 pi01 pi11
si0i: PathSquare p00i p10i pi00 pi01
si1i: PathSquare p01i p11i pi10 pi11
cube: PathCube si0i si1i (tr s0ii) (tr s1ii) (tr sii0) (tr sii1)
?Goal2 = sii1
A: Type
x000, x010, x100, x110, x001, x011, x101, x111: A
p0i0: x000 = x010
p1i0: x100 = x110
pi00: x000 = x100
pi10: x010 = x110
p0i1: x001 = x011
p1i1: x101 = x111
pi01: x001 = x101
pi11: x011 = x111
p00i: x000 = x001
p01i: x010 = x011
p10i: x100 = x101
p11i: x110 = x111
s0ii: PathSquare p0i0 p0i1 p00i p01i
s1ii: PathSquare p1i0 p1i1 p10i p11i
sii0: PathSquare p0i0 p1i0 pi00 pi10
sii1: PathSquare p0i1 p1i1 pi01 pi11
si0i: PathSquare p00i p10i pi00 pi01
si1i: PathSquare p01i p11i pi10 pi11
cube: PathCube si0i si1i (tr s0ii) (tr s1ii) (tr sii0) (tr sii1)
PathCube ?Goal ?Goal0 ?Goal1 ?Goal2 si0i si1i
A: Type
x000, x010, x100, x110, x001, x011, x101, x111: A
p0i0: x000 = x010
p1i0: x100 = x110
pi00: x000 = x100
pi10: x010 = x110
p0i1: x001 = x011
p1i1: x101 = x111
pi01: x001 = x101
pi11: x011 = x111
p00i: x000 = x001
p01i: x010 = x011
p10i: x100 = x101
p11i: x110 = x111
s0ii: PathSquare p0i0 p0i1 p00i p01i
s1ii: PathSquare p1i0 p1i1 p10i p11i
sii0: PathSquare p0i0 p1i0 pi00 pi10
sii1: PathSquare p0i1 p1i1 pi01 pi11
si0i: PathSquare p00i p10i pi00 pi01
si1i: PathSquare p01i p11i pi10 pi11
cube: PathCube si0i si1i (tr s0ii) (tr s1ii) (tr sii0) (tr sii1)

PathCube (tr^-1 (tr s0ii)) (tr^-1 (tr s1ii)) (tr^-1 (tr sii0)) (tr^-1 (tr sii1)) si0i si1i
A: Type
x000, x010, x100, x110, x001, x011, x101, x111: A
p0i0: x000 = x010
p1i0: x100 = x110
pi00: x000 = x100
pi10: x010 = x110
p0i1: x001 = x011
p1i1: x101 = x111
pi01: x001 = x101
pi11: x011 = x111
p00i: x000 = x001
p01i: x010 = x011
p10i: x100 = x101
p11i: x110 = x111
s0ii: PathSquare p0i0 p0i1 p00i p01i
s1ii: PathSquare p1i0 p1i1 p10i p11i
sii0: PathSquare p0i0 p1i0 pi00 pi10
sii1: PathSquare p0i1 p1i1 pi01 pi11
si0i: PathSquare p00i p10i pi00 pi01
si1i: PathSquare p01i p11i pi10 pi11

PathCube si0i si1i (tr s0ii) (tr s1ii) (tr sii0) (tr sii1) -> PathCube (tr^-1 (tr s0ii)) (tr^-1 (tr s1ii)) (tr^-1 (tr sii0)) (tr^-1 (tr sii1)) si0i si1i
A: Type
x000, x010, x100, x110, x001, x011, x101, x111: A
p0i0: x000 = x010
p1i0: x100 = x110
pi00: x000 = x100
pi10: x010 = x110
p0i1: x001 = x011
p1i1: x101 = x111
pi01: x001 = x101
pi11: x011 = x111
p00i: x000 = x001
p01i: x010 = x011
p10i: x100 = x101
p11i: x110 = x111
s0ii: PathSquare p0i0 p0i1 p00i p01i
s1ii: PathSquare p1i0 p1i1 p10i p11i
sii0: PathSquare p0i0 p1i0 pi00 pi10
sii1: PathSquare p0i1 p1i1 pi01 pi11
si0i: PathSquare p00i p10i pi00 pi01
si1i: PathSquare p01i p11i pi10 pi11
a:= tr s0ii: PathSquare p00i p01i p0i0 p0i1

PathCube si0i si1i a (tr s1ii) (tr sii0) (tr sii1) -> PathCube (tr^-1 a) (tr^-1 (tr s1ii)) (tr^-1 (tr sii0)) (tr^-1 (tr sii1)) si0i si1i
A: Type
x000, x010, x100, x110, x001, x011, x101, x111: A
p0i0: x000 = x010
p1i0: x100 = x110
pi00: x000 = x100
pi10: x010 = x110
p0i1: x001 = x011
p1i1: x101 = x111
pi01: x001 = x101
pi11: x011 = x111
p00i: x000 = x001
p01i: x010 = x011
p10i: x100 = x101
p11i: x110 = x111
s0ii: PathSquare p0i0 p0i1 p00i p01i
s1ii: PathSquare p1i0 p1i1 p10i p11i
sii0: PathSquare p0i0 p1i0 pi00 pi10
sii1: PathSquare p0i1 p1i1 pi01 pi11
si0i: PathSquare p00i p10i pi00 pi01
si1i: PathSquare p01i p11i pi10 pi11
a:= tr s0ii: PathSquare p00i p01i p0i0 p0i1
b:= tr s1ii: PathSquare p10i p11i p1i0 p1i1

PathCube si0i si1i a b (tr sii0) (tr sii1) -> PathCube (tr^-1 a) (tr^-1 b) (tr^-1 (tr sii0)) (tr^-1 (tr sii1)) si0i si1i
A: Type
x000, x010, x100, x110, x001, x011, x101, x111: A
p0i0: x000 = x010
p1i0: x100 = x110
pi00: x000 = x100
pi10: x010 = x110
p0i1: x001 = x011
p1i1: x101 = x111
pi01: x001 = x101
pi11: x011 = x111
p00i: x000 = x001
p01i: x010 = x011
p10i: x100 = x101
p11i: x110 = x111
s0ii: PathSquare p0i0 p0i1 p00i p01i
s1ii: PathSquare p1i0 p1i1 p10i p11i
sii0: PathSquare p0i0 p1i0 pi00 pi10
sii1: PathSquare p0i1 p1i1 pi01 pi11
si0i: PathSquare p00i p10i pi00 pi01
si1i: PathSquare p01i p11i pi10 pi11
a:= tr s0ii: PathSquare p00i p01i p0i0 p0i1
b:= tr s1ii: PathSquare p10i p11i p1i0 p1i1
c:= tr sii0: PathSquare pi00 pi10 p0i0 p1i0

PathCube si0i si1i a b c (tr sii1) -> PathCube (tr^-1 a) (tr^-1 b) (tr^-1 c) (tr^-1 (tr sii1)) si0i si1i
A: Type
x000, x010, x100, x110, x001, x011, x101, x111: A
p0i0: x000 = x010
p1i0: x100 = x110
pi00: x000 = x100
pi10: x010 = x110
p0i1: x001 = x011
p1i1: x101 = x111
pi01: x001 = x101
pi11: x011 = x111
p00i: x000 = x001
p01i: x010 = x011
p10i: x100 = x101
p11i: x110 = x111
s0ii: PathSquare p0i0 p0i1 p00i p01i
s1ii: PathSquare p1i0 p1i1 p10i p11i
sii0: PathSquare p0i0 p1i0 pi00 pi10
sii1: PathSquare p0i1 p1i1 pi01 pi11
si0i: PathSquare p00i p10i pi00 pi01
si1i: PathSquare p01i p11i pi10 pi11
a:= tr s0ii: PathSquare p00i p01i p0i0 p0i1
b:= tr s1ii: PathSquare p10i p11i p1i0 p1i1
c:= tr sii0: PathSquare pi00 pi10 p0i0 p1i0
d:= tr sii1: PathSquare pi01 pi11 p0i1 p1i1

PathCube si0i si1i a b c d -> PathCube (tr^-1 a) (tr^-1 b) (tr^-1 c) (tr^-1 d) si0i si1i
A: Type
x000, x010, x100, x110, x001, x011, x101, x111: A
p0i0: x000 = x010
p1i0: x100 = x110
pi00: x000 = x100
pi10: x010 = x110
p0i1: x001 = x011
p1i1: x101 = x111
pi01: x001 = x101
pi11: x011 = x111
p00i: x000 = x001
p01i: x010 = x011
p10i: x100 = x101
p11i: x110 = x111
si0i: PathSquare p00i p10i pi00 pi01
si1i: PathSquare p01i p11i pi10 pi11
a: PathSquare p00i p01i p0i0 p0i1
b: PathSquare p10i p11i p1i0 p1i1
c: PathSquare pi00 pi10 p0i0 p1i0
d: PathSquare pi01 pi11 p0i1 p1i1

PathCube si0i si1i a b c d -> PathCube (tr^-1 a) (tr^-1 b) (tr^-1 c) (tr^-1 d) si0i si1i
A: Type
x000, x010, x100, x110, x001, x011, x101, x111: A
p0i0: x000 = x010
p1i0: x100 = x110
pi00: x000 = x100
pi10: x010 = x110
p0i1: x001 = x011
p1i1: x101 = x111
pi01: x001 = x101
pi11: x011 = x111
p00i: x000 = x001
p01i: x010 = x011
p10i: x100 = x101
p11i: x110 = x111
si0i: PathSquare p00i p10i pi00 pi01
si1i: PathSquare p01i p11i pi10 pi11
a: PathSquare p00i p01i p0i0 p0i1
b: PathSquare p10i p11i p1i0 p1i1
c: PathSquare pi00 pi10 p0i0 p1i0
d: PathSquare pi01 pi11 p0i1 p1i1
cube: PathCube si0i si1i a b c d

PathCube (tr^-1 a) (tr^-1 b) (tr^-1 c) (tr^-1 d) si0i si1i
by destruct cube.
A: Type
x000, x010, x100, x110, x001, x011, x101, x111: A
p0i0: x000 = x010
p1i0: x100 = x110
pi00: x000 = x100
pi10: x010 = x110
p0i1: x001 = x011
p1i1: x101 = x111
pi01: x001 = x101
pi11: x011 = x111
p00i: x000 = x001
p01i: x010 = x011
p10i: x100 = x101
p11i: x110 = x111
s0ii: PathSquare p0i0 p0i1 p00i p01i
s1ii: PathSquare p1i0 p1i1 p10i p11i
sii0: PathSquare p0i0 p1i0 pi00 pi10
sii1: PathSquare p0i1 p1i1 pi01 pi11
si0i: PathSquare p00i p10i pi00 pi01
si1i: PathSquare p01i p11i pi10 pi11

PathCube s0ii s1ii sii0 sii1 si0i si1i -> PathCube si0i si1i (tr s0ii) (tr s1ii) (tr sii0) (tr sii1)
A: Type
x000, x010, x100, x110, x001, x011, x101, x111: A
p0i0: x000 = x010
p1i0: x100 = x110
pi00: x000 = x100
pi10: x010 = x110
p0i1: x001 = x011
p1i1: x101 = x111
pi01: x001 = x101
pi11: x011 = x111
p00i: x000 = x001
p01i: x010 = x011
p10i: x100 = x101
p11i: x110 = x111
s0ii: PathSquare p0i0 p0i1 p00i p01i
s1ii: PathSquare p1i0 p1i1 p10i p11i
sii0: PathSquare p0i0 p1i0 pi00 pi10
sii1: PathSquare p0i1 p1i1 pi01 pi11
si0i: PathSquare p00i p10i pi00 pi01
si1i: PathSquare p01i p11i pi10 pi11
(fun cube : PathCube si0i si1i (tr s0ii) (tr s1ii) (tr sii0) (tr sii1) => cu_GGGGcc (eissect tr s0ii) (eissect tr s1ii) (eissect tr sii0) (eissect tr sii1) ((let a := tr s0ii in let b := tr s1ii in let c := tr sii0 in let d := tr sii1 in fun cube0 : PathCube si0i si1i a b c d => match cube0 in (@PathCube _ x000 x010 x100 x110 x001 x011 x101 x111 p0i0 p1i0 pi00 pi10 p0i1 p1i1 pi01 pi11 p00i p01i p10i p11i s0ii s1ii sii0 sii1 si0i si1i) return (PathCube (tr^-1 sii0) (tr^-1 sii1) (tr^-1 si0i) (tr^-1 si1i) s0ii s1ii) with | idcube x => (fun x0 : A => idcube x0) x end) cube)) o ?g == idmap
A: Type
x000, x010, x100, x110, x001, x011, x101, x111: A
p0i0: x000 = x010
p1i0: x100 = x110
pi00: x000 = x100
pi10: x010 = x110
p0i1: x001 = x011
p1i1: x101 = x111
pi01: x001 = x101
pi11: x011 = x111
p00i: x000 = x001
p01i: x010 = x011
p10i: x100 = x101
p11i: x110 = x111
s0ii: PathSquare p0i0 p0i1 p00i p01i
s1ii: PathSquare p1i0 p1i1 p10i p11i
sii0: PathSquare p0i0 p1i0 pi00 pi10
sii1: PathSquare p0i1 p1i1 pi01 pi11
si0i: PathSquare p00i p10i pi00 pi01
si1i: PathSquare p01i p11i pi10 pi11
?g o (fun cube : PathCube si0i si1i (tr s0ii) (tr s1ii) (tr sii0) (tr sii1) => cu_GGGGcc (eissect tr s0ii) (eissect tr s1ii) (eissect tr sii0) (eissect tr sii1) ((let a := tr s0ii in let b := tr s1ii in let c := tr sii0 in let d := tr sii1 in fun cube0 : PathCube si0i si1i a b c d => match cube0 in (@PathCube _ x000 x010 x100 x110 x001 x011 x101 x111 p0i0 p1i0 pi00 pi10 p0i1 p1i1 pi01 pi11 p00i p01i p10i p11i s0ii s1ii sii0 sii1 si0i si1i) return (PathCube (tr^-1 sii0) (tr^-1 sii1) (tr^-1 si0i) (tr^-1 si1i) s0ii s1ii) with | idcube x => (fun x0 : A => idcube x0) x end) cube)) == idmap
A: Type
x000, x010, x100, x110, x001, x011, x101, x111: A
p0i0: x000 = x010
p1i0: x100 = x110
pi00: x000 = x100
pi10: x010 = x110
p0i1: x001 = x011
p1i1: x101 = x111
pi01: x001 = x101
pi11: x011 = x111
p00i: x000 = x001
p01i: x010 = x011
p10i: x100 = x101
p11i: x110 = x111
s0ii: PathSquare p0i0 p0i1 p00i p01i
s1ii: PathSquare p1i0 p1i1 p10i p11i
sii0: PathSquare p0i0 p1i0 pi00 pi10
sii1: PathSquare p0i1 p1i1 pi01 pi11
si0i: PathSquare p00i p10i pi00 pi01
si1i: PathSquare p01i p11i pi10 pi11

(fun X : PathCube s0ii s1ii sii0 sii1 si0i si1i => match X in (@PathCube _ x000 x010 x100 x110 x001 x011 x101 x111 p0i0 p1i0 pi00 pi10 p0i1 p1i1 pi01 pi11 p00i p01i p10i p11i s0ii s1ii sii0 sii1 si0i si1i) return (PathCube si0i si1i (tr s0ii) (tr s1ii) (tr sii0) (tr sii1)) with | idcube x => (fun x0 : A => idcube x0) x end) o (fun cube : PathCube si0i si1i (tr s0ii) (tr s1ii) (tr sii0) (tr sii1) => cu_GGGGcc (eissect tr s0ii) (eissect tr s1ii) (eissect tr sii0) (eissect tr sii1) ((let a := tr s0ii in let b := tr s1ii in let c := tr sii0 in let d := tr sii1 in fun cube0 : PathCube si0i si1i a b c d => match cube0 in (@PathCube _ x000 x010 x100 x110 x001 x011 x101 x111 p0i0 p1i0 pi00 pi10 p0i1 p1i1 pi01 pi11 p00i p01i p10i p11i s0ii s1ii sii0 sii1 si0i si1i) return (PathCube (tr^-1 sii0) (tr^-1 sii1) (tr^-1 si0i) (tr^-1 si1i) s0ii s1ii) with | idcube x => (fun x0 : A => idcube x0) x end) cube)) == idmap
A: Type
x000, x010, x100, x110, x001, x011, x101, x111: A
p0i0: x000 = x010
p1i0: x100 = x110
pi00: x000 = x100
pi10: x010 = x110
p0i1: x001 = x011
p1i1: x101 = x111
pi01: x001 = x101
pi11: x011 = x111
p00i: x000 = x001
p01i: x010 = x011
p10i: x100 = x101
p11i: x110 = x111
s0ii: PathSquare p0i0 p0i1 p00i p01i
s1ii: PathSquare p1i0 p1i1 p10i p11i
sii0: PathSquare p0i0 p1i0 pi00 pi10
sii1: PathSquare p0i1 p1i1 pi01 pi11
si0i: PathSquare p00i p10i pi00 pi01
si1i: PathSquare p01i p11i pi10 pi11

(fun x : PathCube si0i si1i (tr (tr^-1 (tr s0ii))) (tr s1ii) (tr sii0) (tr sii1) => match cu_GGGGcc (eissect tr (tr^-1 (tr s0ii))) (eissect tr s1ii) (eissect tr sii0) (eissect tr sii1) ((let a := tr (tr^-1 (tr s0ii)) in let b := tr s1ii in let c := tr sii0 in let d := tr sii1 in fun cube : PathCube si0i si1i a b c d => match cube in (@PathCube _ x000 x010 x100 x110 x001 x011 x101 x111 p0i0 p1i0 pi00 pi10 p0i1 p1i1 pi01 pi11 p00i p01i p10i p11i s0ii s1ii sii0 sii1 si0i si1i) return (PathCube (tr^-1 sii0) (tr^-1 sii1) (tr^-1 si0i) (tr^-1 si1i) s0ii s1ii) with | idcube x0 => idcube x0 end) x) in (@PathCube _ x000 x010 x100 x110 x001 x011 x101 x111 p0i0 p1i0 pi00 pi10 p0i1 p1i1 pi01 pi11 p00i p01i p10i p11i s0ii s1ii sii0 sii1 si0i si1i) return (PathCube si0i si1i (tr s0ii) (tr s1ii) (tr sii0) (tr sii1)) with | idcube x0 => idcube x0 end) == idmap
A: Type
x000, x010, x100, x110, x001, x011, x101, x111: A
p0i0: x000 = x010
p1i0: x100 = x110
pi00: x000 = x100
pi10: x010 = x110
p0i1: x001 = x011
p1i1: x101 = x111
pi01: x001 = x101
pi11: x011 = x111
p00i: x000 = x001
p01i: x010 = x011
p10i: x100 = x101
p11i: x110 = x111
s0ii: PathSquare p0i0 p0i1 p00i p01i
s1ii: PathSquare p1i0 p1i1 p10i p11i
sii0: PathSquare p0i0 p1i0 pi00 pi10
sii1: PathSquare p0i1 p1i1 pi01 pi11
si0i: PathSquare p00i p10i pi00 pi01
si1i: PathSquare p01i p11i pi10 pi11

(fun x : PathCube si0i si1i (tr (tr^-1 (tr s0ii))) (tr (tr^-1 (tr s1ii))) (tr sii0) (tr sii1) => match cu_GGGGcc (eissect tr (tr^-1 (tr s0ii))) (eissect tr (tr^-1 (tr s1ii))) (eissect tr sii0) (eissect tr sii1) ((let a := tr (tr^-1 (tr s0ii)) in let b := tr (tr^-1 (tr s1ii)) in let c := tr sii0 in let d := tr sii1 in fun cube : PathCube si0i si1i a b c d => match cube in (@PathCube _ x000 x010 x100 x110 x001 x011 x101 x111 p0i0 p1i0 pi00 pi10 p0i1 p1i1 pi01 pi11 p00i p01i p10i p11i s0ii s1ii sii0 sii1 si0i si1i) return (PathCube (tr^-1 sii0) (tr^-1 sii1) (tr^-1 si0i) (tr^-1 si1i) s0ii s1ii) with | idcube x0 => idcube x0 end) x) in (@PathCube _ x000 x010 x100 x110 x001 x011 x101 x111 p0i0 p1i0 pi00 pi10 p0i1 p1i1 pi01 pi11 p00i p01i p10i p11i s0ii s1ii sii0 sii1 si0i si1i) return (PathCube si0i si1i (tr s0ii) (tr s1ii) (tr sii0) (tr sii1)) with | idcube x0 => idcube x0 end) == idmap
A: Type
x000, x010, x100, x110, x001, x011, x101, x111: A
p0i0: x000 = x010
p1i0: x100 = x110
pi00: x000 = x100
pi10: x010 = x110
p0i1: x001 = x011
p1i1: x101 = x111
pi01: x001 = x101
pi11: x011 = x111
p00i: x000 = x001
p01i: x010 = x011
p10i: x100 = x101
p11i: x110 = x111
s0ii: PathSquare p0i0 p0i1 p00i p01i
s1ii: PathSquare p1i0 p1i1 p10i p11i
sii0: PathSquare p0i0 p1i0 pi00 pi10
sii1: PathSquare p0i1 p1i1 pi01 pi11
si0i: PathSquare p00i p10i pi00 pi01
si1i: PathSquare p01i p11i pi10 pi11

(fun x : PathCube si0i si1i (tr (tr^-1 (tr s0ii))) (tr (tr^-1 (tr s1ii))) (tr (tr^-1 (tr sii0))) (tr sii1) => match cu_GGGGcc (eissect tr (tr^-1 (tr s0ii))) (eissect tr (tr^-1 (tr s1ii))) (eissect tr (tr^-1 (tr sii0))) (eissect tr sii1) ((let a := tr (tr^-1 (tr s0ii)) in let b := tr (tr^-1 (tr s1ii)) in let c := tr (tr^-1 (tr sii0)) in let d := tr sii1 in fun cube : PathCube si0i si1i a b c d => match cube in (@PathCube _ x000 x010 x100 x110 x001 x011 x101 x111 p0i0 p1i0 pi00 pi10 p0i1 p1i1 pi01 pi11 p00i p01i p10i p11i s0ii s1ii sii0 sii1 si0i si1i) return (PathCube (tr^-1 sii0) (tr^-1 sii1) (tr^-1 si0i) (tr^-1 si1i) s0ii s1ii) with | idcube x0 => idcube x0 end) x) in (@PathCube _ x000 x010 x100 x110 x001 x011 x101 x111 p0i0 p1i0 pi00 pi10 p0i1 p1i1 pi01 pi11 p00i p01i p10i p11i s0ii s1ii sii0 sii1 si0i si1i) return (PathCube si0i si1i (tr s0ii) (tr s1ii) (tr sii0) (tr sii1)) with | idcube x0 => idcube x0 end) == idmap
A: Type
x000, x010, x100, x110, x001, x011, x101, x111: A
p0i0: x000 = x010
p1i0: x100 = x110
pi00: x000 = x100
pi10: x010 = x110
p0i1: x001 = x011
p1i1: x101 = x111
pi01: x001 = x101
pi11: x011 = x111
p00i: x000 = x001
p01i: x010 = x011
p10i: x100 = x101
p11i: x110 = x111
s0ii: PathSquare p0i0 p0i1 p00i p01i
s1ii: PathSquare p1i0 p1i1 p10i p11i
sii0: PathSquare p0i0 p1i0 pi00 pi10
sii1: PathSquare p0i1 p1i1 pi01 pi11
si0i: PathSquare p00i p10i pi00 pi01
si1i: PathSquare p01i p11i pi10 pi11

(fun x : PathCube si0i si1i (tr (tr^-1 (tr s0ii))) (tr (tr^-1 (tr s1ii))) (tr (tr^-1 (tr sii0))) (tr (tr^-1 (tr sii1))) => match cu_GGGGcc (eissect tr (tr^-1 (tr s0ii))) (eissect tr (tr^-1 (tr s1ii))) (eissect tr (tr^-1 (tr sii0))) (eissect tr (tr^-1 (tr sii1))) ((let a := tr (tr^-1 (tr s0ii)) in let b := tr (tr^-1 (tr s1ii)) in let c := tr (tr^-1 (tr sii0)) in let d := tr (tr^-1 (tr sii1)) in fun cube : PathCube si0i si1i a b c d => match cube in (@PathCube _ x000 x010 x100 x110 x001 x011 x101 x111 p0i0 p1i0 pi00 pi10 p0i1 p1i1 pi01 pi11 p00i p01i p10i p11i s0ii s1ii sii0 sii1 si0i si1i) return (PathCube (tr^-1 sii0) (tr^-1 sii1) (tr^-1 si0i) (tr^-1 si1i) s0ii s1ii) with | idcube x0 => idcube x0 end) x) in (@PathCube _ x000 x010 x100 x110 x001 x011 x101 x111 p0i0 p1i0 pi00 pi10 p0i1 p1i1 pi01 pi11 p00i p01i p10i p11i s0ii s1ii sii0 sii1 si0i si1i) return (PathCube si0i si1i (tr s0ii) (tr s1ii) (tr sii0) (tr sii1)) with | idcube x0 => idcube x0 end) == idmap
A: Type
x000, x010, x100, x110, x001, x011, x101, x111: A
p0i0: x000 = x010
p1i0: x100 = x110
pi00: x000 = x100
pi10: x010 = x110
p0i1: x001 = x011
p1i1: x101 = x111
pi01: x001 = x101
pi11: x011 = x111
p00i: x000 = x001
p01i: x010 = x011
p10i: x100 = x101
p11i: x110 = x111
s0ii: PathSquare p0i0 p0i1 p00i p01i
s1ii: PathSquare p1i0 p1i1 p10i p11i
sii0: PathSquare p0i0 p1i0 pi00 pi10
sii1: PathSquare p0i1 p1i1 pi01 pi11
si0i: PathSquare p00i p10i pi00 pi01
si1i: PathSquare p01i p11i pi10 pi11
a:= tr s0ii: PathSquare p00i p01i p0i0 p0i1

(fun x : PathCube si0i si1i (tr (tr^-1 a)) (tr (tr^-1 (tr s1ii))) (tr (tr^-1 (tr sii0))) (tr (tr^-1 (tr sii1))) => match cu_GGGGcc (eissect tr (tr^-1 a)) (eissect tr (tr^-1 (tr s1ii))) (eissect tr (tr^-1 (tr sii0))) (eissect tr (tr^-1 (tr sii1))) ((let a := tr (tr^-1 a) in let b := tr (tr^-1 (tr s1ii)) in let c := tr (tr^-1 (tr sii0)) in let d := tr (tr^-1 (tr sii1)) in fun cube : PathCube si0i si1i a b c d => match cube in (@PathCube _ x000 x010 x100 x110 x001 x011 x101 x111 p0i0 p1i0 pi00 pi10 p0i1 p1i1 pi01 pi11 p00i p01i p10i p11i s0ii s1ii sii0 sii1 si0i si1i) return (PathCube (tr^-1 sii0) (tr^-1 sii1) (tr^-1 si0i) (tr^-1 si1i) s0ii s1ii) with | idcube x0 => idcube x0 end) x) in (@PathCube _ x000 x010 x100 x110 x001 x011 x101 x111 p0i0 p1i0 pi00 pi10 p0i1 p1i1 pi01 pi11 p00i p01i p10i p11i s0ii s1ii sii0 sii1 si0i si1i) return (PathCube si0i si1i (tr s0ii) (tr s1ii) (tr sii0) (tr sii1)) with | idcube x0 => idcube x0 end) == idmap
A: Type
x000, x010, x100, x110, x001, x011, x101, x111: A
p0i0: x000 = x010
p1i0: x100 = x110
pi00: x000 = x100
pi10: x010 = x110
p0i1: x001 = x011
p1i1: x101 = x111
pi01: x001 = x101
pi11: x011 = x111
p00i: x000 = x001
p01i: x010 = x011
p10i: x100 = x101
p11i: x110 = x111
s0ii: PathSquare p0i0 p0i1 p00i p01i
s1ii: PathSquare p1i0 p1i1 p10i p11i
sii0: PathSquare p0i0 p1i0 pi00 pi10
sii1: PathSquare p0i1 p1i1 pi01 pi11
si0i: PathSquare p00i p10i pi00 pi01
si1i: PathSquare p01i p11i pi10 pi11
a:= tr s0ii: PathSquare p00i p01i p0i0 p0i1
b:= tr s1ii: PathSquare p10i p11i p1i0 p1i1

(fun x : PathCube si0i si1i (tr (tr^-1 a)) (tr (tr^-1 b)) (tr (tr^-1 (tr sii0))) (tr (tr^-1 (tr sii1))) => match cu_GGGGcc (eissect tr (tr^-1 a)) (eissect tr (tr^-1 b)) (eissect tr (tr^-1 (tr sii0))) (eissect tr (tr^-1 (tr sii1))) ((let a := tr (tr^-1 a) in let b := tr (tr^-1 b) in let c := tr (tr^-1 (tr sii0)) in let d := tr (tr^-1 (tr sii1)) in fun cube : PathCube si0i si1i a b c d => match cube in (@PathCube _ x000 x010 x100 x110 x001 x011 x101 x111 p0i0 p1i0 pi00 pi10 p0i1 p1i1 pi01 pi11 p00i p01i p10i p11i s0ii s1ii sii0 sii1 si0i si1i) return (PathCube (tr^-1 sii0) (tr^-1 sii1) (tr^-1 si0i) (tr^-1 si1i) s0ii s1ii) with | idcube x0 => idcube x0 end) x) in (@PathCube _ x000 x010 x100 x110 x001 x011 x101 x111 p0i0 p1i0 pi00 pi10 p0i1 p1i1 pi01 pi11 p00i p01i p10i p11i s0ii s1ii sii0 sii1 si0i si1i) return (PathCube si0i si1i (tr s0ii) (tr s1ii) (tr sii0) (tr sii1)) with | idcube x0 => idcube x0 end) == idmap
A: Type
x000, x010, x100, x110, x001, x011, x101, x111: A
p0i0: x000 = x010
p1i0: x100 = x110
pi00: x000 = x100
pi10: x010 = x110
p0i1: x001 = x011
p1i1: x101 = x111
pi01: x001 = x101
pi11: x011 = x111
p00i: x000 = x001
p01i: x010 = x011
p10i: x100 = x101
p11i: x110 = x111
s0ii: PathSquare p0i0 p0i1 p00i p01i
s1ii: PathSquare p1i0 p1i1 p10i p11i
sii0: PathSquare p0i0 p1i0 pi00 pi10
sii1: PathSquare p0i1 p1i1 pi01 pi11
si0i: PathSquare p00i p10i pi00 pi01
si1i: PathSquare p01i p11i pi10 pi11
a:= tr s0ii: PathSquare p00i p01i p0i0 p0i1
b:= tr s1ii: PathSquare p10i p11i p1i0 p1i1
c:= tr sii0: PathSquare pi00 pi10 p0i0 p1i0

(fun x : PathCube si0i si1i (tr (tr^-1 a)) (tr (tr^-1 b)) (tr (tr^-1 c)) (tr (tr^-1 (tr sii1))) => match cu_GGGGcc (eissect tr (tr^-1 a)) (eissect tr (tr^-1 b)) (eissect tr (tr^-1 c)) (eissect tr (tr^-1 (tr sii1))) ((let a := tr (tr^-1 a) in let b := tr (tr^-1 b) in let c := tr (tr^-1 c) in let d := tr (tr^-1 (tr sii1)) in fun cube : PathCube si0i si1i a b c d => match cube in (@PathCube _ x000 x010 x100 x110 x001 x011 x101 x111 p0i0 p1i0 pi00 pi10 p0i1 p1i1 pi01 pi11 p00i p01i p10i p11i s0ii s1ii sii0 sii1 si0i si1i) return (PathCube (tr^-1 sii0) (tr^-1 sii1) (tr^-1 si0i) (tr^-1 si1i) s0ii s1ii) with | idcube x0 => idcube x0 end) x) in (@PathCube _ x000 x010 x100 x110 x001 x011 x101 x111 p0i0 p1i0 pi00 pi10 p0i1 p1i1 pi01 pi11 p00i p01i p10i p11i s0ii s1ii sii0 sii1 si0i si1i) return (PathCube si0i si1i (tr s0ii) (tr s1ii) (tr sii0) (tr sii1)) with | idcube x0 => idcube x0 end) == idmap
A: Type
x000, x010, x100, x110, x001, x011, x101, x111: A
p0i0: x000 = x010
p1i0: x100 = x110
pi00: x000 = x100
pi10: x010 = x110
p0i1: x001 = x011
p1i1: x101 = x111
pi01: x001 = x101
pi11: x011 = x111
p00i: x000 = x001
p01i: x010 = x011
p10i: x100 = x101
p11i: x110 = x111
s0ii: PathSquare p0i0 p0i1 p00i p01i
s1ii: PathSquare p1i0 p1i1 p10i p11i
sii0: PathSquare p0i0 p1i0 pi00 pi10
sii1: PathSquare p0i1 p1i1 pi01 pi11
si0i: PathSquare p00i p10i pi00 pi01
si1i: PathSquare p01i p11i pi10 pi11
a:= tr s0ii: PathSquare p00i p01i p0i0 p0i1
b:= tr s1ii: PathSquare p10i p11i p1i0 p1i1
c:= tr sii0: PathSquare pi00 pi10 p0i0 p1i0
d:= tr sii1: PathSquare pi01 pi11 p0i1 p1i1

(fun x : PathCube si0i si1i (tr (tr^-1 a)) (tr (tr^-1 b)) (tr (tr^-1 c)) (tr (tr^-1 d)) => match cu_GGGGcc (eissect tr (tr^-1 a)) (eissect tr (tr^-1 b)) (eissect tr (tr^-1 c)) (eissect tr (tr^-1 d)) ((let a := tr (tr^-1 a) in let b := tr (tr^-1 b) in let c := tr (tr^-1 c) in let d := tr (tr^-1 d) in fun cube : PathCube si0i si1i a b c d => match cube in (@PathCube _ x000 x010 x100 x110 x001 x011 x101 x111 p0i0 p1i0 pi00 pi10 p0i1 p1i1 pi01 pi11 p00i p01i p10i p11i s0ii s1ii sii0 sii1 si0i si1i) return (PathCube (tr^-1 sii0) (tr^-1 sii1) (tr^-1 si0i) (tr^-1 si1i) s0ii s1ii) with | idcube x0 => idcube x0 end) x) in (@PathCube _ x000 x010 x100 x110 x001 x011 x101 x111 p0i0 p1i0 pi00 pi10 p0i1 p1i1 pi01 pi11 p00i p01i p10i p11i s0ii s1ii sii0 sii1 si0i si1i) return (PathCube si0i si1i (tr s0ii) (tr s1ii) (tr sii0) (tr sii1)) with | idcube x0 => idcube x0 end) == idmap
A: Type
x000, x010, x100, x110, x001, x011, x101, x111: A
p0i0: x000 = x010
p1i0: x100 = x110
pi00: x000 = x100
pi10: x010 = x110
p0i1: x001 = x011
p1i1: x101 = x111
pi01: x001 = x101
pi11: x011 = x111
p00i: x000 = x001
p01i: x010 = x011
p10i: x100 = x101
p11i: x110 = x111
si0i: PathSquare p00i p10i pi00 pi01
si1i: PathSquare p01i p11i pi10 pi11
a: PathSquare p00i p01i p0i0 p0i1
b: PathSquare p10i p11i p1i0 p1i1
c: PathSquare pi00 pi10 p0i0 p1i0
d: PathSquare pi01 pi11 p0i1 p1i1

(fun x : PathCube si0i si1i (tr (tr^-1 a)) (tr (tr^-1 b)) (tr (tr^-1 c)) (tr (tr^-1 d)) => match cu_GGGGcc (eissect tr (tr^-1 a)) (eissect tr (tr^-1 b)) (eissect tr (tr^-1 c)) (eissect tr (tr^-1 d)) ((let a := tr (tr^-1 a) in let b := tr (tr^-1 b) in let c := tr (tr^-1 c) in let d := tr (tr^-1 d) in fun cube : PathCube si0i si1i a b c d => match cube in (@PathCube _ x000 x010 x100 x110 x001 x011 x101 x111 p0i0 p1i0 pi00 pi10 p0i1 p1i1 pi01 pi11 p00i p01i p10i p11i s0ii s1ii sii0 sii1 si0i si1i) return (PathCube (tr^-1 sii0) (tr^-1 sii1) (tr^-1 si0i) (tr^-1 si1i) s0ii s1ii) with | idcube x0 => idcube x0 end) x) in (@PathCube _ x000 x010 x100 x110 x001 x011 x101 x111 p0i0 p1i0 pi00 pi10 p0i1 p1i1 pi01 pi11 p00i p01i p10i p11i s0ii s1ii sii0 sii1 si0i si1i) return (PathCube si0i si1i (tr s0ii) (tr s1ii) (tr sii0) (tr sii1)) with | idcube x0 => idcube x0 end) == idmap
A: Type
x000, x010, x100, x110, x001, x011, x101, x111: A
p0i0: x000 = x010
p1i0: x100 = x110
pi00: x000 = x100
pi10: x010 = x110
p0i1: x001 = x011
p1i1: x101 = x111
pi01: x001 = x101
pi11: x011 = x111
p00i: x000 = x001
p01i: x010 = x011
p10i: x100 = x101
p11i: x110 = x111
si0i: PathSquare p00i p10i pi00 pi01
si1i: PathSquare p01i p11i pi10 pi11
a: PathSquare p00i p01i p0i0 p0i1
b: PathSquare p10i p11i p1i0 p1i1
c: PathSquare pi00 pi10 p0i0 p1i0
d: PathSquare pi01 pi11 p0i1 p1i1
X: PathCube si0i si1i (tr (tr^-1 a)) (tr (tr^-1 b)) (tr (tr^-1 c)) (tr (tr^-1 d))

match cu_GGGGcc (eissect tr (tr^-1 a)) (eissect tr (tr^-1 b)) (eissect tr (tr^-1 c)) (eissect tr (tr^-1 d)) ((let a := tr (tr^-1 a) in let b := tr (tr^-1 b) in let c := tr (tr^-1 c) in let d := tr (tr^-1 d) in fun cube : PathCube si0i si1i a b c d => match cube in (@PathCube _ x000 x010 x100 x110 x001 x011 x101 x111 p0i0 p1i0 pi00 pi10 p0i1 p1i1 pi01 pi11 p00i p01i p10i p11i s0ii s1ii sii0 sii1 si0i si1i) return (PathCube (tr^-1 sii0) (tr^-1 sii1) (tr^-1 si0i) (tr^-1 si1i) s0ii s1ii) with | idcube x => idcube x end) X) in (@PathCube _ x000 x010 x100 x110 x001 x011 x101 x111 p0i0 p1i0 pi00 pi10 p0i1 p1i1 pi01 pi11 p00i p01i p10i p11i s0ii s1ii sii0 sii1 si0i si1i) return (PathCube si0i si1i (tr s0ii) (tr s1ii) (tr sii0) (tr sii1)) with | idcube x => idcube x end = X
A: Type
x000, x010, x100, x110, x001, x011, x101, x111: A
p0i0: x000 = x010
p1i0: x100 = x110
pi00: x000 = x100
pi10: x010 = x110
p0i1: x001 = x011
p1i1: x101 = x111
pi01: x001 = x101
pi11: x011 = x111
p00i: x000 = x001
p01i: x010 = x011
p10i: x100 = x101
p11i: x110 = x111
si0i: PathSquare p00i p10i pi00 pi01
si1i: PathSquare p01i p11i pi10 pi11
a: PathSquare p00i p01i p0i0 p0i1
b: PathSquare p10i p11i p1i0 p1i1
c: PathSquare pi00 pi10 p0i0 p1i0
d: PathSquare pi01 pi11 p0i1 p1i1
X: PathCube si0i si1i (tr (tr^-1 a)) (tr (tr^-1 b)) (tr (tr^-1 c)) (tr (tr^-1 d))

match cu_GGGGcc (eissect tr (tr^-1 a)) (eissect tr (tr^-1 b)) (eissect tr (tr^-1 c)) (eissect tr (tr^-1 d)) ((let a := tr (tr^-1 a) in let b := tr (tr^-1 b) in let c := tr (tr^-1 c) in let d := tr (tr^-1 d) in fun cube : PathCube si0i si1i a b c d => match cube in (@PathCube _ x000 x010 x100 x110 x001 x011 x101 x111 p0i0 p1i0 pi00 pi10 p0i1 p1i1 pi01 pi11 p00i p01i p10i p11i s0ii s1ii sii0 sii1 si0i si1i) return (PathCube (tr^-1 sii0) (tr^-1 sii1) (tr^-1 si0i) (tr^-1 si1i) s0ii s1ii) with | idcube x => idcube x end) ((cu_ccGGGG (eisretr tr a) (eisretr tr b) (eisretr tr c) (eisretr tr d))^-1 (cu_ccGGGG (eisretr tr a) (eisretr tr b) (eisretr tr c) (eisretr tr d) X))) in (@PathCube _ x000 x010 x100 x110 x001 x011 x101 x111 p0i0 p1i0 pi00 pi10 p0i1 p1i1 pi01 pi11 p00i p01i p10i p11i s0ii s1ii sii0 sii1 si0i si1i) return (PathCube si0i si1i (tr s0ii) (tr s1ii) (tr sii0) (tr sii1)) with | idcube x => idcube x end = (cu_ccGGGG (eisretr tr a) (eisretr tr b) (eisretr tr c) (eisretr tr d))^-1 (cu_ccGGGG (eisretr tr a) (eisretr tr b) (eisretr tr c) (eisretr tr d) X)
A: Type
x000, x010, x100, x110, x001, x011, x101, x111: A
p0i0: x000 = x010
p1i0: x100 = x110
pi00: x000 = x100
pi10: x010 = x110
p0i1: x001 = x011
p1i1: x101 = x111
pi01: x001 = x101
pi11: x011 = x111
p00i: x000 = x001
p01i: x010 = x011
p10i: x100 = x101
p11i: x110 = x111
si0i: PathSquare p00i p10i pi00 pi01
si1i: PathSquare p01i p11i pi10 pi11
a: PathSquare p00i p01i p0i0 p0i1
b: PathSquare p10i p11i p1i0 p1i1
c: PathSquare pi00 pi10 p0i0 p1i0
d: PathSquare pi01 pi11 p0i1 p1i1
X: PathCube si0i si1i (tr (tr^-1 a)) (tr (tr^-1 b)) (tr (tr^-1 c)) (tr (tr^-1 d))
e:= cu_ccGGGG (eisretr tr a) (eisretr tr b) (eisretr tr c) (eisretr tr d) X: PathCube si0i si1i a b c d

match cu_GGGGcc (eissect tr (tr^-1 a)) (eissect tr (tr^-1 b)) (eissect tr (tr^-1 c)) (eissect tr (tr^-1 d)) ((let a := tr (tr^-1 a) in let b := tr (tr^-1 b) in let c := tr (tr^-1 c) in let d := tr (tr^-1 d) in fun cube : PathCube si0i si1i a b c d => match cube in (@PathCube _ x000 x010 x100 x110 x001 x011 x101 x111 p0i0 p1i0 pi00 pi10 p0i1 p1i1 pi01 pi11 p00i p01i p10i p11i s0ii s1ii sii0 sii1 si0i si1i) return (PathCube (tr^-1 sii0) (tr^-1 sii1) (tr^-1 si0i) (tr^-1 si1i) s0ii s1ii) with | idcube x => idcube x end) ((cu_ccGGGG (eisretr tr a) (eisretr tr b) (eisretr tr c) (eisretr tr d))^-1 e)) in (@PathCube _ x000 x010 x100 x110 x001 x011 x101 x111 p0i0 p1i0 pi00 pi10 p0i1 p1i1 pi01 pi11 p00i p01i p10i p11i s0ii s1ii sii0 sii1 si0i si1i) return (PathCube si0i si1i (tr s0ii) (tr s1ii) (tr sii0) (tr sii1)) with | idcube x => idcube x end = (cu_ccGGGG (eisretr tr a) (eisretr tr b) (eisretr tr c) (eisretr tr d))^-1 e
A: Type
x000, x010, x100, x110, x001, x011, x101, x111: A
p0i0: x000 = x010
p1i0: x100 = x110
pi00: x000 = x100
pi10: x010 = x110
p0i1: x001 = x011
p1i1: x101 = x111
pi01: x001 = x101
pi11: x011 = x111
p00i: x000 = x001
p01i: x010 = x011
p10i: x100 = x101
p11i: x110 = x111
si0i: PathSquare p00i p10i pi00 pi01
si1i: PathSquare p01i p11i pi10 pi11
a: PathSquare p00i p01i p0i0 p0i1
b: PathSquare p10i p11i p1i0 p1i1
c: PathSquare pi00 pi10 p0i0 p1i0
d: PathSquare pi01 pi11 p0i1 p1i1
e: PathCube si0i si1i a b c d

match cu_GGGGcc (eissect tr (tr^-1 a)) (eissect tr (tr^-1 b)) (eissect tr (tr^-1 c)) (eissect tr (tr^-1 d)) ((let a := tr (tr^-1 a) in let b := tr (tr^-1 b) in let c := tr (tr^-1 c) in let d := tr (tr^-1 d) in fun cube : PathCube si0i si1i a b c d => match cube in (@PathCube _ x000 x010 x100 x110 x001 x011 x101 x111 p0i0 p1i0 pi00 pi10 p0i1 p1i1 pi01 pi11 p00i p01i p10i p11i s0ii s1ii sii0 sii1 si0i si1i) return (PathCube (tr^-1 sii0) (tr^-1 sii1) (tr^-1 si0i) (tr^-1 si1i) s0ii s1ii) with | idcube x => idcube x end) ((cu_ccGGGG (eisretr tr a) (eisretr tr b) (eisretr tr c) (eisretr tr d))^-1 e)) in (@PathCube _ x000 x010 x100 x110 x001 x011 x101 x111 p0i0 p1i0 pi00 pi10 p0i1 p1i1 pi01 pi11 p00i p01i p10i p11i s0ii s1ii sii0 sii1 si0i si1i) return (PathCube si0i si1i (tr s0ii) (tr s1ii) (tr sii0) (tr sii1)) with | idcube x => idcube x end = (cu_ccGGGG (eisretr tr a) (eisretr tr b) (eisretr tr c) (eisretr tr d))^-1 e
by destruct e. Defined. Notation cu_rot_tb_fb := equiv_cu_rot_tb_fb. (* Degnerate cubes formed from paths between squares *) (* The first case is easiest to prove and can be written as equivalences *)
A: Type
a00, a10, a01, a11: A
px0: a00 = a10
px1: a01 = a11
p0x: a00 = a01
p1x: a10 = a11
s, s': PathSquare px0 px1 p0x p1x

s = s' <~> PathCube s s' hr hr hr hr
A: Type
a00, a10, a01, a11: A
px0: a00 = a10
px1: a01 = a11
p0x: a00 = a01
p1x: a10 = a11
s, s': PathSquare px0 px1 p0x p1x

s = s' <~> PathCube s s' hr hr hr hr
A: Type
x: A
s': PathSquare 1 1 1 1

1 = s' <~> PathCube 1 s' hr hr hr hr
A: Type
x: A
s': PathSquare 1 1 1 1

1 = s' <~> sq_concat_h (tr (fv 1)) (sq_concat_h hr (tr s')) = sq_ccGG (moveL_Vp (1 @ 1) 1 1 (sq_path^-1 hr)) (moveL_Vp (1 @ 1) 1 1 (sq_path^-1 hr)) hr
A: Type
x: A
s': PathSquare 1 1 1 1

1 = s' <~> sq_ccGG (concat_1p (1 @ 1))^ (concat_1p (1 @ 1))^ (sq_concat_h 1 (tr s')) = sq_ccGG (moveL_Vp (1 @ 1) 1 1 (sq_path^-1 hr)) (moveL_Vp (1 @ 1) 1 1 (sq_path^-1 hr)) hr
A: Type
x: A
s': PathSquare 1 1 1 1

1 = s' <~> sq_ccGG (concat_1p 1)^ (concat_1p 1)^ (tr s') = sq_ccGG (moveL_Vp (1 @ 1) 1 1 (sq_path^-1 hr)) (moveL_Vp (1 @ 1) 1 1 (sq_path^-1 hr)) hr
A: Type
x: A
s': PathSquare 1 1 1 1

1 = s' <~> s' = tr^-1 (sq_ccGG (moveL_Vp (1 @ 1) 1 1 (sq_path^-1 hr)) (moveL_Vp (1 @ 1) 1 1 (sq_path^-1 hr)) hr)
apply equiv_path_inverse. Defined. (* This case can be reduced to the first by rotating the cube and rewriting some faces *)
A: Type
a00, a10, a01, a11: A
px0: a00 = a10
px1: a01 = a11
p0x: a00 = a01
p1x: a10 = a11
s, s': PathSquare px0 px1 p0x p1x

s = s' <~> PathCube hr hr s s' vr vr
A: Type
a00, a10, a01, a11: A
px0: a00 = a10
px1: a01 = a11
p0x: a00 = a01
p1x: a10 = a11
s, s': PathSquare px0 px1 p0x p1x

s = s' <~> PathCube hr hr s s' vr vr
A: Type
a00, a10, a01, a11: A
px0: a00 = a10
px1: a01 = a11
p0x: a00 = a01
p1x: a10 = a11
s, s': PathSquare px0 px1 p0x p1x

s = s' <~> PathCube vr vr (tr hr) (tr hr) (tr s) (tr s')
A: Type
a00, a10, a01, a11: A
px0: a00 = a10
px1: a01 = a11
p0x: a00 = a01
p1x: a10 = a11
s, s': PathSquare px0 px1 p0x p1x

s = s' <~> PathCube (tr s) (tr s') (tr vr) (tr vr) (tr (tr hr)) (tr (tr hr))
A: Type
a00, a10, a01, a11: A
px0: a00 = a10
px1: a01 = a11
p0x: a00 = a01
p1x: a10 = a11
s, s': PathSquare px0 px1 p0x p1x

?Goal = tr vr
A: Type
a00, a10, a01, a11: A
px0: a00 = a10
px1: a01 = a11
p0x: a00 = a01
p1x: a10 = a11
s, s': PathSquare px0 px1 p0x p1x
?Goal0 = tr vr
A: Type
a00, a10, a01, a11: A
px0: a00 = a10
px1: a01 = a11
p0x: a00 = a01
p1x: a10 = a11
s, s': PathSquare px0 px1 p0x p1x
?Goal1 = tr (tr hr)
A: Type
a00, a10, a01, a11: A
px0: a00 = a10
px1: a01 = a11
p0x: a00 = a01
p1x: a10 = a11
s, s': PathSquare px0 px1 p0x p1x
?Goal2 = tr (tr hr)
A: Type
a00, a10, a01, a11: A
px0: a00 = a10
px1: a01 = a11
p0x: a00 = a01
p1x: a10 = a11
s, s': PathSquare px0 px1 p0x p1x
s = s' <~> PathCube (tr s) (tr s') ?Goal ?Goal0 ?Goal1 ?Goal2
A: Type
a00, a10, a01, a11: A
px0: a00 = a10
px1: a01 = a11
p0x: a00 = a01
p1x: a10 = a11
s, s': PathSquare px0 px1 p0x p1x

?Goal = tr (tr hr)
A: Type
a00, a10, a01, a11: A
px0: a00 = a10
px1: a01 = a11
p0x: a00 = a01
p1x: a10 = a11
s, s': PathSquare px0 px1 p0x p1x
?Goal0 = tr (tr hr)
A: Type
a00, a10, a01, a11: A
px0: a00 = a10
px1: a01 = a11
p0x: a00 = a01
p1x: a10 = a11
s, s': PathSquare px0 px1 p0x p1x
s = s' <~> PathCube (tr s) (tr s') hr hr ?Goal ?Goal0
A: Type
a00, a10, a01, a11: A
px0: a00 = a10
px1: a01 = a11
p0x: a00 = a01
p1x: a10 = a11
s, s': PathSquare px0 px1 p0x p1x

s = s' <~> PathCube (tr s) (tr s') hr hr hr hr
A: Type
a00, a10, a01, a11: A
px0: a00 = a10
px1: a01 = a11
p0x: a00 = a01
p1x: a10 = a11
s, s': PathSquare px0 px1 p0x p1x

tr s = tr s' <~> PathCube (tr s) (tr s') hr hr hr hr
apply equiv_cu_G11. Defined. (* Finally this is an even simpler rotation *)
A: Type
a00, a10, a01, a11: A
px0: a00 = a10
px1: a01 = a11
p0x: a00 = a01
p1x: a10 = a11
s, s': PathSquare px0 px1 p0x p1x

s = s' <~> PathCube vr vr vr vr s s'
A: Type
a00, a10, a01, a11: A
px0: a00 = a10
px1: a01 = a11
p0x: a00 = a01
p1x: a10 = a11
s, s': PathSquare px0 px1 p0x p1x

s = s' <~> PathCube vr vr vr vr s s'
A: Type
a00, a10, a01, a11: A
px0: a00 = a10
px1: a01 = a11
p0x: a00 = a01
p1x: a10 = a11
s, s': PathSquare px0 px1 p0x p1x

s = s' <~> PathCube s s' (tr vr) (tr vr) (tr vr) (tr vr)
A: Type
a00, a10, a01, a11: A
px0: a00 = a10
px1: a01 = a11
p0x: a00 = a01
p1x: a10 = a11
s, s': PathSquare px0 px1 p0x p1x

?Goal = tr vr
A: Type
a00, a10, a01, a11: A
px0: a00 = a10
px1: a01 = a11
p0x: a00 = a01
p1x: a10 = a11
s, s': PathSquare px0 px1 p0x p1x
?Goal0 = tr vr
A: Type
a00, a10, a01, a11: A
px0: a00 = a10
px1: a01 = a11
p0x: a00 = a01
p1x: a10 = a11
s, s': PathSquare px0 px1 p0x p1x
?Goal1 = tr vr
A: Type
a00, a10, a01, a11: A
px0: a00 = a10
px1: a01 = a11
p0x: a00 = a01
p1x: a10 = a11
s, s': PathSquare px0 px1 p0x p1x
?Goal2 = tr vr
A: Type
a00, a10, a01, a11: A
px0: a00 = a10
px1: a01 = a11
p0x: a00 = a01
p1x: a10 = a11
s, s': PathSquare px0 px1 p0x p1x
s = s' <~> PathCube s s' ?Goal ?Goal0 ?Goal1 ?Goal2
A: Type
a00, a10, a01, a11: A
px0: a00 = a10
px1: a01 = a11
p0x: a00 = a01
p1x: a10 = a11
s, s': PathSquare px0 px1 p0x p1x

s = s' <~> PathCube s s' hr hr hr hr
by apply equiv_cu_G11. Defined. Notation cu_G11 := equiv_cu_G11. Notation cu_1G1 := equiv_cu_1G1. Notation cu_11G := equiv_cu_11G. (* Degnerate cubes given by squares *) Section PathPathSquares. Context {A} {x y : A} {a00 a10 a01 a11 : x = y} (px0 : a00 = a10) (px1 : a01 = a11) (p0x : a00 = a01) (p1x : a10 = a11).
A: Type
x, y: A
a00, a10, a01, a11: x = y
px0: a00 = a10
px1: a01 = a11
p0x: a00 = a01
p1x: a10 = a11

PathSquare px0 px1 p0x p1x <~> PathCube (sq_G1 px0) (sq_G1 px1) (sq_G1 p0x) (sq_G1 p1x) 1 1
A: Type
x, y: A
a00, a10, a01, a11: x = y
px0: a00 = a10
px1: a01 = a11
p0x: a00 = a01
p1x: a10 = a11

PathSquare px0 px1 p0x p1x <~> PathCube (sq_G1 px0) (sq_G1 px1) (sq_G1 p0x) (sq_G1 p1x) 1 1
A: Type
x: A
a00, a10: x = x
px0, px1: 1%path = a10
p0x: 1%path = 1%path
p1x: a10 = a10

PathSquare px0 px1 1 1 <~> PathCube (sq_G1 px0) (sq_G1 px1) (sq_G1 1%path) (sq_G1 1%path) 1 1
A: Type
x: A
a00, a10: x = x
px0, px1: 1%path = a10
p0x: 1%path = 1%path
p1x: a10 = a10

px0 = px1 <~> PathCube (sq_G1 px0) (sq_G1 px1) (sq_G1 1%path) (sq_G1 1%path) 1 1
A: Type
x: A
a00, a10: x = x
px0, px1: 1%path = a10
p0x: 1%path = 1%path
p1x: a10 = a10

sq_G1 px0 = sq_G1 px1 <~> PathCube (sq_G1 px0) (sq_G1 px1) (sq_G1 1%path) (sq_G1 1%path) 1 1
exact cu_G11. Defined.
A: Type
x, y: A
a00, a10, a01, a11: x = y
px0: a00 = a10
px1: a01 = a11
p0x: a00 = a01
p1x: a10 = a11

PathSquare px0 px1 p0x p1x <~> PathCube 1 1 (sq_1G px0) (sq_1G px1) (sq_1G p0x) (sq_1G p1x)
A: Type
x, y: A
a00, a10, a01, a11: x = y
px0: a00 = a10
px1: a01 = a11
p0x: a00 = a01
p1x: a10 = a11

PathSquare px0 px1 p0x p1x <~> PathCube 1 1 (sq_1G px0) (sq_1G px1) (sq_1G p0x) (sq_1G p1x)
A: Type
x: A
a00, a01: x = x
px0: a00 = a00
px1: 1%path = 1%path
p0x, p1x: a00 = 1%path

PathSquare 1 1 p0x p1x <~> PathCube 1 1 (sq_1G 1%path) (sq_1G 1%path) (sq_1G p0x) (sq_1G p1x)
A: Type
x: A
a00, a01: x = x
px0: a00 = a00
px1: 1%path = 1%path
p0x, p1x: a00 = 1%path

p0x = p1x <~> PathCube 1 1 (sq_1G 1%path) (sq_1G 1%path) (sq_1G p0x) (sq_1G p1x)
A: Type
x: A
a00, a01: x = x
px0: a00 = a00
px1: 1%path = 1%path
p0x, p1x: a00 = 1%path

sq_1G p0x = sq_1G p1x <~> PathCube 1 1 (sq_1G 1%path) (sq_1G 1%path) (sq_1G p0x) (sq_1G p1x)
exact cu_11G. Defined.
A: Type
x, y: A
a00, a10, a01, a11: x = y
px0: a00 = a10
px1: a01 = a11
p0x: a00 = a01
p1x: a10 = a11

PathSquare px0 px1 p0x p1x <~> PathCube (sq_1G px0) (sq_1G px1) 1 1 (sq_G1 p0x) (sq_G1 p1x)
A: Type
x, y: A
a00, a10, a01, a11: x = y
px0: a00 = a10
px1: a01 = a11
p0x: a00 = a01
p1x: a10 = a11

PathSquare px0 px1 p0x p1x <~> PathCube (sq_1G px0) (sq_1G px1) 1 1 (sq_G1 p0x) (sq_G1 p1x)
A: Type
x: A
a00, a10: x = x
px0, px1: a00 = 1%path
p0x: a00 = a00
p1x: 1%path = 1%path

PathSquare px0 px1 1 1 <~> PathCube (sq_1G px0) (sq_1G px1) 1 1 (sq_G1 1%path) (sq_G1 1%path)
A: Type
x: A
a00, a10: x = x
px0, px1: a00 = 1%path
p0x: a00 = a00
p1x: 1%path = 1%path

px0 = px1 <~> PathCube (sq_1G px0) (sq_1G px1) 1 1 (sq_G1 1%path) (sq_G1 1%path)
A: Type
x: A
a00, a10: x = x
px0, px1: a00 = 1%path
p0x: a00 = a00
p1x: 1%path = 1%path

sq_1G px0 = sq_1G px1 <~> PathCube (sq_1G px0) (sq_1G px1) 1 1 (sq_G1 1%path) (sq_G1 1%path)
exact cu_G11. Defined. End PathPathSquares. Notation cu_GG1 := equiv_cu_GG1. Notation cu_G1G := equiv_cu_G1G. Notation cu_1GG := equiv_cu_1GG. Arguments cu_GG1 {_ _ _ _ _ _ _ _ _ _ _}. Arguments cu_G1G {_ _ _ _ _ _ _ _ _ _ _}. Arguments cu_1GG {_ _ _ _ _ _ _ _ _ _ _}. (* PathCubes can be given by DPathSquares over Paths*)
A, B: Type
f, g: A -> B
a00, a10, a01, a11: A
px0: a00 = a10
px1: a01 = a11
p0x: a00 = a01
p1x: a10 = a11
s: PathSquare px0 px1 p0x p1x
b00: f a00 = g a00
b01: f a01 = g a01
b10: f a10 = g a10
b11: f a11 = g a11
qx0: DPath (fun x : A => f x = g x) px0 b00 b10
qx1: DPath (fun x : A => f x = g x) px1 b01 b11
q0x: DPath (fun x : A => f x = g x) p0x b00 b01
q1x: DPath (fun x : A => f x = g x) p1x b10 b11

DPathSquare (fun x : A => f x = g x) s qx0 qx1 q0x q1x <~> PathCube (sq_dp qx0) (sq_dp qx1) (sq_dp q0x) (sq_dp q1x) (sq_ap f s) (sq_ap g s)
A, B: Type
f, g: A -> B
a00, a10, a01, a11: A
px0: a00 = a10
px1: a01 = a11
p0x: a00 = a01
p1x: a10 = a11
s: PathSquare px0 px1 p0x p1x
b00: f a00 = g a00
b01: f a01 = g a01
b10: f a10 = g a10
b11: f a11 = g a11
qx0: DPath (fun x : A => f x = g x) px0 b00 b10
qx1: DPath (fun x : A => f x = g x) px1 b01 b11
q0x: DPath (fun x : A => f x = g x) p0x b00 b01
q1x: DPath (fun x : A => f x = g x) p1x b10 b11

DPathSquare (fun x : A => f x = g x) s qx0 qx1 q0x q1x <~> PathCube (sq_dp qx0) (sq_dp qx1) (sq_dp q0x) (sq_dp q1x) (sq_ap f s) (sq_ap g s)
A, B: Type
f, g: A -> B
x: A
b00, b01, b10, b11: f x = g x
qx0: DPath (fun x : A => f x = g x) 1 b00 b10
qx1: DPath (fun x : A => f x = g x) 1 b01 b11
q0x: DPath (fun x : A => f x = g x) 1 b00 b01
q1x: DPath (fun x : A => f x = g x) 1 b10 b11

DPathSquare (fun x : A => f x = g x) 1 qx0 qx1 q0x q1x <~> PathCube (sq_dp qx0) (sq_dp qx1) (sq_dp q0x) (sq_dp q1x) (sq_ap f 1) (sq_ap g 1)
apply cu_GG1. Defined. Notation cu_ds := equiv_cu_ds. (* PathCubes can be given by DPaths over PathSquares *)
A, B: Type
x1, x2: A
a00, a01, a10, a11: A -> B
px0: a00 == a10
px1: a01 == a11
p0x: a00 == a01
p1x: a10 == a11
f1: PathSquare (px0 x1) (px1 x1) (p0x x1) (p1x x1)
f2: PathSquare (px0 x2) (px1 x2) (p0x x2) (p1x x2)
p: x1 = x2

PathCube f1 f2 (sq_dp (apD px0 p)) (sq_dp (apD px1 p)) (sq_dp (apD p0x p)) (sq_dp (apD p1x p)) <~> DPath (fun x : A => PathSquare (px0 x) (px1 x) (p0x x) (p1x x)) p f1 f2
A, B: Type
x1, x2: A
a00, a01, a10, a11: A -> B
px0: a00 == a10
px1: a01 == a11
p0x: a00 == a01
p1x: a10 == a11
f1: PathSquare (px0 x1) (px1 x1) (p0x x1) (p1x x1)
f2: PathSquare (px0 x2) (px1 x2) (p0x x2) (p1x x2)
p: x1 = x2

PathCube f1 f2 (sq_dp (apD px0 p)) (sq_dp (apD px1 p)) (sq_dp (apD p0x p)) (sq_dp (apD p1x p)) <~> DPath (fun x : A => PathSquare (px0 x) (px1 x) (p0x x) (p1x x)) p f1 f2
destruct p; symmetry; exact cu_G11. Defined. Notation dp_cu := equiv_dp_cu. (* Flipping a cube along the left right direction *)
A: Type
x000, x010, x100, x110, x001, x011, x101, x111: A
p0i0: x000 = x010
p1i0: x100 = x110
pi00: x000 = x100
pi10: x010 = x110
p0i1: x001 = x011
p1i1: x101 = x111
pi01: x001 = x101
pi11: x011 = x111
p00i: x000 = x001
p01i: x010 = x011
p10i: x100 = x101
p11i: x110 = x111
s0ii: PathSquare p0i0 p0i1 p00i p01i
s1ii: PathSquare p1i0 p1i1 p10i p11i
sii0: PathSquare p0i0 p1i0 pi00 pi10
sii1: PathSquare p0i1 p1i1 pi01 pi11
si0i: PathSquare p00i p10i pi00 pi01
si1i: PathSquare p01i p11i pi10 pi11

PathCube s0ii s1ii sii0 sii1 si0i si1i <~> PathCube s1ii s0ii (sq_flip_h sii0) (sq_flip_h sii1) (sq_flip_h si0i) (sq_flip_h si1i)
A: Type
x000, x010, x100, x110, x001, x011, x101, x111: A
p0i0: x000 = x010
p1i0: x100 = x110
pi00: x000 = x100
pi10: x010 = x110
p0i1: x001 = x011
p1i1: x101 = x111
pi01: x001 = x101
pi11: x011 = x111
p00i: x000 = x001
p01i: x010 = x011
p10i: x100 = x101
p11i: x110 = x111
s0ii: PathSquare p0i0 p0i1 p00i p01i
s1ii: PathSquare p1i0 p1i1 p10i p11i
sii0: PathSquare p0i0 p1i0 pi00 pi10
sii1: PathSquare p0i1 p1i1 pi01 pi11
si0i: PathSquare p00i p10i pi00 pi01
si1i: PathSquare p01i p11i pi10 pi11

PathCube s0ii s1ii sii0 sii1 si0i si1i <~> PathCube s1ii s0ii (sq_flip_h sii0) (sq_flip_h sii1) (sq_flip_h si0i) (sq_flip_h si1i)
A: Type
x, x0: A
p0i0, p1i0, p0i1, p1i1: x0 = x
s0ii: PathSquare p0i0 p0i1 1 1
s1ii: PathSquare p1i0 p1i1 1 1
sii0: PathSquare p0i0 p1i0 1 1
sii1: PathSquare p0i1 p1i1 1 1

PathCube s0ii s1ii sii0 sii1 1 1 <~> PathCube s1ii s0ii (sq_flip_h sii0) (sq_flip_h sii1) (sq_flip_h 1) (sq_flip_h 1)
A: Type
x, x0: A
p0i0, p1i0, p0i1, p1i1: x0 = x
s0ii: PathSquare p0i0 p0i1 1 1
s1ii: PathSquare p1i0 p1i1 1 1
sii0: PathSquare p0i0 p1i0 1 1
sii1: PathSquare p0i1 p1i1 1 1

?Goal = s1ii
A: Type
x, x0: A
p0i0, p1i0, p0i1, p1i1: x0 = x
s0ii: PathSquare p0i0 p0i1 1 1
s1ii: PathSquare p1i0 p1i1 1 1
sii0: PathSquare p0i0 p1i0 1 1
sii1: PathSquare p0i1 p1i1 1 1
?Goal0 = s0ii
A: Type
x, x0: A
p0i0, p1i0, p0i1, p1i1: x0 = x
s0ii: PathSquare p0i0 p0i1 1 1
s1ii: PathSquare p1i0 p1i1 1 1
sii0: PathSquare p0i0 p1i0 1 1
sii1: PathSquare p0i1 p1i1 1 1
PathCube s0ii s1ii sii0 sii1 1 1 <~> PathCube ?Goal ?Goal0 (sq_flip_h sii0) (sq_flip_h sii1) (sq_flip_h 1) (sq_flip_h 1)
A: Type
x, x0: A
p0i0, p1i0, p0i1, p1i1: x0 = x
s0ii: PathSquare p0i0 p0i1 1 1
s1ii: PathSquare p1i0 p1i1 1 1
sii0: PathSquare p0i0 p1i0 1 1
sii1: PathSquare p0i1 p1i1 1 1

PathCube s0ii s1ii sii0 sii1 1 1 <~> PathCube (sq_G1 (sq_G1^-1 s1ii)) (sq_G1 (sq_G1^-1 s0ii)) (sq_flip_h sii0) (sq_flip_h sii1) (sq_flip_h 1) (sq_flip_h 1)
A: Type
x, x0: A
p0i0, p1i0, p0i1, p1i1: x0 = x
s0ii: PathSquare p0i0 p0i1 1 1
s1ii: PathSquare p1i0 p1i1 1 1
sii0: PathSquare p0i0 p1i0 1 1
sii1: PathSquare p0i1 p1i1 1 1

PathCube s0ii s1ii sii0 sii1 1 1 <~> PathSquare (sq_G1^-1 s1ii) (sq_G1^-1 s0ii) ((equiv_path_inverse p0i0 p1i0 oE sq_G1^-1) sii0) ((equiv_path_inverse p0i1 p1i1 oE sq_G1^-1) sii1)
A: Type
x, x0: A
p0i0, p1i0, p0i1, p1i1: x0 = x
s0ii: PathSquare p0i0 p0i1 1 1
s1ii: PathSquare p1i0 p1i1 1 1
sii0: PathSquare p0i0 p1i0 1 1
sii1: PathSquare p0i1 p1i1 1 1

PathCube s0ii s1ii sii0 sii1 1 1 <~> PathSquare (sq_G1^-1 s0ii) (sq_G1^-1 s1ii) ((sq_G1^-1)%equiv sii0) ((sq_G1^-1)%equiv sii1)
A: Type
x, x0: A
p0i0, p1i0, p0i1, p1i1: x0 = x
s0ii: PathSquare p0i0 p0i1 1 1
s1ii: PathSquare p1i0 p1i1 1 1
sii0: PathSquare p0i0 p1i0 1 1
sii1: PathSquare p0i1 p1i1 1 1

PathCube s0ii s1ii sii0 sii1 1 1 <~> PathCube (sq_G1 (sq_G1^-1 s0ii)) (sq_G1 (sq_G1^-1 s1ii)) (sq_G1 ((sq_G1^-1)%equiv sii0)) (sq_G1 ((sq_G1^-1)%equiv sii1)) 1 1
A: Type
x, x0: A
p0i0, p1i0, p0i1, p1i1: x0 = x
s0ii: PathSquare p0i0 p0i1 1 1
s1ii: PathSquare p1i0 p1i1 1 1
sii0: PathSquare p0i0 p1i0 1 1
sii1: PathSquare p0i1 p1i1 1 1

s0ii = sq_G1 (sq_G1^-1 s0ii)
A: Type
x, x0: A
p0i0, p1i0, p0i1, p1i1: x0 = x
s0ii: PathSquare p0i0 p0i1 1 1
s1ii: PathSquare p1i0 p1i1 1 1
sii0: PathSquare p0i0 p1i0 1 1
sii1: PathSquare p0i1 p1i1 1 1
s1ii = sq_G1 (sq_G1^-1 s1ii)
A: Type
x, x0: A
p0i0, p1i0, p0i1, p1i1: x0 = x
s0ii: PathSquare p0i0 p0i1 1 1
s1ii: PathSquare p1i0 p1i1 1 1
sii0: PathSquare p0i0 p1i0 1 1
sii1: PathSquare p0i1 p1i1 1 1
sii0 = sq_G1 ((sq_G1^-1)%equiv sii0)
A: Type
x, x0: A
p0i0, p1i0, p0i1, p1i1: x0 = x
s0ii: PathSquare p0i0 p0i1 1 1
s1ii: PathSquare p1i0 p1i1 1 1
sii0: PathSquare p0i0 p1i0 1 1
sii1: PathSquare p0i1 p1i1 1 1
sii1 = sq_G1 ((sq_G1^-1)%equiv sii1)
all: exact (eisretr sq_G1 _)^. Defined. Notation cu_flip_lr := equiv_cu_flip_lr. (* PathCube Kan fillers ~ Every open crate has a lid *)
A: Type
x000, x010, x100, x110, x001, x011, x101, x111: A
p0i0: x000 = x010
p1i0: x100 = x110
pi00: x000 = x100
pi10: x010 = x110
p0i1: x001 = x011
p1i1: x101 = x111
pi01: x001 = x101
pi11: x011 = x111
p00i: x000 = x001
p01i: x010 = x011
p10i: x100 = x101
p11i: x110 = x111
s1ii: PathSquare p1i0 p1i1 p10i p11i
sii0: PathSquare p0i0 p1i0 pi00 pi10
sii1: PathSquare p0i1 p1i1 pi01 pi11
si0i: PathSquare p00i p10i pi00 pi01
si1i: PathSquare p01i p11i pi10 pi11

{s0ii : PathSquare p0i0 p0i1 p00i p01i & PathCube s0ii s1ii sii0 sii1 si0i si1i}
A: Type
x000, x010, x100, x110, x001, x011, x101, x111: A
p0i0: x000 = x010
p1i0: x100 = x110
pi00: x000 = x100
pi10: x010 = x110
p0i1: x001 = x011
p1i1: x101 = x111
pi01: x001 = x101
pi11: x011 = x111
p00i: x000 = x001
p01i: x010 = x011
p10i: x100 = x101
p11i: x110 = x111
s1ii: PathSquare p1i0 p1i1 p10i p11i
sii0: PathSquare p0i0 p1i0 pi00 pi10
sii1: PathSquare p0i1 p1i1 pi01 pi11
si0i: PathSquare p00i p10i pi00 pi01
si1i: PathSquare p01i p11i pi10 pi11

{s0ii : PathSquare p0i0 p0i1 p00i p01i & PathCube s0ii s1ii sii0 sii1 si0i si1i}
A: Type
x, x0: A
p0i0, p1i0, p0i1, p1i1: x = x0
s1ii: PathSquare p1i0 p1i1 1 1
sii0: PathSquare p0i0 p1i0 1 1
sii1: PathSquare p0i1 p1i1 1 1

{s0ii : PathSquare p0i0 p0i1 1 1 & PathCube s0ii s1ii sii0 sii1 1 1}
A: Type
x, x0: A
p0i0, p1i0, p0i1, p1i1: x = x0
s1ii: PathSquare p1i0 p1i1 1 1
sii0: PathSquare p0i0 p1i0 1 1
sii1: PathSquare p0i1 p1i1 1 1
a:= sq_G1^-1 s1ii: p1i0 = p1i1

{s0ii : PathSquare p0i0 p0i1 1 1 & PathCube s0ii s1ii sii0 sii1 1 1}
A: Type
x, x0: A
p0i0, p1i0, p0i1, p1i1: x = x0
s1ii: PathSquare p1i0 p1i1 1 1
sii0: PathSquare p0i0 p1i0 1 1
sii1: PathSquare p0i1 p1i1 1 1
a:= sq_G1^-1 s1ii: p1i0 = p1i1
b:= sq_G1^-1 sii0: p0i0 = p1i0

{s0ii : PathSquare p0i0 p0i1 1 1 & PathCube s0ii s1ii sii0 sii1 1 1}
A: Type
x, x0: A
p0i0, p1i0, p0i1, p1i1: x = x0
s1ii: PathSquare p1i0 p1i1 1 1
sii0: PathSquare p0i0 p1i0 1 1
sii1: PathSquare p0i1 p1i1 1 1
a:= sq_G1^-1 s1ii: p1i0 = p1i1
b:= sq_G1^-1 sii0: p0i0 = p1i0
c:= sq_G1^-1 sii1: p0i1 = p1i1

{s0ii : PathSquare p0i0 p0i1 1 1 & PathCube s0ii s1ii sii0 sii1 1 1}
A: Type
x, x0: A
p0i0, p1i0, p0i1, p1i1: x = x0
s1ii: PathSquare p1i0 p1i1 1 1
sii0: PathSquare p0i0 p1i0 1 1
sii1: PathSquare p0i1 p1i1 1 1
a:= sq_G1^-1 s1ii: p1i0 = p1i1
b:= sq_G1^-1 sii0: p0i0 = p1i0
c:= sq_G1^-1 sii1: p0i1 = p1i1

{s0ii : PathSquare p0i0 p0i1 1 1 & PathCube s0ii (sq_G1 (sq_G1^-1 s1ii)) sii0 sii1 1 1}
A: Type
x, x0: A
p0i0, p1i0, p0i1, p1i1: x = x0
s1ii: PathSquare p1i0 p1i1 1 1
sii0: PathSquare p0i0 p1i0 1 1
sii1: PathSquare p0i1 p1i1 1 1
a:= sq_G1^-1 s1ii: p1i0 = p1i1
b:= sq_G1^-1 sii0: p0i0 = p1i0
c:= sq_G1^-1 sii1: p0i1 = p1i1

{s0ii : PathSquare p0i0 p0i1 1 1 & PathCube s0ii (sq_G1 (sq_G1^-1 s1ii)) (sq_G1 (sq_G1^-1 sii0)) sii1 1 1}
A: Type
x, x0: A
p0i0, p1i0, p0i1, p1i1: x = x0
s1ii: PathSquare p1i0 p1i1 1 1
sii0: PathSquare p0i0 p1i0 1 1
sii1: PathSquare p0i1 p1i1 1 1
a:= sq_G1^-1 s1ii: p1i0 = p1i1
b:= sq_G1^-1 sii0: p0i0 = p1i0
c:= sq_G1^-1 sii1: p0i1 = p1i1

{s0ii : PathSquare p0i0 p0i1 1 1 & PathCube s0ii (sq_G1 (sq_G1^-1 s1ii)) (sq_G1 (sq_G1^-1 sii0)) (sq_G1 (sq_G1^-1 sii1)) 1 1}
A: Type
x, x0: A
p0i0, p1i0, p0i1, p1i1: x = x0
s1ii: PathSquare p1i0 p1i1 1 1
sii0: PathSquare p0i0 p1i0 1 1
sii1: PathSquare p0i1 p1i1 1 1
a:= sq_G1^-1 s1ii: p1i0 = p1i1
b:= sq_G1^-1 sii0: p0i0 = p1i0
c:= sq_G1^-1 sii1: p0i1 = p1i1

{s0ii : PathSquare p0i0 p0i1 1 1 & PathCube s0ii (sq_G1 a) (sq_G1 (sq_G1^-1 sii0)) (sq_G1 (sq_G1^-1 sii1)) 1 1}
A: Type
x, x0: A
p0i0, p1i0, p0i1, p1i1: x = x0
s1ii: PathSquare p1i0 p1i1 1 1
sii0: PathSquare p0i0 p1i0 1 1
sii1: PathSquare p0i1 p1i1 1 1
a:= sq_G1^-1 s1ii: p1i0 = p1i1
b:= sq_G1^-1 sii0: p0i0 = p1i0
c:= sq_G1^-1 sii1: p0i1 = p1i1

{s0ii : PathSquare p0i0 p0i1 1 1 & PathCube s0ii (sq_G1 a) (sq_G1 b) (sq_G1 (sq_G1^-1 sii1)) 1 1}
A: Type
x, x0: A
p0i0, p1i0, p0i1, p1i1: x = x0
s1ii: PathSquare p1i0 p1i1 1 1
sii0: PathSquare p0i0 p1i0 1 1
sii1: PathSquare p0i1 p1i1 1 1
a:= sq_G1^-1 s1ii: p1i0 = p1i1
b:= sq_G1^-1 sii0: p0i0 = p1i0
c:= sq_G1^-1 sii1: p0i1 = p1i1

{s0ii : PathSquare p0i0 p0i1 1 1 & PathCube s0ii (sq_G1 a) (sq_G1 b) (sq_G1 c) 1 1}
A: Type
x, x0: A
p0i0, p1i0, p0i1, p1i1: x = x0
s1ii: PathSquare p1i0 p1i1 1 1
sii0: PathSquare p0i0 p1i0 1 1
sii1: PathSquare p0i1 p1i1 1 1
a: p1i0 = p1i1
b: p0i0 = p1i0
c: p0i1 = p1i1

{s0ii : PathSquare p0i0 p0i1 1 1 & PathCube s0ii (sq_G1 a) (sq_G1 b) (sq_G1 c) 1 1}
A: Type
x, x0: A
p0i0, p1i0, p0i1, p1i1: x = x0
a: p1i0 = p1i1
b: p0i0 = p1i0
c: p0i1 = p1i1

{s0ii : PathSquare p0i0 p0i1 1 1 & PathCube s0ii (sq_G1 a) (sq_G1 b) (sq_G1 c) 1 1}
A: Type
x, x0: A
p0i0, p1i0, p0i1, p1i1: x = x0
a: p1i0 = p1i1
b: p0i0 = p1i0
c: p0i1 = p1i1

PathCube (sq_G1 ((b @ a) @ c^)) (sq_G1 a) (sq_G1 b) (sq_G1 c) 1 1
by destruct a, b, c, p0i1. Defined.
A: Type
x000, x010, x100, x110, x001, x011, x101, x111: A
p0i0: x000 = x010
p1i0: x100 = x110
pi00: x000 = x100
pi10: x010 = x110
p0i1: x001 = x011
p1i1: x101 = x111
pi01: x001 = x101
pi11: x011 = x111
p00i: x000 = x001
p01i: x010 = x011
p10i: x100 = x101
p11i: x110 = x111
s0ii: PathSquare p0i0 p0i1 p00i p01i
sii0: PathSquare p0i0 p1i0 pi00 pi10
sii1: PathSquare p0i1 p1i1 pi01 pi11
si0i: PathSquare p00i p10i pi00 pi01
si1i: PathSquare p01i p11i pi10 pi11

{s1ii : PathSquare p1i0 p1i1 p10i p11i & PathCube s0ii s1ii sii0 sii1 si0i si1i}
A: Type
x000, x010, x100, x110, x001, x011, x101, x111: A
p0i0: x000 = x010
p1i0: x100 = x110
pi00: x000 = x100
pi10: x010 = x110
p0i1: x001 = x011
p1i1: x101 = x111
pi01: x001 = x101
pi11: x011 = x111
p00i: x000 = x001
p01i: x010 = x011
p10i: x100 = x101
p11i: x110 = x111
s0ii: PathSquare p0i0 p0i1 p00i p01i
sii0: PathSquare p0i0 p1i0 pi00 pi10
sii1: PathSquare p0i1 p1i1 pi01 pi11
si0i: PathSquare p00i p10i pi00 pi01
si1i: PathSquare p01i p11i pi10 pi11

{s1ii : PathSquare p1i0 p1i1 p10i p11i & PathCube s0ii s1ii sii0 sii1 si0i si1i}
A: Type
x000, x010, x100, x110, x001, x011, x101, x111: A
p0i0: x000 = x010
p1i0: x100 = x110
pi00: x000 = x100
pi10: x010 = x110
p0i1: x001 = x011
p1i1: x101 = x111
pi01: x001 = x101
pi11: x011 = x111
p00i: x000 = x001
p01i: x010 = x011
p10i: x100 = x101
p11i: x110 = x111
s0ii: PathSquare p0i0 p0i1 p00i p01i
sii0: PathSquare p0i0 p1i0 pi00 pi10
sii1: PathSquare p0i1 p1i1 pi01 pi11
si0i: PathSquare p00i p10i pi00 pi01
si1i: PathSquare p01i p11i pi10 pi11

PathCube s0ii ?Goal sii0 sii1 si0i si1i
A: Type
x000, x010, x100, x110, x001, x011, x101, x111: A
p0i0: x000 = x010
p1i0: x100 = x110
pi00: x000 = x100
pi10: x010 = x110
p0i1: x001 = x011
p1i1: x101 = x111
pi01: x001 = x101
pi11: x011 = x111
p00i: x000 = x001
p01i: x010 = x011
p10i: x100 = x101
p11i: x110 = x111
s0ii: PathSquare p0i0 p0i1 p00i p01i
sii0: PathSquare p0i0 p1i0 pi00 pi10
sii1: PathSquare p0i1 p1i1 pi01 pi11
si0i: PathSquare p00i p10i pi00 pi01
si1i: PathSquare p01i p11i pi10 pi11

PathCube ?Goal s0ii (sq_flip_h sii0) (sq_flip_h sii1) (sq_flip_h si0i) (sq_flip_h si1i)
apply cu_fill_left. Defined.
A: Type
x000, x010, x100, x110, x001, x011, x101, x111: A
p0i0: x000 = x010
p1i0: x100 = x110
pi00: x000 = x100
pi10: x010 = x110
p0i1: x001 = x011
p1i1: x101 = x111
pi01: x001 = x101
pi11: x011 = x111
p00i: x000 = x001
p01i: x010 = x011
p10i: x100 = x101
p11i: x110 = x111
s0ii: PathSquare p0i0 p0i1 p00i p01i
s1ii: PathSquare p1i0 p1i1 p10i p11i
sii1: PathSquare p0i1 p1i1 pi01 pi11
si0i: PathSquare p00i p10i pi00 pi01
si1i: PathSquare p01i p11i pi10 pi11

{sii0 : PathSquare p0i0 p1i0 pi00 pi10 & PathCube s0ii s1ii sii0 sii1 si0i si1i}
A: Type
x000, x010, x100, x110, x001, x011, x101, x111: A
p0i0: x000 = x010
p1i0: x100 = x110
pi00: x000 = x100
pi10: x010 = x110
p0i1: x001 = x011
p1i1: x101 = x111
pi01: x001 = x101
pi11: x011 = x111
p00i: x000 = x001
p01i: x010 = x011
p10i: x100 = x101
p11i: x110 = x111
s0ii: PathSquare p0i0 p0i1 p00i p01i
s1ii: PathSquare p1i0 p1i1 p10i p11i
sii1: PathSquare p0i1 p1i1 pi01 pi11
si0i: PathSquare p00i p10i pi00 pi01
si1i: PathSquare p01i p11i pi10 pi11

{sii0 : PathSquare p0i0 p1i0 pi00 pi10 & PathCube s0ii s1ii sii0 sii1 si0i si1i}
A: Type
x000, x010, x100, x110, x001, x011, x101, x111: A
p0i0: x000 = x010
p1i0: x100 = x110
pi00: x000 = x100
pi10: x010 = x110
p0i1: x001 = x011
p1i1: x101 = x111
pi01: x001 = x101
pi11: x011 = x111
p00i: x000 = x001
p01i: x010 = x011
p10i: x100 = x101
p11i: x110 = x111
s0ii: PathSquare p0i0 p0i1 p00i p01i
s1ii: PathSquare p1i0 p1i1 p10i p11i
sii1: PathSquare p0i1 p1i1 pi01 pi11
si0i: PathSquare p00i p10i pi00 pi01
si1i: PathSquare p01i p11i pi10 pi11

PathCube s0ii s1ii ?Goal sii1 si0i si1i
A: Type
x000, x010, x100, x110, x001, x011, x101, x111: A
p0i0: x000 = x010
p1i0: x100 = x110
pi00: x000 = x100
pi10: x010 = x110
p0i1: x001 = x011
p1i1: x101 = x111
pi01: x001 = x101
pi11: x011 = x111
p00i: x000 = x001
p01i: x010 = x011
p10i: x100 = x101
p11i: x110 = x111
s0ii: PathSquare p0i0 p0i1 p00i p01i
s1ii: PathSquare p1i0 p1i1 p10i p11i
sii1: PathSquare p0i1 p1i1 pi01 pi11
si0i: PathSquare p00i p10i pi00 pi01
si1i: PathSquare p01i p11i pi10 pi11

PathCube si0i si1i (tr s0ii) (tr s1ii) (tr ?Goal) (tr sii1)
A: Type
x000, x010, x100, x110, x001, x011, x101, x111: A
p0i0: x000 = x010
p1i0: x100 = x110
pi00: x000 = x100
pi10: x010 = x110
p0i1: x001 = x011
p1i1: x101 = x111
pi01: x001 = x101
pi11: x011 = x111
p00i: x000 = x001
p01i: x010 = x011
p10i: x100 = x101
p11i: x110 = x111
s0ii: PathSquare p0i0 p0i1 p00i p01i
s1ii: PathSquare p1i0 p1i1 p10i p11i
sii1: PathSquare p0i1 p1i1 pi01 pi11
si0i: PathSquare p00i p10i pi00 pi01
si1i: PathSquare p01i p11i pi10 pi11

PathCube (tr ?Goal) (tr sii1) (tr si0i) (tr si1i) (tr (tr s0ii)) (tr (tr s1ii))
A: Type
x000, x010, x100, x110, x001, x011, x101, x111: A
p0i0: x000 = x010
p1i0: x100 = x110
pi00: x000 = x100
pi10: x010 = x110
p0i1: x001 = x011
p1i1: x101 = x111
pi01: x001 = x101
pi11: x011 = x111
p00i: x000 = x001
p01i: x010 = x011
p10i: x100 = x101
p11i: x110 = x111
s0ii: PathSquare p0i0 p0i1 p00i p01i
s1ii: PathSquare p1i0 p1i1 p10i p11i
sii1: PathSquare p0i1 p1i1 pi01 pi11
si0i: PathSquare p00i p10i pi00 pi01
si1i: PathSquare p01i p11i pi10 pi11

PathCube ?Goal (tr sii1) (tr si0i) (tr si1i) (tr (tr s0ii)) (tr (tr s1ii))
apply cu_fill_left. Defined.
A: Type
x000, x010, x100, x110, x001, x011, x101, x111: A
p0i0: x000 = x010
p1i0: x100 = x110
pi00: x000 = x100
pi10: x010 = x110
p0i1: x001 = x011
p1i1: x101 = x111
pi01: x001 = x101
pi11: x011 = x111
p00i: x000 = x001
p01i: x010 = x011
p10i: x100 = x101
p11i: x110 = x111
s0ii: PathSquare p0i0 p0i1 p00i p01i
s1ii: PathSquare p1i0 p1i1 p10i p11i
sii0: PathSquare p0i0 p1i0 pi00 pi10
si0i: PathSquare p00i p10i pi00 pi01
si1i: PathSquare p01i p11i pi10 pi11

{sii1 : PathSquare p0i1 p1i1 pi01 pi11 & PathCube s0ii s1ii sii0 sii1 si0i si1i}
A: Type
x000, x010, x100, x110, x001, x011, x101, x111: A
p0i0: x000 = x010
p1i0: x100 = x110
pi00: x000 = x100
pi10: x010 = x110
p0i1: x001 = x011
p1i1: x101 = x111
pi01: x001 = x101
pi11: x011 = x111
p00i: x000 = x001
p01i: x010 = x011
p10i: x100 = x101
p11i: x110 = x111
s0ii: PathSquare p0i0 p0i1 p00i p01i
s1ii: PathSquare p1i0 p1i1 p10i p11i
sii0: PathSquare p0i0 p1i0 pi00 pi10
si0i: PathSquare p00i p10i pi00 pi01
si1i: PathSquare p01i p11i pi10 pi11

{sii1 : PathSquare p0i1 p1i1 pi01 pi11 & PathCube s0ii s1ii sii0 sii1 si0i si1i}
A: Type
x000, x010, x100, x110, x001, x011, x101, x111: A
p0i0: x000 = x010
p1i0: x100 = x110
pi00: x000 = x100
pi10: x010 = x110
p0i1: x001 = x011
p1i1: x101 = x111
pi01: x001 = x101
pi11: x011 = x111
p00i: x000 = x001
p01i: x010 = x011
p10i: x100 = x101
p11i: x110 = x111
s0ii: PathSquare p0i0 p0i1 p00i p01i
s1ii: PathSquare p1i0 p1i1 p10i p11i
sii0: PathSquare p0i0 p1i0 pi00 pi10
si0i: PathSquare p00i p10i pi00 pi01
si1i: PathSquare p01i p11i pi10 pi11

PathCube s0ii s1ii sii0 ?Goal si0i si1i
A: Type
x000, x010, x100, x110, x001, x011, x101, x111: A
p0i0: x000 = x010
p1i0: x100 = x110
pi00: x000 = x100
pi10: x010 = x110
p0i1: x001 = x011
p1i1: x101 = x111
pi01: x001 = x101
pi11: x011 = x111
p00i: x000 = x001
p01i: x010 = x011
p10i: x100 = x101
p11i: x110 = x111
s0ii: PathSquare p0i0 p0i1 p00i p01i
s1ii: PathSquare p1i0 p1i1 p10i p11i
sii0: PathSquare p0i0 p1i0 pi00 pi10
si0i: PathSquare p00i p10i pi00 pi01
si1i: PathSquare p01i p11i pi10 pi11

PathCube si0i si1i (tr s0ii) (tr s1ii) (tr sii0) (tr ?Goal)
A: Type
x000, x010, x100, x110, x001, x011, x101, x111: A
p0i0: x000 = x010
p1i0: x100 = x110
pi00: x000 = x100
pi10: x010 = x110
p0i1: x001 = x011
p1i1: x101 = x111
pi01: x001 = x101
pi11: x011 = x111
p00i: x000 = x001
p01i: x010 = x011
p10i: x100 = x101
p11i: x110 = x111
s0ii: PathSquare p0i0 p0i1 p00i p01i
s1ii: PathSquare p1i0 p1i1 p10i p11i
sii0: PathSquare p0i0 p1i0 pi00 pi10
si0i: PathSquare p00i p10i pi00 pi01
si1i: PathSquare p01i p11i pi10 pi11

PathCube (tr sii0) (tr ?Goal) (tr si0i) (tr si1i) (tr (tr s0ii)) (tr (tr s1ii))
A: Type
x000, x010, x100, x110, x001, x011, x101, x111: A
p0i0: x000 = x010
p1i0: x100 = x110
pi00: x000 = x100
pi10: x010 = x110
p0i1: x001 = x011
p1i1: x101 = x111
pi01: x001 = x101
pi11: x011 = x111
p00i: x000 = x001
p01i: x010 = x011
p10i: x100 = x101
p11i: x110 = x111
s0ii: PathSquare p0i0 p0i1 p00i p01i
s1ii: PathSquare p1i0 p1i1 p10i p11i
sii0: PathSquare p0i0 p1i0 pi00 pi10
si0i: PathSquare p00i p10i pi00 pi01
si1i: PathSquare p01i p11i pi10 pi11

PathCube (tr sii0) ?Goal (tr si0i) (tr si1i) (tr (tr s0ii)) (tr (tr s1ii))
apply cu_fill_right. Defined.
A: Type
x000, x010, x100, x110, x001, x011, x101, x111: A
p0i0: x000 = x010
p1i0: x100 = x110
pi00: x000 = x100
pi10: x010 = x110
p0i1: x001 = x011
p1i1: x101 = x111
pi01: x001 = x101
pi11: x011 = x111
p00i: x000 = x001
p01i: x010 = x011
p10i: x100 = x101
p11i: x110 = x111
s0ii: PathSquare p0i0 p0i1 p00i p01i
s1ii: PathSquare p1i0 p1i1 p10i p11i
sii0: PathSquare p0i0 p1i0 pi00 pi10
sii1: PathSquare p0i1 p1i1 pi01 pi11
si1i: PathSquare p01i p11i pi10 pi11

{si0i : PathSquare p00i p10i pi00 pi01 & PathCube s0ii s1ii sii0 sii1 si0i si1i}
A: Type
x000, x010, x100, x110, x001, x011, x101, x111: A
p0i0: x000 = x010
p1i0: x100 = x110
pi00: x000 = x100
pi10: x010 = x110
p0i1: x001 = x011
p1i1: x101 = x111
pi01: x001 = x101
pi11: x011 = x111
p00i: x000 = x001
p01i: x010 = x011
p10i: x100 = x101
p11i: x110 = x111
s0ii: PathSquare p0i0 p0i1 p00i p01i
s1ii: PathSquare p1i0 p1i1 p10i p11i
sii0: PathSquare p0i0 p1i0 pi00 pi10
sii1: PathSquare p0i1 p1i1 pi01 pi11
si1i: PathSquare p01i p11i pi10 pi11

{si0i : PathSquare p00i p10i pi00 pi01 & PathCube s0ii s1ii sii0 sii1 si0i si1i}
A: Type
x000, x010, x100, x110, x001, x011, x101, x111: A
p0i0: x000 = x010
p1i0: x100 = x110
pi00: x000 = x100
pi10: x010 = x110
p0i1: x001 = x011
p1i1: x101 = x111
pi01: x001 = x101
pi11: x011 = x111
p00i: x000 = x001
p01i: x010 = x011
p10i: x100 = x101
p11i: x110 = x111
s0ii: PathSquare p0i0 p0i1 p00i p01i
s1ii: PathSquare p1i0 p1i1 p10i p11i
sii0: PathSquare p0i0 p1i0 pi00 pi10
sii1: PathSquare p0i1 p1i1 pi01 pi11
si1i: PathSquare p01i p11i pi10 pi11

PathCube s0ii s1ii sii0 sii1 ?Goal si1i
A: Type
x000, x010, x100, x110, x001, x011, x101, x111: A
p0i0: x000 = x010
p1i0: x100 = x110
pi00: x000 = x100
pi10: x010 = x110
p0i1: x001 = x011
p1i1: x101 = x111
pi01: x001 = x101
pi11: x011 = x111
p00i: x000 = x001
p01i: x010 = x011
p10i: x100 = x101
p11i: x110 = x111
s0ii: PathSquare p0i0 p0i1 p00i p01i
s1ii: PathSquare p1i0 p1i1 p10i p11i
sii0: PathSquare p0i0 p1i0 pi00 pi10
sii1: PathSquare p0i1 p1i1 pi01 pi11
si1i: PathSquare p01i p11i pi10 pi11

PathCube ?Goal si1i (tr s0ii) (tr s1ii) (tr sii0) (tr sii1)
apply cu_fill_left. Defined.
A: Type
x000, x010, x100, x110, x001, x011, x101, x111: A
p0i0: x000 = x010
p1i0: x100 = x110
pi00: x000 = x100
pi10: x010 = x110
p0i1: x001 = x011
p1i1: x101 = x111
pi01: x001 = x101
pi11: x011 = x111
p00i: x000 = x001
p01i: x010 = x011
p10i: x100 = x101
p11i: x110 = x111
s0ii: PathSquare p0i0 p0i1 p00i p01i
s1ii: PathSquare p1i0 p1i1 p10i p11i
sii0: PathSquare p0i0 p1i0 pi00 pi10
sii1: PathSquare p0i1 p1i1 pi01 pi11
si0i: PathSquare p00i p10i pi00 pi01

{si1i : PathSquare p01i p11i pi10 pi11 & PathCube s0ii s1ii sii0 sii1 si0i si1i}
A: Type
x000, x010, x100, x110, x001, x011, x101, x111: A
p0i0: x000 = x010
p1i0: x100 = x110
pi00: x000 = x100
pi10: x010 = x110
p0i1: x001 = x011
p1i1: x101 = x111
pi01: x001 = x101
pi11: x011 = x111
p00i: x000 = x001
p01i: x010 = x011
p10i: x100 = x101
p11i: x110 = x111
s0ii: PathSquare p0i0 p0i1 p00i p01i
s1ii: PathSquare p1i0 p1i1 p10i p11i
sii0: PathSquare p0i0 p1i0 pi00 pi10
sii1: PathSquare p0i1 p1i1 pi01 pi11
si0i: PathSquare p00i p10i pi00 pi01

{si1i : PathSquare p01i p11i pi10 pi11 & PathCube s0ii s1ii sii0 sii1 si0i si1i}
A: Type
x000, x010, x100, x110, x001, x011, x101, x111: A
p0i0: x000 = x010
p1i0: x100 = x110
pi00: x000 = x100
pi10: x010 = x110
p0i1: x001 = x011
p1i1: x101 = x111
pi01: x001 = x101
pi11: x011 = x111
p00i: x000 = x001
p01i: x010 = x011
p10i: x100 = x101
p11i: x110 = x111
s0ii: PathSquare p0i0 p0i1 p00i p01i
s1ii: PathSquare p1i0 p1i1 p10i p11i
sii0: PathSquare p0i0 p1i0 pi00 pi10
sii1: PathSquare p0i1 p1i1 pi01 pi11
si0i: PathSquare p00i p10i pi00 pi01

PathCube s0ii s1ii sii0 sii1 si0i ?Goal
A: Type
x000, x010, x100, x110, x001, x011, x101, x111: A
p0i0: x000 = x010
p1i0: x100 = x110
pi00: x000 = x100
pi10: x010 = x110
p0i1: x001 = x011
p1i1: x101 = x111
pi01: x001 = x101
pi11: x011 = x111
p00i: x000 = x001
p01i: x010 = x011
p10i: x100 = x101
p11i: x110 = x111
s0ii: PathSquare p0i0 p0i1 p00i p01i
s1ii: PathSquare p1i0 p1i1 p10i p11i
sii0: PathSquare p0i0 p1i0 pi00 pi10
sii1: PathSquare p0i1 p1i1 pi01 pi11
si0i: PathSquare p00i p10i pi00 pi01

PathCube si0i ?Goal (tr s0ii) (tr s1ii) (tr sii0) (tr sii1)
apply cu_fill_right. Defined. (** PathCube concatenation *) Section Concat. Context {A : Type} (* Main Cube *) {x000 x010 x100 x110 x001 x011 x101 x111 : A} {p0i0 : x000 = x010} {p1i0 : x100 = x110} {pi00 : x000 = x100} {pi10 : x010 = x110} {p0i1 : x001 = x011} {p1i1 : x101 = x111} {pi01 : x001 = x101} {pi11 : x011 = x111} {p00i : x000 = x001} {p01i : x010 = x011} {p10i : x100 = x101} {p11i : x110 = x111} {s0ii : PathSquare p0i0 p0i1 p00i p01i} {s1ii : PathSquare p1i0 p1i1 p10i p11i} {sii0 : PathSquare p0i0 p1i0 pi00 pi10} {sii1 : PathSquare p0i1 p1i1 pi01 pi11} {si0i : PathSquare p00i p10i pi00 pi01} {si1i : PathSquare p01i p11i pi10 pi11} (ciii : PathCube s0ii s1ii sii0 sii1 si0i si1i).
A: Type
x000, x010, x100, x110, x001, x011, x101, x111: A
p0i0: x000 = x010
p1i0: x100 = x110
pi00: x000 = x100
pi10: x010 = x110
p0i1: x001 = x011
p1i1: x101 = x111
pi01: x001 = x101
pi11: x011 = x111
p00i: x000 = x001
p01i: x010 = x011
p10i: x100 = x101
p11i: x110 = x111
s0ii: PathSquare p0i0 p0i1 p00i p01i
s1ii: PathSquare p1i0 p1i1 p10i p11i
sii0: PathSquare p0i0 p1i0 pi00 pi10
sii1: PathSquare p0i1 p1i1 pi01 pi11
si0i: PathSquare p00i p10i pi00 pi01
si1i: PathSquare p01i p11i pi10 pi11
ciii: PathCube s0ii s1ii sii0 sii1 si0i si1i
x201, x200, x210, x211: A
pj01: x101 = x201
pj11: x111 = x211
pj10: x110 = x210
pj00: x100 = x200
p2i1: x201 = x211
p2i0: x200 = x210
p20i: x200 = x201
p21i: x210 = x211
sji0: PathSquare p1i0 p2i0 pj00 pj10
sji1: PathSquare p1i1 p2i1 pj01 pj11
sj0i: PathSquare p10i p20i pj00 pj01
sj1i: PathSquare p11i p21i pj10 pj11
s2ii: PathSquare p2i0 p2i1 p20i p21i
cjii: PathCube s1ii s2ii sji0 sji1 sj0i sj1i

PathCube s0ii s2ii (sq_concat_h sii0 sji0) (sq_concat_h sii1 sji1) (sq_concat_h si0i sj0i) (sq_concat_h si1i sj1i)
A: Type
x000, x010, x100, x110, x001, x011, x101, x111: A
p0i0: x000 = x010
p1i0: x100 = x110
pi00: x000 = x100
pi10: x010 = x110
p0i1: x001 = x011
p1i1: x101 = x111
pi01: x001 = x101
pi11: x011 = x111
p00i: x000 = x001
p01i: x010 = x011
p10i: x100 = x101
p11i: x110 = x111
s0ii: PathSquare p0i0 p0i1 p00i p01i
s1ii: PathSquare p1i0 p1i1 p10i p11i
sii0: PathSquare p0i0 p1i0 pi00 pi10
sii1: PathSquare p0i1 p1i1 pi01 pi11
si0i: PathSquare p00i p10i pi00 pi01
si1i: PathSquare p01i p11i pi10 pi11
ciii: PathCube s0ii s1ii sii0 sii1 si0i si1i
x201, x200, x210, x211: A
pj01: x101 = x201
pj11: x111 = x211
pj10: x110 = x210
pj00: x100 = x200
p2i1: x201 = x211
p2i0: x200 = x210
p20i: x200 = x201
p21i: x210 = x211
sji0: PathSquare p1i0 p2i0 pj00 pj10
sji1: PathSquare p1i1 p2i1 pj01 pj11
sj0i: PathSquare p10i p20i pj00 pj01
sj1i: PathSquare p11i p21i pj10 pj11
s2ii: PathSquare p2i0 p2i1 p20i p21i
cjii: PathCube s1ii s2ii sji0 sji1 sj0i sj1i

PathCube s0ii s2ii (sq_concat_h sii0 sji0) (sq_concat_h sii1 sji1) (sq_concat_h si0i sj0i) (sq_concat_h si1i sj1i)
A: Type
x011: A
p0i0, pi00, pi10, p0i1, pi01, pi11, p00i, p01i: x011 = x011
s0ii: PathSquare p0i0 p0i1 p00i p01i
sii0: PathSquare p0i0 1 1 1
sii1: PathSquare p0i1 1 1 1
si0i: PathSquare p00i 1 1 1
si1i: PathSquare p01i 1 1 1
ciii: PathCube s0ii 1 sii0 sii1 si0i si1i

PathCube s0ii 1 (sq_concat_h sii0 1) (sq_concat_h sii1 1) (sq_concat_h si0i 1) (sq_concat_h si1i 1)
exact ciii. Defined.
A: Type
x000, x010, x100, x110, x001, x011, x101, x111: A
p0i0: x000 = x010
p1i0: x100 = x110
pi00: x000 = x100
pi10: x010 = x110
p0i1: x001 = x011
p1i1: x101 = x111
pi01: x001 = x101
pi11: x011 = x111
p00i: x000 = x001
p01i: x010 = x011
p10i: x100 = x101
p11i: x110 = x111
s0ii: PathSquare p0i0 p0i1 p00i p01i
s1ii: PathSquare p1i0 p1i1 p10i p11i
sii0: PathSquare p0i0 p1i0 pi00 pi10
sii1: PathSquare p0i1 p1i1 pi01 pi11
si0i: PathSquare p00i p10i pi00 pi01
si1i: PathSquare p01i p11i pi10 pi11
ciii: PathCube s0ii s1ii sii0 sii1 si0i si1i
x020, x021, x120, x121: A
p0j0: x010 = x020
p1j0: x110 = x120
p0j1: x011 = x021
p1j1: x111 = x121
p02i: x020 = x021
p12i: x120 = x121
pi20: x020 = x120
pi21: x021 = x121
s0ji: PathSquare p0j0 p0j1 p01i p02i
s1ji: PathSquare p1j0 p1j1 p11i p12i
sij0: PathSquare p0j0 p1j0 pi10 pi20
sij1: PathSquare p0j1 p1j1 pi11 pi21
si2i: PathSquare p02i p12i pi20 pi21
ciji: PathCube s0ji s1ji sij0 sij1 si1i si2i

PathCube (sq_concat_v s0ii s0ji) (sq_concat_v s1ii s1ji) (sq_concat_v sii0 sij0) (sq_concat_v sii1 sij1) si0i si2i
A: Type
x000, x010, x100, x110, x001, x011, x101, x111: A
p0i0: x000 = x010
p1i0: x100 = x110
pi00: x000 = x100
pi10: x010 = x110
p0i1: x001 = x011
p1i1: x101 = x111
pi01: x001 = x101
pi11: x011 = x111
p00i: x000 = x001
p01i: x010 = x011
p10i: x100 = x101
p11i: x110 = x111
s0ii: PathSquare p0i0 p0i1 p00i p01i
s1ii: PathSquare p1i0 p1i1 p10i p11i
sii0: PathSquare p0i0 p1i0 pi00 pi10
sii1: PathSquare p0i1 p1i1 pi01 pi11
si0i: PathSquare p00i p10i pi00 pi01
si1i: PathSquare p01i p11i pi10 pi11
ciii: PathCube s0ii s1ii sii0 sii1 si0i si1i
x020, x021, x120, x121: A
p0j0: x010 = x020
p1j0: x110 = x120
p0j1: x011 = x021
p1j1: x111 = x121
p02i: x020 = x021
p12i: x120 = x121
pi20: x020 = x120
pi21: x021 = x121
s0ji: PathSquare p0j0 p0j1 p01i p02i
s1ji: PathSquare p1j0 p1j1 p11i p12i
sij0: PathSquare p0j0 p1j0 pi10 pi20
sij1: PathSquare p0j1 p1j1 pi11 pi21
si2i: PathSquare p02i p12i pi20 pi21
ciji: PathCube s0ji s1ji sij0 sij1 si1i si2i

PathCube (sq_concat_v s0ii s0ji) (sq_concat_v s1ii s1ji) (sq_concat_v sii0 sij0) (sq_concat_v sii1 sij1) si0i si2i
A: Type
x101: A
p0i0, p1i0, pi00, p0i1, p1i1, pi01, p00i, p10i: x101 = x101
s0ii: PathSquare 1 1 p00i 1
s1ii: PathSquare 1 1 p10i 1
sii0: PathSquare 1 1 pi00 1
sii1: PathSquare 1 1 pi01 1
si0i: PathSquare p00i p10i pi00 pi01
ciii: PathCube s0ii s1ii sii0 sii1 si0i 1

PathCube (sq_concat_v s0ii 1) (sq_concat_v s1ii 1) (sq_concat_v sii0 1) (sq_concat_v sii1 1) si0i 1
exact ciii. Defined.
A: Type
x000, x010, x100, x110, x001, x011, x101, x111: A
p0i0: x000 = x010
p1i0: x100 = x110
pi00: x000 = x100
pi10: x010 = x110
p0i1: x001 = x011
p1i1: x101 = x111
pi01: x001 = x101
pi11: x011 = x111
p00i: x000 = x001
p01i: x010 = x011
p10i: x100 = x101
p11i: x110 = x111
s0ii: PathSquare p0i0 p0i1 p00i p01i
s1ii: PathSquare p1i0 p1i1 p10i p11i
sii0: PathSquare p0i0 p1i0 pi00 pi10
sii1: PathSquare p0i1 p1i1 pi01 pi11
si0i: PathSquare p00i p10i pi00 pi01
si1i: PathSquare p01i p11i pi10 pi11
ciii: PathCube s0ii s1ii sii0 sii1 si0i si1i
x002, x012, x102, x112: A
p0i2: x002 = x012
p00j: x001 = x002
p01j: x011 = x012
p1i2: x102 = x112
p10j: x101 = x102
p11j: x111 = x112
pi02: x002 = x102
pi12: x012 = x112
s0ij: PathSquare p0i1 p0i2 p00j p01j
s1ij: PathSquare p1i1 p1i2 p10j p11j
si0j: PathSquare p00j p10j pi01 pi02
si1j: PathSquare p01j p11j pi11 pi12
sii2: PathSquare p0i2 p1i2 pi02 pi12
ciij: PathCube s0ij s1ij sii1 sii2 si0j si1j

PathCube (sq_concat_h s0ii s0ij) (sq_concat_h s1ii s1ij) sii0 sii2 (sq_concat_v si0i si0j) (sq_concat_v si1i si1j)
A: Type
x000, x010, x100, x110, x001, x011, x101, x111: A
p0i0: x000 = x010
p1i0: x100 = x110
pi00: x000 = x100
pi10: x010 = x110
p0i1: x001 = x011
p1i1: x101 = x111
pi01: x001 = x101
pi11: x011 = x111
p00i: x000 = x001
p01i: x010 = x011
p10i: x100 = x101
p11i: x110 = x111
s0ii: PathSquare p0i0 p0i1 p00i p01i
s1ii: PathSquare p1i0 p1i1 p10i p11i
sii0: PathSquare p0i0 p1i0 pi00 pi10
sii1: PathSquare p0i1 p1i1 pi01 pi11
si0i: PathSquare p00i p10i pi00 pi01
si1i: PathSquare p01i p11i pi10 pi11
ciii: PathCube s0ii s1ii sii0 sii1 si0i si1i
x002, x012, x102, x112: A
p0i2: x002 = x012
p00j: x001 = x002
p01j: x011 = x012
p1i2: x102 = x112
p10j: x101 = x102
p11j: x111 = x112
pi02: x002 = x102
pi12: x012 = x112
s0ij: PathSquare p0i1 p0i2 p00j p01j
s1ij: PathSquare p1i1 p1i2 p10j p11j
si0j: PathSquare p00j p10j pi01 pi02
si1j: PathSquare p01j p11j pi11 pi12
sii2: PathSquare p0i2 p1i2 pi02 pi12
ciij: PathCube s0ij s1ij sii1 sii2 si0j si1j

PathCube (sq_concat_h s0ii s0ij) (sq_concat_h s1ii s1ij) sii0 sii2 (sq_concat_v si0i si0j) (sq_concat_v si1i si1j)
A: Type
x010: A
p0i0, p1i0, pi00, pi10, p00i, p01i, p10i, p11i: x010 = x010
s0ii: PathSquare p0i0 1 1 1
s1ii: PathSquare p1i0 1 1 1
sii0: PathSquare p0i0 p1i0 pi00 pi10
si0i: PathSquare 1 1 pi00 1
si1i: PathSquare 1 1 pi10 1
ciii: PathCube s0ii s1ii sii0 1 si0i si1i

PathCube (sq_concat_h s0ii 1) (sq_concat_h s1ii 1) sii0 1 (sq_concat_v si0i 1) (sq_concat_v si1i 1)
exact ciii. Defined. End Concat. (* Notation for left right concatenation *) Notation "x '@lr' y" := (cu_concat_lr x y) : cube_scope. Local Notation apc := (ap_compose_sq _ _ _). (* sq_ap analogue for ap_compse *)
A, B, C: Type
a00, a10, a01, a11: A
px0: a00 = a10
px1: a01 = a11
p0x: a00 = a01
p1x: a10 = a11
f: A -> B
g: B -> C
s: PathSquare px0 px1 p0x p1x

PathCube (sq_ap (g o f) s) (sq_ap g (sq_ap f s)) apc apc apc apc
A, B, C: Type
a00, a10, a01, a11: A
px0: a00 = a10
px1: a01 = a11
p0x: a00 = a01
p1x: a10 = a11
f: A -> B
g: B -> C
s: PathSquare px0 px1 p0x p1x

PathCube (sq_ap (g o f) s) (sq_ap g (sq_ap f s)) apc apc apc apc
by destruct s. Defined. Local Notation api := (ap_idmap_sq _). (* sq_ap analogue for ap_idmap *)
A: Type
a00, a10, a01, a11: A
px0: a00 = a10
px1: a01 = a11
p0x: a00 = a01
p1x: a10 = a11
s: PathSquare px0 px1 p0x p1x

PathCube (sq_ap idmap s) s api api api api
A: Type
a00, a10, a01, a11: A
px0: a00 = a10
px1: a01 = a11
p0x: a00 = a01
p1x: a10 = a11
s: PathSquare px0 px1 p0x p1x

PathCube (sq_ap idmap s) s api api api api
by destruct s. Defined. Local Notation apn := (ap_nat _ _). (* sq_ap analogue for ap_nat *)
A, B: Type
a00, a10, a01, a11: A
f, f': A -> B
h: f == f'
px0: a00 = a10
px1: a01 = a11
p0x: a00 = a01
p1x: a10 = a11
s: PathSquare px0 px1 p0x p1x

PathCube (sq_ap f s) (sq_ap f' s) apn apn apn apn
A, B: Type
a00, a10, a01, a11: A
f, f': A -> B
h: f == f'
px0: a00 = a10
px1: a01 = a11
p0x: a00 = a01
p1x: a10 = a11
s: PathSquare px0 px1 p0x p1x

PathCube (sq_ap f s) (sq_ap f' s) apn apn apn apn
destruct s as [x]; cbn; by destruct (h x). Defined. (* Uncurry a function in sq_ap2 *)
A, B, C: Type
f: A -> B -> C
a, a': A
p: a = a'
b, b': B
q: b = b'

PathCube (sq_ap (uncurry f) (sq_prod (hr, vr))) (sq_ap011 f p q) (sq_G1 (ap_uncurry f p 1)) (sq_G1 (ap_uncurry f p 1)) (sq_G1 (ap_uncurry f 1 q)) (sq_G1 (ap_uncurry f 1 q))
A, B, C: Type
f: A -> B -> C
a, a': A
p: a = a'
b, b': B
q: b = b'

PathCube (sq_ap (uncurry f) (sq_prod (hr, vr))) (sq_ap011 f p q) (sq_G1 (ap_uncurry f p 1)) (sq_G1 (ap_uncurry f p 1)) (sq_G1 (ap_uncurry f 1 q)) (sq_G1 (ap_uncurry f 1 q))
by destruct p, q. Defined. (* ap for cubes *)
A, B: Type
x000, x010, x100, x110, x001, x011, x101, x111: A
p0i0: x000 = x010
p1i0: x100 = x110
pi00: x000 = x100
pi10: x010 = x110
p0i1: x001 = x011
p1i1: x101 = x111
pi01: x001 = x101
pi11: x011 = x111
p00i: x000 = x001
p01i: x010 = x011
p10i: x100 = x101
p11i: x110 = x111
s0ii: PathSquare p0i0 p0i1 p00i p01i
s1ii: PathSquare p1i0 p1i1 p10i p11i
sii0: PathSquare p0i0 p1i0 pi00 pi10
sii1: PathSquare p0i1 p1i1 pi01 pi11
si0i: PathSquare p00i p10i pi00 pi01
si1i: PathSquare p01i p11i pi10 pi11
f: A -> B
c: PathCube s0ii s1ii sii0 sii1 si0i si1i

PathCube (sq_ap f s0ii) (sq_ap f s1ii) (sq_ap f sii0) (sq_ap f sii1) (sq_ap f si0i) (sq_ap f si1i)
A, B: Type
x000, x010, x100, x110, x001, x011, x101, x111: A
p0i0: x000 = x010
p1i0: x100 = x110
pi00: x000 = x100
pi10: x010 = x110
p0i1: x001 = x011
p1i1: x101 = x111
pi01: x001 = x101
pi11: x011 = x111
p00i: x000 = x001
p01i: x010 = x011
p10i: x100 = x101
p11i: x110 = x111
s0ii: PathSquare p0i0 p0i1 p00i p01i
s1ii: PathSquare p1i0 p1i1 p10i p11i
sii0: PathSquare p0i0 p1i0 pi00 pi10
sii1: PathSquare p0i1 p1i1 pi01 pi11
si0i: PathSquare p00i p10i pi00 pi01
si1i: PathSquare p01i p11i pi10 pi11
f: A -> B
c: PathCube s0ii s1ii sii0 sii1 si0i si1i

PathCube (sq_ap f s0ii) (sq_ap f s1ii) (sq_ap f sii0) (sq_ap f sii1) (sq_ap f si0i) (sq_ap f si1i)
by destruct c. Defined.