{-# OPTIONS --with-K --rewriting --postfix-projections --hidden-argument-puns #-} module STT.SSC.Properties where open import STT.Lib open import STT.SSC open import STT.SSC.SNf private variable Γ Δ Θ : Con γ : Sub Δ Γ A B : Ty a b f : Tm Γ A x : Var Γ A infixl 9 _∘_ data Sub* : Con → Con → Set where ⌜_⌝ : Sub Δ Γ → Sub* Δ Γ _∘_ : Sub* Δ Γ → Sub* Θ Δ → Sub* Θ Γ id : Sub* Γ Γ _[_]* : Tm Γ A → Sub* Δ Γ → Tm Δ A a [ ⌜ γ ⌝ ]* = a [ γ ] a [ γ* ∘ δ* ]* = a [ γ* ]* [ δ* ]* a [ id ]* = a infixl 10 _⁺* _⁺* : Sub* Δ Γ → Sub* (Δ ▹ A) (Γ ▹ A) ⌜ γ ⌝ ⁺* = ⌜ γ ⁺ ⌝ (γ* ∘ δ*) ⁺* = γ* ⁺* ∘ δ* ⁺* id ⁺* = id vz-⁺* : (γ* : Sub* Δ Γ) → var vz [ γ* ⁺* ]* ≡ (Tm (Δ ▹ A) A ∋ var vz) vz-⁺* ⌜ γ ⌝ = vz-⁺ vz-⁺* (γ* ∘ δ*) = cong _[ δ* ⁺* ]* (vz-⁺* γ*) ∙ vz-⁺* δ* vz-⁺* id = refl app-[]* : (γ* : Sub* Δ Γ) → app f a [ γ* ]* ≡ app (f [ γ* ]*) (a [ γ* ]*) app-[]* ⌜ γ ⌝ = app-[] app-[]* (γ* ∘ δ*) = cong _[ δ* ]* (app-[]* γ*) ∙ app-[]* δ* app-[]* id = refl lam-[]* : (γ* : Sub* Δ Γ) → lam b [ γ* ]* ≡ lam (b [ γ* ⁺* ]*) lam-[]* ⌜ γ ⌝ = lam-[] lam-[]* (γ* ∘ δ*) = cong _[ δ* ]* (lam-[]* γ*) ∙ lam-[]* δ* lam-[]* id = refl Tel : Set Tel = Con private variable Ω : Tel infixl 2 _++_ _++_ : Con → Tel → Con Γ ++ ◇ = Γ Γ ++ (Ω ▹ A) = (Γ ++ Ω) ▹ A infixl 10 _⁺^ _⁺^ : Sub Δ Γ → Sub (Δ ++ Ω) (Γ ++ Ω) _⁺^ {Ω = ◇} γ = γ _⁺^ {Ω = Ω ▹ A} γ = γ ⁺^ ⁺ infixl 10 _⁺^* _⁺^* : Sub* Δ Γ → Sub* (Δ ++ Ω) (Γ ++ Ω) ⌜ γ ⌝ ⁺^* = ⌜ γ ⁺^ ⌝ (γ* ∘ δ*) ⁺^* = γ* ⁺^* ∘ δ* ⁺^* id ⁺^* = id ⁺^*-◇ : (γ* : Sub* Δ Γ) → γ* ⁺^* ≡ γ* ⁺^*-◇ ⌜ γ ⌝ = refl ⁺^*-◇ (γ* ∘ δ*) = cong₂ _∘_ (⁺^*-◇ γ*) (⁺^*-◇ δ*) ⁺^*-◇ id = refl ⁺^*-▹ : (γ* : Sub* Δ Γ) → γ* ⁺^* ≡ (Sub* (Δ ++ Ω ▹ A) (Γ ++ Ω ▹ A) ∋ γ* ⁺^* ⁺*) ⁺^*-▹ ⌜ γ ⌝ = refl ⁺^*-▹ (γ* ∘ δ*) = cong₂ _∘_ (⁺^*-▹ γ*) (⁺^*-▹ δ*) ⁺^*-▹ id = refl module var-⁺^*→tm-⁺^* (γ*₀ γ*₁ : Sub* Δ Γ) (γ*₀₁ : ∀ {Ω A} {x : Var (Γ ++ Ω) A} → var x [ γ*₀ ⁺^* ]* ≡ var x [ γ*₁ ⁺^* ]*) where open NTmDModel M : NTmDModel _ M .NTmᴰ Γ₀ A a _ = ∀ {Ω} (Γ₌ : Γ₀ ≡ (Γ ++ Ω)) → tm[ Γ₌ , refl ] a [ γ*₀ ⁺^* ]* ≡ tm[ Γ₌ , refl ] a [ γ*₁ ⁺^* ]* M .NTmᴰ-prop = funextᵢ (funext λ _ → uip _ _) M .varᴺᴰ x refl = γ*₀₁ M .appᴺᴰ fᴺᴰ aᴺᴰ refl = app-[]* (γ*₀ ⁺^*) ∙ cong₂ app (fᴺᴰ refl) (aᴺᴰ refl) ∙ sym (app-[]* (γ*₁ ⁺^*)) M .lamᴺᴰ {b} bᴺᴰ refl = lam-[]* (γ*₀ ⁺^*) ∙ cong lam (cong (b [_]*) (sym (⁺^*-▹ γ*₀)) ∙ bᴺᴰ refl ∙ cong (b [_]*) (⁺^*-▹ γ*₁)) ∙ sym (lam-[]* (γ*₁ ⁺^*)) open NTmInd M public var-⁺^*→tm-⁺^* : (γ*₀ γ*₁ : Sub* Δ Γ) → (∀ {Ω A} {x : Var (Γ ++ Ω) A} → var x [ γ*₀ ⁺^* ]* ≡ var x [ γ*₁ ⁺^* ]*) → ∀ {Ω A} {a : Tm (Γ ++ Ω) A} → a [ γ*₀ ⁺^* ]* ≡ a [ γ*₁ ⁺^* ]* var-⁺^*→tm-⁺^* γ*₀ γ*₁ γ*₀₁ {a} = ⟦ norm a ⟧ refl where open var-⁺^*→tm-⁺^* γ*₀ γ*₁ γ*₀₁ infixl 10 _⁺^ʷ _⁺^ʷ : Wk Δ Γ γ → Wk (Δ ++ Ω) (Γ ++ Ω) (γ ⁺^) _⁺^ʷ {Ω = ◇} γʷ = γʷ _⁺^ʷ {Ω = Ω ▹ A} γʷ = γʷ ⁺^ʷ ⁺ var-p-⁺-⁺^ʷ : {x : Var (Γ ++ Ω) B} → Wk Δ Γ γ → var x [ p ⁺^ ] [ γ ⁺ ⁺^ ] ≡ (Tm (Δ ▹ A ++ Ω) B ∋ var x [ γ ⁺^ ] [ p ⁺^ ]) var-p-⁺-⁺^ʷ {Ω = ◇} {γ} γʷ = cong _[ γ ⁺ ] var-p ∙ vs-⁺ var-p-⁺-⁺^ʷ {Ω = Ω ▹ B} {γ} {x = vz} γʷ = cong _[ γ ⁺ ⁺^ ⁺ ] vz-⁺ ∙ vz-⁺ ∙ sym vz-⁺ ∙ cong _[ p ⁺^ ⁺ ] (sym vz-⁺) var-p-⁺-⁺^ʷ {Ω = Ω ▹ B} {γ} {x = vs x} γʷ = cong _[ γ ⁺ ⁺^ ⁺ ] (vs-⁺ ∙ cong _[ p ] (var-[]ʷ (p ⁺^ʷ)) ∙ var-p) ∙ vs-⁺ ∙ cong _[ p ] ( cong _[ γ ⁺ ⁺^ ] (sym (var-[]ʷ (p ⁺^ʷ))) ∙ var-p-⁺-⁺^ʷ γʷ ∙ cong _[ p ⁺^ ] (var-[]ʷ (γʷ ⁺^ʷ))) ∙ sym vs-⁺ ∙ cong _[ p ⁺^ ⁺ ] (sym var-p ∙ cong _[ p ] (sym (var-[]ʷ (γʷ ⁺^ʷ))) ∙ sym vs-⁺) p-⁺-⁺^ʷ : {b : Tm (Γ ++ Ω) B} → Wk Δ Γ γ → b [ p ⁺^ ] [ γ ⁺ ⁺^ ] ≡ (Tm (Δ ▹ A ++ Ω) B ∋ b [ γ ⁺^ ] [ p ⁺^ ]) p-⁺-⁺^ʷ {γ} γʷ = var-⁺^*→tm-⁺^* (⌜ p ⌝ ∘ ⌜ γ ⁺ ⌝) (⌜ γ ⌝ ∘ ⌜ p ⌝) (var-p-⁺-⁺^ʷ γʷ) var-p-⁺-⁺^ : {x : Var (Γ ++ Ω) B} {γ : Sub Δ Γ} → var x [ p ⁺^ ] [ γ ⁺ ⁺^ ] ≡ (Tm (Δ ▹ A ++ Ω) B ∋ var x [ γ ⁺^ ] [ p ⁺^ ]) var-p-⁺-⁺^ {Ω = ◇} {γ} = cong _[ γ ⁺ ] var-p ∙ vs-⁺ var-p-⁺-⁺^ {Ω = Ω ▹ B} {x = vz} {γ} = cong _[ γ ⁺ ⁺^ ⁺ ] vz-⁺ ∙ vz-⁺ ∙ sym vz-⁺ ∙ cong _[ p ⁺^ ⁺ ] (sym vz-⁺) var-p-⁺-⁺^ {Ω = Ω ▹ B} {x = vs x} {γ} = cong _[ γ ⁺ ⁺^ ⁺ ] (vs-⁺ ∙ cong _[ p ] (var-[]ʷ (p ⁺^ʷ)) ∙ var-p) ∙ vs-⁺ ∙ cong _[ p ] (cong _[ γ ⁺ ⁺^ ] (sym (var-[]ʷ (p ⁺^ʷ))) ∙ var-p-⁺-⁺^) ∙ sym (p-⁺-⁺^ʷ (p ⁺^ʷ)) ∙ cong _[ p ⁺^ ⁺ ] (sym vs-⁺) p-⁺-⁺^ : {b : Tm (Γ ++ Ω) B} {γ : Sub Δ Γ} → b [ p ⁺^ ] [ γ ⁺ ⁺^ ] ≡ (Tm (Δ ▹ A ++ Ω) B ∋ b [ γ ⁺^ ] [ p ⁺^ ]) p-⁺-⁺^ {γ} = var-⁺^*→tm-⁺^* (⌜ p ⌝ ∘ ⌜ γ ⁺ ⌝) (⌜ γ ⌝ ∘ ⌜ p ⌝) var-p-⁺-⁺^ p-⁺-⁺^* : {b : Tm (Γ ++ Ω) B} (γ* : Sub* Δ Γ) → b [ p ⁺^ ] [ γ* ⁺* ⁺^* ]* ≡ (Tm (Δ ▹ A ++ Ω) B ∋ b [ γ* ⁺^* ]* [ p ⁺^ ]) p-⁺-⁺^* ⌜ γ ⌝ = p-⁺-⁺^ p-⁺-⁺^* (γ* ∘ δ*) = cong _[ δ* ⁺* ⁺^* ]* (p-⁺-⁺^* γ*) ∙ p-⁺-⁺^* δ* p-⁺-⁺^* id = refl var-[]*→var-⁺^* : (γ*₀ γ*₁ : Sub* Δ Γ) → ({x : Var Γ A} → var x [ γ*₀ ]* ≡ var x [ γ*₁ ]*) → {x : Var (Γ ++ Ω) A} → var x [ γ*₀ ⁺^* ]* ≡ var x [ γ*₁ ⁺^* ]* var-[]*→var-⁺^* {Ω = ◇} γ*₀ γ*₁ γ*₀₁ {x} = cong (var x [_]*) (⁺^*-◇ γ*₀) ∙ γ*₀₁ ∙ cong (var x [_]*) (sym (⁺^*-◇ γ*₁)) var-[]*→var-⁺^* {Ω = Ω ▹ A} γ*₀ γ*₁ γ*₀₁ {x = vz} = cong (var vz [_]*) (⁺^*-▹ γ*₀) ∙ vz-⁺* (γ*₀ ⁺^*) ∙ sym (vz-⁺* (γ*₁ ⁺^*)) ∙ cong (var vz [_]*) (sym (⁺^*-▹ γ*₁)) var-[]*→var-⁺^* {Ω = Ω ▹ A} γ*₀ γ*₁ γ*₀₁ {x = vs x} = cong₂ _[_]* (sym var-p) (⁺^*-▹ γ*₀ ∙ sym (⁺^*-◇ (γ*₀ ⁺^* ⁺*))) ∙ p-⁺-⁺^* (γ*₀ ⁺^*) ∙ cong _[ p ] ( cong (var x [_]*) (⁺^*-◇ (γ*₀ ⁺^*)) ∙ var-[]*→var-⁺^* γ*₀ γ*₁ γ*₀₁ ∙ cong (var x [_]*) (sym (⁺^*-◇ (γ*₁ ⁺^*)))) ∙ sym (p-⁺-⁺^* (γ*₁ ⁺^*)) ∙ cong₂ _[_]* var-p (⁺^*-◇ (γ*₁ ⁺^* ⁺*) ∙ sym (⁺^*-▹ γ*₁)) var-[]*→tm-⁺^* : (γ*₀ γ*₁ : Sub* Δ Γ) → (∀ {A} {x : Var Γ A} → var x [ γ*₀ ]* ≡ var x [ γ*₁ ]*) → ∀ {A} {a : Tm (Γ ++ Ω) A} → a [ γ*₀ ⁺^* ]* ≡ a [ γ*₁ ⁺^* ]* var-[]*→tm-⁺^* γ*₀ γ*₁ γ*₀₁ = var-⁺^*→tm-⁺^* γ*₀ γ*₁ (var-[]*→var-⁺^* γ*₀ γ*₁ γ*₀₁) p-⟨⟩-⁺^ : {b : Tm (Γ ++ Ω) B} {a : Tm Γ A} → b [ p ⁺^ ] [ ⟨ a ⟩ ⁺^ ] ≡ b p-⟨⟩-⁺^ {a} = var-[]*→tm-⁺^* (⌜ p ⌝ ∘ ⌜ ⟨ a ⟩ ⌝) id (cong _[ ⟨ a ⟩ ] var-p ∙ vs-⟨⟩) var-⟨⟩-[] : var x [ ⟨ a ⟩ ] [ γ ] ≡ var x [ γ ⁺ ] [ ⟨ a [ γ ] ⟩ ] var-⟨⟩-[] {x = vz} {a} {γ} = cong _[ γ ] vz-⟨⟩ ∙ sym vz-⟨⟩ ∙ cong _[ ⟨ a [ γ ] ⟩ ] (sym vz-⁺) var-⟨⟩-[] {x = vs x} {a} {γ} = cong _[ γ ] vs-⟨⟩ ∙ sym p-⟨⟩-⁺^ ∙ cong _[ ⟨ a [ γ ] ⟩ ] (sym vs-⁺) ⟨⟩-[]-⁺^ : {b : Tm (Γ ▹ A ++ Ω) B} {γ : Sub Δ Γ} → b [ ⟨ a ⟩ ⁺^ ] [ γ ⁺^ ] ≡ b [ γ ⁺ ⁺^ ] [ ⟨ a [ γ ] ⟩ ⁺^ ] ⟨⟩-[]-⁺^ {a} {γ} = var-[]*→tm-⁺^* (⌜ ⟨ a ⟩ ⌝ ∘ ⌜ γ ⌝) (⌜ γ ⁺ ⌝ ∘ ⌜ ⟨ a [ γ ] ⟩ ⌝) var-⟨⟩-[] ⟨⟩-[]-⁺^* : {b : Tm (Γ ▹ A ++ Ω) B} (γ* : Sub* Δ Γ) → b [ ⟨ a ⟩ ⁺^ ] [ γ* ⁺^* ]* ≡ b [ γ* ⁺* ⁺^* ]* [ ⟨ a [ γ* ]* ⟩ ⁺^ ] ⟨⟩-[]-⁺^* ⌜ γ ⌝ = ⟨⟩-[]-⁺^ ⟨⟩-[]-⁺^* (γ* ∘ δ*) = cong _[ δ* ⁺^* ]* (⟨⟩-[]-⁺^* γ*) ∙ ⟨⟩-[]-⁺^* δ* ⟨⟩-[]-⁺^* id = refl var-▹-η : var x [ p ⁺ ] [ ⟨ var vz ⟩ ] ≡ var x var-▹-η {x = vz} = cong _[ ⟨ var vz ⟩ ] vz-⁺ ∙ vz-⟨⟩ var-▹-η {x = vs x} = cong _[ ⟨ var vz ⟩ ] vs-⁺ ∙ p-⟨⟩-⁺^ ∙ var-p ▹-η-⁺^ : {b : Tm (Γ ▹ A ++ Ω) B} → b [ p ⁺ ⁺^ ] [ ⟨ var vz ⟩ ⁺^ ] ≡ b ▹-η-⁺^ = var-[]*→tm-⁺^* (⌜ p ⁺ ⌝ ∘ ⌜ ⟨ var vz ⟩ ⌝) id var-▹-η