λ-calculus #
The λ-calculus with polymorphism and subtyping, with a locally nameless representation of syntax. This file defines the subtyping 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 subtyping relation.
- top {Var : Type u_1} [DecidableEq Var] {Γ : Env Var} {σ : Ty Var} : Γ.Wf → Ty.Wf Γ σ → Sub Γ σ Ty.top
- refl_tvar {Var : Type u_1} [DecidableEq Var] {X : Var} {Γ : Env Var} : Γ.Wf → Ty.Wf Γ (Ty.fvar X) → Sub Γ (Ty.fvar X) (Ty.fvar X)
- trans_tvar {Var : Type u_1} [DecidableEq Var] {σ : Ty Var} {Γ : Env Var} {σ' : Ty Var} {X : Var} : Binding.sub σ ∈ List.dlookup X Γ → Sub Γ σ σ' → Sub Γ (Ty.fvar X) σ'
- arrow {Var : Type u_1} [DecidableEq Var] {Γ : Env Var} {σ σ' τ' τ : Ty Var} : Sub Γ σ σ' → Sub Γ τ' τ → Sub Γ (σ'.arrow τ') (σ.arrow τ)
- all {Var : Type u_1} [DecidableEq Var] {Γ : Env Var} {σ σ' τ' τ : Ty Var} (L : Finset Var) : Sub Γ σ σ' → (∀ X ∉ L, Sub (⟨X, Binding.sub σ⟩ :: Γ) (τ'.open' (Ty.fvar X)) (τ.open' (Ty.fvar X))) → Sub Γ (σ'.all τ') (σ.all τ)
- sum {Var : Type u_1} [DecidableEq Var] {Γ : Env Var} {σ' σ τ' τ : Ty Var} : Sub Γ σ' σ → Sub Γ τ' τ → Sub Γ (σ'.sum τ') (σ.sum τ)
Instances For
theorem Cslib.LambdaCalculus.LocallyNameless.Fsub.Sub.refl {Var : Type u_1} [DecidableEq Var] {Γ : Env Var} {σ : Ty Var} (wf_Γ : Γ.Wf) (wf_σ : Ty.Wf Γ σ) :
Sub Γ σ σ
Subtypes are reflexive when well-formed.
theorem Cslib.LambdaCalculus.LocallyNameless.Fsub.Sub.narrow_aux {Var : Type u_1} [DecidableEq Var] {Γ Δ : Env Var} {σ τ δ : Ty Var} {X : Var} {δ' : Ty Var} (trans : ∀ (Γ : Env Var) (σ τ : Ty Var), Sub Γ σ δ → Sub Γ δ τ → Sub Γ σ τ) (sub₁ : Sub (Γ ++ ⟨X, Binding.sub δ⟩ :: Δ) σ τ) (sub₂ : Sub Δ δ' δ) :
theorem Cslib.LambdaCalculus.LocallyNameless.Fsub.Sub.trans {Var : Type u_1} [DecidableEq Var] {Γ : Env Var} {σ τ δ : Ty Var} :
@[instance_reducible]
instance Cslib.LambdaCalculus.LocallyNameless.Fsub.Sub.instTransTy {Var : Type u_1} [DecidableEq Var] (Γ : Env Var) :
Equations
- Cslib.LambdaCalculus.LocallyNameless.Fsub.Sub.instTransTy Γ = { trans := ⋯ }
theorem Cslib.LambdaCalculus.LocallyNameless.Fsub.Sub.narrow {Var : Type u_1} [DecidableEq Var] {Γ Δ : Env Var} {σ τ δ δ' : Ty Var} {X : Var} (sub_δ : Sub Δ δ δ') (sub_narrow : Sub (Γ ++ ⟨X, Binding.sub δ'⟩ :: Δ) σ τ) :
Narrowing of subtypes.
theorem Cslib.LambdaCalculus.LocallyNameless.Fsub.Sub.map_subst {Var : Type u_1} [DecidableEq Var] {Γ Δ : Env Var} {σ τ δ : Ty Var} [HasFresh Var] {X : Var} {δ' : Ty Var} (sub₁ : Sub (Γ ++ ⟨X, Binding.sub δ'⟩ :: Δ) σ τ) (sub₂ : Sub Δ δ δ') :
Subtyping of substitutions.
theorem Cslib.LambdaCalculus.LocallyNameless.Fsub.Sub.strengthen {Var : Type u_1} [DecidableEq Var] {Γ Δ : Env Var} {σ τ δ : Ty Var} {X : Var} (sub : Sub (Γ ++ ⟨X, Binding.ty δ⟩ :: Δ) σ τ) :
Strengthening of subtypes.