Definition: coordinate_name
Cname ==  {2...}

Lemma: coordinate_name_wf
Cname ∈ Type

Lemma: coordinate_name-value-type
value-type(Cname)

Definition: cname_deq
CnameDeq ==  IntDeq

Lemma: cname_deq_wf
CnameDeq ∈ EqDecider(Cname)

Definition: eq-cname
eq-cname(x;y) ==  CnameDeq y

Lemma: eq-cname_wf
[x,y:Cname].  (eq-cname(x;y) ∈ 𝔹)

Lemma: assert-eq-cname
[x,y:Cname].  uiff(↑eq-cname(x;y);x y ∈ Cname)

Lemma: decidable__equal-coordinate_name
x,y:Cname.  Dec(x y ∈ Cname)

Definition: nameset
nameset(L) ==  {a:Cname| (a ∈ L)} 

Lemma: nameset_wf
[L:Cname List]. (nameset(L) ∈ Type)

Lemma: nameset-equipollent
L:Cname List. nameset(L) ~ ℕ||remove-repeats(CnameDeq;L)||

Lemma: member-nameset-diff
[L,X:Cname List]. ∀[x:nameset(L)].  x ∈ nameset(L-X) supposing ¬(x ∈ X)

Lemma: nameset-value-type
[L:Cname List]. value-type(nameset(L))

Lemma: nameset_subtype
[L1,L2:Cname List].  nameset(L1) ⊆nameset(L2) supposing l_subset(Cname;L1;L2)

Lemma: nameset_subtype_cons_diff
[I:Cname List]. ∀[x:nameset(I)].  (nameset(I) ⊆nameset([x I-[x]]))

Lemma: nameset_subtype_base
[L:Cname List]. (nameset(L) ⊆Base)

Lemma: nameset_sq
[L:Cname List]. SQType(nameset(L))

Lemma: decidable__nameset
L:Cname List. ∀a:Cname.  Dec(a ∈ nameset(L))

Definition: fresh-cname
fresh-cname(I) ==  (fst(list-max(x.x;[1 I]))) 1

Lemma: fresh-cname_wf
[I:Cname List]. (fresh-cname(I) ∈ {x:Cname| ¬(x ∈ I)} )

Lemma: fresh-cname-not-member
[I:Cname List]. (fresh-cname(I) ∈ nameset(I)))

Lemma: fresh-cname-not-member2
I:Cname List. (fresh-cname(I) ∈ I))

Lemma: fresh-cname-not-member-list-diff
I:Cname List. ∀[L:Cname List]. (fresh-cname(I) ∈ I-L))

Lemma: fresh-cname-not-equal
I:Cname List. ∀[x:nameset(I)]. (fresh-cname(I) x ∈ Cname))

Lemma: fresh-cname-not-equal2
I:Cname List. ∀[x:nameset(I)]. (x fresh-cname(I) ∈ Cname))

Lemma: add-remove-fresh-cname
I:Cname List. (I [fresh-cname(I) I]-[fresh-cname(I)] ∈ (Cname List))

Lemma: add-remove-fresh-sq
I:Cname List. ([fresh-cname(I) I]-[fresh-cname(I)] I)

Definition: add-fresh-cname
I+ ==  eval fresh-cname(I) in [m I]

Lemma: add-fresh-cname_wf
[I:Cname List]. (I+ ∈ Cname List)

Lemma: subtype-add-fresh-cname
[I:Cname List]. (nameset(I) ⊆nameset(I+))

Definition: extd-nameset
extd-nameset(L) ==  nameset(L) ⋃ ℕ2

Lemma: extd-nameset_wf
[L:Cname List]. (extd-nameset(L) ∈ Type)

Lemma: extd-nameset_subtype_base
[L:Cname List]. (extd-nameset(L) ⊆Base)

Lemma: extd-nameset-respects-equality
[L:Cname List]. ∀[T:Type].  respects-equality(extd-nameset(L);T)

Lemma: extd-nameset_subtype_int
[L:Cname List]. (extd-nameset(L) ⊆r ℤ)

Lemma: extd-nameset_subtype
[L,L':Cname List].  extd-nameset(L) ⊆extd-nameset(L') supposing l_subset(Cname;L;L')

Lemma: extd-nameset-nil
extd-nameset([]) ⊆r ℕ2

Lemma: nsub2_subtype_extd-nameset
[L:Cname List]. (ℕ2 ⊆extd-nameset(L))

Lemma: nameset_subtype_extd-nameset
[L:Cname List]. (nameset(L) ⊆extd-nameset(L))

Definition: isname
isname(z) ==  2 ≤z

Lemma: isname_wf
[L:Cname List]. ∀[z:extd-nameset(L)].  (isname(z) ∈ 𝔹)

Lemma: isname-nameset
[L:Cname List]. ∀[z:nameset(L)].  (isname(z) tt)

Lemma: isname-name
[z:Cname]. (isname(z) tt)

Lemma: assert-isname
[L:Cname List]. ∀[z:extd-nameset(L)].  uiff(↑isname(z);z ∈ nameset(L))

Lemma: not-assert-isname
[L:Cname List]. ∀[z:extd-nameset(L)].  uiff(¬↑isname(z);z ∈ ℕ2)

Definition: uext
uext(g) ==  λz.if isname(z) then else fi 

Lemma: uext_wf
[I,J:Cname List]. ∀[g:nameset(I) ⟶ extd-nameset(J)].  (uext(g) ∈ extd-nameset(I) ⟶ extd-nameset(J))

Definition: name-morph
name-morph(I;J) ==
  {f:nameset(I) ⟶ extd-nameset(J)| 
   ∀i,j:nameset(I).  ((↑isname(f i))  (↑isname(f j))  ((f i) (f j) ∈ extd-nameset(J))  (i j ∈ nameset(I)))} 

Lemma: name-morph_wf
[I,J:Cname List].  (name-morph(I;J) ∈ Type)

Lemma: name-morph-ap
[I,J:Cname List]. ∀[f:name-morph(I;J)]. ∀[x:nameset(I)].  (f x ∈ extd-nameset(J))

Lemma: uext-ap-name
[I,J:Cname List]. ∀[g:name-morph(I;J)]. ∀[x:nameset(I)].  ((uext(g) x) (g x) ∈ extd-nameset(J))

Lemma: name-morphs-equal
[I,J:Cname List]. ∀[f:name-morph(I;J)]. ∀[g:nameset(I) ⟶ extd-nameset(J)].
  g ∈ name-morph(I;J) supposing g ∈ (nameset(I) ⟶ extd-nameset(J))

Lemma: name-morph-ext
[I,J:Cname List]. ∀[f,g:name-morph(I;J)].
  g ∈ name-morph(I;J) supposing ∀x:nameset(I). ((f x) (g x) ∈ extd-nameset(J))

Lemma: name-morph_subtype
[I,J,A,B:Cname List].
  (name-morph(I;J) ⊆name-morph(A;B)) supposing ((nameset(A) ⊆nameset(I)) and (nameset(J) ⊆nameset(B)))

Lemma: name-morph_subtype_remove1
[I,J:Cname List]. ∀[x:Cname]. ∀[f:name-morph(I;J)].
  (f ∈ name-morph(I-[x];J-[f x])) supposing ((↑isname(f x)) and (x ∈ I))

Definition: extend-name-morph
f[z1:=z2] ==  λx.if eq-cname(x;z1) then z2 else fi 

Lemma: extend-name-morph_wf
[I,J:Cname List]. ∀[f:name-morph(I;J)]. ∀[z1,z2:Cname].  f[z1:=z2] ∈ name-morph([z1 I];[z2 J]) supposing ¬(z2 ∈ J)

Definition: name-morph-extend
(f)+ ==  eval fresh-cname(I) in eval m' fresh-cname(J) in   λx.if CnameDeq then m' else fi 

Lemma: name-morph-extend_wf
[I,J:Cname List]. ∀[f:name-morph(I;J)].  ((f)+ ∈ name-morph(I+;J+))

Definition: name-morph-domain
name-morph-domain(f;I) ==  nameset(filter(λx.isname(f x);I))

Lemma: name-morph-domain_wf
[I,J:Cname List]. ∀[f:name-morph(I;J)].  (name-morph-domain(f;I) ∈ Type)

Lemma: name-morph-domain_subtype
[I,J:Cname List]. ∀[f:name-morph(I;J)].  name-morph-domain(f;I) ≡ {x:nameset(I)| ↑isname(f x)} 

Lemma: name-morph-domain-inject
[I,J:Cname List]. ∀[f:name-morph(I;J)].  Inj(name-morph-domain(f;I);nameset(J);f)

Lemma: name-morph-one-one
[I,J:Cname List]. ∀[f:name-morph(I;J)]. ∀[x,y:nameset(I)].
  (x y ∈ Cname) supposing (((f x) (f y) ∈ Cname) and (↑isname(f y)) and (↑isname(f x)))

Lemma: name-morph_subtype_domain
[I,J:Cname List]. ∀[f:name-morph(I;J)].  (f ∈ name-morph-domain(f;I) ⟶ nameset(J))

Definition: name-morph-range
name-morph-range(f;I) ==  {x:Cname| ∃i:nameset(I). ((↑isname(f i)) ∧ ((f i) x ∈ Cname))} 

Lemma: name-morph-range_wf
[I,J:Cname List]. ∀[f:name-morph(I;J)].  (name-morph-range(f;I) ∈ Type)

Definition: name-morph-inv
name-morph-inv(I;f) ==  λx.hd(filter(λi.(isname(f i) ∧b (f =z x));I))

Lemma: name-morph-inv_wf
[I,J:Cname List]. ∀[f:name-morph(I;J)].  (name-morph-inv(I;f) ∈ name-morph-range(f;I) ⟶ nameset(I))

Lemma: name-morph-inv-eq
[I,J:Cname List]. ∀[f:name-morph(I;J)]. ∀[x:nameset(I)].
  (name-morph-inv(I;f) (f x)) x ∈ nameset(I) supposing ↑isname(f x)

Lemma: name-morph-inv-eq-domain
[I,J:Cname List]. ∀[f:name-morph(I;J)]. ∀[x:name-morph-domain(f;I)].  ((name-morph-inv(I;f) (f x)) x ∈ nameset(I))

Definition: id-morph
==  λx.x

Lemma: id-morph_wf
[I:Cname List]. (1 ∈ name-morph(I;I))

Lemma: name-morph-extend-id
[I:Cname List]. ((1)+ 1 ∈ name-morph(I+;I+))

Definition: face-map
(x:=i) ==  λz.if (z =z x) then else fi 

Lemma: face-map_wf
[L:Cname List]. ∀[x:Cname]. ∀[p:ℕ2].  ((x:=p) ∈ name-morph([x L];L))

Lemma: face-map_wf2
[I:Cname List]. ∀[x:Cname]. ∀[p:ℕ2].  ((x:=p) ∈ name-morph(I;I-[x]))

Lemma: face-map-property
[L:Cname List]
  ∀x:Cname. ∀p:ℕ2. ∀y:nameset([x L]).
    (((↑isname((x:=p) y))  ((¬(y x ∈ Cname)) ∧ (((x:=p) y) y ∈ nameset(L))))
    ∧ ((¬↑isname((x:=p) y))  ((y x ∈ Cname) ∧ (((x:=p) y) p ∈ ℕ2))))

Definition: degeneracy-map
degeneracy-map(f) ==  f

Lemma: degeneracy-map_wf
[I,J:Cname List]. ∀[f:nameset(I) ⟶ nameset(J)].
  degeneracy-map(f) ∈ name-morph(I;J) supposing Inj(nameset(I);nameset(J);f)

Lemma: name-morph-degeneracy-map
[I,J:Cname List]. ∀[f:name-morph(I;J)].  (degeneracy-map(f) ∈ name-morph(filter(λx.isname(f x);I);J))

Definition: iota
iota(x) ==  λz.z

Lemma: iota_wf
[I:Cname List]. ∀[x:Cname].  (iota(x) ∈ name-morph(I;[x I]))

Lemma: iota-wf
[I:Cname List]. ∀[x:nameset(I)].  (iota(x) ∈ name-morph(I-[x];I))

Definition: iota'
iota'(I) ==  iota(fresh-cname(I))

Lemma: iota'_wf
[I:Cname List]. (iota'(I) ∈ name-morph(I;I+))

Lemma: face-map_wf_fresh-cname
[L:Cname List]. ∀[p:ℕ2].  ((fresh-cname(L):=p) ∈ name-morph(L+;L))

Definition: name-comp
(f g) ==  uext(g) f

Lemma: name-comp_wf
[I,J,K:Cname List]. ∀[f:name-morph(I;J)]. ∀[g:name-morph(J;K)].  ((f g) ∈ name-morph(I;K))

Lemma: name-comp-id-left
[I,J:Cname List]. ∀[f:name-morph(I;J)].  ((1 f) f ∈ name-morph(I;J))

Lemma: name-comp-id-right
[I,J:Cname List]. ∀[f:name-morph(I;J)].  ((f 1) f ∈ name-morph(I;J))

Lemma: name-comp-assoc
[I,J,K,H:Cname List]. ∀[f:name-morph(I;J)]. ∀[g:name-morph(J;K)]. ∀[h:name-morph(K;H)].
  (((f g) h) (f (g h)) ∈ name-morph(I;H))

Lemma: name-morph-extend-comp
[I,J,K:Cname List]. ∀[f:name-morph(I;J)]. ∀[g:name-morph(J;K)].  (((f g))+ ((f)+ (g)+) ∈ name-morph(I+;K+))

Lemma: name-morph-extend-face-map
[I,K:Cname List]. ∀[i:ℕ2]. ∀[f:name-morph(I;K)].
  (((fresh-cname(I):=i) f) ((f)+ (fresh-cname(K):=i)) ∈ name-morph(I+;K))

Lemma: face-map-comp
A,B:Cname List. ∀g:name-morph(A;B). ∀x:nameset(A). ∀i:ℕ2.
  (g (g x:=i)) ((x:=i) g) ∈ name-morph(A;B-[g x]) supposing ↑isname(g x)

Lemma: face-map-comp-id
A,B:Cname List. ∀g:name-morph(A;B). ∀x:nameset(A). ∀i:ℕ2.
  ((x:=i) g) g ∈ name-morph(A;B) supposing (¬↑isname(g x)) ∧ ((g x) i ∈ ℕ2)

Lemma: face-map-comp-trivial
A,B:Cname List. ∀g:name-morph(A;B). ∀x:Cname. ∀i:ℕ2.  ((x:=i) g) g ∈ name-morph(A;B) supposing ¬(x ∈ A)

Lemma: face-map-idempotent
A,B:Cname List. ∀x:nameset(A). ∀g:name-morph(A-[x];B). ∀i:ℕ2.
  (((x:=i) ((x:=i) g)) ((x:=i) g) ∈ name-morph(A;B))

Lemma: face-map-comp2
A,B:Cname List. ∀g:name-morph(A;B). ∀x,y:nameset(A). ∀i,j:ℕ2.
  (g ((g x:=i) (g y:=j))) (((x:=i) (y:=j)) g) ∈ name-morph(A;B-[g x; y]) 
  supposing ((↑isname(g x)) ∧ (↑isname(g y))) ∧ (x y ∈ Cname))

Lemma: face-maps-commute
I:Cname List. ∀x:nameset(I). ∀i:ℕ2. ∀y:nameset(I). ∀j:ℕ2.
  ((¬(x y ∈ Cname))  (((x:=i) (y:=j)) ((y:=j) (x:=i)) ∈ name-morph(I;I-[x; y])))

Lemma: iota-identity
[I:Cname List]. ∀[x:Cname]. ∀[i:ℕ2].  (iota(x) (x:=i)) 1 ∈ name-morph(I;I) supposing ¬(x ∈ I)

Lemma: iota-identity2
[I:Cname List]. ∀[x:Cname]. ∀[i:ℕ2].  ((x:=i) iota(x)) 1 ∈ name-morph(I;I) supposing ¬(x ∈ I)

Lemma: iota-face-map
[I:Cname List]. ∀[x,y:Cname]. ∀[i:ℕ2].
  ((x:=i) iota(y)) (iota(y) (x:=i)) ∈ name-morph(I;[y I-[x]]) supposing ¬(x y ∈ Cname)

Lemma: iota-two-face-maps
[I:Cname List]. ∀[x,y,z:Cname]. ∀[i,j:ℕ2].
  (((x:=i) (y:=j)) iota(z)) (iota(z) ((x:=i) (y:=j))) ∈ name-morph(I;[z I-[x; y]]) 
  supposing (x z ∈ Cname)) ∧ (y z ∈ Cname))

Lemma: iota'-identity
[I:Cname List]. ∀[i:ℕ2].  ((iota'(I) (fresh-cname(I):=i)) 1 ∈ name-morph(I;I))

Lemma: iota'-comp
[I,J:Cname List]. ∀[f:name-morph(I;J)].  ((iota'(I) (f)+) (f iota'(J)) ∈ name-morph(I;J+))

Lemma: extend-name-morph-iota
I,K:Cname List. ∀f:name-morph(I;K). ∀z,x:Cname.
  (iota(z) f[z:=x]) (f iota(x)) ∈ name-morph(I;[x K]) supposing (x ∈ K)) ∧ (z ∈ I))

Lemma: extend-face-map-same
[I:Cname List]. ∀[x,y:Cname]. ∀[i:ℕ2].
  (x:=i)[y:=y] (x:=i) ∈ name-morph([y I];[y I]-[x]) supposing (y x ∈ Cname)) ∧ (y ∈ I))

Lemma: extend-name-morph-face-map
I,K:Cname List. ∀f:name-morph(I;K). ∀z,x:Cname. ∀i:ℕ2.
  (f[z:=x] (x:=i)) ((z:=i) f) ∈ name-morph([z I];K) supposing (x ∈ K)) ∧ (z ∈ I))

Lemma: extend-name-morph-irrelevant
I,K:Cname List. ∀f:name-morph(I;K).  (f f[fresh-cname(I):=fresh-cname(K)] ∈ name-morph(I;K))

Lemma: lift-reduce-face-map
[I:Cname List]. ∀[x:nameset(I)]. ∀[c,i:ℕ2].
  ((iota(fresh-cname(I)) ((x:=i) (fresh-cname(I):=c))) (x:=i) ∈ name-morph(I;I-[x]))

Definition: swap-names
swap-names(z1;z2) ==  λx.if eq-cname(x;z1) then z2 if eq-cname(x;z2) then z1 else fi 

Lemma: swap-names_wf
[I:Cname List]. ∀[z1,z2:nameset(I)].  (swap-names(z1;z2) ∈ name-morph(I;I))

Definition: rename-one-name
rename-one-name(z1;z2) ==  λx.if eq-cname(x;z1) then z2 else fi 

Lemma: rename-one-name_wf
[I:Cname List]. ∀[z1,z2:Cname].
  rename-one-name(z1;z2) ∈ name-morph([z1 I];[z2 I]) supposing (z1 ∈ I)) ∧ (z2 ∈ I))

Lemma: rename-one-same
I:Cname List. ∀z:Cname.  rename-one-name(z;z) 1 ∈ name-morph([z I];[z I]) supposing ¬(z ∈ I)

Lemma: rename-one-iota
I:Cname List. ∀z,z1:Cname.
  (iota(z) rename-one-name(z;z1)) iota(z1) ∈ name-morph(I;[z1 I]) supposing (z1 ∈ I)) ∧ (z ∈ I))

Lemma: rename-one-comp
I:Cname List. ∀z,z1,z2:Cname.
  (rename-one-name(z;z1) rename-one-name(z1;z2)) rename-one-name(z;z2) ∈ name-morph([z I];[z2 I]) 
  supposing (z2 ∈ I)) ∧ (z1 ∈ I)) ∧ (z ∈ I))

Lemma: extended-face-map
I:Cname List. ∀x1,x2:nameset(I). ∀i:ℕ2. ∀y1,y2:Cname.
  (x2:=i)[y1:=y2] ((x2:=i) rename-one-name(y1;y2)) ∈ name-morph([y1 I-[x1]];[y2 I-[x1; x2]]) 
  supposing (y2 ∈ I-[x1; x2])) ∧ (y1 ∈ I))

Lemma: extended-face-map1
I:Cname List. ∀x:nameset(I). ∀i:ℕ2. ∀y1,y2:Cname.
  (x:=i)[y1:=y2] ((x:=i) rename-one-name(y1;y2)) ∈ name-morph([y1 I];[y2 I-[x]]) 
  supposing (y2 ∈ I-[x])) ∧ (y1 ∈ I))

Definition: face-maps-comp
face-maps-comp(L) ==  reduce(λp,f. (let x,i in (x:=i) f);λt.t;L)

Lemma: face-maps-comp_wf
[L:(Cname × ℕ2) List]. ∀[I:Cname List].  (face-maps-comp(L) ∈ name-morph(map(λp.(fst(p));L) I;I))

Lemma: face-maps-comp-property
L:(Cname × ℕ2) List
  ∀[I:Cname List]
    ∀y:nameset(map(λp.(fst(p));L) I)
      (((↑isname(face-maps-comp(L) y))  ((¬(y ∈ map(λp.(fst(p));L))) ∧ ((face-maps-comp(L) y) y ∈ nameset(I))))
      ∧ ((¬↑isname(face-maps-comp(L) y))
         ((y ∈ map(λp.(fst(p));L)) ∧ ((face-maps-comp(L) y) outl(apply-alist(CnameDeq;L;y)) ∈ ℕ2))))

Lemma: extend-name-morph-rename-one
I,K:Cname List. ∀f:name-morph(I;K). ∀z,z1,v:Cname.
  ((¬(z1 ∈ I))
   (z ∈ I))
   (v ∈ K))
   (f[z:=v] (rename-one-name(z;z1) f[z1:=v]) ∈ name-morph([z I];[v K])))

Lemma: rename-one-extend-name-morph
I,K:Cname List. ∀f:name-morph(I;K). ∀x,y,z:Cname.
  ((¬(x ∈ I))  (z ∈ K))  (y ∈ K))  ((f[x:=y] rename-one-name(y;z)) f[x:=z] ∈ name-morph([x I];[z K])))

