module Type.BetaNormal.Equality where
open import Data.Vec using (Vec;[];_∷_) open import Data.List using (List;[];_∷_) open import Function using (id;_∘_) open import Relation.Binary.PropositionalEquality using (_≡_;refl;trans;cong;cong₂) open import Utils using (*;J) open import Type using (Ctx⋆;Θ;Φ;Ψ;_∋⋆_) open import Type.BetaNormal using (_⊢Nf⋆_;_⊢Ne⋆_;renNf;renNe;renNf-List;renNf-VecList) open _⊢Nf⋆_ open _⊢Ne⋆_ open import Type.RenamingSubstitution using (Ren;ext-cong;ext-id;ext-comp)
renNf-cong : {f g : Ren Φ Ψ} → (∀ {J}(α : Φ ∋⋆ J) → f α ≡ g α) → ∀{K}(A : Φ ⊢Nf⋆ K) ------------------------------- → renNf f A ≡ renNf g A renNe-cong : {f g : Ren Φ Ψ} → (∀ {J}(α : Φ ∋⋆ J) → f α ≡ g α) → ∀{K}(A : Φ ⊢Ne⋆ K) ------------------------------- → renNe f A ≡ renNe g A renNf-cong-List : ∀ {f g : Ren Φ Ψ} (p : ∀ {J} (α : Φ ∋⋆ J) → f α ≡ g α) (xs : List (Φ ⊢Nf⋆ *)) ----------------------------------------- → renNf-List f xs ≡ renNf-List g xs renNf-cong-VecList : ∀ {f g : Ren Φ Ψ} (p : ∀ {J} (α : Φ ∋⋆ J) → f α ≡ g α){n} (xss : Vec (List (Φ ⊢Nf⋆ *)) n) ----------------------------------------- → renNf-VecList f xss ≡ renNf-VecList g xss renNf-cong p (Π A) = cong Π (renNf-cong (ext-cong p) A) renNf-cong p (A ⇒ B) = cong₂ _⇒_ (renNf-cong p A) (renNf-cong p B) renNf-cong p (ƛ A) = cong ƛ (renNf-cong (ext-cong p) A) renNf-cong p (ne A) = cong ne (renNe-cong p A) renNf-cong p (con c) = cong con (renNf-cong p c) renNf-cong p (μ A B) = cong₂ μ (renNf-cong p A) (renNf-cong p B) renNf-cong p (SOP xss) = cong SOP (renNf-cong-VecList p xss) renNe-cong p (` α) = cong ` (p α) renNe-cong p (A · B) = cong₂ _·_ (renNe-cong p A) (renNf-cong p B) renNe-cong p (^ x) = refl renNf-cong-List p [] = refl renNf-cong-List p (x ∷ xs) = cong₂ _∷_ (renNf-cong p x) (renNf-cong-List p xs) renNf-cong-VecList p [] = refl renNf-cong-VecList p (xs ∷ xss) = cong₂ _∷_ (renNf-cong-List p xs) (renNf-cong-VecList p xss)
renNf-id : (n : Φ ⊢Nf⋆ J) -------------- → renNf id n ≡ n renNe-id : (n : Φ ⊢Ne⋆ J) -------------- → renNe id n ≡ n renNe-id-List : (n : List (Φ ⊢Nf⋆ J)) ------------------------------ → renNf-List id n ≡ n renNe-id-VecList : ∀{m} (n : Vec (List (Φ ⊢Nf⋆ J)) m) ------------------------------ → renNf-VecList id n ≡ n renNf-id (Π A) = cong Π (trans (renNf-cong ext-id A) (renNf-id A)) renNf-id (A ⇒ B) = cong₂ _⇒_ (renNf-id A) (renNf-id B) renNf-id (ƛ A) = cong ƛ (trans (renNf-cong ext-id A) (renNf-id A)) renNf-id (ne A) = cong ne (renNe-id A) renNf-id (con c) = cong con (renNf-id c) renNf-id (μ A B) = cong₂ μ (renNf-id A) (renNf-id B) renNf-id (SOP xss) = cong SOP (renNe-id-VecList xss) renNe-id (` α) = refl renNe-id (A · B) = cong₂ _·_ (renNe-id A) (renNf-id B) renNe-id (^ x) = refl renNe-id-List [] = refl renNe-id-List (x ∷ xs) = cong₂ _∷_ (renNf-id x) (renNe-id-List xs) renNe-id-VecList [] = refl renNe-id-VecList (xs ∷ xss) = cong₂ _∷_ (renNe-id-List xs) (renNe-id-VecList xss)
renNf-comp : {g : Ren Φ Ψ} → {f : Ren Ψ Θ} → ∀{J}(A : Φ ⊢Nf⋆ J) ------------------------------------- → renNf (f ∘ g) A ≡ renNf f (renNf g A) renNe-comp : {g : Ren Φ Ψ} → {f : Ren Ψ Θ} → ∀{J}(A : Φ ⊢Ne⋆ J) ------------------------------------- → renNe (f ∘ g) A ≡ renNe f (renNe g A) renNf-comp-List : {g : Ren Φ Ψ} → {f : Ren Ψ Θ} → (xs : List (Φ ⊢Nf⋆ *)) ---------------------------------------------------------------- → renNf-List (f ∘ g) xs ≡ renNf-List f (renNf-List g xs) renNf-comp-VecList : ∀{n} {g : Ren Φ Ψ} → {f : Ren Ψ Θ} → (xss : Vec (List (Φ ⊢Nf⋆ *)) n) ---------------------------------------------------------------- → renNf-VecList (f ∘ g) xss ≡ renNf-VecList f (renNf-VecList g xss) renNf-comp (Π B) = cong Π (trans (renNf-cong ext-comp B) (renNf-comp B)) renNf-comp (A ⇒ B) = cong₂ _⇒_ (renNf-comp A) (renNf-comp B) renNf-comp (ƛ A) = cong ƛ (trans (renNf-cong ext-comp A) (renNf-comp A)) renNf-comp (ne A) = cong ne (renNe-comp A) renNf-comp (con c) = cong con (renNf-comp c) renNf-comp (μ A B) = cong₂ μ (renNf-comp A) (renNf-comp B) renNf-comp (SOP xss) = cong SOP (renNf-comp-VecList xss) renNe-comp (` x) = refl renNe-comp (A · B) = cong₂ _·_ (renNe-comp A) (renNf-comp B) renNe-comp (^ x) = refl renNf-comp-List [] = refl renNf-comp-List (x ∷ xs) = cong₂ _∷_ (renNf-comp x) (renNf-comp-List xs) renNf-comp-VecList [] = refl renNf-comp-VecList (xs ∷ xss) = cong₂ _∷_ (renNf-comp-List xs) (renNf-comp-VecList xss)