module MLTT.Syntax where
open import Prelude
open import WSLN
Lvl : Set
Lvl = ℕ
data OpMLTT : Set where
′Univ′ : Lvl → OpMLTT
′Pi′ : Lvl → Lvl → OpMLTT
′lam′ : OpMLTT
′app′ : OpMLTT
′Id′ : OpMLTT
′refl′ : OpMLTT
′J′ : OpMLTT
′Nat′ : OpMLTT
′zero′ : OpMLTT
′succ′ : OpMLTT
′natrec′ : OpMLTT
arMLTT : OpMLTT → List ℕ
arMLTT (′Univ′ l) = []
arMLTT (′Pi′ l l') = 0 :: 1 :: []
arMLTT ′lam′ = 0 :: 1 :: []
arMLTT ′app′ = 0 :: 0 :: 1 :: 0 :: []
arMLTT ′Id′ = 0 :: 0 :: 0 :: []
arMLTT ′refl′ = 0 :: []
arMLTT ′J′ = 2 :: 0 :: 0 :: 0 :: 0 :: []
arMLTT ′Nat′ = []
arMLTT ′zero′ = []
arMLTT ′succ′ = 0 :: []
arMLTT ′natrec′ = 1 :: 0 :: 2 :: 0 :: []
instance
MLTT : Sig
Op MLTT = OpMLTT
ar MLTT = arMLTT
infix 6 Tm[_]
Tm[_] : ℕ → Set
Tm[ n ] = Trm[_] ⦃ MLTT ⦄ n
Tm : Set
Tm = Trm[_] ⦃ MLTT ⦄ 0
infix 6 Ty[_]
Ty[_] : ℕ → Set
Ty[ n ] = Tm[ n ]
Ty : Set
Ty = Tm
infix 7 _∙[_,_]_
pattern 𝐯 x = 𝐚 x
pattern 𝐔 l = 𝐨 (′Univ′ l) []
pattern 𝚷 l l' A B = 𝐨 (′Pi′ l l') (A :: B :: [])
pattern 𝛌 A f = 𝐨 ′lam′ (A :: f :: [])
pattern _∙[_,_]_ b A B a = 𝐨 ′app′ (b :: A :: B :: a :: [])
pattern 𝐈𝐝 A a a' = 𝐨 ′Id′ (A :: a :: a' :: [] )
pattern 𝐫𝐞𝐟𝐥 a = 𝐨 ′refl′ (a :: [])
pattern 𝐉 C a b c e = 𝐨 ′J′ (C :: a :: b :: c :: e :: [])
pattern 𝐍𝐚𝐭 = 𝐨 ′Nat′ []
pattern 𝐳𝐞𝐫𝐨 = 𝐨 ′zero′ []
pattern 𝐬𝐮𝐜𝐜 a = 𝐨 ′succ′ (a :: [])
pattern 𝐧𝐫𝐞𝐜 C c₀ c₊ a = 𝐨 ′natrec′ (C :: c₀ :: c₊ :: a :: [])
infixl 5 _⨟_∶_⦂_
data Cx : Set where
◇ : Cx
_⨟_∶_⦂_ :
(Γ : Cx)
(x : 𝔸)
(A : Ty)
(l : Lvl)
→
Cx
dom : Cx → Fset𝔸
dom ◇ = ∅
dom (Γ ⨟ x ∶ _ ⦂ _) = dom Γ ∪ { x }
instance
FiniteSupportCx : FiniteSupport Cx
supp ⦃ FiniteSupportCx ⦄ Γ = dom Γ
cx⁻¹ :
{Γ Γ' : Cx}
{x x' : 𝔸}
{A A' : Ty}
{l l' : Lvl}
(_ : (Γ ⨟ x ∶ A ⦂ l) ≡ (Γ' ⨟ x' ∶ A' ⦂ l'))
→
(Γ ≡ Γ') ∧ (x ≡ x') ∧ (A ≡ A') ∧ (l ≡ l')
cx⁻¹ refl = (refl , refl , refl , refl)
infix 4 _isIn_
data _isIn_ : (𝔸 × Ty × Lvl) → Cx → Set where
isInNew :
{Γ : Cx}
{x : 𝔸}
{A : Ty}
{l : Lvl}
→
(x , A , l) isIn (Γ ⨟ x ∶ A ⦂ l)
isInOld :
{xAl : 𝔸 × Ty × Lvl}
{Γ : Cx}
{x' : 𝔸}
{A' : Ty}
{l' : Lvl}
(p : xAl isIn Γ)
→
xAl isIn (Γ ⨟ x' ∶ A' ⦂ l')
isIn→dom :
{Γ : Cx}
{x : 𝔸}
{A : Ty}
{l : Lvl}
(_ : (x , A , l) isIn Γ)
→
x ∈ dom Γ
isIn→dom isInNew = ∈∪₂ ∈{}
isIn→dom (isInOld p) = ∈∪₁ (isIn→dom p)
dom→isIn :
{Γ : Cx}
{x : 𝔸}
(_ : x ∈ dom Γ)
→
∃[ A ] ∃[ l ] (x , A , l) isIn Γ
dom→isIn {_ ⨟ _ ∶ _ ⦂ _} (∈∪₁ p)
with (A , l , p') ← dom→isIn p = (A , l , isInOld p')
dom→isIn {_ ⨟ _ ∶ A ⦂ l} (∈∪₂ ∈{}) = (A , l , isInNew)