{-# OPTIONS --without-K --safe #-} open import Relation.Binary using (Setoid) module Cfe.Judgement.Properties {c ℓ} (over : Setoid c ℓ) where open import Cfe.Expression over open import Cfe.Judgement.Base over open import Cfe.Type over open import Data.Empty open import Data.Fin as F hiding (cast) open import Data.Fin.Properties open import Data.Nat as ℕ open import Data.Nat.Properties open import Data.Vec open import Data.Vec.Properties open import Function open import Relation.Binary.PropositionalEquality ≅-refl : ∀ {a A m} {xs : Vec {a} A m} → xs ≅ xs ≅-refl {xs = []} = []≅[] ≅-refl {xs = x ∷ xs} = refl ∷ ≅-refl ≅-reflexive : ∀ {a A m} {xs : Vec {a} A m} {ys} → xs ≡ ys → xs ≅ ys ≅-reflexive refl = ≅-refl ≅-length : ∀ {a A m n} {xs : Vec {a} A m} {ys : Vec _ n} → xs ≅ ys → m ≡ n ≅-length []≅[] = refl ≅-length (_ ∷ xs≅ys) = cong suc (≅-length xs≅ys) ≅⇒≡ : ∀ {a A m n} {xs : Vec {a} A m} {ys : Vec _ n} → (xs≅ys : xs ≅ ys) → vcast (≅-length xs≅ys) xs ≡ ys ≅⇒≡ []≅[] = refl ≅⇒≡ (x≡y ∷ xs≅ys) = cong₂ _∷_ x≡y (≅⇒≡ xs≅ys) ++ˡ : ∀ {a A m n k} {xs : Vec {a} A m} {ys : Vec _ n} (zs : Vec _ k) → xs ≅ ys → zs ++ xs ≅ zs ++ ys ++ˡ [] xs≅ys = xs≅ys ++ˡ (z ∷ zs) xs≅ys = refl ∷ ++ˡ zs xs≅ys cast₁ : ∀ {m₁ m₂ n} {Γ₁ : Vec _ m₁} {Γ₂ : Vec _ m₂} {Δ : Vec _ n} {e τ} → (eq : Γ₁ ≅ Γ₂) → Γ₁ , Δ ⊢ e ∶ τ → Γ₂ , Δ ⊢ cast (cong (n ℕ.+_) (≅-length eq)) e ∶ τ cast₁ eq Eps = Eps cast₁ eq (Char c) = Char c cast₁ eq Bot = Bot cast₁ {n = n} {Γ₁} {Δ = Δ} eq (Var {i = i} i≥n) = subst₂ (_, Δ ⊢ cast (cong (n ℕ.+_) (≅-length eq)) (Var i) ∶_) (≅⇒≡ eq) (eq′ Γ₁ i≥n (≅-length eq)) (Var (ge (≅-length eq) i≥n)) where open import Data.Empty using (⊥-elim) open import Data.Fin.Properties using (toℕ