Lemma: extend-name-morph-comp
I,J,K:Cname List. ∀f:name-morph(I;J). ∀g:name-morph(J;K). ∀z,v,v1:Cname.
  ((¬(z ∈ I))  (v ∈ K))  (v1 ∈ J))  ((f g)[z:=v] (f[z:=v1] g[v1:=v]) ∈ name-morph([z I];[v K])))

Lemma: rename-one-extend-id
I:Cname List. ∀z,z1:Cname.
  ((¬(z ∈ I))  (z1 ∈ I))  (rename-one-name(z;z1) 1[z:=z1] ∈ name-morph([z I];[z1 I])))

Lemma: name-morph-decomp
I,J:Cname List. ∀f:name-morph(I;J).
  ∃L:(Cname × ℕ2) List
   ∃K:Cname List
    (nameset(I) ≡ nameset(map(λp.(fst(p));L) K)
    ∧ (∃g:nameset(K) ⟶ nameset(J)
        (Inj(nameset(K);nameset(J);g) ∧ (f (face-maps-comp(L) degeneracy-map(g)) ∈ name-morph(I;J)))))

Definition: name-cat
NameCat ==  <Cname List, λI,J. name-morph(I;J), λI.1, λI,J,K,f,g. (f g)>

Lemma: name-cat_wf
NameCat ∈ SmallCategory

Lemma: name-morph-nil
[I:Cname List]. name-morph(I;[]) ≡ nameset(I) ⟶ ℕ2

Definition: name-morph-flip
flip(f;y) ==  λn.if eq-cname(n;y) then else fi 

Lemma: name-morph-flip_wf
[I:Cname List]. ∀[y:nameset(I)]. ∀[f:name-morph(I;[])].  (flip(f;y) ∈ name-morph(I;[]))

Lemma: name-morph-flips-commute
I:Cname List. ∀x:name-morph(I;[]). ∀i,j:nameset(I).  (flip(flip(x;j);i) flip(flip(x;i);j) ∈ name-morph(I;[]))

Lemma: name-morph-flip-face-map1
I:Cname List. ∀y:nameset(I). ∀a:ℕ2. ∀f:name-morph(I-[y];[]). ∀v:nameset(I).
  ((¬(v y ∈ Cname))  (flip(((y:=a) f);v) ((y:=a) flip(f;v)) ∈ name-morph(I;[])))

Lemma: name-morph-flip-face-map
I:Cname List. ∀y:nameset(I). ∀a:ℕ2. ∀c1:name-morph(I;[]). ∀v:nameset(I).
  ((¬(v y ∈ Cname))  (flip(((y:=a) c1);v) ((y:=a) flip(c1;v)) ∈ name-morph(I;[])))

Lemma: nsub2-flip
[x,y:ℕ2].  uiff((1 x) y ∈ ℕ2;x (1 y) ∈ ℕ2)

Lemma: name-morph-flip-flip
I:Cname List. ∀f:name-morph(I;[]). ∀j:nameset(I).  (flip(flip(f;j);j) f ∈ name-morph(I;[]))

Lemma: name-comp-flip
I:Cname List. ∀x:nameset(I). ∀K:Cname List. ∀f:name-morph(I;K). ∀f1:name-morph(K;[]).
  (f flip(f1;f x)) flip((f f1);x) ∈ name-morph(I;[]) supposing ↑isname(f x)

Definition: cubical-set
CubicalSet ==
  {XF:X:L:(Cname List) ⟶ Type × (I:(Cname List) ⟶ J:(Cname List) ⟶ name-morph(I;J) ⟶ (X I) ⟶ (X J))| 
   let X,F XF 
   in (∀I,J,K:Cname List. ∀f:name-morph(I;J). ∀g:name-morph(J;K).
         ((F (f g)) ((F g) (F f)) ∈ ((X I) ⟶ (X K))))
      ∧ (∀I:Cname List. ((F 1) x.x) ∈ ((X I) ⟶ (X I))))} 

Lemma: cubical-set-eqs-istype
[XF:X:L:(Cname List) ⟶ Type × (I:(Cname List) ⟶ J:(Cname List) ⟶ name-morph(I;J) ⟶ (X I) ⟶ (X J))]
  istype(let X,F XF 
         in (∀I,J,K:Cname List. ∀f:name-morph(I;J). ∀g:name-morph(J;K).
               ((F (f g)) ((F g) (F f)) ∈ ((X I) ⟶ (X K))))
            ∧ (∀I:Cname List. ((F 1) x.x) ∈ ((X I) ⟶ (X I)))))

Lemma: cubical-set_wf
CubicalSet ∈ 𝕌'

Lemma: cubical-set-is-functor
CubicalSet ≡ Functor(NameCat;TypeCat)

Definition: cube-set-map
A ⟶ ==  nat-trans(NameCat;TypeCat;A;B)

Lemma: cube-set-map_wf
[A,B:CubicalSet].  (A ⟶ B ∈ 𝕌')

Definition: csm-comp
==  G

Lemma: csm-comp_wf
[A,B,C:CubicalSet]. ∀[F:A ⟶ B]. ∀[G:B ⟶ C].  (G F ∈ A ⟶ C)

Lemma: csm-comp-sq
[A,B,C,F,G:Top].  (G ~ λA,x. (G (F x)))

Lemma: csm-comp-assoc
[A,B,C,D:CubicalSet]. ∀[F:A ⟶ B]. ∀[G:B ⟶ C]. ∀[H:C ⟶ D].  (H F ∈ A ⟶ D)

Definition: csm-id
1(X) ==  identity-trans(NameCat;TypeCat;X)

Lemma: csm-id_wf
[X:CubicalSet]. (1(X) ∈ X ⟶ X)

Lemma: csm-id-comp
[A,B:CubicalSet]. ∀[sigma:A ⟶ B].  ((sigma 1(A) sigma ∈ A ⟶ B) ∧ (1(B) sigma sigma ∈ A ⟶ B))

Definition: I-cube
X(I) ==  I

Lemma: I-cube_wf
[X:CubicalSet]. ∀[I:Cname List].  (X(I) ∈ Type)

Lemma: csm-equal
[A,B:CubicalSet]. ∀[f:A ⟶ B]. ∀[g:I:(Cname List) ⟶ A(I) ⟶ B(I)].
  g ∈ A ⟶ supposing g ∈ (I:(Cname List) ⟶ A(I) ⟶ B(I))

Lemma: cube-set-map-subtype
[A,B:CubicalSet].  (A ⟶ B ⊆(I:(Cname List) ⟶ A(I) ⟶ B(I)))

Definition: csm-ap
(s)x ==  x

Lemma: csm-ap_wf
[X,Y:CubicalSet]. ∀[s:X ⟶ Y]. ∀[I:Cname List]. ∀[x:X(I)].  ((s)x ∈ Y(I))

Lemma: csm-ap-csm-comp
Gamma,Delta,Z,s1,s2,I,alpha:Top.  ((s2 s1)alpha (s2)(s1)alpha)

Definition: cube-set-restriction
f(s) ==  (snd(X)) s

Lemma: cube-set-restriction_wf
[X:CubicalSet]. ∀[I,J:Cname List]. ∀[f:name-morph(I;J)]. ∀[s:X(I)].  (f(s) ∈ X(J))

Lemma: cube-set-restriction-face-map
[X:CubicalSet]. ∀[I,K:Cname List]. ∀[f:name-morph(I;K)]. ∀[s:X(I)]. ∀[c:ℕ2]. ∀[j:name-morph-domain(f;I)].
  ((f j:=c)(f(s)) f((j:=c)(s)) ∈ X(K-[f j]))

Lemma: cube-set-restriction-id
[X:CubicalSet]. ∀[I:Cname List]. ∀[s:X(I)].  (1(s) s ∈ X(I))

Lemma: cube-set-restriction-when-id
[X:CubicalSet]. ∀[I:Cname List]. ∀[s:X(I)]. ∀[f:name-morph(I;I)].  f(s) s ∈ X(I) supposing 1 ∈ name-morph(I;I)

Lemma: cube-set-restriction-comp
X:CubicalSet. ∀I,J,K:Cname List. ∀f:name-morph(I;J). ∀g:name-morph(J;K). ∀a:X(I).  (g(f(a)) (f g)(a) ∈ X(K))

Lemma: cube-set-restriction-comp2
X:CubicalSet. ∀I,J,J2,K:Cname List. ∀f:name-morph(I;J). ∀g:name-morph(J;K). ∀a:X(I).
  g(f(a)) (f g)(a) ∈ X(K) supposing J2 ∈ (Cname List)

Lemma: csm-ap-restriction
X,Y:CubicalSet. ∀s:X ⟶ Y. ∀I,J:Cname List. ∀f:name-morph(I;J). ∀a:X(I).  (f((s)a) (s)f(a) ∈ Y(J))

Lemma: cube-set-map-is
[A,B:CubicalSet].
  (A ⟶ {trans:I:(Cname List) ⟶ A(I) ⟶ B(I)| 
             ∀I,J:Cname List. ∀g:name-morph(I;J).  ((λs.g(trans s)) s.(trans g(s))) ∈ (A(I) ⟶ B(J)))} )

Definition: unit-cube
unit-cube(I) ==  <λJ.name-morph(I;J), λJ,K,f,g. (g f)>

Lemma: unit-cube_wf
[I:Cname List]. (unit-cube(I) ∈ CubicalSet)

Lemma: unit-cube-I-cube
[I,L:Top].  (unit-cube(I)(L) name-morph(I;L))

Lemma: unit-cube-is-yoneda
[I:Cname List]. (unit-cube(I) rep-pre-sheaf(op-cat(NameCat);I) ∈ CubicalSet)

Definition: unit-cube-map
unit-cube-map(f) ==  λK,g. (f g)

Lemma: unit-cube-map_wf
[I,J:Cname List]. ∀[f:name-morph(I;J)].  (unit-cube-map(f) ∈ unit-cube(J) ⟶ unit-cube(I))

Lemma: unit-cube-map-id
I:Cname List. (unit-cube-map(1) 1(unit-cube(I)) ∈ unit-cube(I) ⟶ unit-cube(I))

Lemma: unit-cube-map-comp
I,J,K:Cname List. ∀f:name-morph(I;J). ∀g:name-morph(J;K).
  (unit-cube-map((f g)) unit-cube-map(f) unit-cube-map(g) ∈ unit-cube(K) ⟶ unit-cube(I))

Definition: trivial-cube-set
() ==  <λJ.Unit, λJ,K,f,x. ⋅>

Lemma: trivial-cube-set_wf
() ∈ CubicalSet

Definition: discrete-cube
discrete-cube(A) ==  <λJ.A, λJ,K,f,x. x>

Lemma: discrete-cube_wf
[A:Type]. (discrete-cube(A) ∈ CubicalSet)

Definition: cubical-interval
cubical-interval() ==  <λI.(name-morph(I;[]) ⟶ ℕ2), λJ,K,f,L,g. (L (f g))>

Lemma: cubical-interval_wf
cubical-interval() ∈ CubicalSet

Comment: Rules of MLTT without type formers
The rules from Figure in Bezem, Coquand, Huber
"A model of type theory in cubical sets".
(First those without type formers)

    Γ ⊢
-------------                         this is csm-id_wf
  1: σ ⟶ Γ

σ: Δ ⟶ Γ    δ: Θ -> Δ
------------------------              this is csm-comp_wf
     σ δ : Θ ⟶ Γ

Γ ⊢ A   σ : Δ ⟶ Γ
----------------------                this is csm-ap-type_wf
     Δ ⊢ A σ

Γ ⊢ t: A   σ: Δ ⟶ Γ
-----------------------               this is csm-ap-term_wf
     Δ ⊢ t σA σ


-------------                         this is trivial-cube-set_wf
   () ⊢

Γ ⊢    Γ ⊢ A
-----------------                     this is cube-context-adjoin_wf
     Γ.A ⊢ 

     Γ ⊢ A
------------------                    this is cc-fst_wf
   p:  Γ.A ⟶ Γ

   Γ ⊢ A
-----------------                     this is cc-snd_wf
   Γ.A ⊢ q: Ap 

σ:Δ ⟶ Γ  Γ ⊢ A   Δ ⊢ u:A s
------------------------------        this is csm-adjoin_wf
   ,u) ⊢ Δ ⟶ Γ.A

1 σ = σ = σ                         this is csm-id-comp
(σ δ) ν = σ (δ ν)                     this is csm-comp-assoc
[u] (1,u)                           this is csm-id-adjoin
A                               this is csm-ap-id-type
(A σ) δ (σ δ)                     this is csm-ap-comp-type
1                               this is csm-ap-id-term
(u σ) δ (σ δ)                     this is csm-ap-comp-term 
u) δ (σ δu δ)                 this is csm-adjoin-ap
u) = σ                          this is cc-fst-csm-adjoin
u) u                          this is cc-snd-csm-adjoin
(p,q) 1                             this is csm-adjoin-fst-snd



Comment: Rules of MLTT type formers
The rules about type formers Π and ⌜Σ⌝ from Figure in Bezem, Coquand, Huber
"A model of type theory in cubical sets".

  Γ.A ⊢ B
-------------                         this is cubical-pi_wf
 Γ ⊢ Π 

  Γ.A ⊢ B   Γ.A ⊢ b:B
------------------------              this is cubical-lambda_wf
   Γ ⊢ λ: Π B  

  Γ.A ⊢ B
-------------                         this is cubical-sigma_wf
 Γ ⊢ Σ B


 Γ.A ⊢ B  Γ ⊢ u:A  Γ ⊢ v:B[u]
------------------------------        this is cubical-pair_wf
     Γ ⊢ (u,v): Σ B

  Γ ⊢ w: Σ B
----------------                      this is cubical-fst_wf
  Γ ⊢ w.1: A

  Γ ⊢ w: Σ B
-----------------                     this is cubical-snd_wf
  Γ ⊢ w.2: B[w.1]   

 Γ ⊢ w:Π B   Γ ⊢ u:A
------------------------              this is cubical-app_wf
 Γ ⊢ app(w,u): B[u]  


(Π B)σ = Π (Aσ(B(σp,q))           this is csm-cubical-pi
b)σ = λ(b(σp,q))                    this is csm-ap-cubical-lambda  
app(w,u)δ app(wδ)               this is csm-ap-cubical-app
app(λb, u) b[u]                     this is cubical-beta
= λ(app(wp,q))                      this is cubical-eta
(Σ B)σ =  (Aσ(B(σp,q))            this is csm-cubical-sigma
(w.1)σ (wσ).1                       this is csm-ap-cubical-fst
(w.2)σ (wσ).2                       this is csm-ap-cubical-snd
(u,v)σ (uσ)                     this is csm-ap-cubical-pair
(u,v).1 u                           this is cubical-fst-pair
(u,v).2 v                           this is cubical-snd-pair
(w.1,w.2) w                         this is cubical-pair-eta


Definition: cubical-type
{X ⊢ _} ==
  {AF:A:I:(Cname List) ⟶ X(I) ⟶ Type × (I:(Cname List)
                                         ⟶ J:(Cname List)
                                         ⟶ f:name-morph(I;J)
                                         ⟶ a:X(I)
                                         ⟶ (A a)
                                         ⟶ (A f(a)))| 
   let A,F AF 
   in (∀I:Cname List. ∀a:X(I). ∀u:A a.  ((F u) u ∈ (A a)))
      ∧ (∀I,J,K:Cname List. ∀f:name-morph(I;J). ∀g:name-morph(J;K). ∀a:X(I). ∀u:A a.
           ((F (f g) u) (F f(a) (F u)) ∈ (A (f g)(a))))} 

Lemma: cubical-type_wf
[X:CubicalSet]. (X ⊢  ∈ 𝕌')

Definition: cubical-type-at
A(a) ==  (fst(A)) a

Lemma: cubical-type-at_wf
[X:CubicalSet]. ∀[A:{X ⊢ _}]. ∀[I:Cname List]. ∀[a:X(I)].  (A(a) ∈ Type)

Definition: cubical-type-ap-morph
(u f) ==  (snd(A)) u

Lemma: cubical-type-ap-morph_wf
[X:CubicalSet]. ∀[A:{X ⊢ _}]. ∀[I,J:Cname List]. ∀[f:name-morph(I;J)]. ∀[a:X(I)]. ∀[u:A(a)].  ((u f) ∈ A(f(a)))

Lemma: cubical-type-ap-morph-comp
[X:CubicalSet]. ∀[A:{X ⊢ _}]. ∀[I,J,K:Cname List]. ∀[f:name-morph(I;J)]. ∀[g:name-morph(J;K)]. ∀[a:X(I)]. ∀[u:A(a)].
  (((u f) f(a) g) (u (f g)) ∈ A((f g)(a)))

Lemma: cubical-type-ap-morph-id
[X:CubicalSet]. ∀[A:{X ⊢ _}]. ∀[I:Cname List]. ∀[f:name-morph(I;I)]. ∀[a:X(I)]. ∀[u:A(a)].
  (u f) u ∈ A(a) supposing 1 ∈ name-morph(I;I)

Lemma: cubical-type-ap-rename-one-equal
[X:CubicalSet]. ∀[A:{X ⊢ _}]. ∀[I:Cname List]. ∀[x,y:Cname]. ∀[a:X([x I])]. ∀[u,v:A(a)].
  v ∈ A(a) ⇐⇒ (u rename-one-name(x;y)) (v rename-one-name(x;y)) ∈ A(rename-one-name(x;y)(a)) 
  supposing (y ∈ I)) ∧ (x ∈ I))

Lemma: cubical-type-equal
[X:CubicalSet]. ∀[A:{X ⊢ _}]. ∀[B:A:I:(Cname List) ⟶ X(I) ⟶ Type × (I:(Cname List)
                                                                      ⟶ J:(Cname List)
                                                                      ⟶ f:name-morph(I;J)
                                                                      ⟶ a:X(I)
                                                                      ⟶ (A a)
                                                                      ⟶ (A f(a)))].
  B ∈ {X ⊢ _} 
  supposing A
  B
  ∈ (A:I:(Cname List) ⟶ X(I) ⟶ Type × (I:(Cname List)
                                        ⟶ J:(Cname List)
                                        ⟶ f:name-morph(I;J)
                                        ⟶ a:X(I)
                                        ⟶ (A a)
                                        ⟶ (A f(a))))

Definition: csm-ap-type
(AF)s ==  let A,F AF in <λI,a. (A (s)a), λI,J,f,a,u. (F (s)a u)>

Lemma: csm-ap-type_wf
[Gamma,Delta:CubicalSet]. ∀[s:Delta ⟶ Gamma]. ∀[A:{Gamma ⊢ _}].  Delta ⊢ (A)s

Definition: csm-type-ap
csm-type-ap(A;s) ==  (A)s

Lemma: csm-type-ap_wf
[Gamma,Delta:CubicalSet]. ∀[s:Delta ⟶ Gamma]. ∀[A:{Gamma ⊢ _}].  Delta ⊢ csm-type-ap(A;s)

Lemma: csm-ap-id-type
[Gamma:CubicalSet]. ∀[A:{Gamma ⊢ _}].  ((A)1(Gamma) A ∈ {Gamma ⊢ _})

Lemma: csm-ap-comp-type
[Gamma,Delta,Z:CubicalSet]. ∀[s1:Z ⟶ Delta]. ∀[s2:Delta ⟶ Gamma]. ∀[A:{Gamma ⊢ _}].
  ((A)s2 s1 ((A)s2)s1 ∈ {Z ⊢ _})

Lemma: csm-ap-comp-type-sq
[Gamma:CubicalSet]. ∀[Delta,Z,s1,s2:Top].  ∀A:{Gamma ⊢ _}. ((A)s2 s1 ((A)s2)s1)

Lemma: csm-cubical-type-ap-morph
[X:CubicalSet]. ∀[A:{X ⊢ _}]. ∀[I,J,f,a,u,s:Top].  ((u f) (u (s)a f))

Definition: cubical-term
{X ⊢ _:AF} ==
  {u:I:(Cname List) ⟶ a:X(I) ⟶ ((fst(AF)) a)| 
   ∀I,J:Cname List. ∀f:name-morph(I;J). ∀a:X(I).  let A,F AF in (F (u a)) (u f(a)) ∈ (A f(a))} 

Lemma: cubical-term_wf
[X:CubicalSet]. ∀[A:{X ⊢ _}].  ({X ⊢ _:A} ∈ Type)

Definition: cubical-term-at
u(a) ==  a

Lemma: cubical-term-at_wf
[X:CubicalSet]. ∀[A:{X ⊢ _}]. ∀[u:{X ⊢ _:A}]. ∀[I:Cname List]. ∀[a:X(I)].  (u(a) ∈ A(a))

Lemma: cubical-term-at-morph
[X:CubicalSet]. ∀[A:{X ⊢ _}]. ∀[u:{X ⊢ _:A}]. ∀[I:Cname List]. ∀[a:X(I)]. ∀[J:Cname List]. ∀[f:name-morph(I;J)].
  ((u(a) f) u(f(a)) ∈ A(f(a)))

Lemma: cubical-term-equal
[X:CubicalSet]. ∀[A:{X ⊢ _}]. ∀[u:{X ⊢ _:A}]. ∀[z:I:(Cname List) ⟶ a:X(I) ⟶ ((fst(A)) a)].
  z ∈ {X ⊢ _:A} supposing z ∈ (I:(Cname List) ⟶ a:X(I) ⟶ ((fst(A)) a))

Lemma: cubical-term-equal2
[X:CubicalSet]. ∀[A:{X ⊢ _}]. ∀[u,z:{X ⊢ _:A}].
  z ∈ {X ⊢ _:A} supposing ∀I:Cname List. ∀a:X(I).  ((u a) (z a) ∈ ((fst(A)) a))

Definition: csm-ap-term
(t)s ==  λI,a. (t (s)a)

