summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChloe Brown <chloe.brown.00@outlook.com>2021-03-20 13:44:18 +0000
committerChloe Brown <chloe.brown.00@outlook.com>2021-03-20 13:44:18 +0000
commit5867701e6687a93e42a75347397ad0663fbb8f58 (patch)
tree74d9026ab4efcf5802bfd79b53581125b2608dc6
parent02a0f87be944b1d43fda265058b891f419d25b65 (diff)
Introduce variable contexts.
-rw-r--r--src/Cfe/Judgement/Base.agda73
-rw-r--r--src/Cfe/Judgement/Properties.agda234
2 files changed, 52 insertions, 255 deletions
diff --git a/src/Cfe/Judgement/Base.agda b/src/Cfe/Judgement/Base.agda
index 754d92d..475968c 100644
--- a/src/Cfe/Judgement/Base.agda
+++ b/src/Cfe/Judgement/Base.agda
@@ -6,33 +6,64 @@ module Cfe.Judgement.Base
{c ℓ} (over : Setoid c ℓ)
where
-open import Cfe.Expression over as E
+open import Cfe.Expression over renaming (shift to shiftₑ)
open import Cfe.Type over renaming (_∙_ to _∙ₜ_; _∨_ to _∨ₜ_)
open import Cfe.Type.Construct.Lift over
open import Data.Fin as F
+open import Data.Fin.Properties
open import Data.Nat as ℕ hiding (_⊔_)
-open import Data.Vec hiding (_⊛_)
+open import Data.Nat.Properties
+open import Data.Vec hiding (_⊛_) renaming (lookup to lookup′)
open import Level hiding (Lift) renaming (suc to lsuc)
open import Relation.Binary.PropositionalEquality
-infix 2 _,_⊢_∶_
-infix 4 _≅_
-
-data _,_⊢_∶_ : {m : ℕ} → {n : ℕ} → Vec (Type ℓ ℓ) m → Vec (Type ℓ ℓ) n → Expression (n ℕ.+ m) → Type ℓ ℓ → Set (c ⊔ lsuc ℓ) where
- Eps : ∀ {m n} {Γ : Vec _ m} {Δ : Vec _ n} → Γ , Δ ⊢ ε ∶ Lift ℓ ℓ τε
- Char : ∀ {m n} {Γ : Vec _ m} {Δ : Vec _ n} c → Γ , Δ ⊢ Char c ∶ Lift ℓ ℓ τ[ c ]
- Bot : ∀ {m n} {Γ : Vec _ m} {Δ : Vec _ n} → Γ , Δ ⊢ ⊥ ∶ Lift ℓ ℓ τ⊥
- Var : ∀ {m n : ℕ} {Γ : Vec _ m} {Δ : Vec _ n} {i : Fin (n ℕ.+ m)} (i≥n : toℕ i ≥ n) → Γ , Δ ⊢ Var i ∶ lookup Γ (reduce≥ i i≥n)
- Fix : ∀ {m n} {Γ : Vec _ m} {Δ : Vec _ n} {e τ} → Γ , τ ∷ Δ ⊢ e ∶ τ → Γ , Δ ⊢ μ e ∶ τ
- Cat : ∀ {m n} {Γ : Vec _ m} {Δ : Vec _ n} {e₁ e₂ τ₁ τ₂} → Γ , Δ ⊢ e₁ ∶ τ₁ → Δ ++ Γ , [] ⊢ e₂ ∶ τ₂ → (τ₁⊛τ₂ : τ₁ ⊛ τ₂) → Γ , Δ ⊢ e₁ ∙ e₂ ∶ τ₁ ∙ₜ τ₂
- Vee : ∀ {m n} {Γ : Vec _ m} {Δ : Vec _ n} {e₁ e₂ τ₁ τ₂} → Γ , Δ ⊢ e₁ ∶ τ₁ → Γ , Δ ⊢ e₂ ∶ τ₂ → (τ₁#τ₂ : τ₁ # τ₂) → Γ , Δ ⊢ e₁ ∨ e₂ ∶ τ₁ ∨ₜ τ₂
-
-vcast : ∀ {a A m n} → .(m ≡ n) → Vec {a} A m → Vec A n
-vcast {n = ℕ.zero} eq [] = []
-vcast {n = suc n} eq (x ∷ xs) = x ∷ vcast (suc-injective eq) xs
+record Context n : Set (c ⊔ lsuc ℓ) where
+ field
+ m : ℕ
+ m≤n : m ℕ.≤ n
+ Γ : Vec (Type ℓ ℓ) (n ∸ m)
+ Δ : Vec (Type ℓ ℓ) m
+
+-- Fin n → Fin n∸m
+
+ lookup : (i : Fin n) → toℕ i ≥ m → Type ℓ ℓ
+ lookup i i≥m = lookup′ Γ (reduce≥
+ (F.cast (begin-equality
+ n ≡˘⟨ m+n∸m≡n m n ⟩
+ m ℕ.+ n ∸ m ≡⟨ +-∸-assoc m m≤n ⟩
+ m ℕ.+ (n ∸ m) ∎) i)
+ (begin
+ m ≤⟨ i≥m ⟩
+ toℕ i ≡˘⟨ toℕ-cast _ i ⟩
+ toℕ (F.cast _ i) ∎))
+ where
+ open ≤-Reasoning
+
+cons : ∀ {n} → Type ℓ ℓ → Context n → Context (suc n)
+cons {n} τ Γ,Δ = record
+ { m≤n = s≤s m≤n
+ ; Γ = Γ
+ ; Δ = τ ∷ Δ
+ }
where
- open import Data.Nat.Properties using (suc-injective)
+ open Context Γ,Δ
+
+shift : ∀ {n} → Context n → Context n
+shift {n} Γ,Δ = record
+ { m≤n = z≤n
+ ; Γ = subst (Vec (Type ℓ ℓ)) (trans (sym (+-∸-assoc m m≤n)) (m+n∸m≡n m n)) (Δ ++ Γ)
+ ; Δ = []
+ }
+ where
+ open Context Γ,Δ
+
+infix 2 _⊢_∶_
-data _≅_ {a A} : {m n : ℕ} → Vec {a} A m → Vec A n → Set a where
- []≅[] : [] ≅ []
- _∷_ : ∀ {m n x y} {xs : Vec _ m} {ys : Vec _ n} → (x≡y : x ≡ y) → xs ≅ ys → x ∷ xs ≅ y ∷ ys
+data _⊢_∶_ : {n : ℕ} → Context n → Expression n → Type ℓ ℓ → Set (c ⊔ lsuc ℓ) where
+ Eps : ∀ {n} {Γ,Δ : Context n} → Γ,Δ ⊢ ε ∶ Lift ℓ ℓ τε
+ Char : ∀ {n} {Γ,Δ : Context n} c → Γ,Δ ⊢ Char c ∶ Lift ℓ ℓ τ[ c ]
+ Bot : ∀ {n} {Γ,Δ : Context n} → Γ,Δ ⊢ ⊥ ∶ Lift ℓ ℓ τ⊥
+ Var : ∀ {n} {Γ,Δ : Context n} {i : Fin n} (i≥m : toℕ i ℕ.≥ Context.m Γ,Δ) → Γ,Δ ⊢ Var i ∶ Context.lookup Γ,Δ i i≥m
+ Fix : ∀ {n} {Γ,Δ : Context n} {e τ} → cons τ Γ,Δ ⊢ e ∶ τ → Γ,Δ ⊢ μ e ∶ τ
+ Cat : ∀ {n} {Γ,Δ : Context n} {e₁ e₂ τ₁ τ₂} → Γ,Δ ⊢ e₁ ∶ τ₁ → shift Γ,Δ ⊢ e₂ ∶ τ₂ → (τ₁⊛τ₂ : τ₁ ⊛ τ₂) → Γ,Δ ⊢ e₁ ∙ e₂ ∶ τ₁ ∙ₜ τ₂
+ Vee : ∀ {n} {Γ,Δ : Context n} {e₁ e₂ τ₁ τ₂} → Γ,Δ ⊢ e₁ ∶ τ₁ → Γ,Δ ⊢ e₂ ∶ τ₂ → (τ₁#τ₂ : τ₁ # τ₂) → Γ,Δ ⊢ e₁ ∨ e₂ ∶ τ₁ ∨ₜ τ₂
diff --git a/src/Cfe/Judgement/Properties.agda b/src/Cfe/Judgement/Properties.agda
index 1c06fcd..b901ced 100644
--- a/src/Cfe/Judgement/Properties.agda
+++ b/src/Cfe/Judgement/Properties.agda
@@ -5,237 +5,3 @@ 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 as NP
-open import Data.Vec
-open import Data.Vec.Properties
-open import Function
-open import Relation.Binary.PropositionalEquality
-open import Relation.Nullary
-
-private
- raise-mono : ∀ {m n i j} → i F.≤ j → raise {n} m i F.≤ raise m j
- raise-mono {zero} i≤j = i≤j
- raise-mono {suc m} i≤j = s≤s (raise-mono i≤j)
-
- raise≤ : ∀ {m} n i → n ℕ.≤ toℕ (raise {m} n i)
- raise≤ zero i = z≤n
- raise≤ (suc n) i = s≤s (raise≤ n i)
-
- inject+≤raise : ∀ {m n} i j → inject+ {suc n} m i F.≤ F.cast (+-suc n m) (raise {suc m} n j)
- inject+≤raise {m} {n} i j = begin
- toℕ (inject+ m i) ≡˘⟨ toℕ-inject+ m i ⟩
- toℕ i ≤⟨ NP.<⇒≤pred (toℕ<n i) ⟩
- n ≤⟨ m≤m+n n (toℕ j) ⟩
- n ℕ.+ toℕ j ≡˘⟨ toℕ-raise n j ⟩
- toℕ (raise n j) ≡˘⟨ toℕ-cast (+-suc n m) (raise n j) ⟩
- toℕ (F.cast _ (raise n j)) ∎
- where
- open ≤-Reasoning
-
- toℕ-punchIn : ∀ {m} i j → toℕ j ℕ.≤ toℕ (punchIn {m} i j)
- toℕ-punchIn zero j = n≤1+n (toℕ j)
- toℕ-punchIn (suc i) zero = z≤n
- toℕ-punchIn (suc i) (suc j) = s≤s (toℕ-punchIn i j)
-
- toℕ-punchOut : ∀ {m i j} → (i≢j : i ≢ j) → toℕ j ℕ.≤ suc (toℕ (punchOut {m} i≢j))
- toℕ-punchOut {_} {zero} {zero} i≢j = ⊥-elim (i≢j refl)
- toℕ-punchOut {_} {zero} {suc j} i≢j = NP.≤-refl
- toℕ-punchOut {suc m} {suc i} {zero} i≢j = z≤n
- toℕ-punchOut {suc m} {suc i} {suc j} i≢j = s≤s (toℕ-punchOut (i≢j ∘ cong suc))
-
- toℕ-reduce : ∀ {m n} i i≥m → toℕ (reduce≥ {m} {n} i i≥m) ≡ toℕ i ∸ m
- toℕ-reduce {zero} i i≥m = refl
- toℕ-reduce {suc m} (suc i) (s≤s i≥m) = toℕ-reduce i i≥m
-
- <⇒punchOut≤ : ∀ {m n i j} → n ℕ.< toℕ j → (i≢j : i ≢ j) → n ℕ.≤ toℕ (punchOut {m} i≢j)
- <⇒punchOut≤ {m} {n} {zero} {suc j} (s≤s n<j) i≢j = n<j
- <⇒punchOut≤ {suc m} {zero} {suc i} {suc j} (s≤s n<j) i≢j = z≤n
- <⇒punchOut≤ {suc m} {suc n} {suc i} {suc j} (s≤s n<j) i≢j = s≤s (<⇒punchOut≤ n<j (i≢j ∘ cong suc))
-
- punchIn-∸ : ∀ {m n} i {j} j≥n → toℕ (punchIn (F.cast (+-suc n m) (raise n i)) j) ∸ n ≡ toℕ (punchIn i (reduce≥ j j≥n))
- punchIn-∸ {zero} {n} zero {j} j≥n = ⊥-elim (<⇒≱ (begin-strict
- toℕ j ≡˘⟨ toℕ-cast (+-identityʳ n) j ⟩
- toℕ (F.cast _ j) <⟨ toℕ<n (F.cast _ j) ⟩
- n ∎) j≥n)
- where
- open ≤-Reasoning
- punchIn-∸ {suc m} {zero} zero {j} z≤n = refl
- punchIn-∸ {suc m} {suc n} zero {suc j} (s≤s j≥n) = punchIn-∸ zero j≥n
- punchIn-∸ {suc m} {zero} (suc i) {zero} z≤n = refl
- punchIn-∸ {suc m} {zero} (suc i) {suc j} z≤n = cong suc (punchIn-∸ i z≤n)
- punchIn-∸ {suc m} {suc n} (suc i) {suc j} (s≤s j≥n) = punchIn-∸ (suc i) j≥n
-
-≅-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)
-
-≅-vcast : ∀ {a A m n} {xs : Vec {a} A m} → .(m≡n : m ≡ n) → vcast m≡n xs ≅ xs
-≅-vcast {n = zero} {[]} m≡n = []≅[]
-≅-vcast {n = suc n} {x ∷ xs} m≡n = refl ∷ ≅-vcast (NP.suc-injective m≡n)
-
-≅⇒≡ : ∀ {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ℕ<n; toℕ-cast; toℕ-injective)
- open import Data.Nat.Properties using (<⇒≱; +-identityʳ; module ≤-Reasoning)
-
- ge : ∀ {m₁ m₂ n i} → .(eq : m₁ ≡ m₂) → toℕ {n ℕ.+ m₁} i ≥ n → toℕ (F.cast (cong (n ℕ.+_) eq) i) ≥ n
- ge {n = ℕ.zero} {i} _ _ = z≤n
- ge {n = suc n} {suc i} eq (s≤s i≥n) = s≤s (ge eq i≥n)
-
- eq′ : ∀ {a A m₁ m₂ n i} Γ i≥n → (eq : m₁ ≡ m₂) → lookup {a} {A} {m₂} (vcast eq Γ) (reduce≥ {n} (F.cast (cong (n ℕ.+_) eq) i) (ge eq i≥n)) ≡ lookup Γ (reduce≥ i i≥n)
- eq′ {m₁ = ℕ.zero} {ℕ.zero} {n} {i} Γ i≥n _ = ⊥-elim (<⇒≱ (begin-strict
- toℕ i <⟨ toℕ<n i ⟩
- n ℕ.+ 0 ≡⟨ +-identityʳ n ⟩
- n ∎) i≥n)
- where
- open ≤-Reasoning
- eq′ {m₁ = suc m₁} {suc m₁} {ℕ.zero} {i} Γ i≥n refl = cong₂ lookup {vcast refl Γ} (≅⇒≡ ≅-refl) (toℕ-injective (toℕ-cast refl i))
- eq′ {m₁ = suc m₁} {suc m₂} {suc n} {suc i} Γ (s≤s i≥n) eq = eq′ Γ i≥n eq
-cast₁ eq (Fix Γ₁,τ∷Δ⊢e∶τ) = Fix (cast₁ eq Γ₁,τ∷Δ⊢e∶τ)
-cast₁ {Δ = Δ} eq (Cat Γ₁,Δ⊢e₁∶τ₁ Δ++Γ₁,∙⊢e₂∶τ₂ τ₁⊛τ₂) = Cat (cast₁ eq Γ₁,Δ⊢e₁∶τ₁) (cast₁ (++ˡ Δ eq) Δ++Γ₁,∙⊢e₂∶τ₂) τ₁⊛τ₂
-cast₁ eq (Vee Γ₁,Δ⊢e₁∶τ₁ Γ₁,Δ⊢e₂∶τ₂ τ₁#τ₂) = Vee (cast₁ eq Γ₁,Δ⊢e₁∶τ₁) (cast₁ eq Γ₁,Δ⊢e₂∶τ₂) τ₁#τ₂
-
-wkn₁ : ∀ {m n} {Γ : Vec _ m} {Δ : Vec _ n} {e τ} →
- Γ , Δ ⊢ e ∶ τ →
- ∀ τ′ i →
- insert Γ i τ′ , Δ ⊢ cast (sym (+-suc n m)) (wkn e (F.cast (+-suc n m) (raise n i))) ∶ τ
-wkn₁ Eps τ′ i = Eps
-wkn₁ (Char c) τ′ i = Char c
-wkn₁ Bot τ′ i = Bot
-wkn₁ {m} {n} {Γ} {Δ} {e} {τ} (Var {i = j} j≥n) τ′ i =
- subst (insert Γ i τ′ , Δ ⊢ cast (sym (+-suc n m)) (Var (punchIn (F.cast (+-suc n m) (raise n i)) j)) ∶_)
- eq
- (Var le)
- where
- le : toℕ (F.cast _ (punchIn (F.cast _ (raise n i)) j)) ≥ n
- le = begin
- n ≤⟨ j≥n ⟩
- toℕ j ≤⟨ toℕ-punchIn (F.cast (+-suc n m) (raise n i)) j ⟩
- toℕ (punchIn (F.cast _ (raise n i)) j) ≡˘⟨ toℕ-cast (sym (+-suc n m)) (punchIn (F.cast _ (raise n i)) j) ⟩
- toℕ (F.cast _ (punchIn (F.cast _ (raise n i)) j)) ∎
- where
- open ≤-Reasoning
-
- lookup-cast : ∀ {a A n} l j → lookup {a} {A} {n} l (F.cast refl j) ≡ lookup l j
- lookup-cast l zero = refl
- lookup-cast (x ∷ l) (suc j) = lookup-cast l j
-
- missing-link : reduce≥ (F.cast _ (punchIn (F.cast _ (raise n i)) j)) le ≡ punchIn i (reduce≥ j j≥n)
- missing-link = toℕ-injective (begin
- toℕ (reduce≥ (F.cast _ (punchIn (F.cast _ (raise n i)) j)) le) ≡⟨ toℕ-reduce (F.cast _ (punchIn (F.cast _ (raise n i)) j)) le ⟩
- toℕ (F.cast _ (punchIn (F.cast _ (raise n i)) j)) ∸ n ≡⟨ cong (_∸ n) (toℕ-cast _ (punchIn (F.cast _ (raise n i)) j)) ⟩
- toℕ (punchIn (F.cast _ (raise n i)) j) ∸ n ≡⟨ punchIn-∸ i j≥n ⟩
- toℕ (punchIn i (reduce≥ j j≥n)) ∎)
- where
- open ≡-Reasoning
-
- eq : lookup (insert Γ i τ′) (reduce≥ (F.cast _ (punchIn (F.cast _ (raise n i)) j)) le) ≡ lookup Γ (reduce≥ j j≥n)
- eq = begin
- lookup (insert Γ i τ′) (reduce≥ (F.cast _ (punchIn (F.cast _ (raise n i)) j)) le) ≡⟨ cong (lookup (insert Γ i τ′)) missing-link ⟩
- lookup (insert Γ i τ′) (punchIn i (reduce≥ j j≥n)) ≡⟨ insert-punchIn Γ i τ′ (reduce≥ j j≥n) ⟩
- lookup Γ (reduce≥ j j≥n) ∎
- where
- open ≡-Reasoning
-
-wkn₁ (Fix Γ,τ∷Δ⊢e∶τ) τ′ i = Fix (wkn₁ Γ,τ∷Δ⊢e∶τ τ′ i)
-wkn₁{m} {n} {Γ} {Δ} (Cat {e₂ = e₂} {τ₂ = τ₂} Γ,Δ⊢e₁∶τ₁ Δ++Γ,∙⊢e₂∶τ₂ τ₁⊛τ₂) τ′ i =
- Cat (wkn₁ Γ,Δ⊢e₁∶τ₁ τ′ i)
- (subst (λ x → Δ ++ insert Γ i τ′ , [] ⊢ x ∶ τ₂)
- (begin
- cast _ (cast _ (wkn e₂ (F.cast refl (raise zero (F.cast _ (raise n i)))))) ≡⟨⟩
- cast _ (cast _ (wkn e₂ (F.cast refl (F.cast _ (raise n i))))) ≡⟨ cast-involutive (wkn e₂ (F.cast refl (F.cast _ (raise n i)))) refl (sym (+-suc n m)) (sym (+-suc n m)) ⟩
- cast _ (wkn e₂ (F.cast refl (F.cast _ (raise n i)))) ≡⟨ cong (λ x → cast (sym (+-suc n m)) (wkn e₂ x)) (fcast-involutive (raise n i) (+-suc n m) refl (+-suc n m)) ⟩
- cast _ (wkn e₂ (F.cast _ (raise n i))) ∎)
- (cast₁ (eq Γ Δ τ′ i) (wkn₁ Δ++Γ,∙⊢e₂∶τ₂ τ′ (F.cast (+-suc n m) (raise n i)))))
- τ₁⊛τ₂
- where
- open ≡-Reasoning
- eq : ∀ {a A m n} Γ Δ τ′ i → insert (Δ ++ Γ) (F.cast (+-suc n m) (raise n i)) τ′ ≅ Δ ++ insert {a} {A} {m} Γ i τ′
- eq Γ [] τ′ zero = ≅-refl
- eq (x ∷ Γ) [] τ′ (suc i) = refl ∷ eq Γ [] τ′ i
- eq Γ (x ∷ Δ) τ′ i = refl ∷ (eq Γ Δ τ′ i)
-
- fcast-involutive : ∀ {k m n} i → .(k≡m : k ≡ m) → .(m≡n : m ≡ n) → .(k≡n : k ≡ n) → F.cast m≡n (F.cast k≡m i) ≡ F.cast k≡n i
- fcast-involutive i k≡m m≡n k≡n = toℕ-injective (begin
- toℕ (F.cast m≡n (F.cast k≡m i)) ≡⟨ toℕ-cast m≡n (F.cast k≡m i) ⟩
- toℕ (F.cast k≡m i) ≡⟨ toℕ-cast k≡m i ⟩
- toℕ i ≡˘⟨ toℕ-cast k≡n i ⟩
- toℕ (F.cast k≡n i) ∎)
-wkn₁ (Vee Γ,Δ⊢e₁∶τ₁ Γ,Δ⊢e₂∶τ₂ τ₁#τ₂) τ′ i = Vee (wkn₁ Γ,Δ⊢e₁∶τ₁ τ′ i) (wkn₁ Γ,Δ⊢e₂∶τ₂ τ′ i) τ₁#τ₂
-
-wkn₂ : ∀ {m n} {Γ : Vec _ m} {Δ : Vec _ n} {e τ} →
- Γ , Δ ⊢ e ∶ τ →
- ∀ τ′ i →
- Γ , insert Δ i τ′ ⊢ wkn e (inject+ m i) ∶ τ
-wkn₂ Eps τ′ i = Eps
-wkn₂ (Char c) τ′ i = Char c
-wkn₂ Bot τ′ i = Bot
-wkn₂ {m} {n} {Γ} {Δ} (Var {i = j} j≥n) τ′ i =
- subst (Γ , insert Δ i τ′ ⊢_∶ lookup Γ (reduce≥ j j≥n))
- (cong Var (toℕ-injective (begin-equality
- toℕ (suc j) ≡⟨⟩
- suc (toℕ j) ≡˘⟨ cong toℕ (punchIn-suc i≤j) ⟩
- toℕ (punchIn (inject+ m i) j) ∎)))
- (Var (s≤s j≥n))
- where
- open ≤-Reasoning
-
- i≤j : toℕ (inject+ m i) ℕ.≤ toℕ j
- i≤j = begin
- toℕ (inject+ m i) ≡˘⟨ toℕ-inject+ m i ⟩
- toℕ i ≤⟨ NP.<⇒≤pred (toℕ<n i) ⟩
- n ≤⟨ j≥n ⟩
- toℕ j ∎
-
- punchIn-suc : ∀ {m i j} → toℕ i ℕ.≤ toℕ j → punchIn {m} i j ≡ suc j
- punchIn-suc {_} {zero} {j} i≤j = refl
- punchIn-suc {_} {suc i} {suc j} (s≤s i≤j) = cong suc (punchIn-suc i≤j)
-wkn₂ (Fix Γ,τ∷Δ⊢e∶τ) τ′ i = Fix (wkn₂ Γ,τ∷Δ⊢e∶τ τ′ (suc i))
-wkn₂ {m} {n} {Γ} {Δ} (Cat {e₂ = e₂} {τ₂ = τ₂} Γ,Δ⊢e₁∶τ₁ Δ++Γ,∙⊢e₂∶τ₂ τ₁⊛τ₂) τ′ i =
- Cat (wkn₂ Γ,Δ⊢e₁∶τ₁ τ′ i)
- (subst (insert Δ i τ′ ++ Γ , [] ⊢_∶ τ₂)
- (begin
- cast refl (cast refl (wkn e₂ (F.cast refl (inject+ m i)))) ≡⟨ cast-inverse (wkn e₂ (F.cast refl (inject+ m i))) refl refl ⟩
- wkn e₂ (F.cast refl (inject+ m i)) ≡⟨ cong (wkn e₂) (toℕ-injective (toℕ-cast refl (inject+ m i))) ⟩
- wkn e₂ (inject+ m i) ∎)
- (cast₁ (≅-reflexive (eq Γ Δ τ′ i)) (wkn₁ Δ++Γ,∙⊢e₂∶τ₂ τ′ (inject+ m i))))
- τ₁⊛τ₂
- where
- open ≡-Reasoning
-
- eq : ∀ {a A m n} Γ Δ τ i → insert (Δ ++ Γ) (inject+ m i) τ ≡ insert {a} {A} {n} Δ i τ ++ Γ
- eq Γ Δ τ zero = refl
- eq Γ (_ ∷ Δ) τ (suc i) = cong₂ _∷_ refl (eq Γ Δ τ i)
-wkn₂ (Vee Γ,Δ⊢e₁∶τ₁ Γ,Δ⊢e₂∶τ₂ τ₁#τ₂) τ′ i = Vee (wkn₂ Γ,Δ⊢e₁∶τ₁ τ′ i) (wkn₂ Γ,Δ⊢e₂∶τ₂ τ′ i) τ₁#τ₂