module Algorithmic.RenamingSubstitution where
open import Function using (id; _∘_) open import Data.Nat using (suc;zero) open import Data.Fin using (Fin;zero;suc) open import Data.Vec as Vec using (Vec;[];_∷_;lookup) open import Relation.Binary.PropositionalEquality using (_≡_;refl;sym;trans;cong;cong₂;subst) open import Utils using (Kind;*) open import Utils.List using (List;[];_∷_) open import Type using (Ctx⋆;_,⋆_;S) import Type.RenamingSubstitution as ⋆ open import Type.BetaNBE open import Type.BetaNormal --using (_⊢Nf⋆_;_⊢Ne⋆_;renNf;weakenNf;renNf-VecList;renNf-List;lookup-renNf-VecList;embNf-List;embNf;embNf-VecList) open _⊢Nf⋆_ open _⊢Ne⋆_ open import Type.BetaNBE.RenamingSubstitution open import Algorithmic using (Ctx;_∋_;conv∋;_⊢_;conv⊢;ConstrArgs;Cases;[];_∷_) open import Algorithmic.Signature using (btype-ren;btype-sub) open Ctx open _∋_ open _⊢_ open import Type.BetaNormal.Equality using (renNf-id)
Ren : ∀{Φ Ψ} → ⋆.Ren Φ Ψ → Ctx Φ → Ctx Ψ → Set Ren ρ⋆ Γ Δ = {A : _ ⊢Nf⋆ *} → Γ ∋ A → Δ ∋ renNf ρ⋆ A ext : ∀ {Φ Ψ Γ Δ} → (ρ⋆ : ⋆.Ren Φ Ψ) → (ρ : Ren ρ⋆ Γ Δ) → {B : Φ ⊢Nf⋆ *} ------------------------------- → Ren ρ⋆ (Γ , B) (Δ , renNf ρ⋆ B) ext ρ⋆ ρ Z = Z ext ρ⋆ ρ (S x) = S (ρ x)
ext⋆ : ∀ {Φ Ψ Γ Δ} → (ρ⋆ : ⋆.Ren Φ Ψ) → (ρ : Ren ρ⋆ Γ Δ) → ∀ {K} -------------------------------- → Ren (⋆.ext ρ⋆) (Γ ,⋆ K) (Δ ,⋆ K) ext⋆ ρ⋆ ρ (T {A = A} x) = conv∋ refl (weakenNf-renNf ρ⋆ A) (T (ρ x))
A property showing that renaming and the creating the case type is the same as creating the case type and the renaming.
ren-mkCaseType : ∀ {Φ Ψ} → (ρ⋆ : ⋆.Ren Φ Ψ) → ∀{A} As → renNf ρ⋆ (Algorithmic.mkCaseType A As) ≡ Algorithmic.mkCaseType (renNf ρ⋆ A) (renNf-List ρ⋆ As) ren-mkCaseType ρ⋆ [] = refl ren-mkCaseType ρ⋆ (x ∷ As) = cong (renNf ρ⋆ x ⇒_) (ren-mkCaseType ρ⋆ As)
The actual renaming definition
ren : ∀ {Φ Ψ Γ Δ} → (ρ⋆ : ⋆.Ren Φ Ψ) → (ρ : Ren ρ⋆ Γ Δ) ----------------------------------------- → ({A : Φ ⊢Nf⋆ *} → Γ ⊢ A → Δ ⊢ renNf ρ⋆ A ) ren-ConstrArgs : ∀ {Φ Ψ Γ Δ n} → (ρ⋆ : ⋆.Ren Φ Ψ) → (ρ : Ren ρ⋆ Γ Δ) → (e : Fin n) → (Tss : Vec (List (Φ ⊢Nf⋆ *)) n) → (x : ConstrArgs Γ (lookup Tss e)) -------------------------------------------- → ConstrArgs Δ (lookup (renNf-VecList ρ⋆ Tss) e) ren-ConstrArgs-List : ∀ {Φ Ψ Γ Δ} → (ρ⋆ : ⋆.Ren Φ Ψ) → (ρ : Ren ρ⋆ Γ Δ) → {As : List (Φ ⊢Nf⋆ *) } → (x : ConstrArgs Γ As) ------------------------------- → ConstrArgs Δ (renNf-List ρ⋆ As) ren-Cases : ∀ {Φ Ψ Γ Δ n} → (ρ⋆ : ⋆.Ren Φ Ψ) → (ρ : Ren ρ⋆ Γ Δ) → {A : Φ ⊢Nf⋆ *} → {Tss : Vec (List (Φ ⊢Nf⋆ *)) n} → (cases : Cases Γ A Tss) ------------------------------------------- → Cases Δ (renNf ρ⋆ A) (renNf-VecList ρ⋆ Tss) ren ρ⋆ ρ (` x) = ` (ρ x) ren ρ⋆ ρ (ƛ N) = ƛ (ren ρ⋆ (ext ρ⋆ ρ) N) ren ρ⋆ ρ (L · M) = ren ρ⋆ ρ L · ren ρ⋆ ρ M ren ρ⋆ ρ (Λ N) = Λ (ren (⋆.ext ρ⋆) (ext⋆ ρ⋆ ρ) N) ren ρ⋆ ρ (_·⋆_/_ {B = B} t A refl) = conv⊢ refl (sym (ren[]Nf ρ⋆ B A)) (ren ρ⋆ ρ t ·⋆ renNf ρ⋆ A / refl) ren ρ⋆ ρ (wrap A B M) = wrap (renNf ρ⋆ A) (renNf ρ⋆ B) (conv⊢ refl (ren-nf-μ ρ⋆ A B) (ren ρ⋆ ρ M)) ren ρ⋆ ρ (unwrap {A = A}{B} M refl) = conv⊢ refl (sym (ren-nf-μ ρ⋆ A B)) (unwrap (ren ρ⋆ ρ M) refl) ren ρ⋆ ρ (con {A} c refl) = con c (subNf∅-renNf ρ⋆ A) ren ρ⋆ ρ (builtin b / refl) = conv⊢ refl (btype-ren b ρ⋆) (builtin b / refl) ren ρ⋆ ρ (error A) = error (renNf ρ⋆ A) ren ρ⋆ ρ (constr e Tss refl x) = constr e (renNf-VecList ρ⋆ Tss) refl (ren-ConstrArgs ρ⋆ ρ e Tss x) ren ρ⋆ ρ (case x cases) = case (ren ρ⋆ ρ x) (ren-Cases ρ⋆ ρ cases) ren-ConstrArgs-List ρ⋆ ρ [] = [] ren-ConstrArgs-List ρ⋆ ρ (t ∷ xs) = ren ρ⋆ ρ t ∷ ren-ConstrArgs-List ρ⋆ ρ xs ren-ConstrArgs ρ⋆ ρ e Tss x rewrite lookup-renNf-VecList ρ⋆ e Tss = ren-ConstrArgs-List ρ⋆ ρ x ren-Cases ρ⋆ ρ [] = [] ren-Cases {Δ = Δ} ρ⋆ ρ {Tss = As ∷ _} (c ∷ cases) = subst (Δ ⊢_) (ren-mkCaseType ρ⋆ As) (ren ρ⋆ ρ c) ∷ (ren-Cases ρ⋆ ρ cases)
weaken : ∀ {Φ Γ}{A : Φ ⊢Nf⋆ *}{B : Φ ⊢Nf⋆ *} → Γ ⊢ A --------- → Γ , B ⊢ A weaken t = conv⊢ refl (renNf-id _) (ren id (conv∋ refl (sym (renNf-id _)) ∘ S) t)
weaken⋆ : ∀ {Φ Γ}{A : Φ ⊢Nf⋆ *}{K} → Γ ⊢ A ------------------ → Γ ,⋆ K ⊢ weakenNf A weaken⋆ t = ren S (λ α → _∋_.T α) t
Sub : ∀{Φ Ψ} → SubNf Φ Ψ → Ctx Φ → Ctx Ψ → Set Sub σ⋆ Γ Δ = (∀ {A : _ ⊢Nf⋆ *} → Γ ∋ A → Δ ⊢ subNf σ⋆ A) exts : ∀ {Φ Ψ Γ Δ} → (σ⋆ : SubNf Φ Ψ) → (σ : Sub σ⋆ Γ Δ) → {B : Φ ⊢Nf⋆ *} --------------------------------- → Sub σ⋆ (Γ , B) (Δ , subNf σ⋆ B) exts σ⋆ σ Z = ` Z exts σ⋆ σ (S α) = weaken (σ α)
exts⋆ : ∀ {Φ Ψ Γ Δ} → (σ⋆ : SubNf Φ Ψ) → (σ : Sub σ⋆ Γ Δ) → ∀ {K} -------------------------------- → Sub (extsNf σ⋆) (Γ ,⋆ K) (Δ ,⋆ K) exts⋆ σ⋆ σ {K}(T {A = A} x) = conv⊢ refl (weakenNf-subNf σ⋆ A) (weaken⋆ (σ x))
sub : ∀ {Φ Ψ Γ Δ} → (σ⋆ : SubNf Φ Ψ) → (σ : Sub σ⋆ Γ Δ) ------------------------------------------- → ({A : Φ ⊢Nf⋆ *} → Γ ⊢ A → Δ ⊢ subNf σ⋆ A) sub-ConstrList : ∀ {Φ Ψ Γ Δ} → (σ⋆ : SubNf Φ Ψ) → (σ : Sub σ⋆ Γ Δ) → {A : List (Φ ⊢Nf⋆ *)} → (x : ConstrArgs Γ A) -------------------------- → ConstrArgs Δ (eval-List (⋆.sub-List (λ x₁ → embNf (σ⋆ x₁)) (embNf-List A)) (λ x₁ → reflect (` x₁))) sub-ConstrList σ⋆ σ [] = [] sub-ConstrList σ⋆ σ (t ∷ xs) = sub σ⋆ σ t ∷ sub-ConstrList σ⋆ σ xs sub-VecList : ∀ {Φ Ψ Γ Δ n} → (σ⋆ : SubNf Φ Ψ) → (σ : Sub σ⋆ Γ Δ) → (e : Fin n) → (Tss : Vec (List (Φ ⊢Nf⋆ *)) n) → (x : ConstrArgs Γ (lookup Tss e)) -------------------------------------- → ConstrArgs Δ (lookup (eval-VecList (⋆.sub-VecList (λ x₁ → embNf (σ⋆ x₁)) (embNf-VecList Tss)) (idEnv Ψ)) e) sub-VecList σ⋆ σ e Tss x rewrite lookup-eval-VecList e (⋆.sub-VecList (λ x₁ → embNf (σ⋆ x₁)) (embNf-VecList Tss)) (idEnv _) | ⋆.lookup-sub-VecList (λ x₁ → embNf (σ⋆ x₁)) e (embNf-VecList Tss) | lookup-embNf-VecList e Tss = sub-ConstrList σ⋆ σ x sub-mkCaseType : ∀ {Φ Ψ} → (σ⋆ : SubNf Φ Ψ) → ∀{A} As → subNf σ⋆ (Algorithmic.mkCaseType A As) ≡ Algorithmic.mkCaseType (subNf σ⋆ A) (eval-List (⋆.sub-List (λ x₁ → embNf (σ⋆ x₁)) (embNf-List As)) (idEnv Ψ)) sub-mkCaseType σ⋆ [] = refl sub-mkCaseType σ⋆ (x ∷ As) = cong (subNf σ⋆ x ⇒_) (sub-mkCaseType σ⋆ As) sub-Cases : ∀ {Φ Ψ Γ Δ n} → (σ⋆ : SubNf Φ Ψ) → (σ : Sub σ⋆ Γ Δ) → {A : Φ ⊢Nf⋆ *} → {Tss : Vec (List (Φ ⊢Nf⋆ *)) n} → (cs : Cases Γ A Tss) --------------------------------- → Cases Δ (subNf σ⋆ A) (eval-VecList (⋆.sub-VecList (λ x₁ → embNf (σ⋆ x₁)) (embNf-VecList Tss)) (idEnv Ψ)) sub-Cases σ⋆ σ [] = [] sub-Cases {Δ = Δ} σ⋆ σ {Tss = As ∷ _} (c ∷ cs) = subst (Δ ⊢_) (sub-mkCaseType σ⋆ As) (sub σ⋆ σ c) ∷ (sub-Cases σ⋆ σ cs) sub σ⋆ σ (` k) = σ k sub σ⋆ σ (ƛ N) = ƛ (sub σ⋆ (exts σ⋆ σ) N) sub σ⋆ σ (L · M) = sub σ⋆ σ L · sub σ⋆ σ M sub σ⋆ σ (Λ {B = B} N) = Λ (conv⊢ refl (sub-nf-Π σ⋆ B) (sub (extsNf σ⋆) (exts⋆ σ⋆ σ) N)) sub σ⋆ σ (_·⋆_/_ {B = B} L M refl) = conv⊢ refl (sym (sub[]Nf' σ⋆ M B)) (sub σ⋆ σ L ·⋆ subNf σ⋆ M / refl) sub σ⋆ σ (wrap A B M) = wrap (subNf σ⋆ A) (subNf σ⋆ B) (conv⊢ refl (sub-nf-μ σ⋆ A B) (sub σ⋆ σ M)) sub σ⋆ σ (unwrap {A = A}{B} M refl) = conv⊢ refl (sym (sub-nf-μ σ⋆ A B)) (unwrap (sub σ⋆ σ M) refl) sub σ⋆ σ (con {A} c refl) = con c (subNf∅-subNf σ⋆ A) sub σ⋆ σ (builtin b / refl) = conv⊢ refl (btype-sub b σ⋆) (builtin b / refl) sub σ⋆ σ (error A) = error (subNf σ⋆ A) sub σ⋆ σ (constr e Tss refl x) = constr e _ refl (sub-VecList σ⋆ σ e Tss x) sub σ⋆ σ (case x cs) = case (sub σ⋆ σ x) (sub-Cases σ⋆ σ cs)
subcons : ∀{Φ Ψ Γ Δ} → (σ⋆ : SubNf Φ Ψ) → (σ : Sub σ⋆ Γ Δ) → {A : Φ ⊢Nf⋆ *} → (t : Δ ⊢ subNf σ⋆ A) --------------------- → (∀ {B : Φ ⊢Nf⋆ *} → Γ , A ∋ B → Δ ⊢ subNf σ⋆ B) subcons σ⋆ σ t Z = t subcons σ⋆ σ t (S x) = σ x
_[_] : ∀{Φ Γ}{A B : Φ ⊢Nf⋆ *} → Γ , B ⊢ A → Γ ⊢ B ----- → Γ ⊢ A _[_] {A = A}{B} b a = conv⊢ refl (subNf-id A) (sub ( ne ∘ `) (subcons (ne ∘ `) (conv⊢ refl (sym (subNf-id _)) ∘ `) (conv⊢ refl (sym (subNf-id B)) a)) b)
lem : ∀ {Φ Γ K} {B : Φ ,⋆ K ⊢Nf⋆ *}{A : Φ ⊢Nf⋆ K} → (x : Γ ,⋆ K ∋ B) → Γ ⊢ subNf (subNf-cons (λ x₁ → ne (` x₁)) A) B lem (T x) = conv⊢ refl (weakenNf[] _ _) (` x) _[_]⋆ : ∀ {Φ Γ K} {B : Φ ,⋆ K ⊢Nf⋆ *} → Γ ,⋆ K ⊢ B → (A : Φ ⊢Nf⋆ K) --------- → Γ ⊢ B [ A ]Nf _[_]⋆ b A = sub (subNf-cons (ne ∘ `) A) lem b
These are easier to reason about and show up in the CEK machine as discharge is simply typed. Fully general rens/subs reasoning easily gets bogged down with type coercions.
Note: This doesn’t scale to substitution as we need to weaken by a type var to go under a Λ.
Renˢ : ∀{Φ} → Ctx Φ → Ctx Φ → Set Renˢ Γ Δ = ∀{A} → Γ ∋ A → Δ ∋ A extˢ : ∀ {Φ Γ Δ} → (ρ : Renˢ Γ Δ) → {B : Φ ⊢Nf⋆ *} ------------------------------- → Renˢ (Γ , B) (Δ , B) extˢ ρ Z = Z extˢ ρ (S x) = S (ρ x) -- here we are manipulating the type contexts of the renaming but only -- by extending them with the same kind extˢ⋆ : ∀{Φ}{Γ Δ : Ctx Φ} → (ρ : Renˢ Γ Δ) → ∀ {K} ---------------------- → Renˢ (Γ ,⋆ K) (Δ ,⋆ K) extˢ⋆ ρ (T x) = T (ρ x) renˢ : ∀ {Φ Γ Δ} → (ρ : Renˢ Γ Δ) → {A : Φ ⊢Nf⋆ *} → Γ ⊢ A ----- → Δ ⊢ A renˢ-List : ∀ {Φ Γ Δ} → (ρ : Renˢ Γ Δ) → {As : List (Φ ⊢Nf⋆ *)} → ConstrArgs Γ As ---------------------- → ConstrArgs Δ As renˢ-List ρ [] = [] renˢ-List ρ (x ∷ xs) = renˢ ρ x ∷ (renˢ-List ρ xs) renˢ-ConstrArgs : ∀ {Φ Γ Δ n} → (ρ : Renˢ Γ Δ) → (e : Fin n) → (Tss : Vec (List (Φ ⊢Nf⋆ *)) n) → (xs : ConstrArgs Γ (lookup Tss e)) ----- → ConstrArgs Δ (lookup Tss e) renˢ-ConstrArgs ρ zero (As ∷ Tss) xs = renˢ-List ρ xs renˢ-ConstrArgs ρ (suc e) (As ∷ Tss) xs = renˢ-ConstrArgs ρ e Tss xs renˢ-Cases : ∀ {Φ Γ Δ n} → (ρ : Renˢ Γ Δ) → {A : Φ ⊢Nf⋆ *} → {Tss : Vec (List (Φ ⊢Nf⋆ *)) n} → (cs : Cases Γ A Tss) ------------------------------ → Cases Δ A Tss renˢ-Cases ρ [] = [] renˢ-Cases ρ (c ∷ cs) = renˢ ρ c ∷ (renˢ-Cases ρ cs) renˢ ρ (` x) = ` (ρ x) renˢ ρ (ƛ M) = ƛ (renˢ (extˢ ρ) M) renˢ ρ (L · M) = renˢ ρ L · renˢ ρ M renˢ ρ (Λ M) = Λ (renˢ (extˢ⋆ ρ) M) renˢ ρ (M ·⋆ A / p) = renˢ ρ M ·⋆ A / p renˢ ρ (wrap A B M) = wrap A B (renˢ ρ M) renˢ ρ (unwrap M p) = unwrap (renˢ ρ M) p renˢ ρ (con c refl) = con c refl renˢ ρ (builtin b / p) = builtin b / p renˢ ρ (error _) = error _ renˢ ρ (constr e Tss refl x) = constr e Tss refl (renˢ-ConstrArgs ρ e Tss x) renˢ ρ (case x cs) = case (renˢ ρ x) (renˢ-Cases ρ cs) weakenˢ : ∀ {Φ Γ}{A : Φ ⊢Nf⋆ *}{B : Φ ⊢Nf⋆ *} → Γ ⊢ A --------- → Γ , B ⊢ A weakenˢ M = renˢ S M -- cannot define this using renˢ {- weaken⋆ˢ : ∀ {Φ Γ}{A : Φ ⊢Nf⋆ *}{K} → Γ ⊢ A ------------------ → Γ ,⋆ K ⊢ weakenNf A -} extˢ-id : ∀ {Φ Γ}{A B : Φ ⊢Nf⋆ *}(x : Γ , A ∋ B) → extˢ id x ≡ x extˢ-id Z = refl extˢ-id (S x) = refl extˢ-comp : ∀ {Φ Γ Δ Θ}{A B : Φ ⊢Nf⋆ *} → {ρ : Renˢ Δ Θ}{ρ' : Renˢ Γ Δ}(x : Γ , B ∋ A) → extˢ (ρ ∘ ρ') x ≡ extˢ ρ (extˢ ρ' x) extˢ-comp Z = refl extˢ-comp (S x) = refl extˢ⋆-id : ∀ {Φ Γ}{K}{A : Φ ,⋆ K ⊢Nf⋆ *}(x : Γ ,⋆ K ∋ A) → extˢ⋆ id x ≡ x extˢ⋆-id (T x) = refl extˢ⋆-comp : ∀ {Φ Γ Δ Θ}{K}{A : Φ ,⋆ K ⊢Nf⋆ *} → {ρ : Renˢ Δ Θ}{ρ' : Renˢ Γ Δ}(x : Γ ,⋆ K ∋ A) → extˢ⋆ (ρ ∘ ρ') x ≡ extˢ⋆ ρ (extˢ⋆ ρ' x) extˢ⋆-comp (T x) = refl extˢ-cong : ∀{Φ}{Γ Δ : Ctx Φ}{ρ ρ' : Renˢ Γ Δ} → (∀{A}(x : Γ ∋ A) → ρ x ≡ ρ' x) → ∀{A B}(x : Γ , A ∋ B) -------------------------------- → extˢ ρ x ≡ extˢ ρ' x extˢ-cong p Z = refl extˢ-cong p (S x) = cong S (p x) extˢ⋆-cong : ∀{Φ}{Γ Δ : Ctx Φ}{ρ ρ' : Renˢ Γ Δ} → (∀{A}(x : Γ ∋ A) → ρ x ≡ ρ' x) → ∀{K B}(x : Γ ,⋆ K ∋ B) -------------------------------- → extˢ⋆ ρ x ≡ extˢ⋆ ρ' x extˢ⋆-cong p (T x) = cong T (p x) renˢ-cong : ∀{Φ}{Γ Δ : Ctx Φ}{ρ ρ' : Renˢ Γ Δ} → (∀{A}(x : Γ ∋ A) → ρ x ≡ ρ' x) → ∀{A}(M : Γ ⊢ A) -------------------------------- → renˢ ρ M ≡ renˢ ρ' M renˢ-List-cong : ∀{Φ}{Γ Δ : Ctx Φ}{ρ ρ' : Renˢ Γ Δ} → (∀{A}(x : Γ ∋ A) → ρ x ≡ ρ' x) → {As : List (Φ ⊢Nf⋆ *)} → (cs : ConstrArgs Γ As) -------------------------------- → renˢ-List ρ cs ≡ renˢ-List ρ' cs renˢ-List-cong p [] = refl renˢ-List-cong p (t ∷ cs) = cong₂ _∷_ (renˢ-cong p t) (renˢ-List-cong p cs) renˢ-ConstrArgs-cong : ∀{Φ}{Γ Δ : Ctx Φ}{ρ ρ' : Renˢ Γ Δ}{n} → (∀{A}(x : Γ ∋ A) → ρ x ≡ ρ' x) → (e : Fin n) → (Tss : Vec (List (Φ ⊢Nf⋆ *)) n) → (cs : ConstrArgs Γ (lookup Tss e)) --------------------------------------------------- → renˢ-ConstrArgs ρ e Tss cs ≡ renˢ-ConstrArgs ρ' e Tss cs renˢ-ConstrArgs-cong p zero (_ ∷ _) cs = renˢ-List-cong p cs renˢ-ConstrArgs-cong p (suc e) (_ ∷ Tss) cs = renˢ-ConstrArgs-cong p e Tss cs renˢ-Cases-cong : ∀ {Φ} {Γ Δ : Ctx Φ} {ρ ρ' : Renˢ Γ Δ} (p : {A : Φ ⊢Nf⋆ *} (x : Γ ∋ A) → ρ x ≡ ρ' x) {A : Φ ⊢Nf⋆ *} {n} {Tss : Vec (List (Φ ⊢Nf⋆ *)) n} (cs : Cases Γ A Tss) -------------------------------------------------- → renˢ-Cases ρ cs ≡ renˢ-Cases ρ' cs renˢ-Cases-cong p [] = refl renˢ-Cases-cong p (c ∷ cs) = cong₂ _∷_ (renˢ-cong p c) (renˢ-Cases-cong p cs) renˢ-cong p (` x) = cong ` (p x) renˢ-cong p (ƛ M) = cong ƛ (renˢ-cong (extˢ-cong p) M) renˢ-cong p (L · M) = cong₂ _·_ (renˢ-cong p L) (renˢ-cong p M) renˢ-cong p (Λ M) = cong Λ (renˢ-cong (extˢ⋆-cong p) M) renˢ-cong p (M ·⋆ A / q) = cong (_·⋆ A / q) (renˢ-cong p M) renˢ-cong p (wrap A B M) = cong (wrap A B) (renˢ-cong p M) renˢ-cong p (unwrap M q) = cong (λ M → unwrap M q) (renˢ-cong p M) renˢ-cong p (con c refl) = refl renˢ-cong p (builtin b / q) = refl renˢ-cong p (error _) = refl renˢ-cong p (constr e Tss refl x) = cong (constr e Tss refl) (renˢ-ConstrArgs-cong p e Tss x) renˢ-cong p (case M cs) = cong₂ case (renˢ-cong p M) (renˢ-Cases-cong p cs) renˢ-id : ∀ {Φ Γ}{A : Φ ⊢Nf⋆ *}(M : Γ ⊢ A) → renˢ id M ≡ M renˢ-List-id : ∀ {Φ} {Γ : Ctx Φ} {A : List (Φ ⊢Nf⋆ *)} (cs : ConstrArgs Γ A) → renˢ-List id cs ≡ cs renˢ-List-id [] = refl renˢ-List-id (t ∷ cs) = cong₂ _∷_ (renˢ-id t) (renˢ-List-id cs) renˢ-ConstrArgs-id : ∀ {Φ} {Γ : Ctx Φ} {n} (e : Fin n) (Tss : Vec (List (Φ ⊢Nf⋆ *)) n) (cs : ConstrArgs Γ (lookup Tss e)) ----------------------------- → renˢ-ConstrArgs id e Tss cs ≡ cs renˢ-ConstrArgs-id zero (_ ∷ _) cs = renˢ-List-id cs renˢ-ConstrArgs-id (suc e) (_ ∷ Tss) cs = renˢ-ConstrArgs-id e Tss cs renˢ-Cases-id : ∀ {Φ} {Γ : Ctx Φ} {A : Φ ⊢Nf⋆ *} {n} {Tss : Vec (List (Φ ⊢Nf⋆ *)) n} (cases : Cases Γ A Tss) → renˢ-Cases id cases ≡ cases renˢ-Cases-id [] = refl renˢ-Cases-id (c ∷ cases) = cong₂ _∷_ (renˢ-id c) (renˢ-Cases-id cases) renˢ-id (` x) = refl renˢ-id (ƛ M) = cong ƛ (trans (renˢ-cong extˢ-id M) (renˢ-id M)) renˢ-id (L · M) = cong₂ _·_ (renˢ-id L) (renˢ-id M) renˢ-id (Λ M) = cong Λ (trans (renˢ-cong extˢ⋆-id M) (renˢ-id M)) renˢ-id (M ·⋆ A / p) = cong (_·⋆ A / p) (renˢ-id M) renˢ-id (wrap A B M) = cong (wrap A B) (renˢ-id M) renˢ-id (unwrap M p) = cong (λ M → unwrap M p) (renˢ-id M) renˢ-id (con c refl) = refl renˢ-id (builtin b / p) = refl renˢ-id (error _) = refl renˢ-id (constr e Tss refl x) = cong (constr e Tss refl) (renˢ-ConstrArgs-id e Tss x) renˢ-id (case M cases) = cong₂ case (renˢ-id M) (renˢ-Cases-id cases) renˢ-comp : ∀ {Φ Γ Δ Θ}{A : Φ ⊢Nf⋆ *} → {ρ : Renˢ Δ Θ}{ρ' : Renˢ Γ Δ}(M : Γ ⊢ A) → renˢ (ρ ∘ ρ') M ≡ renˢ ρ (renˢ ρ' M) renˢ-List-comp : ∀ {Φ} {Γ Δ Θ : Ctx Φ} {ρ : Renˢ Δ Θ} {ρ' : Renˢ Γ Δ} {A : List (Φ ⊢Nf⋆ *)} (cs : ConstrArgs Γ A) ------------------------------------------------- → renˢ-List (ρ ∘ ρ') cs ≡ renˢ-List ρ (renˢ-List ρ' cs) renˢ-List-comp [] = refl renˢ-List-comp (t ∷ cs) = cong₂ _∷_ (renˢ-comp t) (renˢ-List-comp cs) renˢ-ConstrArgs-comp : ∀ {Φ} {Γ Δ Θ : Ctx Φ} {ρ : Renˢ Δ Θ} {ρ' : Renˢ Γ Δ} {n} (e : Fin n) (Tss : Vec (List (Φ ⊢Nf⋆ *)) n) (x : ConstrArgs Γ (lookup Tss e)) -------------------------------------------------------------------------------- → renˢ-ConstrArgs (ρ ∘ ρ') e Tss x ≡ renˢ-ConstrArgs ρ e Tss (renˢ-ConstrArgs ρ' e Tss x) renˢ-ConstrArgs-comp zero (_ ∷ _) x = renˢ-List-comp x renˢ-ConstrArgs-comp (suc e) (_ ∷ Tss) x = renˢ-ConstrArgs-comp e Tss x renˢ-Cases-comp : ∀ {Φ} {Γ Δ Θ : Ctx Φ} {A : Φ ⊢Nf⋆ *} {ρ : Renˢ Δ Θ} {ρ' : Renˢ Γ Δ} {n} {Tss : Vec (List (Φ ⊢Nf⋆ *)) n} (cs : Cases Γ A Tss) ------------------------------------------------------- → renˢ-Cases (ρ ∘ ρ') cs ≡ renˢ-Cases ρ (renˢ-Cases ρ' cs) renˢ-Cases-comp [] = refl renˢ-Cases-comp (c ∷ cs) = cong₂ _∷_ (renˢ-comp c) (renˢ-Cases-comp cs) renˢ-comp (` x) = refl renˢ-comp (ƛ M) = cong ƛ (trans (renˢ-cong extˢ-comp M) (renˢ-comp M)) renˢ-comp (L · M) = cong₂ _·_ (renˢ-comp L) (renˢ-comp M) renˢ-comp (Λ M) = cong Λ (trans (renˢ-cong extˢ⋆-comp M) (renˢ-comp M)) renˢ-comp (M ·⋆ A / p) = cong (_·⋆ A / p) (renˢ-comp M) renˢ-comp (wrap A B M) = cong (wrap A B) (renˢ-comp M) renˢ-comp (unwrap M p) = cong (λ M → unwrap M p) (renˢ-comp M) renˢ-comp (con c refl) = refl renˢ-comp (builtin b / p) = refl renˢ-comp (error _) = refl renˢ-comp (constr e Tss refl x) = cong (constr e Tss refl) (renˢ-ConstrArgs-comp e Tss x) renˢ-comp (case M cs) = cong₂ case (renˢ-comp M) (renˢ-Cases-comp cs) Subˢ : ∀{Φ} → Ctx Φ → Ctx Φ → Set Subˢ Γ Δ = ∀{A} → Γ ∋ A → Δ ⊢ A extsˢ : ∀ {Φ Γ Δ} → (σ : Subˢ Γ Δ) → {B : Φ ⊢Nf⋆ *} --------------------------------- → Subˢ (Γ , B) (Δ , B) extsˢ σ Z = ` Z extsˢ σ (S α) = weakenˢ (σ α) -- cannot define this using renˢ {- exts⋆ˢ : ∀{Φ}{Γ Δ : Ctx Φ} → (σ : Subˢ Γ Δ) → ∀ {K} ---------------------- → Subˢ (Γ ,⋆ K) (Δ ,⋆ K) -}