Lemma: csm-ap-term_wf
[Delta,Gamma:CubicalSet]. ∀[s:Delta ⟶ Gamma]. ∀[A:{Gamma ⊢ _}]. ∀[t:{Gamma ⊢ _:A}].  ((t)s ∈ {Delta ⊢ _:(A)s})

Lemma: csm-ap-id-term
[Gamma:CubicalSet]. ∀[A:{Gamma ⊢ _}]. ∀[t:{Gamma ⊢ _:A}].  ((t)1(Gamma) t ∈ {Gamma ⊢ _:A})

Lemma: csm-ap-comp-term
[Gamma,Delta,Z:CubicalSet]. ∀[s1:Z ⟶ Delta]. ∀[s2:Delta ⟶ Gamma]. ∀[A:{Gamma ⊢ _}]. ∀[t:{Gamma ⊢ _:A}].
  ((t)s2 s1 ((t)s2)s1 ∈ {Z ⊢ _:(A)s2 s1})

Definition: cube-context-adjoin
X.A ==  <λI.(alpha:X(I) × A(alpha)), λI,J,f,p. <f(fst(p)), (snd(p) fst(p) f)>>

Lemma: cube-context-adjoin_wf
[Gamma:CubicalSet]. ∀[A:{Gamma ⊢ _}].  (Gamma.A ∈ CubicalSet)

Definition: cc-adjoin-cube
(v;u) ==  <v, u>

Lemma: cc-adjoin-cube_wf
X:CubicalSet. ∀A:{X ⊢ _}. ∀J:Cname List. ∀v:X(J). ∀u:A(v).  ((v;u) ∈ X.A(J))

Lemma: cc-adjoin-cube-restriction
[X:CubicalSet]. ∀[A:{X ⊢ _}]. ∀[J,K,g,v,u:Top].  (g((v;u)) (g(v);(u g)))

Definition: cc-fst
==  λI,p. (fst(p))

Lemma: cc-fst_wf
[Gamma:CubicalSet]. ∀[A:{Gamma ⊢ _}].  (p ∈ Gamma.A ⟶ Gamma)

Definition: cc-snd
==  λI,p. (snd(p))

Lemma: cc-snd_wf
[Gamma:CubicalSet]. ∀[A:{Gamma ⊢ _}].  (q ∈ {Gamma.A ⊢ _:(A)p})

Lemma: csm-type-at
Gamma:CubicalSet. ∀s:Top. ∀A:{Gamma ⊢ _}. ∀I,alpha:Top.  ((A)s(alpha) A((s)alpha))

Definition: csm-adjoin
(s;u) ==  λI,a. <(s)a, a>

Lemma: csm-adjoin_wf
[Gamma,Delta:CubicalSet]. ∀[A:{Gamma ⊢ _}]. ∀[sigma:Delta ⟶ Gamma]. ∀[u:{Delta ⊢ _:(A)sigma}].
  ((sigma;u) ∈ Delta ⟶ Gamma.A)

Lemma: csm-adjoin-ap
[sigma,u,I,del:Top].  (((sigma;u))del ~ <(sigma)del, (u)del>)

Definition: csm-id-adjoin
[u] ==  (1(X);u)

Lemma: csm-id-adjoin_wf
[Gamma:CubicalSet]. ∀[A:{Gamma ⊢ _}]. ∀[u:{Gamma ⊢ _:A}].  ([u] ∈ Gamma ⟶ Gamma.A)

Lemma: csm-id-adjoin-ap
X:CubicalSet. ∀A:{X ⊢ _}. ∀u:{X ⊢ _:A}. ∀I:Cname List. ∀a:X(I).  (([u])a (a;u a) ∈ X.A(I))

Lemma: cc-fst-csm-adjoin
[Gamma,Delta:CubicalSet]. ∀[A:{Gamma ⊢ _}]. ∀[sigma:Delta ⟶ Gamma]. ∀[u:{Delta ⊢ _:(A)sigma}].
  (p (sigma;u) sigma ∈ Delta ⟶ Gamma)

Lemma: cc-snd-csm-adjoin
[Gamma,Delta:CubicalSet]. ∀[A:{Gamma ⊢ _}]. ∀[sigma:Delta ⟶ Gamma]. ∀[u:{Delta ⊢ _:(A)sigma}].
  ((q)(sigma;u) u ∈ {Delta ⊢ _:(A)sigma})

Lemma: csm-adjoin-fst-snd
[Gamma,Delta:CubicalSet]. ∀[A:{Gamma ⊢ _}].  ((p;q) 1(Gamma.A) ∈ Gamma.A ⟶ Gamma.A)

Definition: cubical-pi-family
cubical-pi-family(X;A;B;I;a) ==
  {w:J:(Cname List) ⟶ f:name-morph(I;J) ⟶ u:A(f(a)) ⟶ B((f(a);u))| 
   ∀J,K:Cname List. ∀f:name-morph(I;J). ∀g:name-morph(J;K). ∀u:A(f(a)).
     ((w (f(a);u) g) (w (f g) (u f(a) g)) ∈ B(g((f(a);u))))} 

Lemma: cubical-pi-family_wf
[X:CubicalSet]. ∀[A:{X ⊢ _}]. ∀[B:{X.A ⊢ _}]. ∀[I:Cname List]. ∀[a:X(I)].  (cubical-pi-family(X;A;B;I;a) ∈ Type)

Lemma: cubical-pi-family-comp
X,Delta:CubicalSet. ∀s:Delta ⟶ X. ∀I,J:Cname List. ∀f:name-morph(I;J). ∀a:Delta(I). ∀A:{X ⊢ _}. ∀B:{X.A ⊢ _}.
w:cubical-pi-family(X;A;B;I;(s)a).
  K,g. (w (f g)) ∈ cubical-pi-family(X;A;B;J;(s)f(a)))

Lemma: csm-cubical-pi-family
X,Delta:CubicalSet. ∀A:{X ⊢ _}. ∀B:{X.A ⊢ _}. ∀s:Delta ⟶ X. ∀I:Cname List. ∀a:Delta(I).
  (cubical-pi-family(X;A;B;I;(s)a) cubical-pi-family(Delta;(A)s;(B)(s p;q);I;a) ∈ Type)

Definition: cubical-pi
Π==  <λI,a. cubical-pi-family(X;A;B;I;a), λI,J,f,a,w,K,g. (w (f g))>

Lemma: cubical-pi_wf
[X:CubicalSet]. ∀[A:{X ⊢ _}]. ∀[B:{X.A ⊢ _}].  X ⊢ ΠB

Lemma: csm-cubical-pi
X,Delta:CubicalSet. ∀A:{X ⊢ _}. ∀B:{X.A ⊢ _}. ∀s:Delta ⟶ X.  ((ΠB)s Delta ⊢ Π(A)s (B)(s p;q) ∈ {Delta ⊢ _})

Definition: cubical-lambda
b) ==  λI,a,J,f,u. (b (f(a);u))

Lemma: cubical-lambda_wf
[X:CubicalSet]. ∀[A:{X ⊢ _}]. ∀[B:{X.A ⊢ _}]. ∀[b:{X.A ⊢ _:B}].  ((λb) ∈ {X ⊢ _:ΠB})

Definition: cubical-app
app(w; u) ==  λI,a. (w (u a))

Lemma: cubical-app_wf
[X:CubicalSet]. ∀[A:{X ⊢ _}]. ∀[B:{X.A ⊢ _}]. ∀[w:{X ⊢ _:ΠB}]. ∀[u:{X ⊢ _:A}].  (app(w; u) ∈ {X ⊢ _:(B)[u]})

Definition: cubical-sigma
Σ ==  <λI,a. (u:A(a) × B((a;u))), λI,J,f,a,p. <(fst(p) f), (snd(p) (a;fst(p)) f)>>

Lemma: cubical-sigma_wf
[X:CubicalSet]. ∀[A:{X ⊢ _}]. ∀[B:{X.A ⊢ _}].  X ⊢ Σ B

Lemma: cubical-sigma-at
[X,A,B,I,a:Top].  (Σ B(a) u:A(a) × B((a;u)))

Lemma: csm-cubical-sigma
X,Delta:CubicalSet. ∀A:{X ⊢ _}. ∀B:{X.A ⊢ _}. ∀s:Delta ⟶ X.  ((Σ B)s = Σ (A)s (B)(s p;q) ∈ {Delta ⊢ _})

Definition: cubical-fst
p.1 ==  λI,a. (fst((p a)))

Lemma: cubical-fst_wf
[X:CubicalSet]. ∀[A:{X ⊢ _}]. ∀[B:{X.A ⊢ _}]. ∀[p:{X ⊢ _:Σ B}].  (p.1 ∈ {X ⊢ _:A})

Lemma: csm-cubical-fst
[p,s:Top].  ((p.1)s (p)s.1)

Lemma: csm-ap-cubical-fst
[X,Delta:CubicalSet]. ∀[A:{X ⊢ _}]. ∀[B:{X.A ⊢ _}]. ∀[p:{X ⊢ _:Σ B}]. ∀[s:Delta ⟶ X].
  ((p.1)s (p)s.1 ∈ {Delta ⊢ _:(A)s})

Definition: cubical-snd
p.2 ==  λI,a. (snd((p a)))

Lemma: cubical-snd_wf
[X:CubicalSet]. ∀[A:{X ⊢ _}]. ∀[B:{X.A ⊢ _}]. ∀[p:{X ⊢ _:Σ B}].  (p.2 ∈ {X ⊢ _:(B)[p.1]})

Lemma: csm-ap-cubical-snd
[X,Delta:CubicalSet]. ∀[A:{X ⊢ _}]. ∀[B:{X.A ⊢ _}]. ∀[p:{X ⊢ _:Σ B}]. ∀[s:Delta ⟶ X].
  ((p.2)s (p)s.2 ∈ {Delta ⊢ _:((B)[p.1])s})

Definition: cubical-pair
cubical-pair(u;v) ==  λI,a. <a, a>

Lemma: cubical-pair_wf
[X:CubicalSet]. ∀[A:{X ⊢ _}]. ∀[B:{X.A ⊢ _}]. ∀[u:{X ⊢ _:A}]. ∀[v:{X ⊢ _:(B)[u]}].  (cubical-pair(u;v) ∈ {X ⊢ _:Σ B})

Lemma: csm-ap-cubical-pair
[X,Delta:CubicalSet]. ∀[A:{X ⊢ _}]. ∀[B:{X.A ⊢ _}]. ∀[u:{X ⊢ _:A}]. ∀[v:{X ⊢ _:(B)[u]}]. ∀[s:Delta ⟶ X].
  ((cubical-pair(u;v))s cubical-pair((u)s;(v)s) ∈ {Delta ⊢ _:(Σ B)s})

Lemma: csm-ap-cubical-app
[X,Delta:CubicalSet]. ∀[A:{X ⊢ _}]. ∀[B:{X.A ⊢ _}]. ∀[w:{X ⊢ _:ΠB}]. ∀[u:{X ⊢ _:A}]. ∀[s:Delta ⟶ X].
  ((app(w; u))s app((w)s; (u)s) ∈ {Delta ⊢ _:((B)[u])s})

Lemma: csm-ap-cubical-lambda
[X,Delta:CubicalSet]. ∀[A:{X ⊢ _}]. ∀[B:{X.A ⊢ _}]. ∀[w:{X ⊢ _:ΠB}]. ∀[u:{X ⊢ _:A}]. ∀[s:Delta ⟶ X].
  ((app(w; u))s app((w)s; (u)s) ∈ {Delta ⊢ _:((B)[u])s})

Lemma: cubical-snd-pair
[X:CubicalSet]. ∀[A:{X ⊢ _}]. ∀[B:{X.A ⊢ _}]. ∀[u:{X ⊢ _:A}]. ∀[v:{X ⊢ _:(B)[u]}].
  (cubical-pair(u;v).2 v ∈ {X ⊢ _:(B)[u]})

Lemma: cubical-fst-pair
[X:CubicalSet]. ∀[A:{X ⊢ _}]. ∀[B:{X.A ⊢ _}]. ∀[u:{X ⊢ _:A}]. ∀[v:{X ⊢ _:(B)[u]}].
  (cubical-pair(u;v).1 u ∈ {X ⊢ _:A})

Lemma: cubical-pair-eta
[X:CubicalSet]. ∀[A:{X ⊢ _}]. ∀[B:{X.A ⊢ _}]. ∀[w:{X ⊢ _:Σ B}].  (cubical-pair(w.1;w.2) w ∈ {X ⊢ _:Σ B})

Lemma: cubical-eta
[X:CubicalSet]. ∀[A:{X ⊢ _}]. ∀[B:{X.A ⊢ _}]. ∀[w:{X ⊢ _:ΠB}].  ((λapp((w)p; q)) w ∈ {X ⊢ _:ΠB})

Lemma: cubical-beta
[X:CubicalSet]. ∀[A:{X ⊢ _}]. ∀[B:{X.A ⊢ _}]. ∀[b:{X.A ⊢ _:B}]. ∀[u:{X ⊢ _:A}].
  (app((λb); u) (b)[u] ∈ {X ⊢ _:(B)[u]})

Definition: discrete-cubical-type
discr(T) ==  <λI,alpha. T, λI,J,f,alpha,x. x>

Lemma: discrete-cubical-type_wf
[T:Type]. ∀[X:CubicalSet].  X ⊢ discr(T)

Definition: discrete-cubical-term
discr(t) ==  λI,alpha. t

Lemma: discrete-cubical-term_wf
[T:Type]. ∀[t:T]. ∀[X:CubicalSet].  (discr(t) ∈ {X ⊢ _:discr(T)})

Definition: constant-cubical-type
(X) ==  <λI,alpha. X(I), λI,J,f,alpha,w. f(w)>

Lemma: constant-cubical-type_wf
[X,Gamma:CubicalSet].  Gamma ⊢ (X)

Lemma: constant-cubical-type-at
[X,I,a:Top].  ((X)(a) X(I))

Lemma: unit-cube-cubical-type
[I:Cname List]
  ({unit-cube(I) ⊢ _} {AF:A:L:(Cname List) ⟶ name-morph(I;L) ⟶ Type × (L:(Cname List)
                                                                          ⟶ J:(Cname List)
                                                                          ⟶ f:name-morph(L;J)
                                                                          ⟶ a:name-morph(I;L)
                                                                          ⟶ (A a)
                                                                          ⟶ (A (a f)))| 
                         let A,F AF 
                         in (∀K:Cname List. ∀a:name-morph(I;K). ∀u:A a.  ((F u) u ∈ (A a)))
                            ∧ (∀L,J,K:Cname List. ∀f:name-morph(L;J). ∀g:name-morph(J;K). ∀a:name-morph(I;L). ∀u:A a.
                                 ((F (f g) u) (F (a f) (F u)) ∈ (A (a (f g)))))} )

Comment: defining the Kan structure
First, we define the uniform Kan condition for 
cubical set X.  
We really need it for the cubical dependent types,
but cubical set with Kan structure becomes
"constant" (i.e. independent of the context) cubical type with Kan structure
constant-Kan-type
constant-Kan-type_wf.

For given I,
we can define the family of I-faces (faces of the I-cubes)
indexed by pairs ⌜nameset(I) × ℕ2⌝
by I-face x:nameset(I) × ℕ2 × X(I-[x])

Face <y,b,w> is face-compatible with face <z,c,u>
if (z:=c)(w) (y:=b)(u)  in X(I-[y; z])

list of I-faces is adjacent-compatible if it is
pairwise face-compatible.

Then we define open_box and the Kan filler, etc.


But, what we really need is Kan structure on cubical type
 Γ ⊢ A

For that, for given  and α in Γ(I)
we have type A(α), and we need to define what an open box in
A(α)  is.
Here, face will be x:nameset(I) × i:ℕ2 × A((x:=i)(α)).
We call this an A-face and define 
A-face-compatible
A-adjacent-compatible
fills-A-faces
A-face-image

The most tedious proof is to show that
the image of A-face-compatible A-faces are
A-face-compatible.  A-face-compatible-image.


Comment: theorems about Kan structure
The theorems about Kan structure in the Bezem, Coquand, Huber paper
are
Theorem 6.1 --that context morphisms (cubical set maps) preserve Kan structure:
  csm-Kan-cubical-type_wf
  csm-Kan-id
  csm-Kan-comp

Theorem 6.2 -- Pi type has Kan structure
                (that is preserved by context morphisms)
    *** not proved yet ***

Theorem 6.3 -- Sigma type has Kan structure 
                (that is preserved by context morphisms)
   Kan-cubical-sigma_wf
   csm-Kan-cubical-sigma

Theorem 7.1  -- Identity type has Kan structure
   Kan-cubical-identity_wf
   csm-Kan-cubical-identity

Definition: I-face
I-face(X;I) ==  x:nameset(I) × ℕ2 × X(I-[x])

Lemma: I-face_wf
[X:CubicalSet]. ∀[I:Cname List].  (I-face(X;I) ∈ Type)

Definition: face-dimension
dimension(f) ==  fst(f)

Lemma: face-dimension_wf
[X:CubicalSet]. ∀[I:Cname List]. ∀[f:I-face(X;I)].  (dimension(f) ∈ nameset(I))

Definition: face-direction
direction(f) ==  fst(snd(f))

Lemma: face-direction_wf
[X:CubicalSet]. ∀[I:Cname List]. ∀[f:I-face(X;I)].  (direction(f) ∈ ℕ2)

Definition: face-cube
cube(f) ==  snd(snd(f))

Lemma: face-cube_wf
[X:CubicalSet]. ∀[I:Cname List]. ∀[f:I-face(X;I)].  (cube(f) ∈ X(I-[dimension(f)]))

Definition: A-face
A-face(X;A;I;alpha) ==  x:nameset(I) × i:ℕ2 × A((x:=i)(alpha))

Lemma: A-face_wf
[X:CubicalSet]. ∀[A:{X ⊢ _}]. ∀[I:Cname List]. ∀[alpha:X(I)].  (A-face(X;A;I;alpha) ∈ Type)

Definition: face-name
face-name(f) ==  <fst(f), fst(snd(f))>

Lemma: face-name_wf
[X:CubicalSet]. ∀[I:Cname List]. ∀[f:I-face(X;I)].  (face-name(f) ∈ nameset(I) × ℕ2)

Definition: face-name-eq
face-name-eq(a;b) ==  product-deq(ℤ;ℤ;IntDeq;IntDeq) b

Lemma: face-name-eq_wf
[I:Cname List]. ∀[a,b:nameset(I) × ℕ2].  (face-name-eq(a;b) ∈ 𝔹)

Lemma: assert-face-name-eq
[I:Cname List]. ∀[a,b:nameset(I) × ℕ2].  uiff(↑face-name-eq(a;b);a b ∈ (nameset(I) × ℕ2))

Definition: A-face-name
A-face-name(f) ==  <fst(f), fst(snd(f))>

Lemma: A-face-name_wf
[X:CubicalSet]. ∀[A:{X ⊢ _}]. ∀[I:Cname List]. ∀[alpha:X(I)]. ∀[f:A-face(X;A;I;alpha)].
  (A-face-name(f) ∈ nameset(I) × ℕ2)

Definition: face-compatible
face-compatible(X;I;f1;f2) ==
  let y,b,w f1 in 
  let z,c,u f2 in 
  (y z ∈ Cname))  ((z:=c)(w) (y:=b)(u) ∈ X(I-[y; z]))

Lemma: face-compatible_wf
[X:CubicalSet]. ∀[I:Cname List]. ∀[f1,f2:I-face(X;I)].  (face-compatible(X;I;f1;f2) ∈ ℙ)

Lemma: sq_stable__face-compatible
X:CubicalSet. ∀I:Cname List. ∀f1,f2:I-face(X;I).  SqStable(face-compatible(X;I;f1;f2))

Lemma: face-compatible-symmetry
[X:CubicalSet]. ∀[I:Cname List]. ∀[f1,f2:I-face(X;I)].  (face-compatible(X;I;f1;f2)  face-compatible(X;I;f2;f1))

Definition: A-face-compatible
A-face-compatible(X;A;I;alpha;f1;f2) ==
  let y,b,w f1 in 
  let z,c,u f2 in 
  (y z ∈ Cname))  ((w (y:=b)(alpha) (z:=c)) (u (z:=c)(alpha) (y:=b)) ∈ A(((z:=c) (y:=b))(alpha)))

Lemma: A-face-compatible_wf
[X:CubicalSet]. ∀[A:{X ⊢ _}]. ∀[I:Cname List]. ∀[alpha:X(I)]. ∀[f1,f2:A-face(X;A;I;alpha)].
  (A-face-compatible(X;A;I;alpha;f1;f2) ∈ ℙ)

Definition: adjacent-compatible
adjacent-compatible(X;I;L) ==  (∀f1,f2∈L.  face-compatible(X;I;f1;f2))

Lemma: adjacent-compatible_wf
[X:CubicalSet]. ∀[I:Cname List]. ∀[L:I-face(X;I) List].  (adjacent-compatible(X;I;L) ∈ ℙ)

Lemma: adjacent-compatible-iff
[X:CubicalSet]
  ∀I:Cname List. ∀L:I-face(X;I) List.
    uiff(adjacent-compatible(X;I;L);∀f1,f2:I-face(X;I).
                                      ((f1 ∈ L)
                                       (f2 ∈ L)
                                       (dimension(f1) dimension(f2) ∈ Cname))
                                       ((dimension(f2):=direction(f2))(cube(f1))
                                         (dimension(f1):=direction(f1))(cube(f2))
                                         ∈ X(I-[dimension(f1); dimension(f2)]))))

Definition: A-adjacent-compatible
A-adjacent-compatible(X;A;I;alpha;L) ==  (∀f1,f2∈L.  A-face-compatible(X;A;I;alpha;f1;f2))

Lemma: A-adjacent-compatible_wf
[X:CubicalSet]. ∀[A:{X ⊢ _}]. ∀[I:Cname List]. ∀[alpha:X(I)]. ∀[L:A-face(X;A;I;alpha) List].
  (A-adjacent-compatible(X;A;I;alpha;L) ∈ ℙ)

Definition: is-face
is-face(X;I;bx;f) ==  (dimension(f):=direction(f))(bx) cube(f) ∈ X(I-[dimension(f)])

