λ-calculus #
The λ-calculus with polymorphism and subtyping, with a locally nameless representation of syntax. This file defines the typing relation.
References #
- A. Chargueraud, The Locally Nameless Representation
- See also https://www.cis.upenn.edu/~plclub/popl08-tutorial/code/, from which this is adapted
The typing relation.
- var {Var : Type u_1} [DecidableEq Var] {σ : Ty Var} {Γ : Env Var} {x : Var} : Γ.Wf → Binding.ty σ ∈ List.dlookup x Γ → Typing Γ (Term.fvar x) σ
- abs {Var : Type u_1} [DecidableEq Var] {σ : Ty Var} {Γ : List ((_ : Var) × Binding Var)} {t₁ : Term Var} {τ : Ty Var} (L : Finset Var) : (∀ x ∉ L, Typing (⟨x, Binding.ty σ⟩ :: Γ) (t₁.openTm (Term.fvar x)) τ) → Typing Γ (Term.abs σ t₁) (σ.arrow τ)
- app {Var : Type u_1} [DecidableEq Var] {Γ : Env Var} {t₁ : Term Var} {σ τ : Ty Var} {t₂ : Term Var} : Typing Γ t₁ (σ.arrow τ) → Typing Γ t₂ σ → Typing Γ (t₁.app t₂) τ
- tabs {Var : Type u_1} [DecidableEq Var] {σ : Ty Var} {Γ : List ((_ : Var) × Binding Var)} {t₁ : Term Var} {τ : Ty Var} (L : Finset Var) : (∀ X ∉ L, Typing (⟨X, Binding.sub σ⟩ :: Γ) (t₁.openTy (Ty.fvar X)) (τ.open' (Ty.fvar X))) → Typing Γ (Term.tabs σ t₁) (σ.all τ)
- tapp {Var : Type u_1} [DecidableEq Var] {Γ : Env Var} {t₁ : Term Var} {σ τ σ' : Ty Var} : Typing Γ t₁ (σ.all τ) → Sub Γ σ' σ → Typing Γ (t₁.tapp σ') (τ.open' σ')
- sub {Var : Type u_1} [DecidableEq Var] {Γ : Env Var} {t : Term Var} {τ τ' : Ty Var} : Typing Γ t τ → Sub Γ τ τ' → Typing Γ t τ'
- let' {Var : Type u_1} [DecidableEq Var] {Γ : Env Var} {t₁ : Term Var} {σ : Ty Var} {t₂ : Term Var} {τ : Ty Var} (L : Finset Var) : Typing Γ t₁ σ → (∀ x ∉ L, Typing (⟨x, Binding.ty σ⟩ :: Γ) (t₂.openTm (Term.fvar x)) τ) → Typing Γ (t₁.let' t₂) τ
- inl {Var : Type u_1} [DecidableEq Var] {Γ : Env Var} {t₁ : Term Var} {σ τ : Ty Var} : Typing Γ t₁ σ → Ty.Wf Γ τ → Typing Γ t₁.inl (σ.sum τ)
- inr {Var : Type u_1} [DecidableEq Var] {Γ : Env Var} {t₁ : Term Var} {τ σ : Ty Var} : Typing Γ t₁ τ → Ty.Wf Γ σ → Typing Γ t₁.inr (σ.sum τ)
- case {Var : Type u_1} [DecidableEq Var] {Γ : Env Var} {t₁ : Term Var} {σ τ : Ty Var} {t₂ : Term Var} {δ : Ty Var} {t₃ : Term Var} (L : Finset Var) : Typing Γ t₁ (σ.sum τ) → (∀ x ∉ L, Typing (⟨x, Binding.ty σ⟩ :: Γ) (t₂.openTm (Term.fvar x)) δ) → (∀ x ∉ L, Typing (⟨x, Binding.ty τ⟩ :: Γ) (t₃.openTm (Term.fvar x)) δ) → Typing Γ (t₁.case t₂ t₃) δ
Instances For
theorem Cslib.LambdaCalculus.LocallyNameless.Fsub.Typing.narrow {Var : Type u_1} [DecidableEq Var] [HasFresh Var] {Γ Δ : Env Var} {τ δ δ' : Ty Var} {X : Var} {t : Term Var} (sub : Sub Δ δ δ') (der : Typing (Γ ++ ⟨X, Binding.sub δ'⟩ :: Δ) t τ) :
Narrowing of typings.
theorem Cslib.LambdaCalculus.LocallyNameless.Fsub.Typing.subst_tm {Var : Type u_1} [DecidableEq Var] [HasFresh Var] {Γ Δ : Env Var} {σ τ : Ty Var} {X : Var} {t s : Term Var} (der : Typing (Γ ++ ⟨X, Binding.ty σ⟩ :: Δ) t τ) (der_sub : Typing Δ s σ) :
Term substitution within a typing.
theorem Cslib.LambdaCalculus.LocallyNameless.Fsub.Typing.subst_ty {Var : Type u_1} [DecidableEq Var] [HasFresh Var] {Γ Δ : Env Var} {τ δ : Ty Var} {X : Var} {δ' : Ty Var} {t : Term Var} (der : Typing (Γ ++ ⟨X, Binding.sub δ'⟩ :: Δ) t τ) (sub : Sub Δ δ δ') :
Type substitution within a typing.
theorem Cslib.LambdaCalculus.LocallyNameless.Fsub.Typing.canonical_form_tabs {Var : Type u_1} [DecidableEq Var] {σ τ : Ty Var} {t : Term Var} (val : t.Value) (der : Typing [] t (σ.all τ)) :
A value that types as a quantifier is a type abstraction.