{-# OPTIONS --without-K --prop --rewriting --confluence-check --hidden-argument-puns #-} module TT.SSC.Lift where open import TT.Lib open import TT.SSC.Syntax open import TT.SSC.Path open import TT.SSC.Tel open import TT.SSC.AlphaNorm private variable i : ℕ Γ Δ : Con A B : Ty Γ i a b : Tm Γ A Ω : Tel Γ module _ (γ*₀ γ*₁ : Sub* Δ Γ) (γ*₀₁ᵀ : ∀ {i} {A : Ty Γ i} → A [ γ*₀ ]ᵀ* ≡ A [ γ*₁ ]ᵀ*) where []ᵀ→⁺^ᵀᵛ : (Ω-γ*₀₁ : Ω [ γ*₀ ]ᵀˡ* ≡ Ω [ γ*₁ ]ᵀˡ*) → Var (Γ ++ Ω) A a → A [ γ*₀ ⁺^* ]ᵀ* ≡[ ap-Ty (ap-++ Ω-γ*₀₁) ] A [ γ*₁ ⁺^* ]ᵀ* []ᵀ→⁺^ᵀᵛ {Ω = ◇} ◇-γ*₀₁ aᵛ = dep γ*₀₁ᵀ []ᵀ→⁺^ᵀᵛ {Ω = Ω ▹ A} Ω▹A-γ*₀₁ vz = dep (p-⁺ᵀ* (γ*₀ ⁺^*)) ∙ᵈ apᵈ-[]ᵀ (ap-++ (▹ᵀˡ-inj-Ω Ω▹A-γ*₀₁)) (▹ᵀˡ-inj-A Ω▹A-γ*₀₁) (ap-▹ (ap-++ (▹ᵀˡ-inj-Ω Ω▹A-γ*₀₁)) (▹ᵀˡ-inj-A Ω▹A-γ*₀₁)) (apᵈ-p (ap-++ (▹ᵀˡ-inj-Ω Ω▹A-γ*₀₁)) (▹ᵀˡ-inj-A Ω▹A-γ*₀₁)) ∙ᵈ dep (sym (p-⁺ᵀ* (γ*₁ ⁺^*))) []ᵀ→⁺^ᵀᵛ {Ω = Ω ▹ A} Ω▹A-γ*₀₁ (vs bᵛ) = dep (p-⁺ᵀ* (γ*₀ ⁺^*)) ∙ᵈ apᵈ-[]ᵀ (ap-++ (▹ᵀˡ-inj-Ω Ω▹A-γ*₀₁)) ([]ᵀ→⁺^ᵀᵛ (▹ᵀˡ-inj-Ω Ω▹A-γ*₀₁) bᵛ) (ap-▹ (ap-++ (▹ᵀˡ-inj-Ω Ω▹A-γ*₀₁)) (▹ᵀˡ-inj-A Ω▹A-γ*₀₁)) (apᵈ-p (ap-++ (▹ᵀˡ-inj-Ω Ω▹A-γ*₀₁)) (▹ᵀˡ-inj-A Ω▹A-γ*₀₁)) ∙ᵈ dep (sym (p-⁺ᵀ* (γ*₁ ⁺^*))) module []ᵛ→⁺^ (γ*₀ γ*₁ : Sub* Δ Γ) (γ*₀₁ᵀ : ∀ {i} {A : Ty Γ i} → A [ γ*₀ ]ᵀ* ≡ A [ γ*₁ ]ᵀ*) (γ*₀₁ᵛ : ∀ {i} {A : Ty Γ i} {a} (aᵛ : Var Γ A a) → a [ γ*₀ ]ᵗ* ≡[ ap-Tm γ*₀₁ᵀ ] a [ γ*₁ ]ᵗ*) where private []ᵛ→⁺^ᵛ₀ : ∀ {A : Ty (Γ ++ Ω) i} {a} (Ω-γ*₀₁ : Ω [ γ*₀ ]ᵀˡ* ≡ Ω [ γ*₁ ]ᵀˡ*) (aᵛ : Var (Γ ++ Ω) A a) → a [ γ*₀ ⁺^* ]ᵗ* ≡[ ap-Tm₂ (ap-++ Ω-γ*₀₁) ([]ᵀ→⁺^ᵀᵛ γ*₀ γ*₁ γ*₀₁ᵀ Ω-γ*₀₁ aᵛ) ] a [ γ*₁ ⁺^* ]ᵗ* []ᵛ→⁺^ᵛ₀ {Ω = ◇} ◇-γ*₀₁ aᵛ = γ*₀₁ᵛ aᵛ []ᵛ→⁺^ᵛ₀ {Ω = Ω ▹ A} Ω▹A-γ*₀₁ vz = q-⁺* (γ*₀ ⁺^*) ∙ᵈ apᵈ-q (ap-++ (▹ᵀˡ-inj-Ω Ω▹A-γ*₀₁)) (▹ᵀˡ-inj-A Ω▹A-γ*₀₁) ∙ᵈ symᵈ (q-⁺* (γ*₁ ⁺^*)) []ᵛ→⁺^ᵛ₀ {Ω = Ω ▹ A} Ω▹A-γ*₀₁ (vs bᵛ) = p-⁺ᵗ* (γ*₀ ⁺^*) ∙ᵈ apᵈ-[]ᵗ₅ (ap-++ (▹ᵀˡ-inj-Ω Ω▹A-γ*₀₁)) ([]ᵀ→⁺^ᵀᵛ γ*₀ γ*₁ γ*₀₁ᵀ (▹ᵀˡ-inj-Ω Ω▹A-γ*₀₁) bᵛ) ([]ᵛ→⁺^ᵛ₀ (▹ᵀˡ-inj-Ω Ω▹A-γ*₀₁) bᵛ) (ap-▹ (ap-++ (▹ᵀˡ-inj-Ω Ω▹A-γ*₀₁)) (▹ᵀˡ-inj-A Ω▹A-γ*₀₁)) (apᵈ-p (ap-++ (▹ᵀˡ-inj-Ω Ω▹A-γ*₀₁)) (▹ᵀˡ-inj-A Ω▹A-γ*₀₁)) ∙ᵈ symᵈ (p-⁺ᵗ* (γ*₁ ⁺^*)) []ᵛ→⁺^ᵀ₀ : (Ω-γ*₀₁ : Ω [ γ*₀ ]ᵀˡ* ≡ Ω [ γ*₁ ]ᵀˡ*) → NTy (Γ ++ Ω) i A → A [ γ*₀ ⁺^* ]ᵀ* ≡[ ap-Ty (ap-++ Ω-γ*₀₁) ] A [ γ*₁ ⁺^* ]ᵀ* []ᵛ→⁺^ᵀᵗ₀ : (Ω-γ*₀₁ : Ω [ γ*₀ ]ᵀˡ* ≡ Ω [ γ*₁ ]ᵀˡ*) → NTm (Γ ++ Ω) A a → A [ γ*₀ ⁺^* ]ᵀ* ≡[ ap-Ty (ap-++ Ω-γ*₀₁) ] A [ γ*₁ ⁺^* ]ᵀ* []ᵛ→⁺^ᵗ₀ : ∀ {A : Ty (Γ ++ Ω) i} {a} (Ω-γ*₀₁ : Ω [ γ*₀ ]ᵀˡ* ≡ Ω [ γ*₁ ]ᵀˡ*) (aᴺ : NTm (Γ ++ Ω) A a) → a [ γ*₀ ⁺^* ]ᵗ* ≡[ ap-Tm₂ (ap-++ Ω-γ*₀₁) ([]ᵛ→⁺^ᵀᵗ₀ Ω-γ*₀₁ aᴺ) ] a [ γ*₁ ⁺^* ]ᵗ* []ᵛ→⁺^ᵀ₀ Ω-γ*₀₁ (Uᴺ i) = dep (U-[]* (γ*₀ ⁺^*)) ∙ᵈ apᵈ-U (ap-++ Ω-γ*₀₁) ∙ᵈ dep (sym (U-[]* (γ*₁ ⁺^*))) []ᵛ→⁺^ᵀ₀ Ω-γ*₀₁ (Elᴺ αᴺ) = dep (El-[]* (γ*₀ ⁺^*)) ∙ᵈ apᵈ-El (ap-++ Ω-γ*₀₁) (splitlr ([]ᵛ→⁺^ᵗ₀ Ω-γ*₀₁ αᴺ)) ∙ᵈ dep (sym (El-[]* (γ*₁ ⁺^*))) []ᵛ→⁺^ᵀ₀ Ω-γ*₀₁ (Liftᴺ Aᴺ) = dep (Lift-[]* (γ*₀ ⁺^*)) ∙ᵈ apᵈ-Lift (ap-++ Ω-γ*₀₁) ([]ᵛ→⁺^ᵀ₀ Ω-γ*₀₁ Aᴺ) ∙ᵈ dep (sym (Lift-[]* (γ*₁ ⁺^*))) []ᵛ→⁺^ᵀ₀ Ω-γ*₀₁ (Πᴺ Aᴺ Bᴺ) = dep (Π-[]* (γ*₀ ⁺^*)) ∙ᵈ apᵈ-Π (ap-++ Ω-γ*₀₁) ([]ᵛ→⁺^ᵀ₀ Ω-γ*₀₁ Aᴺ) ([]ᵛ→⁺^ᵀ₀ (ap-▹ᵀˡ Ω-γ*₀₁ ([]ᵛ→⁺^ᵀ₀ Ω-γ*₀₁ Aᴺ)) Bᴺ) ∙ᵈ dep (sym (Π-[]* (γ*₁ ⁺^*))) []ᵛ→⁺^ᵀᵗ₀ Ω-γ*₀₁ (var aᵛ) = []ᵀ→⁺^ᵀᵛ γ*₀ γ*₁ γ*₀₁ᵀ Ω-γ*₀₁ aᵛ []ᵛ→⁺^ᵀᵗ₀ Ω-γ*₀₁ (cᴺ Aᴺ) = dep (U-[]* (γ*₀ ⁺^*)) ∙ᵈ apᵈ-U (ap-++ Ω-γ*₀₁) ∙ᵈ dep (sym (U-[]* (γ*₁ ⁺^*))) []ᵛ→⁺^ᵀᵗ₀ Ω-γ*₀₁ (lowerᴺ Aᴺ aᴺ) = []ᵛ→⁺^ᵀ₀ Ω-γ*₀₁ Aᴺ []ᵛ→⁺^ᵀᵗ₀ Ω-γ*₀₁ (liftᴺ _ aᴺ) = dep (Lift-[]* (γ*₀ ⁺^*)) ∙ᵈ apᵈ-Lift (ap-++ Ω-γ*₀₁) ([]ᵛ→⁺^ᵀᵗ₀ Ω-γ*₀₁ aᴺ) ∙ᵈ dep (sym (Lift-[]* (γ*₁ ⁺^*))) []ᵛ→⁺^ᵀᵗ₀ Ω-γ*₀₁ (appᴺ _ Bᴺ fᴺ aᴺ) = dep (⟨⟩-[]ᵀ* (γ*₀ ⁺^*)) ∙ᵈ apᵈ-[]ᵀ (ap-▹ (ap-++ Ω-γ*₀₁) ([]ᵛ→⁺^ᵀᵗ₀ Ω-γ*₀₁ aᴺ)) ([]ᵛ→⁺^ᵀ₀ (ap-▹ᵀˡ Ω-γ*₀₁ ([]ᵛ→⁺^ᵀᵗ₀ Ω-γ*₀₁ aᴺ)) Bᴺ) (ap-++ Ω-γ*₀₁) (apᵈ-⟨⟩₃ (ap-++ Ω-γ*₀₁) ([]ᵛ→⁺^ᵀᵗ₀ Ω-γ*₀₁ aᴺ) ([]ᵛ→⁺^ᵗ₀ Ω-γ*₀₁ aᴺ)) ∙ᵈ dep (sym (⟨⟩-[]ᵀ* (γ*₁ ⁺^*))) []ᵛ→⁺^ᵀᵗ₀ Ω-γ*₀₁ (lamᴺ Aᴺ _ bᴺ) = dep (Π-[]* (γ*₀ ⁺^*)) ∙ᵈ apᵈ-Π (ap-++ Ω-γ*₀₁) ([]ᵛ→⁺^ᵀ₀ Ω-γ*₀₁ Aᴺ) ([]ᵛ→⁺^ᵀᵗ₀ (ap-▹ᵀˡ Ω-γ*₀₁ ([]ᵛ→⁺^ᵀ₀ Ω-γ*₀₁ Aᴺ)) bᴺ) ∙ᵈ dep (sym (Π-[]* (γ*₁ ⁺^*))) []ᵛ→⁺^ᵗ₀ Ω-γ*₀₁ (var aᵛ) = []ᵛ→⁺^ᵛ₀ Ω-γ*₀₁ aᵛ []ᵛ→⁺^ᵗ₀ Ω-γ*₀₁ (cᴺ Aᴺ) = c-[]* (γ*₀ ⁺^*) ∙ᵈ apᵈ-c (ap-++ Ω-γ*₀₁) ([]ᵛ→⁺^ᵀ₀ Ω-γ*₀₁ Aᴺ) ∙ᵈ symᵈ (c-[]* (γ*₁ ⁺^*)) []ᵛ→⁺^ᵗ₀ Ω-γ*₀₁ (lowerᴺ Aᴺ aᴺ) = dep (lower-[]* (γ*₀ ⁺^*)) ∙ᵈ apᵈ-lower (ap-++ Ω-γ*₀₁) ([]ᵛ→⁺^ᵀ₀ Ω-γ*₀₁ Aᴺ) (splitlr ([]ᵛ→⁺^ᵗ₀ Ω-γ*₀₁ aᴺ)) ∙ᵈ dep (sym (lower-[]* (γ*₁ ⁺^*))) []ᵛ→⁺^ᵗ₀ Ω-γ*₀₁ (liftᴺ _ aᴺ) = lift-[]* (γ*₀ ⁺^*) ∙ᵈ apᵈ-lift (ap-++ Ω-γ*₀₁) ([]ᵛ→⁺^ᵀᵗ₀ Ω-γ*₀₁ aᴺ) ([]ᵛ→⁺^ᵗ₀ Ω-γ*₀₁ aᴺ) ∙ᵈ symᵈ (lift-[]* (γ*₁ ⁺^*)) []ᵛ→⁺^ᵗ₀ Ω-γ*₀₁ (appᴺ _ Bᴺ fᴺ aᴺ) = app-[]* (γ*₀ ⁺^*) ∙ᵈ apᵈ-app (ap-++ Ω-γ*₀₁) ([]ᵛ→⁺^ᵀᵗ₀ Ω-γ*₀₁ aᴺ) ([]ᵛ→⁺^ᵀ₀ (ap-▹ᵀˡ Ω-γ*₀₁ ([]ᵛ→⁺^ᵀᵗ₀ Ω-γ*₀₁ aᴺ)) Bᴺ) (splitlr ([]ᵛ→⁺^ᵗ₀ Ω-γ*₀₁ fᴺ)) ([]ᵛ→⁺^ᵗ₀ Ω-γ*₀₁ aᴺ) ∙ᵈ symᵈ (app-[]* (γ*₁ ⁺^*)) []ᵛ→⁺^ᵗ₀ Ω-γ*₀₁ (lamᴺ Aᴺ _ bᴺ) = lam-[]* (γ*₀ ⁺^*) ∙ᵈ apᵈ-lam₄ (ap-++ Ω-γ*₀₁) ([]ᵛ→⁺^ᵀ₀ Ω-γ*₀₁ Aᴺ) ([]ᵛ→⁺^ᵀᵗ₀ (ap-▹ᵀˡ Ω-γ*₀₁ ([]ᵛ→⁺^ᵀ₀ Ω-γ*₀₁ Aᴺ)) bᴺ) ([]ᵛ→⁺^ᵗ₀ (ap-▹ᵀˡ Ω-γ*₀₁ ([]ᵛ→⁺^ᵀ₀ Ω-γ*₀₁ Aᴺ)) bᴺ) ∙ᵈ symᵈ (lam-[]* (γ*₁ ⁺^*)) []ᵛ→[]ᵀˡ : Ω [ γ*₀ ]ᵀˡ* ≡ Ω [ γ*₁ ]ᵀˡ* []ᵛ→[]ᵀˡ {Ω = ◇} = refl []ᵛ→[]ᵀˡ {Ω = Ω ▹ A} = ap-▹ᵀˡ []ᵛ→[]ᵀˡ ([]ᵛ→⁺^ᵀ₀ []ᵛ→[]ᵀˡ (normᵀ A)) []ᵛ→⁺^ᵀ : (Ω : Tel Γ) {A : Ty (Γ ++ Ω) i} → A [ γ*₀ ⁺^* ]ᵀ* ≡[ ap-Ty (ap-++ []ᵛ→[]ᵀˡ) ] A [ γ*₁ ⁺^* ]ᵀ* []ᵛ→⁺^ᵀ Ω {A} = []ᵛ→⁺^ᵀ₀ []ᵛ→[]ᵀˡ (normᵀ A) []ᵛ→⁺^ᵗ : (Ω : Tel Γ) {A : Ty (Γ ++ Ω) i} {a : Tm (Γ ++ Ω) A} → a [ γ*₀ ⁺^* ]ᵗ* ≡[ ap-Tm₂ (ap-++ []ᵛ→[]ᵀˡ) ([]ᵛ→⁺^ᵀ Ω) ] a [ γ*₁ ⁺^* ]ᵗ* []ᵛ→⁺^ᵗ Ω {a} = []ᵛ→⁺^ᵗ₀ []ᵛ→[]ᵀˡ (normᵗ a) open []ᵛ→⁺^ public module _ {a : Tm Γ A} {γ : Sub Δ Γ} where ⟨⟩-[]ᵛ : Var (Γ ▹ A) B b → b [ ⟨ a ⟩ ]ᵗ [ γ ]ᵗ ≡[ ap-Tm ⟨⟩-[]ᵀ ] b [ γ ⁺ ]ᵗ [ ⟨ a [ γ ]ᵗ ⟩ ]ᵗ ⟨⟩-[]ᵛ vz = apᵈ-[]ᵗ p-⟨⟩ᵀ q-⟨⟩ ∙ᵈ symᵈ q-⟨⟩ ∙ᵈ apᵈ-[]ᵗ (sym p-⁺ᵀ) (symᵈ q-⁺) ⟨⟩-[]ᵛ (vs cᵛ) = apᵈ-[]ᵗ p-⟨⟩ᵀ p-⟨⟩ᵗ ∙ᵈ symᵈ p-⟨⟩ᵗ ∙ᵈ apᵈ-[]ᵗ (sym p-⁺ᵀ) (symᵈ p-⁺ᵗ) open []ᵛ→⁺^ (⌜ ⟨ a ⟩ ⌝ ∘ ⌜ γ ⌝) (⌜ γ ⁺ ⌝ ∘ ⌜ ⟨ a [ γ ]ᵗ ⟩ ⌝) ⟨⟩-[]ᵀ ⟨⟩-[]ᵛ public using () renaming ([]ᵛ→[]ᵀˡ to ⟨⟩-[]ᵀˡ; []ᵛ→⁺^ᵀ to ⟨⟩-[]ᵀ-⁺^; []ᵛ→⁺^ᵗ to ⟨⟩-[]ᵗ-⁺^) ⟨⟩-[]ᵗ* : (γ* : Sub* Δ Γ) → b [ ⟨ a ⟩ ]ᵗ [ γ* ]ᵗ* ≡[ ap-Tm (⟨⟩-[]ᵀ* γ*) ] b [ γ* ⁺* ]ᵗ* [ ⟨ a [ γ* ]ᵗ* ⟩ ]ᵗ ⟨⟩-[]ᵗ* ⌜ γ ⌝ = ⟨⟩-[]ᵗ-⁺^ ◇ ⟨⟩-[]ᵗ* (γ* ∘ δ*) = apᵈ-[]ᵗ* (⟨⟩-[]ᵀ* γ*) (⟨⟩-[]ᵗ* γ*) δ* ∙ᵈ ⟨⟩-[]ᵗ* δ* ⟨⟩-[]ᵗ* id = reflᵈ module _ {A : Ty Γ i} where ▹-ηᵛ : Var (Γ ▹ A) B b → b ≡[ ap-Tm ▹-ηᵀ ] b [ p ⁺ ]ᵗ [ ⟨ q ⟩ ]ᵗ ▹-ηᵛ vz = symᵈ q-⟨⟩ ∙ᵈ apᵈ-[]ᵗ (sym p-⁺ᵀ) (symᵈ q-⁺) ▹-ηᵛ (vs cᵛ) = symᵈ p-⟨⟩ᵗ ∙ᵈ apᵈ-[]ᵗ (sym p-⁺ᵀ) (symᵈ p-⁺ᵗ) open []ᵛ→⁺^ id (⌜ p ⁺ ⌝ ∘ ⌜ ⟨ q ⟩ ⌝) ▹-ηᵀ ▹-ηᵛ public using () renaming ([]ᵛ→[]ᵀˡ to ▹-ηᵀˡ; []ᵛ→⁺^ᵀ to ▹-ηᵀ-⁺^; []ᵛ→⁺^ᵗ to ▹-ηᵗ-⁺^)