Lemma: is-face_wf
[X:CubicalSet]. ∀[I:Cname List]. ∀[bx:X(I)]. ∀[f:I-face(X;I)].  (is-face(X;I;bx;f) ∈ ℙ)

Definition: is-A-face
is-A-face(X;A;I;alpha;bx;f) ==  let y,b,w in (bx alpha (y:=b)) w ∈ A((y:=b)(alpha))

Lemma: is-A-face_wf
[X:CubicalSet]. ∀[A:{X ⊢ _}]. ∀[I:Cname List]. ∀[alpha:X(I)]. ∀[bx:A(alpha)]. ∀[f:A-face(X;A;I;alpha)].
  (is-A-face(X;A;I;alpha;bx;f) ∈ ℙ)

Definition: fills-faces
fills-faces(X;I;bx;L) ==  (∀f∈L.is-face(X;I;bx;f))

Lemma: fills-faces_wf
[X:CubicalSet]. ∀[I:Cname List]. ∀[bx:X(I)]. ∀[L:I-face(X;I) List].  (fills-faces(X;I;bx;L) ∈ ℙ)

Definition: fills-A-faces
fills-A-faces(X;A;I;alpha;bx;L) ==  (∀f∈L.is-A-face(X;A;I;alpha;bx;f))

Lemma: fills-A-faces_wf
[X:CubicalSet]. ∀[A:{X ⊢ _}]. ∀[I:Cname List]. ∀[alpha:X(I)]. ∀[bx:A(alpha)]. ∀[L:A-face(X;A;I;alpha) List].
  (fills-A-faces(X;A;I;alpha;bx;L) ∈ ℙ)

Definition: face-image
face-image(X;I;K;f;face) ==  let x,b,w face in <x, b, f(w)>

Lemma: face-image_wf
[X:CubicalSet]. ∀[I,K:Cname List]. ∀[f:name-morph(I;K)]. ∀[face:I-face(X;I)].
  face-image(X;I;K;f;face) ∈ I-face(X;K) supposing ↑isname(f (fst(face)))

Definition: A-face-image
A-face-image(X;A;I;K;f;alpha;face) ==  let x,b,w face in <x, b, (w (x:=b)(alpha) f)>

Lemma: A-face-image_wf
[X:CubicalSet]. ∀[A:{X ⊢ _}]. ∀[I,K:Cname List]. ∀[f:name-morph(I;K)]. ∀[alpha:X(I)]. ∀[face:A-face(X;A;I;alpha)].
  A-face-image(X;A;I;K;f;alpha;face) ∈ A-face(X;A;K;f(alpha)) supposing ↑isname(f (fst(face)))

Lemma: face-compatible-image
X:CubicalSet. ∀I,K:Cname List. ∀f:name-morph(I;K). ∀fc1,fc2:I-face(X;I).
  ((↑isname(f (fst(fc1))))
   (↑isname(f (fst(fc2))))
   face-compatible(X;I;fc1;fc2)
   face-compatible(X;K;face-image(X;I;K;f;fc1);face-image(X;I;K;f;fc2)))

Lemma: A-face-compatible-image
X:CubicalSet. ∀A:{X ⊢ _}. ∀I,K:Cname List. ∀f:name-morph(I;K). ∀alpha:X(I). ∀fc1,fc2:A-face(X;A;I;alpha).
  ((↑isname(f (fst(fc1))))
   (↑isname(f (fst(fc2))))
   A-face-compatible(X;A;I;alpha;fc1;fc2)
   A-face-compatible(X;A;K;f(alpha);A-face-image(X;A;I;K;f;alpha;fc1);A-face-image(X;A;I;K;f;alpha;fc2)))

Lemma: face-name-image
X:CubicalSet. ∀I:Cname List. ∀K,f:Top. ∀face:I-face(X;I).
  (face-name(face-image(X;I;K;f;face)) p.<(fst(p)), snd(p)>face-name(face))

Lemma: A-face-name-image
X:CubicalSet. ∀A:{X ⊢ _}. ∀I:Cname List. ∀alpha:X(I). ∀K,f:Top. ∀face:A-face(X;A;I;alpha).
  (A-face-name(A-face-image(X;A;I;K;f;alpha;face)) p.<(fst(p)), snd(p)>A-face-name(face))

Definition: open_box
open_box(X;I;J;x;i) ==
  {L:I-face(X;I) List| 
   adjacent-compatible(X;I;L)
   ∧ (x ∈ J))
   ∧ l_subset(Cname;J;I)
   ∧ ((∀y:nameset(J). ∀c:ℕ2.  (∃f∈L. face-name(f) = <y, c> ∈ (nameset(I) × ℕ2)))
     ∧ (∃f∈L. face-name(f) = <x, i> ∈ (nameset(I) × ℕ2))
     ∧ (∀f∈L.¬(face-name(f) = <x, i> ∈ (nameset(I) × ℕ2))))
   ∧ (∀f∈L.(fst(f) ∈ [x J]))
   ∧ (∀f1,f2∈L.  ¬(face-name(f1) face-name(f2) ∈ (nameset(I) × ℕ2)))} 

Lemma: open_box_wf
[X:CubicalSet]. ∀[I,J:Cname List]. ∀[x:nameset(I)]. ∀[i:ℕ2].  (open_box(X;I;J;x;i) ∈ Type)

Lemma: open_box-nil
[X:CubicalSet]. ∀[I:Cname List]. ∀[x:nameset(I)]. ∀[i:ℕ2].
  open_box(X;I;[];x;i) ≡ {L:I-face(X;I) List| (||L|| 1 ∈ ℤ) ∧ (face-name(hd(L)) = <x, i> ∈ (nameset(I) × ℕ2))} 

Lemma: length-open_box
[X:CubicalSet]. ∀[I:Cname List].
  ∀J:nameset(I) List
    ∀[x:nameset(I)]. ∀[i:ℕ2]. ∀[box:open_box(X;I;J;x;i)].  (||box|| (1 (||remove-repeats(CnameDeq;J)|| 2)) ∈ ℤ)

Lemma: length-open_box-ge-3
[X:CubicalSet]. ∀[I:Cname List].
  ∀J:nameset(I) List
    ∀[x:nameset(I)]. ∀[i:ℕ2]. ∀[box:open_box(X;I;J;x;i)].  (3 < ||box||  (∃j1∈J. (∃j2∈J. ¬(j1 j2 ∈ Cname))))

Lemma: length-open_box-le-3
[X:CubicalSet]. ∀[I:Cname List].
  ∀J:nameset(I) List
    ∀[x:nameset(I)]. ∀[i:ℕ2]. ∀[box:open_box(X;I;J;x;i)].  ((¬↑null(J))  (||box|| ≤ 3)  (∀j'∈J.j' hd(J) ∈ Cname))

Lemma: non-trivial-open-box
[X:CubicalSet]. ∀[I:Cname List]. ∀[J:nameset(I) List]. ∀[x:nameset(I)]. ∀[i:ℕ2].
  ∀bx:open_box(X;I;J;x;i). ∀y:nameset(J). ∀c:ℕ2.
    (filter(λf.((dimension(f) =z y) ∧b (direction(f) =z c));bx)
    []
    ∈ ({f:{f:I-face(X;I)| (f ∈ bx)} | ↑((dimension(f) =z y) ∧b (direction(f) =z c))}  List)))

Definition: get_face
get_face(y;c;box) ==  hd(filter(λf.((fst(f) =z y) ∧b (fst(snd(f)) =z c));box))

Lemma: get_face_wf
[X:CubicalSet]. ∀[I,J:Cname List]. ∀[x:nameset(I)]. ∀[i:ℕ2]. ∀[box:open_box(X;I;J;x;i)]. ∀[y:nameset(J)]. ∀[c:ℕ2].
  (get_face(y;c;box) ∈ {f:I-face(X;I)| (f ∈ box) ∧ (face-name(f) = <y, c> ∈ (nameset(I) × ℕ2))} )

Lemma: get_face-wf
[X:CubicalSet]. ∀[I,J:Cname List]. ∀[x:nameset(I)]. ∀[i:ℕ2]. ∀[box:open_box(X;I;J;x;i)].
  (get_face(x;i;box) ∈ {f:I-face(X;I)| (f ∈ box) ∧ (face-name(f) = <x, i> ∈ (nameset(I) × ℕ2))} )

Lemma: get_face-dimension
[X:CubicalSet]. ∀[I,J:Cname List]. ∀[x:nameset(I)]. ∀[i:ℕ2]. ∀[box:open_box(X;I;J;x;i)]. ∀[y:nameset(J)]. ∀[c:ℕ2].
  (dimension(get_face(y;c;box)) y)

Lemma: get_face-direction
[X:CubicalSet]. ∀[I,J:Cname List]. ∀[x:nameset(I)]. ∀[i:ℕ2]. ∀[box:open_box(X;I;J;x;i)]. ∀[y:nameset(J)]. ∀[c:ℕ2].
  (direction(get_face(y;c;box)) c)

Lemma: get_face_unique
X:CubicalSet. ∀I:Cname List. ∀f:I-face(X;I). ∀J:nameset(I) List. ∀x:nameset(I). ∀i:ℕ2. ∀box:open_box(X;I;J;x;i).
  ((f ∈ box)  (get_face(dimension(f);direction(f);box) f ∈ I-face(X;I)))

Definition: A-open-box
A-open-box(X;A;I;alpha;J;x;i) ==
  {L:A-face(X;A;I;alpha) List| 
   A-adjacent-compatible(X;A;I;alpha;L)
   ∧ (x ∈ J))
   ∧ l_subset(Cname;J;I)
   ∧ ((∀y:nameset(J). ∀c:ℕ2.  (∃f∈L. A-face-name(f) = <y, c> ∈ (nameset(I) × ℕ2)))
     ∧ (∃f∈L. A-face-name(f) = <x, i> ∈ (nameset(I) × ℕ2))
     ∧ (∀f∈L.¬(A-face-name(f) = <x, i> ∈ (nameset(I) × ℕ2))))
   ∧ (∀f∈L.(fst(f) ∈ [x J]))
   ∧ (∀f1,f2∈L.  ¬(A-face-name(f1) A-face-name(f2) ∈ (nameset(I) × ℕ2)))} 

Lemma: A-open-box_wf
X:CubicalSet. ∀A:{X ⊢ _}. ∀I:Cname List. ∀alpha:X(I).
  ∀[J:Cname List]. ∀[x:nameset(I)]. ∀[i:ℕ2].  (A-open-box(X;A;I;alpha;J;x;i) ∈ Type)

Lemma: A-open-box-equal
X:CubicalSet. ∀A:{X ⊢ _}. ∀I:Cname List. ∀alpha:X(I).
  ∀[J:Cname List]. ∀[x:nameset(I)]. ∀[i:ℕ2]. ∀[bx1:A-open-box(X;A;I;alpha;J;x;i)]. ∀[bx2:A-face(X;A;I;alpha) List].
    bx1 bx2 ∈ A-open-box(X;A;I;alpha;J;x;i) supposing bx1 bx2 ∈ (A-face(X;A;I;alpha) List)

Lemma: constant-A-open-box
Gamma,X,I,alpha:Top.  ∀[J,x,i:Top].  (A-open-box(Gamma;(X);I;alpha;J;x;i) open_box(X;I;J;x;i))

Definition: extend-A-open-box
extend-A-open-box(bx;f1;f2) ==  [f1; [f2 bx]]

Lemma: extend-A-open-box_wf
X:CubicalSet. ∀A:{X ⊢ _}. ∀I:Cname List. ∀alpha:X(I).
  ∀[J:Cname List]. ∀[x:nameset(I)]. ∀[i:ℕ2]. ∀[bx:A-open-box(X;A;I;alpha;J;x;i)]. ∀[f1,f2:A-face(X;A;I;alpha)].
  ∀[z:nameset(I)].
    extend-A-open-box(bx;f1;f2) ∈ A-open-box(X;A;I;alpha;[z J];x;i) 
    supposing ((¬(z ∈ J))
              ∧ (A-face-name(f1) = <z, 0> ∈ (nameset(I) × ℕ2))
              ∧ (A-face-name(f2) = <z, 1> ∈ (nameset(I) × ℕ2)))
    ∧ (x z ∈ Cname))
    ∧ (∀f∈bx.A-face-compatible(X;A;I;alpha;f1;f) ∧ A-face-compatible(X;A;I;alpha;f2;f))

Lemma: csm-A-open-box
Delta,Gamma:CubicalSet. ∀s:Delta ⟶ Gamma. ∀A:{Gamma ⊢ _}. ∀I:Cname List. ∀alpha:Delta(I). ∀J:nameset(I) List.
x:nameset(I). ∀i:ℕ2.
  (A-open-box(Delta;(A)s;I;alpha;J;x;i) ⊆A-open-box(Gamma;A;I;(s)alpha;J;x;i))

Definition: open_box_image
open_box_image(X;I;K;f;bx) ==  map(λface.face-image(X;I;K;f;face);bx)

Lemma: open_box_image_wf
[X:CubicalSet]. ∀[I,J,K:Cname List]. ∀[f:name-morph(I;K)]. ∀[x:nameset(I)]. ∀[i:ℕ2].
  ∀[bx:open_box(X;I;J;x;i)]. (open_box_image(X;I;K;f;bx) ∈ open_box(X;K;map(f;J);f x;i)) 
  supposing nameset([x J]) ⊆name-morph-domain(f;I)

Lemma: length-open_box_image
[X,I,K,f,bx:Top].  (||open_box_image(X;I;K;f;bx)|| ||bx||)

Lemma: get_face_image
[X:CubicalSet]. ∀[I:Cname List]. ∀[J:nameset(I) List]. ∀[x:nameset(I)]. ∀[i:ℕ2]. ∀[bx:open_box(X;I;J;x;i)].
[K:Cname List]. ∀[f:name-morph(I;K)]. ∀[c:ℕ2]. ∀[y:nameset(J)].
  get_face(f y;c;open_box_image(X;I;K;f;bx)) face-image(X;I;K;f;get_face(y;c;bx)) ∈ I-face(X;K) 
  supposing nameset([x J]) ⊆name-morph-domain(f;I)

Definition: A-open-box-image
A-open-box-image(X;A;I;K;f;alpha;bx) ==  map(λface.A-face-image(X;A;I;K;f;alpha;face);bx)

Lemma: A-open-box-image_wf
[X:CubicalSet]. ∀[A:{X ⊢ _}]. ∀[I,J,K:Cname List]. ∀[alpha:X(I)]. ∀[f:name-morph(I;K)]. ∀[x:nameset(I)]. ∀[i:ℕ2].
  ∀[bx:A-open-box(X;A;I;alpha;J;x;i)]
    (A-open-box-image(X;A;I;K;f;alpha;bx) ∈ A-open-box(X;A;K;f(alpha);map(f;J);f x;i)) 
  supposing nameset([x J]) ⊆name-morph-domain(f;I)

Definition: fills-open_box
fills-open_box(X;I;bx;cube) ==  fills-faces(X;I;cube;bx)

