The copy-and-paste approach [ag-000M]

{-# OPTIONS --safe --without-K #-}
module ag-000M where

open import MLTT.Spartan

類型跟 context

data Ty : 𝓤₀ ̇ where
  base : Ty
  _⇒_ : Ty → Ty → Ty
infixl 50 _⇒_

data Con : 𝓤₀ ̇ where
  ◇ : Con
  _▷_ : Con → Ty → Con
infixl 40 _▷_
  1. 等一下用的變數
  2. de Bruijn variables
  3. terms
variable
  Γ Δ Ξ : Con
  A B C : Ty

data _∋_ : Con → Ty → 𝓤₀ ̇ where
  here : Γ ▷ A ∋ A
  there : Γ ∋ A → (B : Ty)
        ------------------
        → Γ ▷ B ∋ A
infixl 30 _∋_

data _⊢_ : Con → Ty → 𝓤₀ ̇ where
  -- embeds variables in λ-terms
  `_ : Γ ∋ A → Γ ⊢ A
  -- application t · u
  _·_ : Γ ⊢ A ⇒ B → Γ ⊢ A → Γ ⊢ B
  ƛ_ : Γ ▷ A ⊢ B → Γ ⊢ A ⇒ B
infixl 20 _⊢_
infixl 60 `_
infixl 50 _·_
infixl 40 ƛ_

substitution 定義成

data _⊩_ : Con → Con → 𝓤₀ ̇ where
  ε : Γ ⊩ ◇
  _,_ : Γ ⊩ Δ → Γ ⊢ A → Γ ⊩ Δ ▷ A

現在要定義 substitution 在 terms 跟 variables 上的作用:

_v[_] : Δ ∋ A → Γ ⊩ Δ → Γ ⊢ A
here v[ ts , t ] = t
there i B v[ ts , t ] = i v[ ts ]

data _⊩v_ : Con → Con → 𝓤₀ ̇ where
  ε : Γ ⊩v ◇
  _,_ : Γ ⊩v Δ → Γ ∋ A → Γ ⊩v Δ ▷ A

_v[_]v : Γ ∋ A → Δ ⊩v Γ → Δ ∋ A
here v[ is , i ]v = i
there i B v[ is , j ]v = i v[ is ]v

_⁺v_ : Γ ⊩v Δ → (A : Ty) → Γ ▷ A ⊩v Δ
ε ⁺v A = ε
(is , i) ⁺v A = (is ⁺v A) , there i A

_↑v_ : Γ ⊩v Δ → (A : Ty) → Γ ▷ A ⊩v Δ ▷ A
is ↑v A = (is ⁺v A) , here

_[_]v : Γ ⊢ A → Δ ⊩v Γ → Δ ⊢ A
(` i) [ is ]v = ` (i v[ is ]v)
(t · u) [ is ]v = (t [ is ]v) · (u [ is ]v)
(ƛ t) [ is ]v = ƛ (t [ is ↑v _ ]v)

idv : Γ ⊩v Γ
idv {Γ = ◇} = ε
idv {Γ = Γ ▷ A} = idv ↑v A

為了定義下面的 suc-tm,需要定義上面大量的類似結構 Γ ⊩v Δ

_⁺_ : Γ ⊩ Δ → (A : Ty) → Γ ▷ A ⊩ Δ
ε ⁺ A = ε
(ts , t) ⁺ A = (ts ⁺ A) , suc-tm t A
  where
  suc-tm : Γ ⊢ B → (A : Ty) → Γ ▷ A ⊢ B
  suc-tm t A = t [ idv ⁺v A ]v

_↑_ : Γ ⊩ Δ → (A : Ty) → Γ ▷ A ⊩ Δ ▷ A
ts ↑ A = ts ⁺ A , ` here

_[_] : Γ ⊢ A → Δ ⊩ Γ → Δ ⊢ A
(` i) [ ts ] = i v[ ts ]
(t · u) [ ts ] = (t [ ts ]) · (u [ ts ])
(ƛ t) [ ts ] = ƛ (t [ ts ↑ _ ])