{-# OPTIONS --without-K #-}
module globular where
open import Data.Nat
open import Data.Maybe
open import Data.Sum
open import Data.Product
open import mctt
open import extract
data AllKinds : Cxt → Set where
AKε : AllKinds ε
AK,,k : {cxt : Cxt} → AllKinds cxt → (k : Kind cxt) → AllKinds (cxt ,, k)
data FirstTy : Cxt → Set where
FT,t₁ : {cxt : Cxt} → AllKinds cxt → (t : Ty cxt) → FirstTy (cxt , t)
FT,t₊ : {cxt : Cxt} → FirstTy cxt → (t : Ty cxt) → FirstTy (cxt , t)
FT,,k : {cxt : Cxt} → FirstTy cxt → (k : Kind cxt) → FirstTy (cxt ,, k)
AK⊎FT : (cxt : Cxt) → AllKinds cxt ⊎ FirstTy cxt
AK⊎FT ε = inj₁ AKε
AK⊎FT (cxt , t) = helper (AK⊎FT cxt) where
helper : AllKinds cxt ⊎ FirstTy cxt → AllKinds (cxt , t) ⊎ FirstTy (cxt , t)
helper (inj₁ ak) = inj₂ (FT,t₁ ak t)
helper (inj₂ ft) = inj₂ (FT,t₊ ft t)
AK⊎FT (cxt ,, k) = helper (AK⊎FT cxt) where
helper : AllKinds cxt ⊎ FirstTy cxt → AllKinds (cxt ,, k) ⊎ FirstTy (cxt ,, k)
helper (inj₁ ak) = inj₁ (AK,,k ak k)
helper (inj₂ ft) = inj₂ (FT,,k ft k)
gcxt : Cxt → Cxt
gcxt? : (cxt : Cxt) → AllKinds cxt ⊎ FirstTy cxt → Cxt
gcxt cxt = gcxt? cxt (AK⊎FT cxt)
gcxt-ak : (cxt : Cxt) → AllKinds cxt → Cxt
gnewty₁-ak : (cxt : Cxt) → (ak : AllKinds cxt) → Ty (gcxt-ak cxt ak)
gnewty₂-ak : (cxt : Cxt) → (ak : AllKinds cxt) → Ty (gcxt-ak cxt ak , gnewty₁-ak cxt ak)
gcxt-ft : (cxt : Cxt) → FirstTy cxt → Cxt
gcxt? cxt (inj₁ ak) = ((gcxt-ak cxt ak , gnewty₁-ak cxt ak) , gnewty₂-ak cxt ak)
gcxt? cxt (inj₂ ft) = (gcxt-ft cxt ft)
gkind : {cxt : Cxt} → (k : Kind cxt) → Kind (gcxt cxt)
gkind? : {cxt : Cxt} → (akft : AllKinds cxt ⊎ FirstTy cxt) → (k : Kind cxt) → Kind (gcxt? cxt akft)
gkind {cxt} k = gkind? (AK⊎FT cxt) k
gty : {cxt : Cxt} → (t : Ty cxt) → Ty (gcxt cxt)
gty? : {cxt : Cxt} → (akft : AllKinds cxt ⊎ FirstTy cxt) → (t : Ty cxt) → Ty (gcxt? cxt akft)
gty {cxt} t = gty? (AK⊎FT cxt) t
gcxt-ak .ε AKε = (ε ,, U)
gcxt-ak .(cxt ,, k) (AK,,k {cxt} ak k) =
(gcxt-ak cxt ak ,, Π (gnewty₁-ak cxt ak) (Π (gnewty₂-ak cxt ak) (gkind? (inj₁ ak) k)))
ΠΠgkind? : {cxt : Cxt} → (ak : AllKinds cxt) → Kind cxt → Kind (gcxt-ak cxt ak)
ΠΠgkind? {cxt} ak k = Π (gnewty₁-ak cxt ak) (Π (gnewty₂-ak cxt ak) (gkind? (inj₁ ak) k))
gnewty₁-ak .ε AKε = (el (coe (U[] (kpop U)) ktop))
gnewty₁-ak .(cxt ,, k) (AK,,k {cxt} ak k) = gnewty₁-ak cxt ak [ kpop (ΠΠgkind? ak k) ]
gnewty₂-ak cxt ak = gnewty₁-ak cxt ak [ tpop (gnewty₁-ak cxt ak) ]
gcxt-ft .(cxt , t) (FT,t₁ {cxt} ak t) =
(((gcxt-ak cxt ak , gnewty₁-ak cxt ak) , gnewty₂-ak cxt ak) , gty? (inj₁ ak) t)
gcxt-ft .(cxt , t) (FT,t₊ {cxt} ft t) = (gcxt-ft cxt ft , gty? (inj₂ ft) t)
gcxt-ft .(cxt ,, k) (FT,,k {cxt} ft k) = (gcxt-ft cxt ft ,, gkind? (inj₂ ft) k)
gcxt-sub? : (cxt : Cxt) → (akft : AllKinds cxt ⊎ FirstTy cxt) → Sub (gcxt? cxt akft) cxt
gkind? {cxt} akft k = k [ gcxt-sub? cxt akft ]
gty? {cxt} akft t = t [ gcxt-sub? cxt akft ]
gcxt-sub? .ε (inj₁ AKε) = (kpop U
∘ tpop (el (coe (U[] (kpop U)) ktop)))
∘ tpop (el (coe (U[] (kpop U)) ktop) [ tpop (el (coe (U[] (kpop U)) ktop)) ])
gcxt-sub? .(cxt ,, k) (inj₁ (AK,,k {cxt} ak k)) =
(gcxt-sub? cxt (inj₁ ak)
∘ (kpop (ΠΠgkind? ak k) <id (gnewty₁-ak cxt ak) <id (gnewty₂-ak cxt ak))
∘ (_ id<≡ (ktpop≡ (gnewty₁-ak cxt ak) (ΠΠgkind? ak k) (gnewty₁-ak cxt ak))))
≪ coe (k[∘] _ _ _)
((coe (k[∘] _ _ _)
(ap (coe (Π[] (gnewty₂-ak cxt ak) (k [ gcxt-sub? cxt (inj₁ ak) ])
(kpop (ΠΠgkind? ak k) <id gnewty₁-ak cxt ak))
(ap (coe (Π[] _ _ (kpop (ΠΠgkind? ak k))) ktop)))))
[ (gcxt-ak cxt ak ,, ΠΠgkind? ak k , gnewty₁-ak cxt ak [ kpop (ΠΠgkind? ak k) ])
id<≡ (ktpop≡ (gnewty₁-ak cxt ak) (ΠΠgkind? ak k) (gnewty₁-ak cxt ak))
])
gcxt-sub? .(cxt , t) (inj₂ (FT,t₁ {cxt} ak t)) = gcxt-sub? cxt (inj₁ ak) <id t
gcxt-sub? .(cxt , t) (inj₂ (FT,t₊ {cxt} ft t)) = gcxt-sub? cxt (inj₂ ft) <id t
gcxt-sub? .(cxt ,, k) (inj₂ (FT,,k {cxt} ft k)) = gcxt-sub? cxt (inj₂ ft) ≪id k
gcxt-ak-ak : (cxt : Cxt) → (ak : AllKinds cxt) → AllKinds (gcxt-ak cxt ak)
gcxt-ak-ak .ε AKε = AK,,k AKε U
gcxt-ak-ak .(cxt ,, k) (AK,,k {cxt} ak k) = AK,,k (gcxt-ak-ak cxt ak) (ΠΠgkind? ak k)
glob : ℕ → Cxt
glob-ak : (n : ℕ) → AllKinds (glob n)
glob 0 = ε
glob (suc n) = gcxt-ak (glob n) (glob-ak n)
glob-ak 0 = AKε
glob-ak (suc n) = gcxt-ak-ak (glob n) (glob-ak n)