Lemma: fills-open_box_wf
[X:CubicalSet]. ∀[I,J:Cname List]. ∀[x:nameset(I)]. ∀[i:ℕ2].
  ∀[bx:open_box(X;I;J;x;i)]. ∀[cube:X(I)].  (fills-open_box(X;I;bx;cube) ∈ ℙsupposing l_subset(Cname;J;I)

Definition: fills-A-open-box
fills-A-open-box(X;A;I;alpha;bx;cube) ==  fills-A-faces(X;A;I;alpha;cube;bx)

Lemma: fills-A-open-box_wf
[X:CubicalSet]. ∀[A:{X ⊢ _}]. ∀[I:Cname List]. ∀[alpha:X(I)]. ∀[J:Cname List]. ∀[x:nameset(I)]. ∀[i:ℕ2].
[cube:A(alpha)]. ∀[bx:A-open-box(X;A;I;alpha;J;x;i)].
  fills-A-open-box(X;A;I;alpha;bx;cube) ∈ ℙ supposing l_subset(Cname;J;I)

Lemma: sq_stable_fills-A-open-box
[X:CubicalSet]. ∀[A:{X ⊢ _}]. ∀[I:Cname List]. ∀[alpha:X(I)]. ∀[J:Cname List]. ∀[x:nameset(I)]. ∀[i:ℕ2].
[cube:A(alpha)].
  ∀bx:A-open-box(X;A;I;alpha;J;x;i). SqStable(fills-A-open-box(X;A;I;alpha;bx;cube)) supposing l_subset(Cname;J;I)

Definition: Kan-A-filler
Kan-A-filler(X;A;filler) ==
  ∀I:Cname List. ∀alpha:X(I). ∀J:nameset(I) List. ∀x:nameset(I). ∀i:ℕ2. ∀bx:A-open-box(X;A;I;alpha;J;x;i).
    fills-A-open-box(X;A;I;alpha;bx;filler alpha bx)

Lemma: Kan-A-filler_wf
[X:CubicalSet]. ∀[A:{X ⊢ _}]. ∀[filler:I:(Cname List)
                                        ⟶ alpha:X(I)
                                        ⟶ J:(nameset(I) List)
                                        ⟶ x:nameset(I)
                                        ⟶ i:ℕ2
                                        ⟶ A-open-box(X;A;I;alpha;J;x;i)
                                        ⟶ A(alpha)].
  (Kan-A-filler(X;A;filler) ∈ ℙ)

Lemma: sq_stable_Kan-A-filler
[X:CubicalSet]. ∀[A:{X ⊢ _}]. ∀[filler:I:(Cname List)
                                        ⟶ alpha:X(I)
                                        ⟶ J:(nameset(I) List)
                                        ⟶ x:nameset(I)
                                        ⟶ i:ℕ2
                                        ⟶ A-open-box(X;A;I;alpha;J;x;i)
                                        ⟶ A(alpha)].
  SqStable(Kan-A-filler(X;A;filler))

Definition: uniform-Kan-A-filler
uniform-Kan-A-filler(X;A;filler) ==
  ∀I:Cname List. ∀alpha:X(I). ∀J:nameset(I) List. ∀x:nameset(I). ∀i:ℕ2. ∀bx:A-open-box(X;A;I;alpha;J;x;i).
  ∀K:Cname List. ∀f:name-morph(I;K).
    ((∀i:nameset(I). ((i ∈ J)  (↑isname(f i))))
     (↑isname(f x))
     ((filler alpha bx alpha f)
       (filler f(alpha) map(f;J) (f x) A-open-box-image(X;A;I;K;f;alpha;bx))
       ∈ A(f(alpha))))

Lemma: uniform-Kan-A-filler_wf
[X:CubicalSet]. ∀[A:{X ⊢ _}]. ∀[filler:I:(Cname List)
                                        ⟶ alpha:X(I)
                                        ⟶ J:(nameset(I) List)
                                        ⟶ x:nameset(I)
                                        ⟶ i:ℕ2
                                        ⟶ A-open-box(X;A;I;alpha;J;x;i)
                                        ⟶ A(alpha)].
  (uniform-Kan-A-filler(X;A;filler) ∈ ℙ)

Lemma: sq_stable_uniform-Kan-A-filler
[X:CubicalSet]. ∀[A:{X ⊢ _}]. ∀[filler:I:(Cname List)
                                        ⟶ alpha:X(I)
                                        ⟶ J:(nameset(I) List)
                                        ⟶ x:nameset(I)
                                        ⟶ i:ℕ2
                                        ⟶ A-open-box(X;A;I;alpha;J;x;i)
                                        ⟶ A(alpha)].
  SqStable(uniform-Kan-A-filler(X;A;filler))

Definition: Kan-cubical-type
{X ⊢ _(Kan)} ==
  {p:A:{X ⊢ _} × (I:(Cname List)
                 ⟶ alpha:X(I)
                 ⟶ J:(nameset(I) List)
                 ⟶ x:nameset(I)
                 ⟶ i:ℕ2
                 ⟶ A-open-box(X;A;I;alpha;J;x;i)
                 ⟶ A(alpha))| 
   let A,filler 
   in Kan-A-filler(X;A;filler) ∧ uniform-Kan-A-filler(X;A;filler)} 

Lemma: Kan-cubical-type_wf
[X:CubicalSet]. ({X ⊢ _(Kan)} ∈ 𝕌')

Definition: Kan-type
Kan-type(Ak) ==  fst(Ak)

Lemma: Kan-type_wf
[X:CubicalSet]. ∀[AK:{X ⊢ _(Kan)}].  X ⊢ Kan-type(AK)

Definition: Kanfiller
filler(x;i;bx) ==  (snd(A)) alpha bx

Lemma: Kanfiller_wf
[X:CubicalSet]. ∀[A:{X ⊢ _(Kan)}]. ∀[I:Cname List]. ∀[alpha:X(I)]. ∀[J:nameset(I) List]. ∀[x:nameset(I)]. ∀[i:ℕ2].
[bx:A-open-box(X;Kan-type(A);I;alpha;J;x;i)].
  (filler(x;i;bx) ∈ {cube:Kan-type(A)(alpha)| fills-A-open-box(X;Kan-type(A);I;alpha;bx;cube)} )

Lemma: Kanfiller-uniform
[X:CubicalSet]. ∀[A:{X ⊢ _(Kan)}]. ∀[I:Cname List]. ∀[alpha:X(I)]. ∀[J:nameset(I) List]. ∀[x:nameset(I)]. ∀[i:ℕ2].
[bx:A-open-box(X;Kan-type(A);I;alpha;J;x;i)].
  ∀K:Cname List. ∀f:name-morph(I;K).
    ((∀i:nameset(I). ((i ∈ J)  (↑isname(f i))))
     (↑isname(f x))
     ((filler(x;i;bx) alpha f)
       filler(f x;i;A-open-box-image(X;Kan-type(A);I;K;f;alpha;bx))
       ∈ Kan-type(A)(f(alpha))))

Lemma: Kan-cubical-type-equal
[X:CubicalSet]. ∀[A:{X ⊢ _(Kan)}]. ∀[B:A:{X ⊢ _} × (I:(Cname List)
                                                    ⟶ alpha:X(I)
                                                    ⟶ J:(nameset(I) List)
                                                    ⟶ x:nameset(I)
                                                    ⟶ i:ℕ2
                                                    ⟶ A-open-box(X;A;I;alpha;J;x;i)
                                                    ⟶ A(alpha))].
  B ∈ {X ⊢ _(Kan)} 
  supposing A
  B
  ∈ (A:{X ⊢ _} × (I:(Cname List)
                 ⟶ alpha:X(I)
                 ⟶ J:(nameset(I) List)
                 ⟶ x:nameset(I)
                 ⟶ i:ℕ2
                 ⟶ A-open-box(X;A;I;alpha;J;x;i)
                 ⟶ A(alpha)))

Definition: csm-Kan-cubical-type
(AK)s ==  let A,filler AK in <(A)s, λI,alpha. (filler (s)alpha)>

Lemma: csm-Kan-cubical-type_wf
[Delta,Gamma:CubicalSet]. ∀[s:Delta ⟶ Gamma]. ∀[AK:{Gamma ⊢ _(Kan)}].  ((AK)s ∈ {Delta ⊢ _(Kan)})

Lemma: type-csm-Kan-cubical-type
[Gamma:CubicalSet]. ∀[s:Top]. ∀[AK:{Gamma ⊢ _(Kan)}].  (Kan-type((AK)s) (Kan-type(AK))s)

Lemma: csm-Kan-id
[Gamma:CubicalSet]. ∀[AK:{Gamma ⊢ _(Kan)}].  ((AK)1(Gamma) AK ∈ {Gamma ⊢ _(Kan)})

Lemma: csm-Kan-comp
[Gamma,Delta,Z:CubicalSet]. ∀[s1:Z ⟶ Delta]. ∀[s2:Delta ⟶ Gamma]. ∀[AK:{Gamma ⊢ _(Kan)}].
  ((AK)s2 s1 ((AK)s2)s1 ∈ {Z ⊢ _(Kan)})

Lemma: csm-Kan-unit-cube-id
I:Cname List. ∀x:{unit-cube(I) ⊢ _(Kan)}.  ((x)unit-cube-map(1) x ∈ {unit-cube(I) ⊢ _(Kan)})

Lemma: csm-Kan-unit-cube-comp
I,J,K:Cname List. ∀f:name-morph(I;J). ∀g:name-morph(J;K). ∀x:{unit-cube(I) ⊢ _(Kan)}.
  ((x)unit-cube-map((f g)) ((x)unit-cube-map(f))unit-cube-map(g) ∈ {unit-cube(K) ⊢ _(Kan)})

Definition: sigma-box-fst
sigma-box-fst(bx) ==  map(λfc.<fst(fc), fst(snd(fc)), fst(snd(snd(fc)))>;bx)

Lemma: sigma-box-fst_wf
X:CubicalSet. ∀A:{X ⊢ _(Kan)}. ∀B:{X.Kan-type(A) ⊢ _(Kan)}. ∀I:Cname List. ∀alpha:X(I). ∀J:nameset(I) List.
x:nameset(I). ∀i:ℕ2. ∀bx:A-open-box(X;Σ Kan-type(A) Kan-type(B);I;alpha;J;x;i).
  (sigma-box-fst(bx) ∈ A-open-box(X;Kan-type(A);I;alpha;J;x;i))

Definition: sigma-box-snd
sigma-box-snd(bx) ==  map(λfc.<fst(fc), fst(snd(fc)), snd(snd(snd(fc)))>;bx)

Lemma: sigma-box-snd_wf
[X:CubicalSet]. ∀[A:{X ⊢ _(Kan)}]. ∀[B:{X.Kan-type(A) ⊢ _(Kan)}]. ∀[I:Cname List]. ∀[alpha:X(I)]. ∀[J:nameset(I) List].
[x:nameset(I)]. ∀[i:ℕ2]. ∀[bx:A-open-box(X;Σ Kan-type(A) Kan-type(B);I;alpha;J;x;i)]. ∀[cbA:Kan-type(A)(alpha)].
  sigma-box-snd(bx) ∈ A-open-box(X.Kan-type(A);Kan-type(B);I;(alpha;cbA);J;x;i) 
  supposing fills-A-open-box(X;Kan-type(A);I;alpha;sigma-box-fst(bx);cbA)

Definition: Kan_sigma_filler
Kan_sigma_filler(A;B) ==
  λI,alpha,J,x,i,bx. let cubeA filler(x;i;sigma-box-fst(bx)) in
                      let cubeB filler(x;i;sigma-box-snd(bx)) in
                      <cubeA, cubeB>

Lemma: Kan_sigma_filler_wf
X:CubicalSet. ∀A:{X ⊢ _(Kan)}. ∀B:{X.Kan-type(A) ⊢ _(Kan)}.
  (Kan_sigma_filler(A;B) ∈ {filler:I:(Cname List)
                            ⟶ alpha:X(I)
                            ⟶ J:(nameset(I) List)
                            ⟶ x:nameset(I)
                            ⟶ i:ℕ2
                            ⟶ A-open-box(X;Σ Kan-type(A) Kan-type(B);I;alpha;J;x;i)
                            ⟶ Σ Kan-type(A) Kan-type(B)(alpha)| 
                            Kan-A-filler(X;Σ Kan-type(A) Kan-type(B);filler)} )

Lemma: Kan_sigma_filler_uniform
X:CubicalSet. ∀A:{X ⊢ _(Kan)}. ∀B:{X.Kan-type(A) ⊢ _(Kan)}.
  uniform-Kan-A-filler(X;Σ Kan-type(A) Kan-type(B);Kan_sigma_filler(A;B))

Definition: Kan-cubical-sigma
KanΣ ==  <Σ Kan-type(A) Kan-type(B), Kan_sigma_filler(A;B)>

Lemma: Kan-cubical-sigma_wf
[X:CubicalSet]. ∀[A:{X ⊢ _(Kan)}]. ∀[B:{X.Kan-type(A) ⊢ _(Kan)}].  (KanΣ B ∈ {X ⊢ _(Kan)})

Lemma: csm-Kan-cubical-sigma
[X,Delta:CubicalSet]. ∀[s:Delta ⟶ X]. ∀[A:{X ⊢ _(Kan)}]. ∀[B:{X.Kan-type(A) ⊢ _(Kan)}].
  ((KanΣ B)s KanΣ (A)s (B)(s p;q) ∈ {Delta ⊢ _(Kan)})

Definition: Kan-discrete
Kan-discrete(T) ==  <discr(T), λI,alpha,J,x,i,bx. (snd(snd(hd(bx))))>

Lemma: Kan-discrete_wf
[X:CubicalSet]. ∀[T:Type].  (Kan-discrete(T) ∈ {X ⊢ _(Kan)})

Definition: Kan-filler
Kan-filler(X;filler) ==
  ∀I:Cname List. ∀J:nameset(I) List. ∀x:nameset(I). ∀i:ℕ2. ∀bx:open_box(X;I;J;x;i).
    fills-open_box(X;I;bx;filler bx)

Lemma: Kan-filler_wf
[X:CubicalSet]. ∀[filler:I:(Cname List) ⟶ J:(nameset(I) List) ⟶ x:nameset(I) ⟶ i:ℕ2 ⟶ open_box(X;I;J;x;i) ⟶ X(I)].
  (Kan-filler(X;filler) ∈ ℙ)

Definition: uniform-Kan-filler
uniform-Kan-filler(X;filler) ==
  ∀I:Cname List. ∀J:nameset(I) List. ∀x:nameset(I). ∀i:ℕ2. ∀bx:open_box(X;I;J;x;i). ∀K:Cname List. ∀f:name-morph(I;K).
    ((∀i:nameset(I). ((i ∈ J)  (↑isname(f i))))
     (↑isname(f x))
     (f(filler bx) (filler map(f;J) (f x) open_box_image(X;I;K;f;bx)) ∈ X(K)))

Lemma: uniform-Kan-filler_wf
[X:CubicalSet]. ∀[filler:I:(Cname List) ⟶ J:(nameset(I) List) ⟶ x:nameset(I) ⟶ i:ℕ2 ⟶ open_box(X;I;J;x;i) ⟶ X(I)].
  (uniform-Kan-filler(X;filler) ∈ ℙ)

Definition: Kan-cubical-set
KanCubicalSet ==
  {p:X:CubicalSet × (I:(Cname List) ⟶ J:(nameset(I) List) ⟶ x:nameset(I) ⟶ i:ℕ2 ⟶ open_box(X;I;J;x;i) ⟶ X(I))| 
   let X,filler 
   in Kan-filler(X;filler) ∧ uniform-Kan-filler(X;filler)} 

Lemma: Kan-cubical-set_wf
KanCubicalSet ∈ 𝕌'

Definition: constant-Kan-type
constant-Kan-type(X) ==  let S,filler in <(S), λI,alpha. (filler I)>

Lemma: constant-Kan-type_wf
[X:KanCubicalSet]. ∀[Gamma:CubicalSet].  (constant-Kan-type(X) ∈ {Gamma ⊢ _(Kan)})

Definition: cubical-interval-ap
u(L) ==  L

Lemma: cubical-interval-ap_wf
[I:Cname List]. ∀[u:cubical-interval()(I)]. ∀[L:name-morph(I;[])].  (u(L) ∈ ℕ2)

Lemma: cubical-interval-non-trivial-box
[I:Cname List]. ∀[J:nameset(I) List]. ∀[x:nameset(I)]. ∀[i:ℕ2].
  ∀bx:open_box(cubical-interval();I;J;x;i). ∀h:name-morph(I;[]).
    ((¬(J [] ∈ (nameset(I) List)))
     (filter(λf.(h (fst(f)) =z fst(snd(f)));bx)
       []
       ∈ ({x:{f:I-face(cubical-interval();I)| (f ∈ bx)} | ↑(h (fst(x)) =z fst(snd(x)))}  List))))

Definition: cubical-interval-filler
cubical-interval-filler() ==  λI,J,x,i,bx. if null(J) then cube(hd(bx)) else λL.cube(get_face(hd(J);L hd(J);bx))(L) fi 

Lemma: cubical-interval-filler_wf
cubical-interval-filler() ∈ I:(Cname List)
⟶ J:(nameset(I) List)
⟶ x:nameset(I)
⟶ i:ℕ2
⟶ open_box(cubical-interval();I;J;x;i)
⟶ cubical-interval()(I)

Lemma: cubical-interval-filler-fills
Kan-filler(cubical-interval();cubical-interval-filler())

Definition: Kan-interval
Kan-interval() ==  <cubical-interval(), cubical-interval-filler()>

Lemma: Kan-interval_wf
Kan-interval() ∈ KanCubicalSet

Definition: poset-cat
poset-cat(J) ==  <name-morph(J;[]), λf,g. ∀x:nameset(J). (↑x ≤x), λf,x. Ax, λf,g,h,p,q,x. Ax>

Lemma: poset-cat_wf
[J:Cname List]. (poset-cat(J) ∈ SmallCategory)

Lemma: poset-cat-ob_subtype
[I,J:Cname List].  cat-ob(poset-cat(I)) ⊆cat-ob(poset-cat(J)) supposing nameset(J) ⊆nameset(I)

Lemma: poset-cat-arrow_subtype
[I,J:Cname List].
  ∀[x,y:cat-ob(poset-cat(I))].  ((cat-arrow(poset-cat(I)) y) ⊆(cat-arrow(poset-cat(J)) y)) 
  supposing nameset(J) ⊆nameset(I)

Lemma: poset-cat-arrow-unique
[I:Cname List]. ∀[x,y:cat-ob(poset-cat(I))]. ∀[a,b:cat-arrow(poset-cat(I)) y].
  (a b ∈ (cat-arrow(poset-cat(I)) y))

Lemma: poset-cat-arrow-flip
I:Cname List. ∀x:cat-ob(poset-cat(I)). ∀a:nameset(I).  (((x a) 0 ∈ ℤ (cat-arrow(poset-cat(I)) flip(x;a)))

Lemma: poset-cat-arrow-iff
[I:Cname List]. ∀[x,y:cat-ob(poset-cat(I))].  uiff(cat-arrow(poset-cat(I)) y;{∀i:nameset(I). ((x i) ≤ (y i))})

Lemma: poset-cat-arrow-equals
[I:Cname List]. ∀[x,y:cat-ob(poset-cat(I))]. ∀[a:cat-arrow(poset-cat(I)) y].
  (a x.Ax) ∈ (cat-arrow(poset-cat(I)) y))

Lemma: member-poset-cat-arrow
[I:Cname List]. ∀[x,y:cat-ob(poset-cat(I))].  λx.Ax ∈ cat-arrow(poset-cat(I)) supposing cat-arrow(poset-cat(I)) y

Lemma: poset-cat-arrow-not-equal
I:Cname List. ∀y:nameset(I). ∀c1,c2:cat-ob(poset-cat(I)).
  (c1 y ≠ c2  (∀f:cat-arrow(poset-cat(I)) c1 c2. (((c1 y) 0 ∈ ℕ2) ∧ ((c2 y) 1 ∈ ℕ2))))

Lemma: poset-cat-ob-cases
I:Cname List. ∀c1,c2:cat-ob(poset-cat(I)).  ((c1 c2 ∈ cat-ob(poset-cat(I))) ∨ (∃y:nameset(I). c1 y ≠ c2 y))

Lemma: decidable__equal-poset-cat-ob
I:Cname List. ∀c1,c2:cat-ob(poset-cat(I)).  Dec(c1 c2 ∈ cat-ob(poset-cat(I)))

Lemma: poset-cat-arrow-cases
I:Cname List. ∀c1,c2:cat-ob(poset-cat(I)). ∀f:cat-arrow(poset-cat(I)) c1 c2.
  ((c1 c2 ∈ cat-ob(poset-cat(I)))
  ∨ (∃y:{y:nameset(I)| (c1 y) 0 ∈ ℕ2} (c2 flip(c1;y) ∈ cat-ob(poset-cat(I))))
  ∨ (∃c3:cat-ob(poset-cat(I))
      ∃g:cat-arrow(poset-cat(I)) c1 c3
       ∃h:cat-arrow(poset-cat(I)) c3 c2. ((¬(c1 c3 ∈ cat-ob(poset-cat(I)))) ∧ (c2 c3 ∈ cat-ob(poset-cat(I)))))))

Lemma: poset-cat-arrow-filter-nil
I:Cname List. ∀J:nameset(I) List. ∀c1,c2:cat-ob(poset-cat(I)). ∀f:cat-arrow(poset-cat(I)) c1 c2.
  ((filter(λz.(c1 =z c2 z);J) [] ∈ ({x:nameset(J)| ↑(c1 =z c2 x)}  List))
   (∀j∈J.((c1 j) 0 ∈ ℕ2) ∧ ((c2 j) 1 ∈ ℕ2)))

Definition: poset-cat-dist
poset-cat-dist(I;x;y) ==  ||filter(λi.((x =z 0) ∧b (y =z 1));I)||

Lemma: poset-cat-dist_wf
[I:Cname List]. ∀[x,y:cat-ob(poset-cat(I))].  (poset-cat-dist(I;x;y) ∈ ℕ)

Lemma: poset-cat-dist-add
[I:Cname List]. ∀[x,y,z:cat-ob(poset-cat(I))].
  (poset-cat-dist(I;x;z) (poset-cat-dist(I;x;y) poset-cat-dist(I;y;z)) ∈ ℤsupposing 
     ((cat-arrow(poset-cat(I)) y) and 
     (cat-arrow(poset-cat(I)) z))

Lemma: poset-cat-dist-zero
[I:Cname List]. ∀[x,y:cat-ob(poset-cat(I))].
  uiff(x y ∈ cat-ob(poset-cat(I));poset-cat-dist(I;x;y) ≤ 0) supposing cat-arrow(poset-cat(I)) y

Lemma: poset-cat-dist-non-zero
[I:Cname List]. ∀[x,y:cat-ob(poset-cat(I))].
  (null(filter(λx1.((x x1 =z 0) ∧b (y x1 =z 1));I)) ff) supposing 
     ((¬(x y ∈ cat-ob(poset-cat(I)))) and 
     (cat-arrow(poset-cat(I)) y))

Lemma: poset-cat-dist-flip
I:Cname List. ∀x:cat-ob(poset-cat(I)). ∀a:nameset(I).  (((x a) 0 ∈ ℤ (1 ≤ poset-cat-dist(I;x;flip(x;a))))

Definition: poset-functor
poset-functor(J;K;f) ==  <λg.(f g), λg,h,p,x. Ax>

Lemma: poset-functor_wf
[J,K:Cname List]. ∀[f:name-morph(J;K)].  (poset-functor(J;K;f) ∈ Functor(poset-cat(K);poset-cat(J)))

Lemma: poset-functor-comp
[I,J,K:Cname List]. ∀[f:name-morph(I;J)]. ∀[g:name-morph(J;K)].
  (poset-functor(I;K;(f g))
  functor-comp(poset-functor(J;K;g);poset-functor(I;J;f))
  ∈ Functor(poset-cat(K);poset-cat(I)))

Lemma: poset-id-functor
[I:Cname List]. (poset-functor(I;I;1) 1 ∈ Functor(poset-cat(I);poset-cat(I)))

Lemma: poset-functor-id
[I:Cname List]. ∀[f:name-morph(I;I)].
  poset-functor(I;I;f) 1 ∈ Functor(poset-cat(I);poset-cat(I)) supposing 1 ∈ name-morph(I;I)

Lemma: name-morph-flip-id
I:Cname List. ∀x:nameset(I). ∀c2:cat-ob(poset-cat(I)).  (c2 flip(c2;x) ∈ cat-ob(poset-cat(I-[x])))

Definition: poset_functor_extend
poset_functor_extend(C;I;L;E;c1;c2)
==r eval filter(λx.((c1 =z 0) ∧b (c2 =z 1));I) in
    if null(d)
    then cat-id(C) (L c1)
    else cat-comp(C) (L c1) (L flip(c1;hd(d))) (L c2) (E hd(d) c1) poset_functor_extend(C;I;L;E;flip(c1;hd(d));c2)
    fi 

Lemma: poset_functor_extend_wf
[C:SmallCategory]. ∀[I:Cname List]. ∀[L:name-morph(I;[]) ⟶ cat-ob(C)]. ∀[E:i:nameset(I)
                                                                             ⟶ c:{c:name-morph(I;[])| (c i) 0 ∈ ℕ2} 
                                                                             ⟶ (cat-arrow(C) (L c) (L flip(c;i)))].
[c1,c2:name-morph(I;[])].
  poset_functor_extend(C;I;L;E;c1;c2) ∈ cat-arrow(C) (L c1) (L c2) supposing ∀x:nameset(I). ((c1 x) ≤ (c2 x))

Lemma: poset_functor_extend-face-map1
[C:SmallCategory]. ∀[I:Cname List]. ∀[L:name-morph(I;[]) ⟶ cat-ob(C)]. ∀[E:i:nameset(I)
                                                                             ⟶ c:{c:name-morph(I;[])| (c i) 0 ∈ ℕ2} 
                                                                             ⟶ (cat-arrow(C) (L c) (L flip(c;i)))].
[y:nameset(I)]. ∀[a:ℕ2]. ∀[c1,c2:name-morph(I;[])].
  poset_functor_extend(C;I;L;E;((y:=a) c1);((y:=a) c2))
  poset_functor_extend(C;I-[y];L f.((y:=a) f));λz,f. (E ((y:=a) f));c1;c2)
  ∈ (cat-arrow(C) (L ((y:=a) c1)) (L ((y:=a) c2))) 
  supposing ∀x:nameset(I). ((c1 x) ≤ (c2 x))

Lemma: poset_functor_extend-face-map
[C:SmallCategory]. ∀[I:Cname List]. ∀[L:name-morph(I;[]) ⟶ cat-ob(C)]. ∀[E:i:nameset(I)
                                                                             ⟶ c:{c:name-morph(I;[])| (c i) 0 ∈ ℕ2} 
                                                                             ⟶ (cat-arrow(C) (L c) (L flip(c;i)))].
[y:nameset(I)]. ∀[a:ℕ2]. ∀[c1,c2:name-morph(I-[y];[])].
  poset_functor_extend(C;I;L;E;((y:=a) c1);((y:=a) c2))
  poset_functor_extend(C;I-[y];L f.((y:=a) f));λz,f. (E ((y:=a) f));c1;c2)
  ∈ (cat-arrow(C) (L ((y:=a) c1)) (L ((y:=a) c2))) 
  supposing ∀x:nameset(I-[y]). ((c1 x) ≤ (c2 x))

Lemma: poset_functor_extend_id
C:SmallCategory. ∀I:Cname List. ∀L:name-morph(I;[]) ⟶ cat-ob(C). ∀E:i:nameset(I)
                                                                      ⟶ c:{c:name-morph(I;[])| (c i) 0 ∈ ℕ2} 
                                                                      ⟶ (cat-arrow(C) (L c) (L flip(c;i))).
x:cat-ob(poset-cat(I)).
  (poset_functor_extend(C;I;L;E;x;x) (cat-id(C) (L x)) ∈ (cat-arrow(C) (L x) (L x)))

Lemma: poset_functor_extend_same
C:SmallCategory. ∀I:Cname List. ∀L:name-morph(I;[]) ⟶ cat-ob(C). ∀E:i:nameset(I)
                                                                      ⟶ c:{c:name-morph(I;[])| (c i) 0 ∈ ℕ2} 
                                                                      ⟶ (cat-arrow(C) (L c) (L flip(c;i))).
x:cat-ob(poset-cat(I)).
  ∀[y:cat-ob(poset-cat(I))]
    poset_functor_extend(C;I;L;E;x;y) (cat-id(C) (L x)) ∈ (cat-arrow(C) (L x) (L x)) 
    supposing y ∈ cat-ob(poset-cat(I))

