Require Import Basics.[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
* [PathCube]s from paths between squares
* [PathCube]s from squares
* [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.
(** [PathCube]s form a path of squares up to retyping *)
Definition equiv_cu_path {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}
: sq_concat_h (tr (fv s0ii)) (sq_concat_h si0i (tr s1ii)) =
sq_ccGG
(moveL_Vp _ _ _ (sq_path^-1 sii0))
(moveL_Vp _ _ _ (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
Proof .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
srapply equiv_adjointify. 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
destruct sii0, sii1; cbn .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
rewrite (eisretr sq_G1 si0i)^,
(eisretr sq_1G s0ii)^,
(eisretr sq_1G s1ii)^.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
intro X.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
1 ,2 : by intros [].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
destruct sii0, sii1.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
cbn .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 (concat_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 (concat_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 (concat_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
rewrite <- (eisretr sq_G1 si0i).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 (concat_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 (concat_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 (concat_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
rewrite <- (eisretr sq_1G s0ii).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 (concat_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 (concat_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 (concat_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
rewrite <- (eisretr sq_1G s1ii).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 (concat_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 (concat_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 (concat_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
destruct (@equiv_inv _ _ sq_G1 _ si0i).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 (concat_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 (concat_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 (concat_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
destruct (@equiv_inv _ _ sq_1G _ s0ii).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 (concat_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 (concat_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 (concat_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
destruct (@equiv_inv _ _ sq_1G _ s1ii).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 (concat_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 (concat_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 (concat_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
destruct p00i.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 (concat_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 (concat_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 (concat_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
intro X.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 (concat_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 (concat_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 (concat_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 *)
Definition cu_refl_lr (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
Proof .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 *)
Definition cu_refl_tb (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
Proof .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 *)
Definition cu_refl_fb (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
Proof .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 *)
Definition equiv_cu_GGGGGG {s0ii' s1ii' sii0' sii1' si0i' si1i' }
(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'
Proof .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 *)
Definition equiv_cu_rot_tb_fb {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}
: PathCube si0i si1i (sq_tr s0ii) (sq_tr s1ii) (sq_tr sii0) (sq_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
Proof .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
srapply equiv_adjointify. 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
intro 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 cube : PathCube si0i si1i (tr s0ii)
(tr s1ii) (tr sii0) (tr sii1)
PathCube s0ii s1ii sii0 sii1 si0i si1i
refine (cu_GGGGcc _ _ _ _ _).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
1 ,2 ,3 ,4 : exact (eissect tr _).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
revert 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 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
set (a := tr 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 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
set (b := 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 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
set (c := tr 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 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
set (d := 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 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
clearbody a b c d; clear s0ii s1ii sii0 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 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
intro 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 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)
1 ,2 : by intros [].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
rewrite <- (eissect tr 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
(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
rewrite <- (eissect 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 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
rewrite <- (eissect tr 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
(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
rewrite <- (eissect 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
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
set (a := tr 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 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
set (b := 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 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
set (c := tr 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 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
set (d := 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 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
clearbody a b c d; clear s0ii s1ii sii0 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 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
intro 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 ) 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
rewrite <- (eissect (cu_ccGGGG (eisretr tr _)
(eisretr tr _) (eisretr tr _) (eisretr tr _)) 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)
set (e := cu_ccGGGG (eisretr tr _) (eisretr tr _)
(eisretr tr _) (eisretr tr _) 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
clearbody e; clear 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 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.
(** Degenerate cubes formed from paths between squares *)
(** The first case is easiest to prove and can be written as equivalences *)
Definition equiv_cu_G11 {A } {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
Proof .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
destruct s.A : Type x : A s' : PathSquare 1 1 1 1
1 = s' <~> PathCube 1 s' hr hr hr hr
refine (cu_path oE _).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
refine (equiv_concat_l (sq_concat_h_1s (sq_concat_h 1 %square (tr s'))
(p0y:=1 ) (p1y:=1 )) _ oE _).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
refine (equiv_concat_l (sq_concat_h_1s (tr s')
(p0y:=1 ) (p1y:=1 )) _ oE _).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
refine (equiv_moveR_equiv_M (f:=tr) _ _ oE _).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 *)
Definition equiv_cu_1G1 {A } {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
Proof .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
refine (cu_rot_tb_fb oE _).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')
refine (cu_rot_tb_fb oE _).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))
refine (cu_ccGGGG _ _ _ _ oE _).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
1 ,2 : exact sq_tr_refl_v^.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)
1 ,2 : exact (eisretr tr _)^.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
refine (_ oE equiv_ap' tr _ _).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
exact equiv_cu_G11.
Defined .
(** Finally this is an even simpler rotation *)
Definition equiv_cu_11G {A } {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'
Proof .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'
refine (cu_rot_tb_fb oE _).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)
refine (cu_ccGGGG _ _ _ _ oE _).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
1 -4 : exact sq_tr_refl_v^.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 exact equiv_cu_G11.
Defined .
Notation cu_G11 := equiv_cu_G11.
Notation cu_1G1 := equiv_cu_1G1.
Notation cu_11G := equiv_cu_11G.
(** Degenerate 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).
Definition equiv_cu_GG1
: 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
Proof .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
destruct p0x, p1x, a00.A : Type x : A a00, a10 : x = x px0, px1 : 1 %path = a10p0x : 1 %path = 1 %pathp1x : a10 = a10
PathSquare px0 px1 1 1 <~>
PathCube (sq_G1 px0) (sq_G1 px1) (sq_G1 1 %path)
(sq_G1 1 %path) 1 1
refine (_ oE sq_G1^-1 ).A : Type x : A a00, a10 : x = x px0, px1 : 1 %path = a10p0x : 1 %path = 1 %pathp1x : a10 = a10
px0 = px1 <~>
PathCube (sq_G1 px0) (sq_G1 px1) (sq_G1 1 %path)
(sq_G1 1 %path) 1 1
refine (_ oE equiv_ap' sq_G1 _ _).A : Type x : A a00, a10 : x = x px0, px1 : 1 %path = a10p0x : 1 %path = 1 %pathp1x : 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 .
Definition equiv_cu_1GG
: 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)
Proof .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)
destruct px0, px1, a01.A : Type x : A a00, a01 : x = x px0 : a00 = a00 px1 : 1 %path = 1 %pathp0x, 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)
refine (_ oE sq_1G^-1 ).A : Type x : A a00, a01 : x = x px0 : a00 = a00 px1 : 1 %path = 1 %pathp0x, p1x : a00 = 1 %path
p0x = p1x <~>
PathCube 1 1 (sq_1G 1 %path) (sq_1G 1 %path) (sq_1G p0x)
(sq_1G p1x)
refine (_ oE equiv_ap' sq_1G _ _).A : Type x : A a00, a01 : x = x px0 : a00 = a00 px1 : 1 %path = 1 %pathp0x, 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 .
Definition equiv_cu_G1G : 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)
Proof .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)
destruct p0x, p1x, a10.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)
refine (_ oE sq_G1^-1 ).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)
refine (_ oE equiv_ap' sq_1G _ _).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 {_ _ _ _ _ _ _ _ _ _ _}.
(** [PathCube]s can be given by [DPathSquare]s over paths *)
Definition equiv_cu_ds
{A B } {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 => f x = g x) px0 b00 b10}
{qx1 : DPath (fun x => f x = g x) px1 b01 b11}
{q0x : DPath (fun x => f x = g x) p0x b00 b01}
{q1x : DPath (fun x => f x = g x) p1x b10 b11}
: DPathSquare (fun x => 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)
Proof .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)
destruct 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 )
exact cu_GG1.
Defined .
Notation cu_ds := equiv_cu_ds.
(** [PathCube]s can be given by [DPath]s over [PathSquare]s *)
Definition equiv_dp_cu {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 => 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
Proof .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 *)
Definition equiv_cu_flip_lr {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}
: 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)
Proof .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)
destruct si1i, si0i.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 )
refine (cu_GGcccc _ _ oE _).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
1 ,2 : exact (eisretr sq_G1 _).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 )
refine (cu_GG1 oE _).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)
refine (sq_flip_h oE _).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)
refine (cu_GG1^-1 oE _).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
refine (cu_GGGGcc _ _ _ _).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)
all : exact (eisretr sq_G1 _)^.
Defined .
Notation cu_flip_lr := equiv_cu_flip_lr.
(** [PathCube] Kan fillers ~ Every open crate has a lid *)
Definition cu_fill_left {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}
(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}
Proof .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}
destruct 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 }
set (a := sq_G1^-1 s1ii).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 }
set (b := sq_G1^-1 sii0).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 }
set (c := sq_G1^-1 sii1).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 }
rewrite <- (eisretr sq_G1 s1ii).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 }
rewrite <- (eisretr sq_G1 sii0).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 }
rewrite <- (eisretr sq_G1 sii1).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 }
change (sq_G1^-1 s1ii) with a.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 }
change (sq_G1^-1 sii0) with b.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 }
change (sq_G1^-1 sii1) with c.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 }
clearbody a b c.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 }
clear s1ii sii0 sii1.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 }
refine (sq_G1 (b @ a @ c^); _).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 .
Definition cu_fill_right {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)
(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}
Proof .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}
refine (_;_).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
apply cu_flip_lr^-1 .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 .
Definition cu_fill_top {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)
(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}
Proof .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}
refine (_;_).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
apply cu_rot_tb_fb.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)
apply cu_rot_tb_fb.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))
refine (cu_Gccccc (eisretr tr _)^ _).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 .
Definition cu_fill_bottom {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)
(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}
Proof .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}
refine (_;_).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
apply cu_rot_tb_fb.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 )
apply cu_rot_tb_fb.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))
refine (cu_cGcccc (eisretr tr _)^ _).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 .
Definition cu_fill_front {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)
(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}
Proof .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}
refine (_;_).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
apply cu_rot_tb_fb.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 .
Definition cu_fill_back {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 & 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}
Proof .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}
refine (_;_).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
apply cu_rot_tb_fb.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).
Definition cu_concat_lr
{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)
Proof .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)
destruct cjii, pi00, pi01, pi10, pi11.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 .
Definition cu_concat_tb
{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
Proof .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
destruct ciji, p0i0, p1i0, p0i1, p1i1.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 .
Definition cu_concat_fb
{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)
Proof .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)
destruct ciij, p00i, p10i, p11i, p01i.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_compose] *)
Definition sq_ap_compose {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
Proof .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] *)
Definition sq_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
Proof .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] *)
Definition sq_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) (ap_nat h _) 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
Proof .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] *)
Definition sq_ap_uncurry {A B C } (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 _ _ _)) (sq_G1 (ap_uncurry _ _ _))
(sq_G1 (ap_uncurry _ _ _)) (sq_G1 (ap_uncurry _ _ _)).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))
Proof .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 *)
Definition cu_ap {A B } {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)
Proof .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 .