{-# OPTIONS --safe --without-K --postfix-projections #-} module STT.Contextual where open import Function using (_∋_; _↔_; mk↔ₛ′) open import Relation.Binary.PropositionalEquality using (_≡_; refl; sym; cong; module ≡-Reasoning) open ≡-Reasoning module _ (Ty : Set) where infixl 2 _▹_ data Con-of : Set where ◆ : Con-of _▹_ : Con-of → Ty → Con-of record CwF : Set₁ where no-eta-equality field Ty : Set Con : Set Con = Con-of Ty infixl 9 _∘_ _[_] infixl 4 _,_ infixr 0 _⇒_ field Sub : Con → Con → Set _∘_ : ∀ {Θ Δ Γ} → Sub Δ Γ → Sub Θ Δ → Sub Θ Γ assoc : ∀ {Ξ Θ Δ Γ} (γ : Sub Δ Γ) (δ : Sub Θ Δ) (θ : Sub Ξ Θ) → γ ∘ (δ ∘ θ) ≡ γ ∘ δ ∘ θ id : ∀ {Γ} → Sub Γ Γ idr : ∀ {Δ Γ} (γ : Sub Δ Γ) → γ ∘ id ≡ γ idl : ∀ {Δ Γ} (γ : Sub Δ Γ) → id ∘ γ ≡ γ Tm : Con → Ty → Set _[_] : ∀ {Δ Γ A} → Tm Γ A → Sub Δ Γ → Tm Δ A []-∘ : ∀ {Θ Δ Γ A} (a : Tm Γ A) (γ : Sub Δ Γ) (δ : Sub Θ Δ) → a [ γ ∘ δ ] ≡ a [ γ ] [ δ ] []-id : ∀ {Γ A} (a : Tm Γ A) → a [ id ] ≡ a ε : ∀ {Γ} → Sub Γ ◆ ε-∘ : ∀ {Δ Γ} (γ : Sub Δ Γ) → ε ∘ γ ≡ ε ◆-η : ε ≡ id p : ∀ {Γ A} → Sub (Γ ▹ A) Γ q : ∀ {Γ A} → Tm (Γ ▹ A) A _,_ : ∀ {Δ Γ A} → Sub Δ Γ → Tm Δ A → Sub Δ (Γ ▹ A) ,-∘ : ∀ {Θ Δ Γ A} (γ : Sub Δ Γ) (a : Tm Δ A) (δ : Sub Θ Δ) → (γ , a) ∘ δ ≡ (γ ∘ δ , a [ δ ]) ▹-β₁ : ∀ {Δ Γ A} (γ : Sub Δ Γ) (a : Tm Δ A) → p ∘ (γ , a) ≡ γ ▹-β₂ : ∀ {Δ Γ A} (γ : Sub Δ Γ) (a : Tm Δ A) → q [ γ , a ] ≡ a ▹-η : ∀ {Γ A} → (p , q) ≡ id {Γ ▹ A} ι : Ty _⇒_ : Ty → Ty → Ty app : ∀ {Γ A B} → Tm Γ (A ⇒ B) → Tm Γ A → Tm Γ B app-[] : ∀ {Δ Γ A B} (f : Tm Γ (A ⇒ B)) a (γ : Sub Δ Γ) → app f a [ γ ] ≡ app (f [ γ ]) (a [ γ ]) lam : ∀ {Γ A B} → Tm (Γ ▹ A) B → Tm Γ (A ⇒ B) lam-[] : ∀ {Δ Γ A B} (b : Tm (Γ ▹ A) B) (γ : Sub Δ Γ) → lam b [ γ ] ≡ lam (b [ γ ∘ p , q ]) ⇒-β : ∀ {Γ A B} (b : Tm (Γ ▹ A) B) a → app (lam b) a ≡ b [ id , a ] ⇒-η : ∀ {Γ A B} (f : Tm Γ (A ⇒ B)) → lam (app (f [ p ]) q) ≡ f module _ (Ty : Set) (Tm : Con-of Ty → Ty → Set) where infixl 10 _⁺ data SSub-of : Con-of Ty → Con-of Ty → Set where pₛ : ∀ {Γ A} → SSub-of (Γ ▹ A) Γ _⁺ : ∀ {Δ Γ A} → SSub-of Δ Γ → SSub-of (Δ ▹ A) (Γ ▹ A) ⟨_⟩ : ∀ {Γ A} → Tm Γ A → SSub-of Γ (Γ ▹ A) record SSC : Set₁ where no-eta-equality field Ty : Set Con : Set Con = Con-of Ty field Tm : Con → Ty → Set SSub : Con → Con → Set SSub = SSub-of Ty Tm p : ∀ {Γ A} → SSub (Γ ▹ A) Γ p = pₛ infixl 9 _[_] infixr 0 _⇒_ field _[_] : ∀ {Δ Γ A} → Tm Γ A → SSub Δ Γ → Tm Δ A q : ∀ {Γ A} → Tm (Γ ▹ A) A p-⁺ : ∀ {Δ Γ A B} (b : Tm Γ B) (γ : SSub Δ Γ) → (Tm (Δ ▹ A) B ∋ b [ p ] [ γ ⁺ ]) ≡ b [ γ ] [ p ] q-⁺ : ∀ {Δ Γ A} (γ : SSub Δ Γ) → (Tm (Δ ▹ A) A ∋ q [ γ ⁺ ]) ≡ q ⟨⟩-[] : ∀ {Δ Γ A B} (b : Tm (Γ ▹ A) B) (a : Tm Γ A) (γ : SSub Δ Γ) → b [ ⟨ a ⟩ ] [ γ ] ≡ b [ γ ⁺ ] [ ⟨ a [ γ ] ⟩ ] p-⟨⟩ : ∀ {Γ A B} (b : Tm Γ B) (a : Tm Γ A) → b [ p ] [ ⟨ a ⟩ ] ≡ b q-⟨⟩ : ∀ {Γ A} (a : Tm Γ A) → q [ ⟨ a ⟩ ] ≡ a ▹-η : ∀ {Γ A B} (b : Tm (Γ ▹ A) B) → b [ p ⁺ ] [ ⟨ q ⟩ ] ≡ b ι : Ty _⇒_ : Ty → Ty → Ty app : ∀ {Γ A B} → Tm Γ (A ⇒ B) → Tm Γ A → Tm Γ B app-[] : ∀ {Δ Γ A B} (f : Tm Γ (A ⇒ B)) a (γ : SSub Δ Γ) → app f a [ γ ] ≡ app (f [ γ ]) (a [ γ ]) lam : ∀ {Γ A B} → Tm (Γ ▹ A) B → Tm Γ (A ⇒ B) lam-[] : ∀ {Δ Γ A B} (b : Tm (Γ ▹ A) B) (γ : SSub Δ Γ) → lam b [ γ ] ≡ lam (b [ γ ⁺ ]) ⇒-β : ∀ {Γ A B} (b : Tm (Γ ▹ A) B) a → app (lam b) a ≡ b [ ⟨ a ⟩ ] ⇒-η : ∀ {Γ A B} (f : Tm Γ (A ⇒ B)) → lam (app (f [ p ]) q) ≡ f module CwF→SSC (M : CwF) where open CwF M SSub : Con → Con → Set SSub = SSub-of Ty Tm SS→S : ∀ {Δ Γ} → SSub Δ Γ → Sub Δ Γ SS→S pₛ = p SS→S (γ ⁺) = SS→S γ ∘ p , q SS→S ⟨ a ⟩ = id , a module _ (M : CwF) where open CwF M open CwF→SSC M CwF→SSC : SSC CwF→SSC .SSC.Ty = Ty CwF→SSC .SSC.Tm = Tm CwF→SSC .SSC._[_] a γ = a [ SS→S γ ] CwF→SSC .SSC.q = q CwF→SSC .SSC.p-⁺ b γ = begin b [ p ] [ SS→S γ ∘ p , q ] ≡˘⟨ []-∘ _ _ _ ⟩ b [ p ∘ (SS→S γ ∘ p , q) ] ≡⟨ cong (λ x → b [ x ]) (▹-β₁ _ _) ⟩ b [ SS→S γ ∘ p ] ≡⟨ []-∘ _ _ _ ⟩ b [ SS→S γ ] [ p ] ∎ CwF→SSC .SSC.q-⁺ γ = ▹-β₂ _ _ CwF→SSC .SSC.⟨⟩-[] b a γ = begin b [ id , a ] [ SS→S γ ] ≡˘⟨ []-∘ _ _ _ ⟩ b [ (id , a) ∘ SS→S γ ] ≡⟨ cong (λ x → b [ x ]) (,-∘ _ _ _) ⟩ b [ id ∘ SS→S γ , a [ SS→S γ ] ] ≡⟨ cong (λ x → b [ x , a [ SS→S γ ] ]) (idl _) ⟩ b [ SS→S γ , a [ SS→S γ ] ] ≡˘⟨ cong (λ x → b [ x , a [ SS→S γ ] ]) (idr _) ⟩ b [ SS→S γ ∘ id , a [ SS→S γ ] ] ≡˘⟨ cong (λ x → b [ SS→S γ ∘ x , a [ SS→S γ ] ]) (▹-β₁ _ _) ⟩ b [ SS→S γ ∘ (p ∘ (id , a [ SS→S γ ])) , a [ SS→S γ ] ] ≡⟨ cong (λ x → b [ x , a [ SS→S γ ] ]) (assoc _ _ _) ⟩ b [ SS→S γ ∘ p ∘ (id , a [ SS→S γ ]) , a [ SS→S γ ] ] ≡˘⟨ cong (λ x → b [ SS→S γ ∘ p ∘ (id , a [ SS→S γ ]) , x ]) (▹-β₂ _ _) ⟩ b [ SS→S γ ∘ p ∘ (id , a [ SS→S γ ]) , q [ id , a [ SS→S γ ] ] ] ≡˘⟨ cong (λ x → b [ x ]) (,-∘ _ _ _) ⟩ b [ (SS→S γ ∘ p , q) ∘ (id , a [ SS→S γ ]) ] ≡⟨ []-∘ _ _ _ ⟩ b [ SS→S γ ∘ p , q ] [ id , a [ SS→S γ ] ] ∎ CwF→SSC .SSC.p-⟨⟩ b a = begin b [ p ] [ id , a ] ≡˘⟨ []-∘ _ _ _ ⟩ b [ p ∘ (id , a) ] ≡⟨ cong (λ x → b [ x ]) (▹-β₁ _ _) ⟩ b [ id ] ≡⟨ []-id _ ⟩ b ∎ CwF→SSC .SSC.q-⟨⟩ a = ▹-β₂ _ _ CwF→SSC .SSC.▹-η b = begin b [ p ∘ p , q ] [ id , q ] ≡˘⟨ []-∘ _ _ _ ⟩ b [ (p ∘ p , q) ∘ (id , q) ] ≡⟨ cong (λ x → b [ x ]) (,-∘ _ _ _) ⟩ b [ p ∘ p ∘ (id , q) , q [ id , q ] ] ≡˘⟨ cong (λ x → b [ x , q [ id , q ] ]) (assoc _ _ _) ⟩ b [ p ∘ (p ∘ (id , q)) , q [ id , q ] ] ≡⟨ cong (λ x → b [ p ∘ x , q [ id , q ] ]) (▹-β₁ _ _) ⟩ b [ p ∘ id , q [ id , q ] ] ≡⟨ cong (λ x → b [ x , q [ id , q ] ]) (idr _) ⟩ b [ p , q [ id , q ] ] ≡⟨ cong (λ x → b [ p , x ]) (▹-β₂ _ _) ⟩ b [ p , q ] ≡⟨ cong (λ x → b [ x ]) ▹-η ⟩ b [ id ] ≡⟨ []-id _ ⟩ b ∎ CwF→SSC .SSC.ι = ι CwF→SSC .SSC._⇒_ = _⇒_ CwF→SSC .SSC.app = app CwF→SSC .SSC.app-[] f a γ = app-[] _ _ _ CwF→SSC .SSC.lam = lam CwF→SSC .SSC.lam-[] b γ = lam-[] _ _ CwF→SSC .SSC.⇒-β = ⇒-β CwF→SSC .SSC.⇒-η = ⇒-η module SSC→CwF (M : SSC) where open SSC M private variable Γ Δ Θ Ξ : Con A B : Ty infixl 9 _∘ₛ_ data SSubs : Con → Con → Set where ⌜_⌝ : SSub Δ Γ → SSubs Δ Γ _∘ₛ_ : SSubs Δ Γ → SSubs Θ Δ → SSubs Θ Γ idₛ : SSubs Γ Γ infixl 9 _[_]ₛ _[_]ₛ : Tm Γ A → SSubs Δ Γ → Tm Δ A a [ ⌜ γ ⌝ ]ₛ = a [ γ ] a [ γ ∘ₛ δ ]ₛ = a [ γ ]ₛ [ δ ]ₛ a [ idₛ ]ₛ = a infixl 10 _⁺ₛ _⁺ₛ : SSubs Δ Γ → SSubs (Δ ▹ A) (Γ ▹ A) ⌜ γ ⌝ ⁺ₛ = ⌜ γ ⁺ ⌝ (γ ∘ₛ δ) ⁺ₛ = γ ⁺ₛ ∘ₛ δ ⁺ₛ idₛ ⁺ₛ = idₛ p-⁺ₛ : (b : Tm Γ B) (γ : SSubs Δ Γ) → (Tm (Δ ▹ A) B ∋ b [ p ] [ γ ⁺ₛ ]ₛ) ≡ b [ γ ]ₛ [ p ] p-⁺ₛ b ⌜ γ ⌝ = p-⁺ _ _ p-⁺ₛ b (γ ∘ₛ δ) = begin b [ p ] [ γ ⁺ₛ ]ₛ [ δ ⁺ₛ ]ₛ ≡⟨ cong (λ x → x [ δ ⁺ₛ ]ₛ) (p-⁺ₛ _ γ) ⟩ b [ γ ]ₛ [ p ] [ δ ⁺ₛ ]ₛ ≡⟨ p-⁺ₛ _ δ ⟩ b [ γ ]ₛ [ δ ]ₛ [ p ] ∎ p-⁺ₛ b idₛ = refl q-⁺ₛ : (γ : SSubs Δ Γ) → (Tm (Δ ▹ A) A ∋ q [ γ ⁺ₛ ]ₛ) ≡ q q-⁺ₛ ⌜ γ ⌝ = q-⁺ _ q-⁺ₛ (γ ∘ₛ δ) = begin q [ γ ⁺ₛ ]ₛ [ δ ⁺ₛ ]ₛ ≡⟨ cong (λ x → x [ δ ⁺ₛ ]ₛ) (q-⁺ₛ γ) ⟩ q [ δ ⁺ₛ ]ₛ ≡⟨ q-⁺ₛ δ ⟩ q ∎ q-⁺ₛ idₛ = refl ⟨⟩-[]ₛ : (b : Tm (Γ ▹ A) B) (a : Tm Γ A) (γ : SSubs Δ Γ) → b [ ⟨ a ⟩ ] [ γ ]ₛ ≡ b [ γ ⁺ₛ ]ₛ [ ⟨ a [ γ ]ₛ ⟩ ] ⟨⟩-[]ₛ b a ⌜ γ ⌝ = ⟨⟩-[] _ _ _ ⟨⟩-[]ₛ b a (γ ∘ₛ δ) = begin b [ ⟨ a ⟩ ] [ γ ]ₛ [ δ ]ₛ ≡⟨ cong (λ x → x [ δ ]ₛ) (⟨⟩-[]ₛ _ _ γ) ⟩ b [ γ ⁺ₛ ]ₛ [ ⟨ a [ γ ]ₛ ⟩ ] [ δ ]ₛ ≡⟨ ⟨⟩-[]ₛ _ _ δ ⟩ b [ γ ⁺ₛ ]ₛ [ δ ⁺ₛ ]ₛ [ ⟨ a [ γ ]ₛ [ δ ]ₛ ⟩ ] ∎ ⟨⟩-[]ₛ b a idₛ = refl app-[]ₛ : ∀ (f : Tm Γ (A ⇒ B)) a (γ : SSubs Δ Γ) → app f a [ γ ]ₛ ≡ app (f [ γ ]ₛ) (a [ γ ]ₛ) app-[]ₛ f a ⌜ γ ⌝ = app-[] _ _ _ app-[]ₛ f a (γ ∘ₛ δ) = begin app f a [ γ ]ₛ [ δ ]ₛ ≡⟨ cong (λ x → x [ δ ]ₛ) (app-[]ₛ _ _ γ) ⟩ app (f [ γ ]ₛ) (a [ γ ]ₛ) [ δ ]ₛ ≡⟨ app-[]ₛ _ _ δ ⟩ app (f [ γ ]ₛ [ δ ]ₛ) (a [ γ ]ₛ [ δ ]ₛ) ∎ app-[]ₛ f a idₛ = refl lam-[]ₛ : (b : Tm (Γ ▹ A) B) (γ : SSubs Δ Γ) → lam b [ γ ]ₛ ≡ lam (b [ γ ⁺ₛ ]ₛ) lam-[]ₛ b ⌜ γ ⌝ = lam-[] _ _ lam-[]ₛ b (γ ∘ₛ δ) = begin lam b [ γ ]ₛ [ δ ]ₛ ≡⟨ cong (λ x → x [ δ ]ₛ) (lam-[]ₛ _ γ) ⟩ lam (b [ γ ⁺ₛ ]ₛ) [ δ ]ₛ ≡⟨ lam-[]ₛ _ δ ⟩ lam (b [ γ ⁺ₛ ]ₛ [ δ ⁺ₛ ]ₛ) ∎ lam-[]ₛ b idₛ = refl []-⁺ₛ→lam : (b : Tm (Γ ▹ A) B) (γ : SSubs Δ Γ) → b [ γ ⁺ₛ ]ₛ ≡ app (lam b [ γ ]ₛ [ p ]) q []-⁺ₛ→lam b γ = begin b [ γ ⁺ₛ ]ₛ ≡˘⟨ ▹-η _ ⟩ b [ γ ⁺ₛ ]ₛ [ p ⁺ ] [ ⟨ q ⟩ ] ≡˘⟨ ⇒-β _ _ ⟩ app (lam (b [ γ ⁺ₛ ]ₛ [ p ⁺ ])) q ≡˘⟨ cong (λ x → app x q) (lam-[]ₛ _ (γ ∘ₛ ⌜ p ⌝)) ⟩ app (lam b [ γ ]ₛ [ p ]) q ∎ []-⁺ₛ : (b : Tm (Γ ▹ A) B) (γ₀ γ₁ : SSubs Δ Γ) → (∀ {B} (b : Tm Γ B) → b [ γ₀ ]ₛ ≡ b [ γ₁ ]ₛ) → b [ γ₀ ⁺ₛ ]ₛ ≡ b [ γ₁ ⁺ₛ ]ₛ []-⁺ₛ b γ₀ γ₁ γ₀₁ = begin b [ γ₀ ⁺ₛ ]ₛ ≡⟨ []-⁺ₛ→lam _ γ₀ ⟩ app (lam b [ γ₀ ]ₛ [ p ]) q ≡⟨ cong (λ x → app (x [ p ]) q) (γ₀₁ _) ⟩ app (lam b [ γ₁ ]ₛ [ p ]) q ≡˘⟨ []-⁺ₛ→lam _ γ₁ ⟩ b [ γ₁ ⁺ₛ ]ₛ ∎ εₛ : SSubs Γ ◆ εₛ {Γ = ◆} = idₛ εₛ {Γ = Γ ▹ A} = εₛ ∘ₛ ⌜ p ⌝ εₛ-[] : (a : Tm ◆ A) (γ : SSub Δ Γ) → a [ εₛ ]ₛ [ γ ] ≡ a [ εₛ ]ₛ εₛ-[] a pₛ = refl εₛ-[] a (γ ⁺) = begin a [ εₛ ]ₛ [ p ] [ γ ⁺ ] ≡⟨ p-⁺ _ _ ⟩ a [ εₛ ]ₛ [ γ ] [ p ] ≡⟨ cong (λ x → x [ p ]) (εₛ-[] _ _) ⟩ a [ εₛ ]ₛ [ p ] ∎ εₛ-[] a ⟨ z ⟩ = p-⟨⟩ _ _ ε-[]ₛ : (a : Tm ◆ A) (γ : SSubs Δ Γ) → a [ εₛ ]ₛ [ γ ]ₛ ≡ a [ εₛ ]ₛ ε-[]ₛ a ⌜ γ ⌝ = εₛ-[] _ _ ε-[]ₛ a (γ ∘ₛ δ) = begin a [ εₛ ]ₛ [ γ ]ₛ [ δ ]ₛ ≡⟨ cong (λ x → x [ δ ]ₛ) (ε-[]ₛ _ γ) ⟩ a [ εₛ ]ₛ [ δ ]ₛ ≡⟨ ε-[]ₛ _ δ ⟩ a [ εₛ ]ₛ ∎ ε-[]ₛ a idₛ = refl infixl 4 _,ₜ_ data Tms : Con → Con → Set where εₜ : Tms Γ ◆ _,ₜ_ : Tms Δ Γ → Tm Δ A → Tms Δ (Γ ▹ A) T→SS : Tms Δ Γ → SSubs Δ Γ T→SS εₜ = εₛ T→SS (γ ,ₜ a) = T→SS γ ⁺ₛ ∘ₛ ⌜ ⟨ a ⟩ ⌝ infixl 9 _[_]ₜ _[_]ₜ : Tm Γ A → Tms Δ Γ → Tm Δ A a [ γ ]ₜ = a [ T→SS γ ]ₛ infixl 9 _∘ₜ_ _∘ₜ_ : Tms Δ Γ → Tms Θ Δ → Tms Θ Γ _∘ₜ_ εₜ δ = εₜ _∘ₜ_ (γ ,ₜ a) δ = γ ∘ₜ δ ,ₜ a [ δ ]ₜ []-∘ₜ : (a : Tm Γ A) (γ : Tms Δ Γ) (δ : Tms Θ Δ) → a [ γ ∘ₜ δ ]ₜ ≡ a [ γ ]ₜ [ δ ]ₜ []-∘ₜ a εₜ δ = sym (ε-[]ₛ _ (T→SS δ)) []-∘ₜ a (γ ,ₜ z) δ = begin a [ T→SS (γ ∘ₜ δ) ⁺ₛ ]ₛ [ ⟨ z [ T→SS δ ]ₛ ⟩ ] ≡⟨ cong (λ x → x [ ⟨ z [ T→SS δ ]ₛ ⟩ ]) ([]-⁺ₛ _ (T→SS (γ ∘ₜ δ)) (T→SS γ ∘ₛ T→SS δ) λ a → []-∘ₜ _ γ δ) ⟩ a [ T→SS γ ⁺ₛ ]ₛ [ T→SS δ ⁺ₛ ]ₛ [ ⟨ z [ T→SS δ ]ₛ ⟩ ] ≡˘⟨ ⟨⟩-[]ₛ _ _ (T→SS δ) ⟩ a [ T→SS γ ⁺ₛ ]ₛ [ ⟨ z ⟩ ] [ T→SS δ ]ₛ ∎ assocₜ : (γ : Tms Δ Γ) (δ : Tms Θ Δ) (θ : Tms Ξ Θ) → γ ∘ₜ (δ ∘ₜ θ) ≡ γ ∘ₜ δ ∘ₜ θ assocₜ εₜ δ θ = refl assocₜ (γ ,ₜ a) δ θ = begin γ ∘ₜ (δ ∘ₜ θ) ,ₜ a [ δ ∘ₜ θ ]ₜ ≡⟨ cong (λ x → x ,ₜ a [ δ ∘ₜ θ ]ₜ) (assocₜ _ _ _) ⟩ γ ∘ₜ δ ∘ₜ θ ,ₜ a [ δ ∘ₜ θ ]ₜ ≡⟨ cong (λ x → γ ∘ₜ δ ∘ₜ θ ,ₜ x) ([]-∘ₜ _ δ θ) ⟩ γ ∘ₜ δ ∘ₜ θ ,ₜ a [ δ ]ₜ [ θ ]ₜ ∎ infixl 9 _∘pₜ _∘pₜ : Tms Δ Γ → Tms (Δ ▹ A) Γ _∘pₜ εₜ = εₜ _∘pₜ (γ ,ₜ z) = γ ∘pₜ ,ₜ z [ p ] []-∘pₜ : (b : Tm Γ B) (γ : Tms Δ Γ) → (Tm (Δ ▹ A) B ∋ b [ γ ∘pₜ ]ₜ) ≡ b [ γ ]ₜ [ p ] []-∘pₜ b εₜ = refl []-∘pₜ b (γ ,ₜ z) = begin b [ T→SS (γ ∘pₜ) ⁺ₛ ]ₛ [ ⟨ z [ p ] ⟩ ] ≡⟨ cong (λ x → x [ ⟨ z [ p ] ⟩ ]) ([]-⁺ₛ _ (T→SS (γ ∘pₜ)) (T→SS γ ∘ₛ ⌜ p ⌝) λ b → []-∘pₜ _ γ) ⟩ b [ T→SS γ ⁺ₛ ]ₛ [ p ⁺ ] [ ⟨ z [ p ] ⟩ ] ≡˘⟨ ⟨⟩-[] _ _ _ ⟩ b [ T→SS γ ⁺ₛ ]ₛ [ ⟨ z ⟩ ] [ p ] ∎ ∘p-,ₜ : (γ : Tms Δ Γ) (δ : Tms Θ Δ) (a : Tm Θ A) → γ ∘pₜ ∘ₜ (δ ,ₜ a) ≡ γ ∘ₜ δ ∘p-,ₜ εₜ δ a = refl ∘p-,ₜ (γ ,ₜ z) δ a = begin γ ∘pₜ ∘ₜ (δ ,ₜ a) ,ₜ z [ p ] [ T→SS δ ⁺ₛ ]ₛ [ ⟨ a ⟩ ] ≡⟨ cong (λ x → x ,ₜ z [ p ] [ T→SS δ ⁺ₛ ]ₛ [ ⟨ a ⟩ ]) (∘p-,ₜ _ _ _) ⟩ γ ∘ₜ δ ,ₜ z [ p ] [ T→SS δ ⁺ₛ ]ₛ [ ⟨ a ⟩ ] ≡⟨ cong (λ x → γ ∘ₜ δ ,ₜ x [ ⟨ a ⟩ ]) (p-⁺ₛ _ (T→SS δ)) ⟩ γ ∘ₜ δ ,ₜ z [ T→SS δ ]ₛ [ p ] [ ⟨ a ⟩ ] ≡⟨ cong (λ x → γ ∘ₜ δ ,ₜ x) (p-⟨⟩ _ _) ⟩ γ ∘ₜ δ ,ₜ z [ T→SS δ ]ₛ ∎ idₜ : Tms Γ Γ idₜ {Γ = ◆} = εₜ idₜ {Γ = Γ ▹ A} = idₜ ∘pₜ ,ₜ q []-idₜ : (a : Tm Γ A) → a [ idₜ ]ₜ ≡ a []-idₜ {Γ = ◆} a = refl []-idₜ {Γ = Γ ▹ Z} a = begin a [ T→SS (idₜ ∘pₜ) ⁺ₛ ]ₛ [ ⟨ q ⟩ ] ≡⟨ cong (λ x → x [ ⟨ q ⟩ ]) ([]-⁺ₛ a (T→SS (idₜ ∘pₜ)) (T→SS idₜ ∘ₛ ⌜ p ⌝) λ a → []-∘pₜ _ idₜ) ⟩ a [ T→SS idₜ ⁺ₛ ]ₛ [ p ⁺ ] [ ⟨ q ⟩ ] ≡⟨ cong (λ x → x [ p ⁺ ] [ ⟨ q ⟩ ]) ([]-⁺ₛ _ (T→SS idₜ) idₛ λ a → []-idₜ _) ⟩ a [ p ⁺ ] [ ⟨ q ⟩ ] ≡⟨ ▹-η _ ⟩ a ∎ idrₜ : (γ : Tms Δ Γ) → γ ∘ₜ idₜ ≡ γ idrₜ εₜ = refl idrₜ (γ ,ₜ a) = begin γ ∘ₜ idₜ ,ₜ a [ idₜ ]ₜ ≡⟨ cong (λ x → x ,ₜ a [ idₜ ]ₜ) (idrₜ _) ⟩ γ ,ₜ a [ idₜ ]ₜ ≡⟨ cong (λ x → γ ,ₜ x) ([]-idₜ _) ⟩ γ ,ₜ a ∎ idlₜ : (γ : Tms Δ Γ) → idₜ ∘ₜ γ ≡ γ idlₜ εₜ = refl idlₜ (γ ,ₜ a) = begin idₜ ∘pₜ ∘ₜ (γ ,ₜ a) ,ₜ q [ T→SS γ ⁺ₛ ]ₛ [ ⟨ a ⟩ ] ≡⟨ cong (λ x → x ,ₜ q [ T→SS γ ⁺ₛ ]ₛ [ ⟨ a ⟩ ]) (∘p-,ₜ _ _ _) ⟩ idₜ ∘ₜ γ ,ₜ q [ T→SS γ ⁺ₛ ]ₛ [ ⟨ a ⟩ ] ≡⟨ cong (λ x → x ,ₜ q [ T→SS γ ⁺ₛ ]ₛ [ ⟨ a ⟩ ]) (idlₜ _) ⟩ γ ,ₜ q [ T→SS γ ⁺ₛ ]ₛ [ ⟨ a ⟩ ] ≡⟨ cong (λ x → γ ,ₜ x [ ⟨ a ⟩ ]) (q-⁺ₛ (T→SS γ)) ⟩ γ ,ₜ q [ ⟨ a ⟩ ] ≡⟨ cong (λ x → γ ,ₜ x) (q-⟨⟩ _) ⟩ γ ,ₜ a ∎ module _ (M : SSC) where open SSC M open SSC→CwF M SSC→CwF : CwF SSC→CwF .CwF.Ty = Ty SSC→CwF .CwF.Sub = Tms SSC→CwF .CwF._∘_ = _∘ₜ_ SSC→CwF .CwF.assoc = assocₜ SSC→CwF .CwF.id = idₜ SSC→CwF .CwF.idr = idrₜ SSC→CwF .CwF.idl = idlₜ SSC→CwF .CwF.Tm = Tm SSC→CwF .CwF._[_] = _[_]ₜ SSC→CwF .CwF.[]-∘ = []-∘ₜ SSC→CwF .CwF.[]-id = []-idₜ SSC→CwF .CwF.ε = εₜ SSC→CwF .CwF.ε-∘ γ = refl SSC→CwF .CwF.◆-η = refl SSC→CwF .CwF.p = idₜ ∘pₜ SSC→CwF .CwF.q = q SSC→CwF .CwF._,_ = _,ₜ_ SSC→CwF .CwF.,-∘ γ a δ = refl SSC→CwF .CwF.▹-β₁ γ a = begin idₜ ∘pₜ ∘ₜ (γ ,ₜ a) ≡⟨ ∘p-,ₜ _ _ _ ⟩ idₜ ∘ₜ γ ≡⟨ idlₜ _ ⟩ γ ∎ SSC→CwF .CwF.▹-β₂ γ a = begin q [ T→SS γ ⁺ₛ ]ₛ [ ⟨ a ⟩ ] ≡⟨ cong (λ x → x [ ⟨ a ⟩ ]) (q-⁺ₛ (T→SS γ)) ⟩ q [ ⟨ a ⟩ ] ≡⟨ q-⟨⟩ _ ⟩ a ∎ SSC→CwF .CwF.▹-η = refl SSC→CwF .CwF.ι = ι SSC→CwF .CwF._⇒_ = _⇒_ SSC→CwF .CwF.app = app SSC→CwF .CwF.app-[] f a γ = app-[]ₛ _ _ (T→SS γ) SSC→CwF .CwF.lam = lam SSC→CwF .CwF.lam-[] b γ = begin lam b [ T→SS γ ]ₛ ≡⟨ lam-[]ₛ _ (T→SS γ) ⟩ lam (b [ T→SS γ ⁺ₛ ]ₛ) ≡˘⟨ cong (λ x → lam x) ([]-⁺ₛ _ (T→SS idₜ) idₛ λ b → []-idₜ _) ⟩ lam (b [ T→SS γ ⁺ₛ ]ₛ [ T→SS idₜ ⁺ₛ ]ₛ) ≡˘⟨ cong (λ x → lam x) (▹-η _) ⟩ lam (b [ T→SS γ ⁺ₛ ]ₛ [ T→SS idₜ ⁺ₛ ]ₛ [ p ⁺ ] [ ⟨ q ⟩ ]) ≡˘⟨ cong (λ x → lam (x [ ⟨ q ⟩ ])) ([]-⁺ₛ (b [ T→SS γ ⁺ₛ ]ₛ) (T→SS (idₜ ∘pₜ)) (T→SS idₜ ∘ₛ ⌜ p ⌝) λ b → []-∘pₜ _ idₜ) ⟩ lam (b [ T→SS γ ⁺ₛ ]ₛ [ T→SS (idₜ ∘pₜ) ⁺ₛ ]ₛ [ ⟨ q ⟩ ]) ≡˘⟨ cong (λ x → lam (x [ ⟨ q ⟩ ])) ([]-⁺ₛ _ (T→SS (γ ∘ₜ (idₜ ∘pₜ))) (T→SS γ ∘ₛ T→SS (idₜ ∘pₜ)) λ b → []-∘ₜ _ γ (idₜ ∘pₜ)) ⟩ lam (b [ T→SS (γ ∘ₜ (idₜ ∘pₜ)) ⁺ₛ ]ₛ [ ⟨ q ⟩ ]) ∎ SSC→CwF .CwF.⇒-β b a = begin app (lam b) a ≡⟨ ⇒-β _ _ ⟩ b [ ⟨ a ⟩ ] ≡˘⟨ cong (λ x → x [ ⟨ a ⟩ ]) ([]-⁺ₛ _ (T→SS idₜ) idₛ λ b → []-idₜ _) ⟩ b [ T→SS idₜ ⁺ₛ ]ₛ [ ⟨ a ⟩ ] ∎ SSC→CwF .CwF.⇒-η f = begin lam (app (f [ T→SS (idₜ ∘pₜ) ]ₛ) q) ≡⟨ cong (λ x → lam (app x q)) ([]-∘pₜ _ idₜ) ⟩ lam (app (f [ T→SS idₜ ]ₛ [ p ]) q) ≡⟨ cong (λ x → lam (app (x [ p ]) q)) ([]-idₜ _) ⟩ lam (app (f [ p ]) q) ≡⟨ ⇒-η _ ⟩ f ∎ module SSC→CwF→SSC (M : SSC) where open SSC M open SSC→CwF M open CwF→SSC (SSC→CwF M) hiding (SSub) module SCS = SSC (CwF→SSC (SSC→CwF M)) private variable Γ Δ : Con A B : Ty SCS-Ty : SCS.Ty ≡ Ty SCS-Ty = refl SCS-Tm : (Γ : Con) (A : Ty) → SCS.Tm Γ A ≡ Tm Γ A SCS-Tm Γ A = refl SCS-[] : (a : Tm Γ A) (γ : SSub Δ Γ) → a SCS.[ γ ] ≡ a [ γ ] SCS-[] a pₛ = begin a [ idₜ ∘pₜ ]ₜ ≡⟨ []-∘pₜ _ idₜ ⟩ a [ idₜ ]ₜ [ p ] ≡⟨ cong (λ x → x [ p ]) ([]-idₜ _) ⟩ a [ p ] ∎ SCS-[] a (γ ⁺) = begin a [ T→SS (SS→S γ ∘ₜ (idₜ ∘pₜ)) ⁺ₛ ]ₛ [ ⟨ q ⟩ ] ≡⟨ cong (λ x → x [ ⟨ q ⟩ ]) ([]-⁺ₛ _ (T→SS (SS→S γ ∘ₜ (idₜ ∘pₜ))) (T→SS (SS→S γ) ∘ₛ (T→SS (idₜ ∘pₜ))) λ a → []-∘ₜ _ (SS→S γ) (idₜ ∘pₜ)) ⟩ a [ T→SS (SS→S γ) ⁺ₛ ]ₛ [ T→SS (idₜ ∘pₜ) ⁺ₛ ]ₛ [ ⟨ q ⟩ ] ≡⟨ cong (λ x → x [ T→SS (idₜ ∘pₜ) ⁺ₛ ]ₛ [ ⟨ q ⟩ ]) ([]-⁺ₛ _ (T→SS (SS→S γ)) ⌜ γ ⌝ λ a → SCS-[] _ _) ⟩ a [ γ ⁺ ] [ T→SS (idₜ ∘pₜ) ⁺ₛ ]ₛ [ ⟨ q ⟩ ] ≡⟨ cong (λ x → x [ ⟨ q ⟩ ]) ([]-⁺ₛ _ (T→SS (idₜ ∘pₜ)) (T→SS idₜ ∘ₛ ⌜ p ⌝) λ a → []-∘pₜ _ idₜ) ⟩ a [ γ ⁺ ] [ T→SS idₜ ⁺ₛ ]ₛ [ p ⁺ ] [ ⟨ q ⟩ ] ≡⟨ cong (λ x → x [ p ⁺ ] [ ⟨ q ⟩ ]) ([]-⁺ₛ _ (T→SS idₜ) idₛ λ a → []-idₜ _) ⟩ a [ γ ⁺ ] [ p ⁺ ] [ ⟨ q ⟩ ] ≡⟨ ▹-η _ ⟩ a [ γ ⁺ ] ∎ SCS-[] a ⟨ z ⟩ = cong (λ x → x [ ⟨ z ⟩ ]) ([]-⁺ₛ _ (T→SS idₜ) idₛ λ a → []-idₜ _) SCS-q : (Tm (Γ ▹ A) A ∋ SCS.q) ≡ q SCS-q = refl SCS-ι : SCS.ι ≡ ι SCS-ι = refl SCS-⇒ : (A B : Ty) → (A SCS.⇒ B) ≡ (A ⇒ B) SCS-⇒ A B = refl SCS-app : (f : Tm Γ (A ⇒ B)) (a : Tm Γ A) → SCS.app f a ≡ app f a SCS-app f a = refl SCS-lam : (b : Tm (Γ ▹ A) B) → SCS.lam b ≡ lam b SCS-lam b = refl module CwF→SSC→CwF (M : CwF) where open CwF M open CwF→SSC M open SSC→CwF (CwF→SSC M) module CSC = CwF (SSC→CwF (CwF→SSC M)) private variable Γ Δ Θ : Con A B : Ty CSC-Ty : CSC.Ty ≡ Ty CSC-Ty = refl CSC-Tm : (Γ : Con) (A : Ty) → CSC.Tm Γ A ≡ Tm Γ A CSC-Tm Γ A = refl T→S : Tms Δ Γ → Sub Δ Γ T→S εₜ = ε T→S (γ ,ₜ a) = T→S γ , a S→T : Sub Δ Γ → Tms Δ Γ S→T {Γ = ◆} γ = εₜ S→T {Γ = Γ ▹ A} γ = S→T (p ∘ γ) ,ₜ q [ γ ] S→T→S : (γ : Sub Δ Γ) → T→S (S→T γ) ≡ γ S→T→S {Γ = ◆} γ = begin ε ≡˘⟨ ε-∘ _ ⟩ ε ∘ γ ≡⟨ cong (λ x → x ∘ γ) ◆-η ⟩ id ∘ γ ≡⟨ idl _ ⟩ γ ∎ S→T→S {Γ = Γ ▹ A} γ = begin T→S (S→T (p ∘ γ)) , q [ γ ] ≡⟨ cong (λ x → x , q [ γ ]) (S→T→S _) ⟩ p ∘ γ , q [ γ ] ≡˘⟨ ,-∘ _ _ _ ⟩ (p , q) ∘ γ ≡⟨ cong (λ x → x ∘ γ) ▹-η ⟩ id ∘ γ ≡⟨ idl _ ⟩ γ ∎ T→S→T : (γ : Tms Δ Γ) → S→T (T→S γ) ≡ γ T→S→T εₜ = refl T→S→T (γ ,ₜ a) = begin S→T (p ∘ (T→S γ , a)) ,ₜ q [ T→S γ , a ] ≡⟨ cong (λ x → S→T x ,ₜ q [ T→S γ , a ]) (▹-β₁ _ _) ⟩ S→T (T→S γ) ,ₜ q [ T→S γ , a ] ≡⟨ cong (λ x → x ,ₜ q [ T→S γ , a ]) (T→S→T _) ⟩ γ ,ₜ q [ T→S γ , a ] ≡⟨ cong (λ x → γ ,ₜ x) (▹-β₂ _ _) ⟩ γ ,ₜ a ∎ CSC-Sub : (Δ Γ : Con) → CSC.Sub Δ Γ ↔ Sub Δ Γ CSC-Sub Δ Γ = mk↔ₛ′ T→S S→T S→T→S T→S→T []-εₛ : (a : Tm ◆ A) → (Tm Γ A ∋ a [ εₛ ]ₛ) ≡ a [ ε ] []-εₛ {Γ = ◆} a = begin a ≡˘⟨ []-id _ ⟩ a [ id ] ≡˘⟨ cong (λ x → a [ x ]) ◆-η ⟩ a [ ε ] ∎ []-εₛ {Γ = Γ ▹ Z} a = begin a [ εₛ ]ₛ [ p ] ≡⟨ cong (λ x → x [ p ]) ([]-εₛ _) ⟩ a [ ε ] [ p ] ≡˘⟨ []-∘ _ _ _ ⟩ a [ ε ∘ p ] ≡⟨ cong (λ x → a [ x ]) (ε-∘ _) ⟩ a [ ε ] ∎ CSC-[] : (a : Tm Γ A) (γ : Tms Δ Γ) → a CSC.[ γ ] ≡ a [ T→S γ ] CSC-[] a εₜ = []-εₛ _ CSC-[] a (γ ,ₜ z) = begin a [ T→SS γ ⁺ₛ ]ₛ [ id , z ] ≡⟨ cong (λ x → x [ id , z ]) ([]-⁺ₛ→lam _ (T→SS γ)) ⟩ app (lam a [ T→SS γ ]ₛ [ p ]) q [ id , z ] ≡⟨ cong (λ x → app (x [ p ]) q [ id , z ]) (CSC-[] _ γ) ⟩ app (lam a [ T→S γ ] [ p ]) q [ id , z ] ≡⟨ app-[] _ _ _ ⟩ app (lam a [ T→S γ ] [ p ] [ id , z ]) (q [ id , z ]) ≡˘⟨ cong (λ x → app x (q [ id , z ])) ([]-∘ _ _ _) ⟩ app (lam a [ T→S γ ] [ p ∘ (id , z) ]) (q [ id , z ]) ≡⟨ cong (λ x → app (lam a [ T→S γ ] [ x ]) (q [ id , z ])) (▹-β₁ _ _) ⟩ app (lam a [ T→S γ ] [ id ]) (q [ id , z ]) ≡⟨ cong (λ x → app x (q [ id , z ])) ([]-id _) ⟩ app (lam a [ T→S γ ]) (q [ id , z ]) ≡⟨ cong (λ x → app (lam a [ T→S γ ]) x) (▹-β₂ _ _) ⟩ app (lam a [ T→S γ ]) z ≡⟨ cong (λ x → app x z) (lam-[] _ _) ⟩ app (lam (a [ T→S γ ∘ p , q ])) z ≡⟨ ⇒-β _ _ ⟩ a [ T→S γ ∘ p , q ] [ id , z ] ≡˘⟨ []-∘ _ _ _ ⟩ a [ (T→S γ ∘ p , q) ∘ (id , z) ] ≡⟨ cong (λ x → a [ x ]) (,-∘ _ _ _) ⟩ a [ T→S γ ∘ p ∘ (id , z) , q [ id , z ] ] ≡˘⟨ cong (λ x → a [ x , q [ id , z ] ]) (assoc _ _ _) ⟩ a [ T→S γ ∘ (p ∘ (id , z)) , q [ id , z ] ] ≡⟨ cong (λ x → a [ T→S γ ∘ x , q [ id , z ] ]) (▹-β₁ _ _) ⟩ a [ T→S γ ∘ id , q [ id , z ] ] ≡⟨ cong (λ x → a [ x , q [ id , z ] ]) (idr _) ⟩ a [ T→S γ , q [ id , z ] ] ≡⟨ cong (λ x → a [ T→S γ , x ]) (▹-β₂ _ _) ⟩ a [ T→S γ , z ] ∎ CSC-∘ : (γ : Tms Δ Γ) (δ : Tms Θ Δ) → T→S (γ CSC.∘ δ) ≡ T→S γ ∘ T→S δ CSC-∘ εₜ δ = sym (ε-∘ _) CSC-∘ (γ ,ₜ a) δ = begin T→S (γ ∘ₜ δ) , a [ δ ]ₜ ≡⟨ cong (λ x → x , a [ δ ]ₜ) (CSC-∘ γ δ) ⟩ T→S γ ∘ T→S δ , a [ δ ]ₜ ≡⟨ cong (λ x → T→S γ ∘ T→S δ , x) (CSC-[] _ δ) ⟩ T→S γ ∘ T→S δ , a [ T→S δ ] ≡˘⟨ ,-∘ _ _ _ ⟩ (T→S γ , a) ∘ T→S δ ∎ CSC-∘p : (γ : Tms Δ Γ) → (Sub (Δ ▹ A) Γ ∋ T→S (γ ∘pₜ)) ≡ (T→S γ ∘ p) CSC-∘p εₜ = sym (ε-∘ _) CSC-∘p (γ ,ₜ z) = begin T→S (γ ∘pₜ) , z [ p ] ≡⟨ cong (λ x → x , z [ p ]) (CSC-∘p γ) ⟩ T→S γ ∘ p , z [ p ] ≡˘⟨ ,-∘ _ _ _ ⟩ (T→S γ , z) ∘ p ∎ CSC-id : (Sub Γ Γ ∋ T→S CSC.id) ≡ id CSC-id {Γ = ◆} = ◆-η CSC-id {Γ = Γ ▹ A} = begin T→S (idₜ ∘pₜ) , q ≡⟨ cong (λ x → x , q) (CSC-∘p idₜ) ⟩ T→S idₜ ∘ p , q ≡⟨ cong (λ x → x ∘ p , q) CSC-id ⟩ id ∘ p , q ≡⟨ cong (λ x → x , q) (idl _) ⟩ p , q ≡⟨ ▹-η ⟩ id ∎ CSC-ε : (Sub Γ ◆ ∋ T→S CSC.ε) ≡ ε CSC-ε = refl CSC-p : (Sub (Γ ▹ A) Γ ∋ T→S CSC.p) ≡ p CSC-p = begin T→S (idₜ ∘pₜ) ≡⟨ CSC-∘p idₜ ⟩ T→S idₜ ∘ p ≡⟨ cong (λ x → x ∘ p) CSC-id ⟩ id ∘ p ≡⟨ idl _ ⟩ p ∎ CSC-q : (Tm (Γ ▹ A) A ∋ CSC.q) ≡ q CSC-q = refl CSC-, : (γ : Tms Δ Γ) (a : Tm Δ A) → T→S (γ CSC., a) ≡ (T→S γ , a) CSC-, γ a = refl CSC-ι : CSC.ι ≡ ι CSC-ι = refl CSC-⇒ : (A B : Ty) → (A CSC.⇒ B) ≡ (A ⇒ B) CSC-⇒ A B = refl CSC-app : (f : Tm Γ (A ⇒ B)) (a : Tm Γ A) → CSC.app f a ≡ app f a CSC-app f a = refl CSC-lam : (b : Tm (Γ ▹ A) B) → CSC.lam b ≡ lam b CSC-lam b = refl