Definition: poset-functor-extends
poset-functor-extends(C;I;L;E;F) ==
  (ob(F) L ∈ (name-morph(I;[]) ⟶ cat-ob(C)))
  ∧ (∀i:nameset(I). ∀c:{c:name-morph(I;[])| (c i) 0 ∈ ℕ2} .
       ((F flip(c;i) x.Ax)) (E c) ∈ (cat-arrow(C) (L c) (L flip(c;i)))))

Lemma: poset-functor-extends_wf
[C:SmallCategory]. ∀[I:Cname List]. ∀[L:name-morph(I;[]) ⟶ cat-ob(C)]. ∀[E:i:nameset(I)
                                                                             ⟶ c:{c:name-morph(I;[])| (c i) 0 ∈ ℕ2} 
                                                                             ⟶ (cat-arrow(C) (L c) (L flip(c;i)))].
[F:Functor(poset-cat(I);C)].
  (poset-functor-extends(C;I;L;E;F) ∈ ℙ)

Lemma: poset_functor_extend-extends
C:SmallCategory. ∀I:Cname List. ∀L:name-morph(I;[]) ⟶ cat-ob(C). ∀E:i:nameset(I)
                                                                      ⟶ c:{c:name-morph(I;[])| (c i) 0 ∈ ℕ2} 
                                                                      ⟶ (cat-arrow(C) (L c) (L flip(c;i))).
  poset-functor-extends(C;I;L;E;<L, λc1,c2,p. poset_functor_extend(C;I;L;E;c1;c2)>)

Lemma: poset_functor_extend-flip
C:SmallCategory. ∀I:Cname List. ∀L:name-morph(I;[]) ⟶ cat-ob(C). ∀E:i:nameset(I)
                                                                      ⟶ c:{c:name-morph(I;[])| (c i) 0 ∈ ℕ2} 
                                                                      ⟶ (cat-arrow(C) (L c) (L flip(c;i))).
i:nameset(I). ∀c:cat-ob(poset-cat(I)).
  poset_functor_extend(C;I;L;E;c;flip(c;i)) (E c) ∈ (cat-arrow(C) (L c) (L flip(c;i))) supposing (c i) 0 ∈ ℕ2

Definition: edge-arrows-commute
edge-arrows-commute(C;I;L;E) ==
  ∀x:name-morph(I;[]). ∀i,j:{i:nameset(I)| (x i) 0 ∈ ℕ2} .
    ((¬(i j ∈ nameset(I)))
     ((cat-comp(C) (L x) (L flip(x;i)) (L flip(flip(x;i);j)) (E x) (E flip(x;i)))
       (cat-comp(C) (L x) (L flip(x;j)) (L flip(flip(x;j);i)) (E x) (E flip(x;j)))
       ∈ (cat-arrow(C) (L x) (L flip(flip(x;i);j)))))

Lemma: edge-arrows-commute_wf
C:SmallCategory. ∀I:Cname List. ∀L:name-morph(I;[]) ⟶ cat-ob(C). ∀E:i:nameset(I)
                                                                      ⟶ c:{c:name-morph(I;[])| (c i) 0 ∈ ℕ2} 
                                                                      ⟶ (cat-arrow(C) (L c) (L flip(c;i))).
  (edge-arrows-commute(C;I;L;E) ∈ ℙ)

Lemma: poset_functor_extend-is-functor
[C:SmallCategory]. ∀[I:Cname List]. ∀[L:name-morph(I;[]) ⟶ cat-ob(C)]. ∀[E:i:nameset(I)
                                                                             ⟶ c:{c:name-morph(I;[])| (c i) 0 ∈ ℕ2} 
                                                                             ⟶ (cat-arrow(C) (L c) (L flip(c;i)))].
  <L, λc1,c2,p. poset_functor_extend(C;I;L;E;c1;c2)> ∈ Functor(poset-cat(I);C) supposing edge-arrows-commute(C;I;L;E)

Lemma: poset-extend-unique
[C:SmallCategory]. ∀[I:Cname List]. ∀[L:name-morph(I;[]) ⟶ cat-ob(C)]. ∀[E:i:nameset(I)
                                                                             ⟶ c:{c:name-morph(I;[])| (c i) 0 ∈ ℕ2} 
                                                                             ⟶ (cat-arrow(C) (L c) (L flip(c;i)))].
[F,G:Functor(poset-cat(I);C)].
  (F G ∈ Functor(poset-cat(I);C)) supposing (poset-functor-extends(C;I;L;E;G) and poset-functor-extends(C;I;L;E;F))

Lemma: unique-poset-functor
C:SmallCategory. ∀I:Cname List. ∀L:name-morph(I;[]) ⟶ cat-ob(C). ∀E:i:nameset(I)
                                                                      ⟶ c:{c:name-morph(I;[])| (c i) 0 ∈ ℕ2} 
                                                                      ⟶ (cat-arrow(C) (L c) (L flip(c;i))).
  (edge-arrows-commute(C;I;L;E)  (∃!F:Functor(poset-cat(I);C). poset-functor-extends(C;I;L;E;F)))

Lemma: poset-functors-equal
C:SmallCategory. ∀I:Cname List. ∀F,G:Functor(poset-cat(I);C).
  (F G ∈ Functor(poset-cat(I);C)
  ⇐⇒ (∀f:name-morph(I;[]). ((F f) (G f) ∈ cat-ob(C)))
      ∧ (∀x:nameset(I). ∀f:{f:name-morph(I;[])| (f x) 0 ∈ ℕ2} .
           ((F flip(f;x) x.Ax)) (G flip(f;x) x.Ax)) ∈ (cat-arrow(C) (F f) (F flip(f;x))))))

Definition: cubical-nerve
cubical-nerve(X) ==  <λJ.Functor(poset-cat(J);X), λI,J,f,F. functor-comp(poset-functor(I;J;f);F)>

Lemma: cubical-nerve_wf
[X:SmallCategory]. (cubical-nerve(X) ∈ CubicalSet)

Lemma: cubical-nerve-I-cube
[X,I:Top].  (cubical-nerve(X)(I) Functor(poset-cat(I);X))

Lemma: face-compatible-cubical-nerve1
[C:SmallCategory]. ∀[I:Cname List].
  ∀f1,f2:I-face(cubical-nerve(C);I).
    (face-compatible(cubical-nerve(C);I;f1;f2) ((fst(f1)) (fst(f2)) ∈ Cname))
     (functor-comp(poset-functor(I-[fst(f1)];I-[fst(f1); fst(f2)];(fst(f2):=fst(snd(f2))));snd(snd(f1)))
       functor-comp(poset-functor(I-[fst(f2)];I-[fst(f1); fst(f2)];(fst(f1):=fst(snd(f1))));snd(snd(f2)))
       ∈ Functor(poset-cat(I-[fst(f1); fst(f2)]);C)))

Definition: nerve-box-face
nerve-box-face(box;L) ==  hd(filter(λf.(direction(f) =z dimension(f));box))

Lemma: nerve-box-face_wf
[C:SmallCategory]. ∀[I:Cname List]. ∀[J:nameset(I) List]. ∀[x:nameset(I)]. ∀[i:ℕ2].
[box:open_box(cubical-nerve(C);I;J;x;i)]. ∀[L:cat-ob(poset-cat(I))].
  nerve-box-face(box;L) ∈ {f:I-face(cubical-nerve(C);I)| (f ∈ box) ∧ (direction(f) (L dimension(f)) ∈ ℕ2)}  
  supposing ((L x) i ∈ ℕ2) ∨ (¬↑null(J))

Definition: nerve-box-common-face
nerve-box-common-face(box;L;z) ==
  hd(filter(λf.((direction(f) =z dimension(f)) ∧b (direction(f) =z flip(L;z) dimension(f)));box))

Lemma: nerve-box-common-face_wf2
[C:SmallCategory]. ∀[I:Cname List]. ∀[J:nameset(I) List]. ∀[x:nameset(I)]. ∀[i:ℕ2].
[box:open_box(cubical-nerve(C);I;J;x;i)]. ∀[L:cat-ob(poset-cat(I))]. ∀[z:nameset(I)].
  nerve-box-common-face(box;L;z) ∈ {f:I-face(cubical-nerve(C);I)| 
                                    (f ∈ box)
                                    ∧ (direction(f) (L dimension(f)) ∈ ℕ2)
                                    ∧ (direction(f) (flip(L;z) dimension(f)) ∈ ℕ2)}  
  supposing (∃j∈J. ¬(j z ∈ Cname)) ∨ (((L x) i ∈ ℕ2) ∧ (¬↑null(J)))

Lemma: nerve-box-common-face_wf
[C:SmallCategory]. ∀[I:Cname List]. ∀[J:nameset(I) List]. ∀[x:nameset(I)]. ∀[i:ℕ2].
[box:open_box(cubical-nerve(C);I;J;x;i)]. ∀[L:cat-ob(poset-cat(I))]. ∀[z:nameset(I)].
  nerve-box-common-face(box;L;z) ∈ {f:I-face(cubical-nerve(C);I)| 
                                    (f ∈ box)
                                    ∧ (direction(f) (L dimension(f)) ∈ ℕ2)
                                    ∧ (direction(f) (flip(L;z) dimension(f)) ∈ ℕ2)}  
  supposing (∃j1∈J. (∃j2∈J. ¬(j1 j2 ∈ Cname))) ∨ (((L x) i ∈ ℕ2) ∧ (¬↑null(J)))

Definition: nerve_box_label
nerve_box_label(box;L) ==  cube(nerve-box-face(box;L)) L

Lemma: nerve_box_label_wf
[C:SmallCategory]. ∀[I:Cname List]. ∀[J:nameset(I) List]. ∀[x:nameset(I)]. ∀[i:ℕ2].
[box:open_box(cubical-nerve(C);I;J;x;i)]. ∀[L:name-morph(I;[])].
  nerve_box_label(box;L) ∈ cat-ob(C) supposing ((L x) i ∈ ℕ2) ∨ (¬↑null(J))

Lemma: nerve_box_label_same
[C:SmallCategory]. ∀[I:Cname List]. ∀[J:nameset(I) List]. ∀[x:nameset(I)]. ∀[i:ℕ2].
[box:open_box(cubical-nerve(C);I;J;x;i)]. ∀[L:name-morph(I;[])].
  ∀f:I-face(cubical-nerve(C);I)
    ((cube(f) L) nerve_box_label(box;L) ∈ cat-ob(C)) supposing ((f ∈ box) and (direction(f) (L dimension(f)) ∈ ℕ2)) 
  supposing ((L x) i ∈ ℕ2) ∨ (¬↑null(J))

Lemma: same-face-edge-arrows-commute
C:SmallCategory. ∀I:Cname List. ∀f:name-morph(I;[]). ∀a,b:nameset(I). ∀v:I-face(cubical-nerve(C);I).
  (((f a) 0 ∈ ℕ2)
   ((f b) 0 ∈ ℕ2)
   (a b ∈ nameset(I)))
   (dimension(v) a ∈ Cname))
   (dimension(v) b ∈ Cname))
   ((cat-comp(C) (cube(v) f) (cube(v) flip(f;a)) (cube(v) flip(flip(f;a);b)) (cube(v) flip(f;a) x.Ax)) 
       (cube(v) flip(f;a) flip(flip(f;a);b) x.Ax)))
     (cat-comp(C) (cube(v) f) (cube(v) flip(f;b)) (cube(v) flip(flip(f;b);a)) (cube(v) flip(f;b) x.Ax)) 
        (cube(v) flip(f;b) flip(flip(f;b);a) x.Ax)))
     ∈ (cat-arrow(C) (cube(v) f) (cube(v) flip(flip(f;a);b)))))

Definition: nerve_box_edge
nerve_box_edge(box;c;y) ==  cube(nerve-box-common-face(box;c;y)) flip(c;y) x.Ax)

Definition: nerve_box_edge'
nerve_box_edge'(box; c; y) ==  nerve_box_edge(box;c;y)

Lemma: nerve_box_edge_wf2
[C:SmallCategory]. ∀[I:Cname List]. ∀[J:nameset(I) List]. ∀[x:nameset(I)]. ∀[i:ℕ2].
[box:open_box(cubical-nerve(C);I;J;x;i)]. ∀[y:nameset(I)]. ∀[c:{c:name-morph(I;[])| (c y) 0 ∈ ℕ2} ].
  nerve_box_edge(box;c;y) ∈ cat-arrow(C) nerve_box_label(box;c) nerve_box_label(box;flip(c;y)) 
  supposing (∃j∈J. ¬(j y ∈ Cname)) ∨ (((c x) i ∈ ℕ2) ∧ (¬↑null(J)))

Lemma: nerve_box_edge'_wf
[C:SmallCategory]. ∀[I:Cname List]. ∀[J:nameset(I) List]. ∀[x:nameset(I)]. ∀[i:ℕ2].
[box:open_box(cubical-nerve(C);I;J;x;i)]. ∀[y:nameset(I)]. ∀[c:{c:name-morph(I;[])| (c y) 0 ∈ ℕ2} ].
  nerve_box_edge'(box; c; y) ∈ cat-arrow(C) nerve_box_label(box;c) nerve_box_label(box;flip(c;y)) 
  supposing (∃j∈J. ¬(j y ∈ Cname)) ∨ (((c x) i ∈ ℕ2) ∧ (¬↑null(J)))

Lemma: nerve_box_edge_wf
[C:SmallCategory]. ∀[I:Cname List]. ∀[J:nameset(I) List]. ∀[x:nameset(I)]. ∀[i:ℕ2].
[box:open_box(cubical-nerve(C);I;J;x;i)]. ∀[y:nameset(I)]. ∀[c:{c:name-morph(I;[])| (c y) 0 ∈ ℕ2} ].
  nerve_box_edge(box;c;y) ∈ cat-arrow(C) nerve_box_label(box;c) nerve_box_label(box;flip(c;y)) 
  supposing (∃j1∈J. (∃j2∈J. ¬(j1 j2 ∈ Cname))) ∨ (((c x) i ∈ ℕ2) ∧ (¬↑null(J)))

Lemma: nerve_box_edge_same1
[C:SmallCategory]. ∀[I:Cname List]. ∀[J:nameset(I) List]. ∀[x:nameset(I)]. ∀[i:ℕ2].
[box:open_box(cubical-nerve(C);I;J;x;i)]. ∀[y:nameset(I)]. ∀[c:{c:name-morph(I;[])| (c y) 0 ∈ ℕ2} ].
  ∀f:I-face(cubical-nerve(C);I)
    (cube(f) flip(c;y) x.Ax))
    nerve_box_edge(box;c;y)
    ∈ (cat-arrow(C) nerve_box_label(box;c) nerve_box_label(box;flip(c;y))) 
    supposing (f ∈ box) ∧ (direction(f) (c dimension(f)) ∈ ℕ2) ∧ (direction(f) (flip(c;y) dimension(f)) ∈ ℕ2) 
  supposing (∃j∈J. ¬(j y ∈ Cname)) ∨ (((c x) i ∈ ℕ2) ∧ (¬↑null(J)))

Lemma: nerve_box_edge_same
[C:SmallCategory]. ∀[I:Cname List]. ∀[J:nameset(I) List]. ∀[x:nameset(I)]. ∀[i:ℕ2].
[box:open_box(cubical-nerve(C);I;J;x;i)]. ∀[y:nameset(I)]. ∀[c:{c:name-morph(I;[])| (c y) 0 ∈ ℕ2} ].
  ∀f:I-face(cubical-nerve(C);I)
    (cube(f) flip(c;y) x.Ax))
    nerve_box_edge(box;c;y)
    ∈ (cat-arrow(C) nerve_box_label(box;c) nerve_box_label(box;flip(c;y))) 
    supposing (f ∈ box) ∧ (direction(f) (c dimension(f)) ∈ ℕ2) ∧ (direction(f) (flip(c;y) dimension(f)) ∈ ℕ2) 
  supposing (∃j1∈J. (∃j2∈J. ¬(j1 j2 ∈ Cname))) ∨ (((c x) i ∈ ℕ2) ∧ (¬↑null(J)))

Lemma: same-face-edge-arrows-commute0
[C:SmallCategory]. ∀[I:Cname List]. ∀[J:nameset(I) List]. ∀[x:nameset(I)]. ∀[i:ℕ2].
[box:open_box(cubical-nerve(C);I;J;x;i)].
  ∀f:name-morph(I;[]). ∀a,b:nameset(I).
    ∀[v:I-face(cubical-nerve(C);I)]
      ((cat-comp(C) nerve_box_label(box;f) nerve_box_label(box;flip(f;a)) nerve_box_label(box;flip(flip(f;a);b)) 
        nerve_box_edge(box;f;a) 
        nerve_box_edge(box;flip(f;a);b))
         (cat-comp(C) nerve_box_label(box;f) nerve_box_label(box;flip(f;b)) nerve_box_label(box;flip(flip(f;b);a)) 
            nerve_box_edge(box;f;b) 
            nerve_box_edge(box;flip(f;b);a))
         ∈ (cat-arrow(C) nerve_box_label(box;f) nerve_box_label(box;flip(flip(f;a);b)))) supposing 
         ((v ∈ box) and 
         (dimension(v) b ∈ Cname)) and 
         (dimension(v) a ∈ Cname)) and 
         (a b ∈ nameset(I))) and 
         ((f b) 0 ∈ ℕ2) and 
         (((f a) 0 ∈ ℕ2) ∧ (direction(v) (f dimension(v)) ∈ ℕ2))) 
    supposing ((∃j1∈J. ¬(j1 a ∈ Cname)) ∧ (∃j2∈J. ¬(j2 b ∈ Cname)))
    ∨ ((¬↑null(J)) ∧ ((f x) i ∈ ℤ) ∧ ((flip(f;a) x) i ∈ ℤ) ∧ ((flip(f;b) x) i ∈ ℕ2))

Lemma: same-face-edge-arrows-commute1
[C:SmallCategory]. ∀[I:Cname List]. ∀[J:nameset(I) List]. ∀[x:nameset(I)]. ∀[i:ℕ2].
[box:open_box(cubical-nerve(C);I;J;x;i)].
  ∀f:name-morph(I;[]). ∀a,b:nameset(I).
    ∀[v:I-face(cubical-nerve(C);I)]
      ((cat-comp(C) nerve_box_label(box;f) nerve_box_label(box;flip(f;a)) nerve_box_label(box;flip(flip(f;a);b)) 
        nerve_box_edge(box;f;a) 
        nerve_box_edge(box;flip(f;a);b))
         (cat-comp(C) nerve_box_label(box;f) nerve_box_label(box;flip(f;b)) nerve_box_label(box;flip(flip(f;b);a)) 
            nerve_box_edge(box;f;b) 
            nerve_box_edge(box;flip(f;b);a))
         ∈ (cat-arrow(C) nerve_box_label(box;f) nerve_box_label(box;flip(flip(f;a);b)))) supposing 
         ((v ∈ box) and 
         (dimension(v) b ∈ Cname)) and 
         (dimension(v) a ∈ Cname)) and 
         (a b ∈ nameset(I))) and 
         ((f b) 0 ∈ ℕ2) and 
         (((f a) 0 ∈ ℕ2) ∧ (direction(v) (f dimension(v)) ∈ ℕ2))) 
    supposing (∃j1∈J. ¬(j1 a ∈ Cname)) ∧ (∃j2∈J. ¬(j2 b ∈ Cname))

Lemma: same-face-edge-arrows-commute4
[C:SmallCategory]. ∀[I:Cname List]. ∀[J:nameset(I) List]. ∀[x:nameset(I)]. ∀[i:ℕ2].
[box:open_box(cubical-nerve(C);I;J;x;i)].
  ∀f:name-morph(I;[]). ∀a,b:nameset(I).
    ((cat-comp(C) nerve_box_label(box;f) nerve_box_label(box;flip(f;a)) nerve_box_label(box;flip(flip(f;a);b)) 
      nerve_box_edge(box;f;a) 
      nerve_box_edge(box;flip(f;a);b))
       (cat-comp(C) nerve_box_label(box;f) nerve_box_label(box;flip(f;b)) nerve_box_label(box;flip(flip(f;b);a)) 
          nerve_box_edge(box;f;b) 
          nerve_box_edge(box;flip(f;b);a))
       ∈ (cat-arrow(C) nerve_box_label(box;f) nerve_box_label(box;flip(flip(f;a);b)))) supposing 
       ((¬(a b ∈ nameset(I))) and 
       ((f b) 0 ∈ ℕ2) and 
       ((f a) 0 ∈ ℕ2) and 
       (∃v:I-face(cubical-nerve(C);I)
         ((v ∈ box)
         ∧ (dimension(v) b ∈ Cname))
         ∧ (dimension(v) a ∈ Cname))
         ∧ (direction(v) (f dimension(v)) ∈ ℕ2))) and 
       ((∃j1∈J. ¬(j1 a ∈ Cname)) ∧ (∃j2∈J. ¬(j2 b ∈ Cname))))

Lemma: same-face-edge-arrows-commute2
[C:SmallCategory]. ∀[I:Cname List]. ∀[J:nameset(I) List].
  ∀[x:nameset(I)]. ∀[i:ℕ2]. ∀[box:open_box(cubical-nerve(C);I;J;x;i)].
    ∀f:name-morph(I;[]). ∀a,b:nameset(I).
      ∀[v:I-face(cubical-nerve(C);I)]
        ((cat-comp(C) nerve_box_label(box;f) nerve_box_label(box;flip(f;a)) nerve_box_label(box;flip(flip(f;a);b)) 
          nerve_box_edge(box;f;a) 
          nerve_box_edge(box;flip(f;a);b))
           (cat-comp(C) nerve_box_label(box;f) nerve_box_label(box;flip(f;b)) nerve_box_label(box;flip(flip(f;b);a)) 
              nerve_box_edge(box;f;b) 
              nerve_box_edge(box;flip(f;b);a))
           ∈ (cat-arrow(C) nerve_box_label(box;f) nerve_box_label(box;flip(flip(f;a);b)))) supposing 
           ((v ∈ box) and 
           (dimension(v) b ∈ Cname)) and 
           (dimension(v) a ∈ Cname)) and 
           (a b ∈ nameset(I))) and 
           ((f b) 0 ∈ ℕ2) and 
           (((f a) 0 ∈ ℕ2) ∧ (direction(v) (f dimension(v)) ∈ ℕ2))) 
  supposing (∃j1∈J. (∃j2∈J. ¬(j1 j2 ∈ Cname)))

