{-# OPTIONS --without-K --prop --rewriting --confluence-check #-} module TT.SSC.Path where open import TT.Lib open import TT.SSC.Syntax private variable i j : ℕ Γ Γ₀ Γ₁ Δ Δ₀ Δ₁ Θ : Con γ : Sub Δ Γ A A₀ A₁ B : Ty Γ i a a₀ a₁ b f α : Tm Γ A infixl 9 _∘_ data Sub* : Con → Con → Set where ⌜_⌝ : Sub Δ Γ → Sub* Δ Γ _∘_ : Sub* Δ Γ → Sub* Θ Δ → Sub* Θ Γ id : Sub* Γ Γ infixl 9 _[_]ᵀ* _[_]ᵀ* : Ty Γ i → Sub* Δ Γ → Ty Δ i A [ ⌜ γ ⌝ ]ᵀ* = A [ γ ]ᵀ A [ γ* ∘ δ* ]ᵀ* = A [ γ* ]ᵀ* [ δ* ]ᵀ* A [ id ]ᵀ* = A infixl 9 _[_]ᵗ* _[_]ᵗ* : Tm Γ A → (γ* : Sub* Δ Γ) → Tm Δ (A [ γ* ]ᵀ*) a [ ⌜ γ ⌝ ]ᵗ* = a [ γ ]ᵗ a [ γ* ∘ δ* ]ᵗ* = a [ γ* ]ᵗ* [ δ* ]ᵗ* a [ id ]ᵗ* = a private variable γ*₀ γ*₁ δ*₀ δ*₁ : Sub* Δ Γ opaque unfolding coe ap-Sub* : Δ₀ ≡ Δ₁ → Γ₀ ≡ Γ₁ → Sub* Δ₀ Γ₀ ≡ Sub* Δ₁ Γ₁ ap-Sub* refl refl = refl ap-[]ᵀ* : A₀ ≡ A₁ → (γ* : Sub* Δ Γ) → A₀ [ γ* ]ᵀ* ≡ A₁ [ γ* ]ᵀ* ap-[]ᵀ* refl γ* = refl apᵈ-[]ᵀ* : (Γ₀₁ : Γ₀ ≡ Γ₁) → A₀ ≡[ ap-Ty Γ₀₁ ] A₁ → (Δ₀₁ : Δ₀ ≡ Δ₁) → γ*₀ ≡[ ap-Sub* Δ₀₁ Γ₀₁ ] γ*₁ → A₀ [ γ*₀ ]ᵀ* ≡[ ap-Ty Δ₀₁ ] A₁ [ γ*₁ ]ᵀ* apᵈ-[]ᵀ* refl refl refl refl = refl ap-[]ᵗ* : a₀ ≡ a₁ → (γ* : Sub* Δ Γ) → a₀ [ γ* ]ᵗ* ≡ a₁ [ γ* ]ᵗ* ap-[]ᵗ* refl γ* = refl apᵈ-[]ᵗ* : (A₀₁ : A₀ ≡ A₁) → a₀ ≡[ ap-Tm A₀₁ ] a₁ → (γ* : Sub* Δ Γ) → a₀ [ γ* ]ᵗ* ≡[ ap-Tm (ap-[]ᵀ* A₀₁ γ*) ] a₁ [ γ* ]ᵗ* apᵈ-[]ᵗ* refl refl γ* = refl ε* : Sub* Γ ◇ ε* {Γ = ◇} = id ε* {Γ = Γ ▹ A} = ε* ∘ ⌜ p ⌝ ε*-[]ᵀ : A [ ε* ]ᵀ* [ γ ]ᵀ ≡ A [ ε* ]ᵀ* ε*-[]ᵀ {γ = p} = refl ε*-[]ᵀ {γ = γ ⁺} = p-⁺ᵀ ∙ ap-[]ᵀ ε*-[]ᵀ ε*-[]ᵀ {γ = ⟨ a ⟩} = p-⟨⟩ᵀ ε*-[]ᵗ : {A : Ty ◇ i} {a : Tm ◇ A} {γ : Sub Δ Γ} → a [ ε* ]ᵗ* [ γ ]ᵗ ≡[ ap-Tm ε*-[]ᵀ ] a [ ε* ]ᵗ* ε*-[]ᵗ {γ = p} = reflᵈ ε*-[]ᵗ {γ = γ ⁺} = p-⁺ᵗ ∙ᵈ apᵈ-[]ᵗ ε*-[]ᵀ ε*-[]ᵗ ε*-[]ᵗ {γ = ⟨ a ⟩} = p-⟨⟩ᵗ ε-[]ᵀ* : (γ* : Sub* Δ Γ) → A [ ε* ]ᵀ* [ γ* ]ᵀ* ≡ A [ ε* ]ᵀ* ε-[]ᵀ* ⌜ γ ⌝ = ε*-[]ᵀ ε-[]ᵀ* (γ* ∘ δ*) = ap-[]ᵀ* (ε-[]ᵀ* γ*) δ* ∙ ε-[]ᵀ* δ* ε-[]ᵀ* id = refl ε-[]ᵗ* : {A : Ty ◇ i} {a : Tm ◇ A} (γ* : Sub* Δ Γ) → a [ ε* ]ᵗ* [ γ* ]ᵗ* ≡[ ap-Tm (ε-[]ᵀ* γ*) ] a [ ε* ]ᵗ* ε-[]ᵗ* ⌜ γ ⌝ = ε*-[]ᵗ ε-[]ᵗ* (γ* ∘ δ*) = apᵈ-[]ᵗ* (ε-[]ᵀ* γ*) (ε-[]ᵗ* γ*) δ* ∙ᵈ ε-[]ᵗ* δ* ε-[]ᵗ* id = reflᵈ infixl 10 _⁺* _⁺* : (γ* : Sub* Δ Γ) → Sub* (Δ ▹ A [ γ* ]ᵀ*) (Γ ▹ A) ⌜ γ ⌝ ⁺* = ⌜ γ ⁺ ⌝ (γ* ∘ δ*) ⁺* = γ* ⁺* ∘ δ* ⁺* id ⁺* = id p-⁺ᵀ* : (γ* : Sub* Δ Γ) → B [ p ]ᵀ [ γ* ⁺* ]ᵀ* ≡ B [ γ* ]ᵀ* [ p ]ᵀ ∈ Ty (Δ ▹ A [ γ* ]ᵀ*) j p-⁺ᵀ* ⌜ γ ⌝ = p-⁺ᵀ p-⁺ᵀ* (γ* ∘ δ*) = ap-[]ᵀ* (p-⁺ᵀ* γ*) (δ* ⁺*) ∙ p-⁺ᵀ* δ* p-⁺ᵀ* id = refl p-⁺ᵗ* : (γ* : Sub* Δ Γ) → b [ p ]ᵗ [ γ* ⁺* ]ᵗ* ≡[ ap-Tm (p-⁺ᵀ* γ*) ] b [ γ* ]ᵗ* [ p ]ᵗ ∈ Tm (Δ ▹ A [ γ* ]ᵀ*) (B [ γ* ]ᵀ* [ p ]ᵀ) p-⁺ᵗ* ⌜ γ ⌝ = p-⁺ᵗ p-⁺ᵗ* (γ* ∘ δ*) = apᵈ-[]ᵗ* (p-⁺ᵀ* γ*) (p-⁺ᵗ* γ*) (δ* ⁺*) ∙ᵈ p-⁺ᵗ* δ* p-⁺ᵗ* id = reflᵈ q-⁺* : (γ* : Sub* Δ Γ) → q [ γ* ⁺* ]ᵗ* ≡[ ap-Tm (p-⁺ᵀ* γ*) ] q ∈ Tm (Δ ▹ A [ γ* ]ᵀ*) (A [ γ* ]ᵀ* [ p ]ᵀ) q-⁺* ⌜ γ ⌝ = q-⁺ q-⁺* (γ* ∘ δ*) = apᵈ-[]ᵗ* (p-⁺ᵀ* γ*) (q-⁺* γ*) (δ* ⁺*) ∙ᵈ q-⁺* δ* q-⁺* id = reflᵈ infixl 4 _,*_ _,*_ : (γ* : Sub* Δ Γ) → Tm Δ (A [ γ* ]ᵀ*) → Sub* Δ (Γ ▹ A) γ* ,* a = γ* ⁺* ∘ ⌜ ⟨ a ⟩ ⌝ ▹-β₁ᵀ* : (γ* : Sub* Δ Γ) {a : Tm Δ (A [ γ* ]ᵀ*)} → B [ p ]ᵀ [ γ* ,* a ]ᵀ* ≡ B [ γ* ]ᵀ* ▹-β₁ᵀ* γ* = ap-[]ᵀ (p-⁺ᵀ* γ*) ∙ p-⟨⟩ᵀ ▹-β₁ᵗ* : (γ* : Sub* Δ Γ) {a : Tm Δ (A [ γ* ]ᵀ*)} → b [ p ]ᵗ [ γ* ,* a ]ᵗ* ≡[ ap-Tm (▹-β₁ᵀ* γ*) ] b [ γ* ]ᵗ* ▹-β₁ᵗ* γ* = apᵈ-[]ᵗ (p-⁺ᵀ* γ*) (p-⁺ᵗ* γ*) ∙ᵈ p-⟨⟩ᵗ ▹-β₂* : (γ* : Sub* Δ Γ) {a : Tm Δ (A [ γ* ]ᵀ*)} → q [ γ* ,* a ]ᵗ* ≡[ ap-Tm (▹-β₁ᵀ* γ*) ] a ▹-β₂* γ* = apᵈ-[]ᵗ (p-⁺ᵀ* γ*) (q-⁺* γ*) ∙ᵈ q-⟨⟩ ⟨⟩-[]ᵀ* : (γ* : Sub* Δ Γ) → B [ ⟨ a ⟩ ]ᵀ [ γ* ]ᵀ* ≡ B [ γ* ⁺* ]ᵀ* [ ⟨ a [ γ* ]ᵗ* ⟩ ]ᵀ ⟨⟩-[]ᵀ* ⌜ γ ⌝ = ⟨⟩-[]ᵀ ⟨⟩-[]ᵀ* (γ* ∘ δ*) = ap-[]ᵀ* (⟨⟩-[]ᵀ* γ*) δ* ∙ ⟨⟩-[]ᵀ* δ* ⟨⟩-[]ᵀ* id = refl U-[]* : (γ* : Sub* Δ Γ) → U i [ γ* ]ᵀ* ≡ U i U-[]* ⌜ γ ⌝ = U-[] U-[]* (γ* ∘ δ*) = ap-[]ᵀ* (U-[]* γ*) δ* ∙ U-[]* δ* U-[]* id = refl El-[]* : (γ* : Sub* Δ Γ) → El α [ γ* ]ᵀ* ≡ El (coe (ap-Tm (U-[]* γ*)) (α [ γ* ]ᵗ*)) El-[]* ⌜ γ ⌝ = El-[] El-[]* (γ* ∘ δ*) = ap-[]ᵀ* (El-[]* γ*) δ* ∙ El-[]* δ* ∙ ap-El (splitr (apᵈ-[]ᵗ* (sym (U-[]* γ*)) (splitl reflᵈ) δ*)) El-[]* id = ap-El (undep refl) c-[]* : (γ* : Sub* Δ Γ) → c A [ γ* ]ᵗ* ≡[ ap-Tm (U-[]* γ*) ] c (A [ γ* ]ᵀ*) c-[]* ⌜ γ ⌝ = c-[] c-[]* (γ* ∘ δ*) = apᵈ-[]ᵗ* (U-[]* γ*) (c-[]* γ*) δ* ∙ᵈ c-[]* δ* c-[]* id = reflᵈ Lift-[]* : (γ* : Sub* Δ Γ) → Lift A [ γ* ]ᵀ* ≡ Lift (A [ γ* ]ᵀ*) Lift-[]* ⌜ γ ⌝ = Lift-[] Lift-[]* (γ* ∘ δ*) = ap-[]ᵀ* (Lift-[]* γ*) δ* ∙ Lift-[]* δ* Lift-[]* id = refl lower-[]* : (γ* : Sub* Δ Γ) → lower a [ γ* ]ᵗ* ≡ lower (coe (ap-Tm (Lift-[]* γ*)) (a [ γ* ]ᵗ*)) lower-[]* ⌜ γ ⌝ = lower-[] lower-[]* (γ* ∘ δ*) = ap-[]ᵗ* (lower-[]* γ*) δ* ∙ lower-[]* δ* ∙ ap-lower (splitr (apᵈ-[]ᵗ* (sym (Lift-[]* γ*)) (splitl reflᵈ) δ*)) lower-[]* id = ap-lower (undep refl) lift-[]* : (γ* : Sub* Δ Γ) → lift a [ γ* ]ᵗ* ≡[ ap-Tm (Lift-[]* γ*) ] lift (a [ γ* ]ᵗ*) lift-[]* ⌜ γ ⌝ = lift-[] lift-[]* (γ* ∘ δ*) = apᵈ-[]ᵗ* (Lift-[]* γ*) (lift-[]* γ*) δ* ∙ᵈ lift-[]* δ* lift-[]* id = reflᵈ Π-[]* : (γ* : Sub* Δ Γ) → Π A B [ γ* ]ᵀ* ≡ Π (A [ γ* ]ᵀ*) (B [ γ* ⁺* ]ᵀ*) Π-[]* ⌜ γ ⌝ = Π-[] Π-[]* (γ* ∘ δ*) = ap-[]ᵀ* (Π-[]* γ*) δ* ∙ Π-[]* δ* Π-[]* id = refl app-[]* : (γ* : Sub* Δ Γ) → app f a [ γ* ]ᵗ* ≡[ ap-Tm (⟨⟩-[]ᵀ* γ*) ] app (coe (ap-Tm (Π-[]* γ*)) (f [ γ* ]ᵗ*)) (a [ γ* ]ᵗ*) app-[]* ⌜ γ ⌝ = app-[] app-[]* (γ* ∘ δ*) = apᵈ-[]ᵗ* (⟨⟩-[]ᵀ* γ*) (app-[]* γ*) δ* ∙ᵈ app-[]* δ* ∙ᵈ dep (ap-app (splitr (apᵈ-[]ᵗ* (sym (Π-[]* γ*)) (splitl reflᵈ) δ*))) app-[]* id = dep (ap-app (undep refl)) lam-[]* : (γ* : Sub* Δ Γ) → lam b [ γ* ]ᵗ* ≡[ ap-Tm (Π-[]* γ*) ] lam (b [ γ* ⁺* ]ᵗ*) lam-[]* ⌜ γ ⌝ = lam-[] lam-[]* (γ* ∘ δ*) = apᵈ-[]ᵗ* (Π-[]* γ*) (lam-[]* γ*) δ* ∙ᵈ lam-[]* δ* lam-[]* id = reflᵈ