{-# OPTIONS
  --without-K
  --prop
  --rewriting
  --confluence-check
#-}

module TT.SSC.Tel where

open import TT.Lib
open import TT.SSC.Syntax
open import TT.SSC.Path

private variable
  i i₀ i₁ : 
  Γ Δ : Con
  A A₀ A₁ : Ty Γ i

infixl 2 _++_
data Tel (Γ : Con) : Set
_++_ : (Γ : Con)  Tel Γ  Con

infixl 2 _▹_
data Tel Γ where
   : Tel Γ
  _▹_ : (Ω : Tel Γ)  Ty (Γ ++ Ω) i  Tel Γ

Γ ++  = Γ
Γ ++ (Ω  A) = (Γ ++ Ω)  A

private variable
  Ω Ω₀ Ω₁ : Tel Γ

infixl 9 _[_]ᵀˡ
infixl 10 _⁺^
_[_]ᵀˡ : Tel Γ  Sub Δ Γ  Tel Δ
_⁺^ : (γ : Sub Δ Γ)  Sub (Δ ++ Ω [ γ ]ᵀˡ) (Γ ++ Ω)

 [ γ ]ᵀˡ = 
(Ω  A) [ γ ]ᵀˡ = Ω [ γ ]ᵀˡ  A [ γ ⁺^ ]ᵀ

_⁺^ {Ω = } γ = γ
_⁺^ {Ω = Ω  A} γ = γ ⁺^ 

infixl 9 _[_]ᵀˡ*
infixl 10 _⁺^*
_[_]ᵀˡ* : Tel Γ  Sub* Δ Γ  Tel Δ
_⁺^* : (γ* : Sub* Δ Γ)  Sub* (Δ ++ Ω [ γ* ]ᵀˡ*) (Γ ++ Ω)

 [ γ* ]ᵀˡ* = 
(Ω  A) [ γ* ]ᵀˡ* = Ω [ γ* ]ᵀˡ*  A [ γ* ⁺^* ]ᵀ*

_⁺^* {Ω = } γ* = γ*
_⁺^* {Ω = Ω  A} γ* = γ* ⁺^* ⁺*

opaque
  unfolding coe

  ap-++ : Ω₀  Ω₁  (Γ ++ Ω₀)  (Γ ++ Ω₁)
  ap-++ refl = refl

  ap-▹ᵀˡ :
    (Ω₀₁ : Ω₀  Ω₁)  A₀ ≡[ ap-Ty (ap-++ Ω₀₁) ] A₁  (Ω₀  A₀)  (Ω₁  A₁)
  ap-▹ᵀˡ refl refl = refl

  ▹ᵀˡ-inj-Ω : (Ω₀  A₀)  (Ω₁  A₁)  Ω₀  Ω₁
  ▹ᵀˡ-inj-Ω refl = refl

  ▹ᵀˡ-inj-i :
    {A₀ : Ty (Γ ++ Ω₀) i₀} {A₁ : Ty (Γ ++ Ω₁) i₁} 
    (Ω₀  A₀)  (Ω₁  A₁)  i₀  i₁
  ▹ᵀˡ-inj-i refl = refl

  ▹ᵀˡ-inj-A :
    (e : (Ω₀  A₀)  (Ω₁  A₁)) 
    A₀ ≡[ ap-Ty₂ (ap-++ (▹ᵀˡ-inj-Ω e)) (▹ᵀˡ-inj-i e) ] A₁
  ▹ᵀˡ-inj-A refl = refl