Lemma: same-face-edge-arrows-commute3
[C:SmallCategory]. ∀[I:Cname List]. ∀[J:nameset(I) List].
  ∀[x:nameset(I)]. ∀[i:ℕ2]. ∀[box:open_box(cubical-nerve(C);I;J;x;i)].
    ∀f:name-morph(I;[]). ∀a,b:nameset(I).
      (cat-comp(C) nerve_box_label(box;f) nerve_box_label(box;flip(f;a)) nerve_box_label(box;flip(flip(f;a);b)) 
       nerve_box_edge(box;f;a) 
       nerve_box_edge(box;flip(f;a);b))
      (cat-comp(C) nerve_box_label(box;f) nerve_box_label(box;flip(f;b)) nerve_box_label(box;flip(flip(f;b);a)) 
         nerve_box_edge(box;f;b) 
         nerve_box_edge(box;flip(f;b);a))
      ∈ (cat-arrow(C) nerve_box_label(box;f) nerve_box_label(box;flip(flip(f;a);b))) 
      supposing (((¬(a b ∈ nameset(I))) ∧ ((f a) 0 ∈ ℕ2)) ∧ ((f b) 0 ∈ ℕ2))
      ∧ (∃v:I-face(cubical-nerve(C);I)
          ((v ∈ box)
          ∧ (dimension(v) b ∈ Cname))
          ∧ (dimension(v) a ∈ Cname))
          ∧ (direction(v) (f dimension(v)) ∈ ℕ2))) 
  supposing (∃j1∈J. (∃j2∈J. ¬(j1 j2 ∈ Cname)))

Lemma: same-face-square-commutes
[C:SmallCategory]. ∀[I:Cname List]. ∀[J:nameset(I) List].
  ∀[x:nameset(I)]. ∀[i:ℕ2]. ∀[box:open_box(cubical-nerve(C);I;J;x;i)]. ∀[f,g,h,k:name-morph(I;[])].
    ∀a,b:nameset(I).
      nerve_box_edge(box;f;a) nerve_box_edge(box;g;b) nerve_box_edge(box;f;b) nerve_box_edge(box;h;a) 
      supposing (((¬(a b ∈ nameset(I))) ∧ ((f a) 0 ∈ ℕ2))
      ∧ ((f b) 0 ∈ ℕ2)
      ∧ (g flip(f;a) ∈ name-morph(I;[]))
      ∧ (h flip(f;b) ∈ name-morph(I;[]))
      ∧ (k flip(flip(f;a);b) ∈ name-morph(I;[])))
      ∧ (∃v:I-face(cubical-nerve(C);I)
          ((v ∈ box)
          ∧ (dimension(v) b ∈ Cname))
          ∧ (dimension(v) a ∈ Cname))
          ∧ (direction(v) (f dimension(v)) ∈ ℕ2))) 
  supposing (∃j1∈J. (∃j2∈J. ¬(j1 j2 ∈ Cname)))

Lemma: same-face-square-commutes2
[C:SmallCategory]. ∀[I:Cname List]. ∀[J:nameset(I) List]. ∀[x:nameset(I)]. ∀[i:ℕ2].
[box:open_box(cubical-nerve(C);I;J;x;i)]. ∀[f,g,h,k:name-morph(I;[])].
  ∀a,b:nameset(I).
    (nerve_box_edge(box;f;a) nerve_box_edge(box;g;b) nerve_box_edge(box;f;b) nerve_box_edge(box;h;a)) supposing 
       (((((¬(a b ∈ nameset(I))) ∧ ((f a) 0 ∈ ℕ2))
       ∧ ((f b) 0 ∈ ℕ2)
       ∧ (g flip(f;a) ∈ name-morph(I;[]))
       ∧ (h flip(f;b) ∈ name-morph(I;[]))
       ∧ (k flip(flip(f;a);b) ∈ name-morph(I;[])))
       ∧ (∃v:I-face(cubical-nerve(C);I)
           ((v ∈ box)
           ∧ (dimension(v) b ∈ Cname))
           ∧ (dimension(v) a ∈ Cname))
           ∧ (direction(v) (f dimension(v)) ∈ ℕ2)))) and 
       (((∃j1∈J. ¬(j1 a ∈ Cname)) ∧ (∃j2∈J. ¬(j2 b ∈ Cname)))
       ∨ ((¬↑null(J)) ∧ ((f x) i ∈ ℤ) ∧ ((flip(f;a) x) i ∈ ℤ) ∧ ((flip(f;b) x) i ∈ ℕ2))))

Lemma: poset-functor-extends-box-faces
G:Groupoid. ∀I:Cname List. ∀J:nameset(I) List. ∀x:nameset(I). ∀i:ℕ2. ∀bx:open_box(cubical-nerve(cat(G));I;J;x;i).
  (((¬↑null(J)) ∧ (∃j1∈J. (∃j2∈J. ¬(j1 j2 ∈ Cname))))
   (∀fc∈bx.poset-functor-extends(cat(G);I-[dimension(fc)];λx.nerve_box_label(bx;((dimension(fc):=direction(fc)) x));
                                   λz,f. nerve_box_edge(bx;((dimension(fc):=direction(fc)) f);z);cube(fc))))

Lemma: groupoid-edges-commute
G:Groupoid. ∀I:Cname List. ∀J:nameset(I) List. ∀x:nameset(I). ∀i:ℕ2. ∀box:open_box(cubical-nerve(fst(G));I;J;x;i).
  ((∃j1∈J. (∃j2∈J. ¬(j1 j2 ∈ Cname)))
   edge-arrows-commute(fst(G);I;λc.nerve_box_label(box;c);λy,c. nerve_box_edge(box;c;y)))

Definition: nerve_box_edge1
nerve_box_edge1(G;box;x;i;j;c;y) ==
  if (c =z i) ∨bbeq-cname(y;j)) then nerve_box_edge(box;c;y)
  if (i =z 0)
    then groupoid-square1(G;nerve_box_label(box;flip(c;x));nerve_box_label(box;flip(flip(c;x);y));
         nerve_box_label(box;c);nerve_box_label(box;flip(c;y));nerve_box_edge(box;flip(c;x);y);
         nerve_box_edge(box;flip(flip(c;x);y);x);nerve_box_edge(box;flip(c;x);x))
  else groupoid-square2(G;nerve_box_label(box;c);nerve_box_label(box;flip(c;y));
       nerve_box_label(box;flip(c;x));nerve_box_label(box;flip(flip(c;y);x));nerve_box_edge(box;flip(c;y);x);
       nerve_box_edge(box;c;x);nerve_box_edge(box;flip(c;x);y))
  fi 

Lemma: nerve_box_edge1_wf
[G:Groupoid]. ∀[I:Cname List]. ∀[J:nameset(I) List]. ∀[j:nameset(J)]. ∀[x:nameset(I)]. ∀[i:ℕ2].
[box:open_box(cubical-nerve(cat(G));I;J;x;i)]. ∀[y:nameset(I)]. ∀[c:{c:name-morph(I;[])| (c y) 0 ∈ ℕ2} ].
  nerve_box_edge1(G;box;x;i;j;c;y) ∈ cat-arrow(cat(G)) nerve_box_label(box;c) nerve_box_label(box;flip(c;y)) 
  supposing (∀j'∈J.j' j ∈ Cname)

Lemma: poset-functor-extends-box-faces-1
G:Groupoid. ∀I:Cname List. ∀J:nameset(I) List. ∀x:nameset(I). ∀i:ℕ2. ∀bx:open_box(cubical-nerve(cat(G));I;J;x;i).
  (((¬↑null(J)) ∧ (∀j'∈J.j' hd(J) ∈ Cname))
   (∀fc∈bx.poset-functor-extends(cat(G);I-[dimension(fc)];λx.nerve_box_label(bx;((dimension(fc):=direction(fc)) x));
                                   λz,f. nerve_box_edge1(G;bx;x;i;hd(J);((dimension(fc):=direction(fc)) f);z);cube(fc)\000C)))

Lemma: groupoid-edges-commute1
G:Groupoid. ∀I:Cname List. ∀J:nameset(I) List. ∀j:nameset(I).
  ((j ∈ J)
   (∀j'∈J.j' j ∈ Cname)
   (∀x:nameset(I). ∀i:ℕ2. ∀box:open_box(cubical-nerve(fst(G));I;J;x;i).
        edge-arrows-commute(fst(G);I;λc.nerve_box_label(box;c);λy,c. nerve_box_edge1(G;box;x;i;j;c;y))))

Definition: groupoid-nerve-filler0
groupoid-nerve-filler0(I;x;box) ==  functor-comp(poset-functor(I-[x];I;iota(x));snd(snd(hd(box))))

Lemma: groupoid-nerve-filler0_wf
[G:Groupoid]. ∀[I:Cname List]. ∀[J:nameset(I) List]. ∀[x:nameset(I)]. ∀[i:ℕ2].
[box:open_box(cubical-nerve(cat(G));I;J;x;i)].
  groupoid-nerve-filler0(I;x;box) ∈ cubical-nerve(cat(G))(I) supposing ↑null(J)

Definition: groupoid-nerve-filler1
groupoid-nerve-filler1(G;I;J;x;i;box) ==
  <λc.nerve_box_label(box;c)
  , λc1,c2,p. poset_functor_extend(cat(G);I;λc.nerve_box_label(box;c);λy,c. nerve_box_edge1(G;box;x;i;hd(J);c;y);c1;c2)
  >

Lemma: groupoid-nerve-filler1_wf
[G:Groupoid]. ∀[I:Cname List]. ∀[J:nameset(I) List]. ∀[x:nameset(I)]. ∀[i:ℕ2].
[box:open_box(cubical-nerve(cat(G));I;J;x;i)].
  groupoid-nerve-filler1(G;I;J;x;i;box) ∈ cubical-nerve(cat(G))(I) supposing (¬↑null(J)) ∧ (||box|| ≤ 3)

Definition: groupoid-nerve-filler2
groupoid-nerve-filler2(C;I;J;box) ==
  <λc.nerve_box_label(box;c)
  , λc1,c2,p. poset_functor_extend(C;I;λc.nerve_box_label(box;c);λy,c. nerve_box_edge(box;c;y);c1;c2)
  >

Lemma: groupoid-nerve-filler2_wf
[G:Groupoid]. ∀[I:Cname List]. ∀[J:nameset(I) List]. ∀[x:nameset(I)]. ∀[i:ℕ2].
[box:open_box(cubical-nerve(cat(G));I;J;x;i)].
  groupoid-nerve-filler2(cat(G);I;J;box) ∈ cubical-nerve(cat(G))(I) supposing 3 < ||box||

Definition: groupoid-nerve-filler
groupoid-nerve-filler(G;I;J;x;i;box) ==
  if null(J) then groupoid-nerve-filler0(I;x;box)
  if 3 <||box|| then groupoid-nerve-filler2(cat(G);I;J;box)
  else groupoid-nerve-filler1(G;I;J;x;i;box)
  fi 

Lemma: groupoid-nerve-filler_wf
[G:Groupoid]. ∀[I:Cname List]. ∀[J:nameset(I) List]. ∀[x:nameset(I)]. ∀[i:ℕ2].
[box:open_box(cubical-nerve(cat(G));I;J;x;i)].
  (groupoid-nerve-filler(G;I;J;x;i;box) ∈ cubical-nerve(cat(G))(I))

Lemma: groupoid-nerve-filler-fills
G:Groupoid. ∀I:Cname List. ∀J:nameset(I) List. ∀x:nameset(I). ∀i:ℕ2. ∀bx:open_box(cubical-nerve(cat(G));I;J;x;i).
  fills-open_box(cubical-nerve(cat(G));I;bx;(λI,J,x,i,box. groupoid-nerve-filler(G;I;J;x;i;box)) bx)

Lemma: groupoid-nerve-functor-flip
[G:Groupoid]. ∀[I:Cname List]. ∀[u:nameset(I)]. ∀[K:Cname List]. ∀[f:name-morph(I;K)]. ∀[f1:name-morph(K;[])].
  ∀x1:nameset(I)
    ∀[F:Functor(poset-cat(I-[x1]);cat(G))]
      (F (f f1) flip((f f1);u) x.Ax))
      (f(F) f1 flip(f1;f u) x.Ax))
      ∈ (cat-arrow(cat(G)) (F (f f1)) (F (f flip(f1;f u)))) 
      supposing (↑isname(f u)) ∧ ((f1 (f u)) 0 ∈ ℕ2)

Lemma: groupoid-nerve-filler-uniform
G:Groupoid. uniform-Kan-filler(cubical-nerve(cat(G));λI,J,x,i,box. groupoid-nerve-filler(G;I;J;x;i;box))

Definition: Kan-groupoid-nerve
Kan-groupoid-nerve(G) ==  <cubical-nerve(cat(G)), λI,J,x,i,box. groupoid-nerve-filler(G;I;J;x;i;box)>

Lemma: Kan-groupoid-nerve_wf
[G:Groupoid]. (Kan-groupoid-nerve(G) ∈ KanCubicalSet)

Comment: Theorem 6.2 in Bezem,Coquand,Huber
We prove theorem 6.2 of the BCH paper.
If ⋅

Comment: The Type (Id_A a b)
To define the type (Id_A b) we must define, for each I-cube, alpha of

the context X, the "set" (Id_A b)(alpha).
For new coordinate z, the members of the type
   named-path are  z-paths from a(alpha) to b(alpha).

We tried to simply use ⌜fresh-cname(I)⌝ as the choice for coordinate z.
But, when defining the Kan structure on (Id_A b) this did not work.
(Because then, an (y,c)-face of (Id_A b) has coordinates
 ⌜[fresh-cname(I-[y]) I-[y]]⌝ in A,  and that is not the same as
 ⌜[fresh-cname(I) I]-[y]⌝ -- since fresh-cname(I-[y]) could be y  ).

So, we need to proceed as in the BCH paper with an equivalence class
of I-path.

The equivalence relation is 
path-eq
path-eq-equiv
and the equivalence classes are the quotient type: cubical-path.

The morphisms on this type are defined by the operation: I-path-morph,
and then we can define the type cubical-identity
and prove its typing lemma cubical-identity_wf.

To prove that, we have to show that the morphisms are well defined on the
quotient type, which is proved in
I-path-morph_functionality
I-path-morph-id
I-path-morph-comp
 
Those proof use lemmas
like extend-name-morph-rename-one
    rename-one-extend-name-morph
    extend-name-morph-comp
    rename-one-extend-id

The next step is to show that (Id_A a) is inhabited by the term refl(a)
cubical-refl_wf

The description of the Kan-structure is here: Kan structure on Id_A a b


Definition: name-path-endpoints
name-path-endpoints(X;A;a;b;I;alpha;z;omega) ==
  ((omega iota(z)(alpha) (z:=0)) (a alpha) ∈ A(alpha)) ∧ ((omega iota(z)(alpha) (z:=1)) (b alpha) ∈ A(alpha))

Lemma: name-path-endpoints_wf
[X:CubicalSet]. ∀[A:{X ⊢ _}]. ∀[a,b:{X ⊢ _:A}]. ∀[I:Cname List]. ∀[alpha:X(I)]. ∀[z:Cname]. ∀[omega:A(iota(z)(alpha))].
  name-path-endpoints(X;A;a;b;I;alpha;z;omega) ∈ ℙ supposing ¬(z ∈ I)

Definition: named-path
named-path(X;A;a;b;I;alpha;z) ==  {omega:A(iota(z)(alpha))| name-path-endpoints(X;A;a;b;I;alpha;z;omega)} 

Lemma: named-path_wf
[X:CubicalSet]. ∀[A:{X ⊢ _}]. ∀[a,b:{X ⊢ _:A}]. ∀[I:Cname List]. ∀[alpha:X(I)]. ∀[z:Cname].
  named-path(X;A;a;b;I;alpha;z) ∈ Type supposing ¬(z ∈ I)

Lemma: named-path-subtype
[X:CubicalSet]. ∀[A:{X ⊢ _}]. ∀[a,b:{X ⊢ _:A}]. ∀[I:Cname List]. ∀[alpha:X(I)]. ∀[z:Cname].
  named-path(X;A;a;b;I;alpha;z) ⊆A(iota(z)(alpha)) supposing ¬(z ∈ I)

Lemma: named-path-equal-implies
[X:CubicalSet]. ∀[A:{X ⊢ _}]. ∀[a,b:{X ⊢ _:A}]. ∀[I:Cname List]. ∀[alpha:X(I)]. ∀[z:Cname].
  ∀[p,q:named-path(X;A;a;b;I;alpha;z)].  q ∈ A(iota(z)(alpha)) supposing q ∈ named-path(X;A;a;b;I;alpha;z) 
  supposing ¬(z ∈ I)

Lemma: equal-named-paths
[X:CubicalSet]. ∀[A:{X ⊢ _}]. ∀[a,b:{X ⊢ _:A}]. ∀[I:Cname List]. ∀[alpha:X(I)]. ∀[z:Cname].
  ∀[p:named-path(X;A;a;b;I;alpha;z)]. ∀[q:A(iota(z)(alpha))].
    q ∈ named-path(X;A;a;b;I;alpha;z) supposing q ∈ A(iota(z)(alpha)) 
  supposing ¬(z ∈ I)

Definition: named-path-morph
named-path-morph(X;A;I;K;z;x;f;alpha;w) ==  (w iota(z)(alpha) f[z:=x])

Lemma: named-path-morph_wf
X:CubicalSet. ∀A:{X ⊢ _}. ∀a,b:{X ⊢ _:A}. ∀I,K:Cname List. ∀f:name-morph(I;K). ∀alpha:X(I). ∀z:{z:Cname| ¬(z ∈ I)} .
w:named-path(X;A;a;b;I;alpha;z). ∀x:{x:Cname| ¬(x ∈ K)} .
  (named-path-morph(X;A;I;K;z;x;f;alpha;w) ∈ named-path(X;A;a;b;K;f(alpha);x))

Definition: I-path
I-path(X;A;a;b;I;alpha) ==  z:{z:Cname| ¬(z ∈ I)}  × named-path(X;A;a;b;I;alpha;z)

Lemma: I-path_wf
[X:CubicalSet]. ∀[A:{X ⊢ _}]. ∀[a,b:{X ⊢ _:A}]. ∀[I:Cname List]. ∀[alpha:X(I)].  (I-path(X;A;a;b;I;alpha) ∈ Type)

Lemma: equal-I-paths
[X:CubicalSet]. ∀[A:{X ⊢ _}]. ∀[a,b:{X ⊢ _:A}]. ∀[I:Cname List]. ∀[alpha:X(I)]. ∀[p,q:I-path(X;A;a;b;I;alpha)].
  q ∈ I-path(X;A;a;b;I;alpha) 
  supposing ((fst(p)) (fst(q)) ∈ Cname) ∧ ((snd(p)) (snd(q)) ∈ A(iota(fst(p))(alpha)))

Definition: I-path-morph
I-path-morph(X;A;I;K;f;alpha;p) ==
  let z,w 
  in <fresh-cname(K), named-path-morph(X;A;I;K;z;fresh-cname(K);f;alpha;w)>

Lemma: I-path-morph_wf
X:CubicalSet. ∀A:{X ⊢ _}. ∀a,b:{X ⊢ _:A}. ∀I,K:Cname List. ∀f:name-morph(I;K). ∀alpha:X(I). ∀w:I-path(X;A;a;b;I;alpha).
  (I-path-morph(X;A;I;K;f;alpha;w) ∈ I-path(X;A;a;b;K;f(alpha)))

Definition: path-eq
path-eq(X;A;I;alpha;p;q) ==
  let z,w 
  in let z',w' 
     in (w iota(z)(alpha) rename-one-name(z;z')) w' ∈ A(iota(z')(alpha))

Lemma: path-eq_wf
[X:CubicalSet]. ∀[A:{X ⊢ _}]. ∀[a,b:{X ⊢ _:A}]. ∀[I:Cname List]. ∀[alpha:X(I)]. ∀[p,q:I-path(X;A;a;b;I;alpha)].
  (path-eq(X;A;I;alpha;p;q) ∈ ℙ)

Lemma: path-eq-equiv
[X:CubicalSet]. ∀[A:{X ⊢ _}]. ∀[a,b:{X ⊢ _:A}]. ∀[I:Cname List]. ∀[alpha:X(I)].
  EquivRel(I-path(X;A;a;b;I;alpha);p,q.path-eq(X;A;I;alpha;p;q))

Lemma: path-eq_weakening
[X:CubicalSet]. ∀[A:{X ⊢ _}]. ∀[a,b:{X ⊢ _:A}]. ∀[I:Cname List]. ∀[alpha:X(I)].
  ∀p,q:I-path(X;A;a;b;I;alpha).  path-eq(X;A;I;alpha;p;q) supposing q ∈ I-path(X;A;a;b;I;alpha)

Lemma: path-eq-same-name
[X:CubicalSet]. ∀[A:{X ⊢ _}]. ∀[a,b:{X ⊢ _:A}]. ∀[I:Cname List]. ∀[alpha:X(I)].
  ∀p,q:I-path(X;A;a;b;I;alpha).
    path-eq(X;A;I;alpha;p;q) ⇐⇒ q ∈ I-path(X;A;a;b;I;alpha) supposing (fst(p)) (fst(q)) ∈ Cname

Lemma: I-path-morph_functionality
X:CubicalSet. ∀A:{X ⊢ _}. ∀a,b:{X ⊢ _:A}. ∀I,K:Cname List. ∀f:name-morph(I;K). ∀alpha:X(I).
p,q:I-path(X;A;a;b;I;alpha).
  (path-eq(X;A;I;alpha;p;q)  path-eq(X;A;K;f(alpha);I-path-morph(X;A;I;K;f;alpha;p);I-path-morph(X;A;I;K;f;alpha;q)))

Definition: cubical-path
cubical-path(X;A;a;b;I;alpha) ==  p,q:I-path(X;A;a;b;I;alpha)//path-eq(X;A;I;alpha;p;q)

Lemma: cubical-path_wf
[X:CubicalSet]. ∀[A:{X ⊢ _}]. ∀[a,b:{X ⊢ _:A}]. ∀[I:Cname List]. ∀[alpha:X(I)].  (cubical-path(X;A;a;b;I;alpha) ∈ Type)

Lemma: cubical-path-same-name
[X:CubicalSet]. ∀[A:{X ⊢ _}]. ∀[a,b:{X ⊢ _:A}]. ∀[I:Cname List]. ∀[alpha:X(I)]. ∀[p,q:I-path(X;A;a;b;I;alpha)].
  (((fst(p)) (fst(q)) ∈ Cname)  (p q ∈ cubical-path(X;A;a;b;I;alpha))  (p q ∈ I-path(X;A;a;b;I;alpha)))

Lemma: I-path-morph_wf2
X:CubicalSet. ∀A:{X ⊢ _}. ∀a,b:{X ⊢ _:A}. ∀I,K:Cname List. ∀f:name-morph(I;K). ∀alpha:X(I).
w:cubical-path(X;A;a;b;I;alpha).
  (I-path-morph(X;A;I;K;f;alpha;w) ∈ cubical-path(X;A;a;b;K;f(alpha)))

Lemma: I-path-morph-id
X:CubicalSet. ∀A:{X ⊢ _}. ∀a,b:{X ⊢ _:A}. ∀I:Cname List. ∀alpha:X(I). ∀w:cubical-path(X;A;a;b;I;alpha).
  (I-path-morph(X;A;I;I;1;alpha;w) w ∈ cubical-path(X;A;a;b;I;alpha))

Lemma: I-path-morph-comp
X:CubicalSet. ∀A:{X ⊢ _}. ∀a,b:{X ⊢ _:A}. ∀I,J,K:Cname List. ∀f:name-morph(I;J). ∀g:name-morph(J;K). ∀alpha:X(I).
u:cubical-path(X;A;a;b;I;alpha).
  (I-path-morph(X;A;I;K;(f g);alpha;u)
  I-path-morph(X;A;J;K;g;f(alpha);I-path-morph(X;A;I;J;f;alpha;u))
  ∈ cubical-path(X;A;a;b;K;(f g)(alpha)))

Definition: cubical-identity
(Id_A b) ==  <λI,alpha. cubical-path(X;A;a;b;I;alpha), λI,K,f,alpha,p. I-path-morph(X;A;I;K;f;alpha;p)>

Lemma: cubical-identity_wf
[X:CubicalSet]. ∀[A:{X ⊢ _}]. ∀[a,b:{X ⊢ _:A}].  X ⊢ (Id_A b)

Lemma: equal-cubical-identity-at
[X:CubicalSet]. ∀[A:{X ⊢ _}]. ∀[a,b:{X ⊢ _:A}]. ∀[I:Cname List]. ∀[alpha:X(I)]. ∀[p,q:I-path(X;A;a;b;I;alpha)].
  q ∈ (Id_A b)(alpha) supposing path-eq(X;A;I;alpha;p;q)

Definition: set-path-name
set-path-name(X;A;I;alpha;x;p) ==  let z,w in <x, named-path-morph(X;A;I;I;z;x;1;alpha;w)>

Lemma: set-path-name_wf
X:CubicalSet. ∀A:{X ⊢ _}. ∀a,b:{X ⊢ _:A}. ∀I:Cname List. ∀alpha:X(I).
  ∀[x:{x:Cname| ¬(x ∈ I)} ]
    ∀p:(Id_A b)(alpha)
      (set-path-name(X;A;I;alpha;x;p) ∈ {q:I-path(X;A;a;b;I;alpha)| 
                                         ((fst(q)) x ∈ Cname) ∧ (q p ∈ (Id_A b)(alpha))} )

Definition: lift-id-face
lift-id-face(X;A;I;alpha;face) ==
  let y,c,w face in 
  <y, c, snd(set-path-name(X;A;I-[y];(y:=c)(alpha);fresh-cname(I);w))>

Lemma: lift-id-face_wf
[X:CubicalSet]. ∀[A:{X ⊢ _}]. ∀[a,b:{X ⊢ _:A}]. ∀[I:Cname List]. ∀[alpha:X(I)]. ∀[face:A-face(X;(Id_A b);I;alpha)].
  (lift-id-face(X;A;I;alpha;face) ∈ A-face(X;A;I+;iota'(I)(alpha)))

Definition: lift-id-faces
lift-id-faces(X;A;I;alpha;box) ==  map(λface.lift-id-face(X;A;I;alpha;face);box)

Lemma: lift-id-faces-wf
[X:CubicalSet]. ∀[A:{X ⊢ _}]. ∀[a,b:{X ⊢ _:A}]. ∀[I:Cname List]. ∀[J:nameset(I) List]. ∀[x:nameset(I)]. ∀[i:ℕ2].
[alpha:X(I)]. ∀[box:A-open-box(X;(Id_A b);I;alpha;J;x;i)].
  (lift-id-faces(X;A;I;alpha;box) ∈ A-open-box(X;A;I+;iota'(I)(alpha);J;x;i))

Lemma: lift-id-faces_wf
[X:CubicalSet]. ∀[A:{X ⊢ _}]. ∀[a,b:{X ⊢ _:A}]. ∀[I:Cname List]. ∀[J:nameset(I) List]. ∀[x:nameset(I)]. ∀[i:ℕ2].
[alpha:X(I)]. ∀[box:A-open-box(X;(Id_A b);I;alpha;J;x;i)].
  (lift-id-faces(X;A;I;alpha;box) ∈ A-open-box(X;A;[fresh-cname(I) I];iota(fresh-cname(I))(alpha);J;x;i))

Definition: term-A-face
This makes a <y,i>-face  (where is fresh(I))  that is equal to the
given cubical term, a.⋅

term-A-face(a;I;alpha;i) ==  <fresh-cname(I), i, a(alpha)>

Lemma: term-A-face_wf
[X:CubicalSet]. ∀[A:{X ⊢ _}]. ∀[a:{X ⊢ _:A}]. ∀[I:Cname List]. ∀[alpha:X(I)]. ∀[i:ℕ2].
  (term-A-face(a;I;alpha;i) ∈ A-face(X;A;[fresh-cname(I) I];iota(fresh-cname(I))(alpha)))

Definition: cubical-id-box
cubical-id-box(X;A;a;b;I;alpha;box) ==
  extend-A-open-box(lift-id-faces(X;A;I;alpha;box);term-A-face(a;I;alpha;0);term-A-face(b;I;alpha;1))

Lemma: cubical-id-box_wf
[X:CubicalSet]. ∀[A:{X ⊢ _}]. ∀[a,b:{X ⊢ _:A}]. ∀[I:Cname List]. ∀[J:nameset(I) List]. ∀[x:nameset(I)]. ∀[i:ℕ2].
[alpha:X(I)]. ∀[box:A-open-box(X;(Id_A b);I;alpha;J;x;i)].
  (cubical-id-box(X;A;a;b;I;alpha;box) ∈ A-open-box(X;A;[fresh-cname(I) 
                                                         I];iota(fresh-cname(I))(alpha);[fresh-cname(I) J];x;i))

Comment: Kan structure on Id_A a b
We need the Kan structure on (Id_A b).

If bx is an open box in (Id_A b)(alpha) then it is list of faces
<y,c,w> with in ⌜(Id_A b)((y:=c)(alpha))⌝

If we take fresh-cname(I) then ⌜¬(x ∈ I)⌝ so 
trivially,  ⌜¬(x ∈ I-[y])⌝
so we can use set-path-name(X;A;I;alpha;x;w)
to change into an equal w' with ⌜(fst(w')) x⌝.

We use this to 
define lift-id-face
that converts an A-face(X;(Id_A b);I;alpha)
to an A-face(X;A;I+;iota'(I)(alpha)).

If we do this to each face in bx, we get an open box (with parameters J)
  lift-id-faces-wf  (proof is quite long!)
in A(iota'(I)(alpha))

Now we extend this to an open box with parameters ⌜[fresh-cname(I) J]⌝
by adding the bottom and top faces corresponding to a(alpha) and b(alpha)
to get: cubical-id-box
        cubical-id-box_wf 

We can use the Kanfiller for A
to fill it with cube c  

Then  the pair <fresh-cname(I),c> fills the original bx in (Id_A b)(alpha)
Kan_id_filler.
Kan_id_filler_wf

Then we have to show that this filler satisfies the uniformity condition:
  Kan_id_filler_uniform   (very long proof!! can it be improved?)

Putting these together we get the identity type with uniform Kan structure:
Kan-cubical-identity
Kan-cubical-identity_wf.⋅

Definition: Kan_id_filler
Kan_id_filler(X;A;a;b) ==  λI,alpha,J,x,i,bx. <fresh-cname(I), filler(x;i;cubical-id-box(X;Kan-type(A);a;b;I;alpha;bx))>

Lemma: Kan_id_filler_wf1
X:CubicalSet. ∀A:{X ⊢ _(Kan)}. ∀a,b:{X ⊢ _:Kan-type(A)}.
  (Kan_id_filler(X;A;a;b) ∈ I:(Cname List)
   ⟶ alpha:X(I)
   ⟶ J:(nameset(I) List)
   ⟶ x:nameset(I)
   ⟶ i:ℕ2
   ⟶ A-open-box(X;(Id_Kan-type(A) b);I;alpha;J;x;i)
   ⟶ I-path(X;Kan-type(A);a;b;I;alpha))

Lemma: Kan_id_filler_wf
X:CubicalSet. ∀A:{X ⊢ _(Kan)}. ∀a,b:{X ⊢ _:Kan-type(A)}.
  (Kan_id_filler(X;A;a;b) ∈ {filler:I:(Cname List)
                             ⟶ alpha:X(I)
                             ⟶ J:(nameset(I) List)
                             ⟶ x:nameset(I)
                             ⟶ i:ℕ2
                             ⟶ A-open-box(X;(Id_Kan-type(A) b);I;alpha;J;x;i)
                             ⟶ (Id_Kan-type(A) b)(alpha)| 
                             Kan-A-filler(X;(Id_Kan-type(A) b);filler)} )

Lemma: Kan_id_filler_uniform
X:CubicalSet. ∀A:{X ⊢ _(Kan)}. ∀a,b:{X ⊢ _:Kan-type(A)}.
  uniform-Kan-A-filler(X;(Id_Kan-type(A) b);Kan_id_filler(X;A;a;b))

Definition: Kan-cubical-identity
Kan(Id_A b) ==  <(Id_Kan-type(A) b), Kan_id_filler(X;A;a;b)>

Lemma: Kan-cubical-identity_wf
[X:CubicalSet]. ∀[A:{X ⊢ _(Kan)}]. ∀[a,b:{X ⊢ _:Kan-type(A)}].  (Kan(Id_A b) ∈ {X ⊢ _(Kan)})

Lemma: csm-I-path
X,Delta:CubicalSet. ∀s:Delta ⟶ X. ∀A:{X ⊢ _}. ∀a,b:{X ⊢ _:A}. ∀I:Cname List. ∀alpha:Delta(I).
  (I-path(Delta;(A)s;(a)s;(b)s;I;alpha) I-path(X;A;a;b;I;(s)alpha) ∈ Type)

Lemma: csm-cubical-identity
X,Delta:CubicalSet. ∀s:Delta ⟶ X. ∀A:{X ⊢ _}. ∀a,b:{X ⊢ _:A}.
  (((Id_A b))s
  (Id_(A)s (a)s (b)s)
  ∈ (A:I:(Cname List) ⟶ Delta(I) ⟶ Type × (I:(Cname List)
                                            ⟶ J:(Cname List)
                                            ⟶ f:name-morph(I;J)
                                            ⟶ a:Delta(I)
                                            ⟶ (A a)
                                            ⟶ (A f(a)))))

Lemma: csm-Kan-cubical-identity
[X,Delta:CubicalSet]. ∀[s:Delta ⟶ X]. ∀[A:{X ⊢ _(Kan)}]. ∀[a,b:{X ⊢ _:Kan-type(A)}].
  ((Kan(Id_A b))s Kan(Id_(A)s (a)s (b)s) ∈ {Delta ⊢ _(Kan)})

Definition: refl-path
refl-path(A;a;I;alpha) ==  <fresh-cname(I), (a alpha alpha iota'(I))>

Lemma: refl-path_wf
X:CubicalSet. ∀A:{X ⊢ _}. ∀a:{X ⊢ _:A}. ∀I:Cname List. ∀alpha:X(I).  (refl-path(A;a;I;alpha) ∈ I-path(X;A;a;a;I;alpha))

Definition: cubical-refl
refl(a) ==  λI,alpha. refl-path(A;a;I;alpha)

Lemma: cubical-refl_wf
[X:CubicalSet]. ∀[A:{X ⊢ _}]. ∀[a:{X ⊢ _:A}].  (refl(a) ∈ {X ⊢ _:(Id_A a)})

Definition: cubical-universe
c𝕌 ==  <λI.{unit-cube(I) ⊢ _(Kan)}, λI,J,f,AK. (AK)unit-cube-map(f)>

Lemma: cubical-universe_wf
c𝕌 ∈ CubicalSet'

Lemma: cubical-universe-I-cube
[I:Cname List]
  (c𝕌(I) {p:AF:{AF:A:L:(Cname List) ⟶ name-morph(I;L) ⟶ Type × (L:(Cname List)
                                                                   ⟶ J:(Cname List)
                                                                   ⟶ f:name-morph(L;J)
                                                                   ⟶ a:name-morph(I;L)
                                                                   ⟶ (A a)
                                                                   ⟶ (A (a f)))| 
                  let A,F AF 
                  in (∀K:Cname List. ∀a:name-morph(I;K). ∀u:A a.  ((F u) u ∈ (A a)))
                     ∧ (∀L,J,K:Cname List. ∀f:name-morph(L;J). ∀g:name-morph(J;K). ∀a:name-morph(I;L). ∀u:A a.
                          ((F (f g) u) (F (a f) (F u)) ∈ (A (a (f g)))))} 
            × (L:(Cname List)
              ⟶ f:name-morph(I;L)
              ⟶ J:(nameset(L) List)
              ⟶ x:nameset(L)
              ⟶ i:ℕ2
              ⟶ A-open-box(unit-cube(I);AF;L;f;J;x;i)
              ⟶ ((fst(AF)) f))| 
            let AF,filler 
            in Kan-A-filler(unit-cube(I);AF;filler) ∧ uniform-Kan-A-filler(unit-cube(I);AF;filler)} )

Definition: cu-cube-family
cu-cube-family(alpha;L;f) ==  (fst(fst(alpha))) f

Lemma: cu-cube-family_wf
[I:Cname List]. ∀[alpha:c𝕌(I)]. ∀[L:Cname List]. ∀[f:name-morph(I;L)].  (cu-cube-family(alpha;L;f) ∈ Type)

Lemma: cu-cube-family-Kan-type-at
[alpha,L,f:Top].  (cu-cube-family(alpha;L;f) Kan-type(alpha)(f))

Lemma: cu-cube-family-comp
[I:Cname List]. ∀[alpha:c𝕌(I)]. ∀[J,L,f,g:Top].  (cu-cube-family(alpha;L;(f g)) cu-cube-family(f(alpha);L;g))

Definition: cu-cube-restriction
cu-cube-restriction(alpha;L;J;f;a;T) ==  (snd(fst(alpha))) T

Lemma: cu-cube-restriction_wf
[I:Cname List]. ∀[alpha:c𝕌(I)]. ∀[L,J:Cname List]. ∀[f:name-morph(L;J)]. ∀[a:name-morph(I;L)].
[T:cu-cube-family(alpha;L;a)].
  (cu-cube-restriction(alpha;L;J;f;a;T) ∈ cu-cube-family(alpha;J;(a f)))

Lemma: cu-cube-restriction-id
[I:Cname List]. ∀[alpha:c𝕌(I)]. ∀[K:Cname List]. ∀[a:name-morph(I;K)]. ∀[T:cu-cube-family(alpha;K;a)].
  (cu-cube-restriction(alpha;K;K;1;a;T) T ∈ cu-cube-family(alpha;K;a))

Lemma: cu-cube-restriction-comp
[I:Cname List]. ∀[alpha:c𝕌(I)]. ∀[L,J,K:Cname List]. ∀[f:name-morph(L;J)]. ∀[g:name-morph(J;K)]. ∀[a:name-morph(I;L)].
[T:cu-cube-family(alpha;L;a)].
  (cu-cube-restriction(alpha;J;K;g;(a f);cu-cube-restriction(alpha;L;J;f;a;T))
  cu-cube-restriction(alpha;L;K;(f g);a;T)
  ∈ cu-cube-family(alpha;K;(a (f g))))

Definition: cu-cube-filler
cu-cube-filler(alpha) ==  snd(alpha)

Lemma: cu-cube-filler_wf
[I:Cname List]. ∀[alpha:c𝕌(I)].
  (cu-cube-filler(alpha) ∈ L:(Cname List)
   ⟶ f:name-morph(I;L)
   ⟶ J:(nameset(L) List)
   ⟶ x:nameset(L)
   ⟶ i:ℕ2
   ⟶ A-open-box(unit-cube(I);Kan-type(alpha);L;f;J;x;i)
   ⟶ cu-cube-family(alpha;L;f))

Lemma: cu-cube-filler-fills
[I:Cname List]. ∀[alpha:c𝕌(I)]. ∀[L:Cname List]. ∀[f:name-morph(I;L)]. ∀[J:nameset(L) List]. ∀[x:nameset(L)]. ∀[i:ℕ2].
[box:A-open-box(unit-cube(I);Kan-type(alpha);L;f;J;x;i)].
  Kan-A-filler(unit-cube(I);Kan-type(alpha);cu-cube-filler(alpha))

Lemma: cu-cube-filler-uniform
[I:Cname List]. ∀[alpha:c𝕌(I)]. ∀[L:Cname List]. ∀[f:name-morph(I;L)]. ∀[J:nameset(L) List]. ∀[x:nameset(L)]. ∀[i:ℕ2].
[box:A-open-box(unit-cube(I);Kan-type(alpha);L;f;J;x;i)].
  uniform-Kan-A-filler(unit-cube(I);Kan-type(alpha);cu-cube-filler(alpha))

Definition: cu-box-in-box
cu-box-in-box(I;box) ==
  {u:i:ℕ||box|| ⟶ cu-cube-family(cube(box[i]);I-[dimension(box[i])];1)| 
   ∀i,j:ℕ||box||.
     ((¬(dimension(box[i]) dimension(box[j]) ∈ Cname))
      (cu-cube-restriction(cube(box[i]);I-[dimension(box[i])];I-[dimension(box[i]); dimension(box[j])];
                             (dimension(box[j]):=direction(box[j]));1;u i)
        cu-cube-restriction(cube(box[j]);I-[dimension(box[j])];I-[dimension(box[j]); dimension(box[i])];
                              (dimension(box[i]):=direction(box[i]));1;u j)
        ∈ cu-cube-family(cube(box[i]);I-[dimension(box[i]);
                                         dimension(box[j])];(1 (dimension(box[j]):=direction(box[j]))))))} 

Lemma: cu-box-in-box_wf
[I:Cname List]. ∀[J:nameset(I) List]. ∀[x:nameset(I)]. ∀[d:ℕ2]. ∀[box:open_box(c𝕌;I;J;x;d)].
  (cu-box-in-box(I;box) ∈ Type)

Lemma: cu-filler-cases
I:Cname List. ∀J:nameset(I) List. ∀K:Cname List. ∀x:nameset(I). ∀f:name-morph(I-[x];K). ∀i:ℕ2.
box:open_box(c𝕌;I;J;x;i).
  ((J ∈ nameset(J) List)
  ∧ (nameset(J) ⊆nameset(I-[x]))
  ∧ ((∃y:nameset(J) [((y ∈ J) ∧ (↑¬bisname(f y)) ∧ (l-first(y.¬bisname(f y);J) inl y))])
    ∨ (((∀y∈J.¬↑¬bisname(f y)) ∧ (↑isr(l-first(y.¬bisname(f y);J))))
      ∧ (f[x:=fresh-cname(K)] ∈ name-morph(I;[fresh-cname(K) K]))
      ∧ (nameset([x J]) ⊆nameset(I))
      ∧ (∀z:nameset([x J]). (↑isname(f[x:=fresh-cname(K)] z)))
      ∧ (f[x:=fresh-cname(K)] ∈ nameset([x J]) ⟶ nameset([fresh-cname(K) K]))
      ∧ (x ∈ nameset([x J]))
      ∧ (nameset([x J]) ⊆name-morph-domain(f[x:=fresh-cname(K)];I)))))

Definition: cu_filler_1
cu_filler_1{i:l}(I;J;K;f;x;i;box) ==
  case l-first(y.¬bisname(f y);J)
   of inl(y) =>
   cu-cube-family(cube(get_face(y;f y;box));K;((x:=i) f))
   inr(_) =>
   cu-box-in-box([fresh-cname(K) K];open_box_image(c𝕌;I;[fresh-cname(K) K];f[x:=fresh-cname(K)];box))

Lemma: cu_filler_1_wf
[I:Cname List]. ∀[J:nameset(I) List]. ∀[K:Cname List]. ∀[x:nameset(I)]. ∀[f:name-morph(I-[x];K)]. ∀[i:ℕ2].
[box:open_box(c𝕌;I;J;x;i)].
  (cu_filler_1{i:l}(I;J;K;f;x;i;box) ∈ Type)

Definition: cu_filler_2
cu_filler_2(J;K;L;f;g;x;i;box;X) ==
  case l-first(y.¬bisname(f y);J)
   of inl(y) =>
   cu-cube-restriction(cube(get_face(y;f y;box));K;L;g;((x:=i) f);X)
   inr(_) =>
   case l-first(y.¬bisname((f g) y);J) of inl(y) => 44 inr(_) => 55



Home Index