λ-calculus #
The λ-calculus with polymorphism and subtyping, with a locally nameless representation of syntax.
References #
- A. Chargueraud, The Locally Nameless Representation
- See also https://www.cis.upenn.edu/~plclub/popl08-tutorial/code/, from which this is adapted
Types of the polymorphic lambda calculus.
- top {Var : Type u_2} : Ty Var
The type ⊤, with a single inhabitant.
- bvar {Var : Type u_2} : ℕ → Ty Var
Bound variables that appear in a type, using a de-Bruijn index.
- fvar {Var : Type u_2} : Var → Ty Var
Free type variables.
- arrow {Var : Type u_2} : Ty Var → Ty Var → Ty Var
A function type.
- all {Var : Type u_2} : Ty Var → Ty Var → Ty Var
A universal quantification.
- sum {Var : Type u_2} : Ty Var → Ty Var → Ty Var
A sum type.
Instances For
Syntax of locally nameless lambda terms, with free variables over Var.
- bvar {Var : Type u_2} : ℕ → Term Var
Bound term variables that appear under a lambda abstraction, using a de-Bruijn index.
- fvar {Var : Type u_2} : Var → Term Var
Free term variables.
- abs {Var : Type u_2} : Ty Var → Term Var → Term Var
Lambda abstraction, introducing a new bound term variable.
- app {Var : Type u_2} : Term Var → Term Var → Term Var
Function application.
- tabs {Var : Type u_2} : Ty Var → Term Var → Term Var
Type abstraction, introducing a new bound type variable.
- tapp {Var : Type u_2} : Term Var → Ty Var → Term Var
Type application.
- let' {Var : Type u_2} : Term Var → Term Var → Term Var
Binding of a term.
- inl {Var : Type u_2} : Term Var → Term Var
Left constructor of a sum.
- inr {Var : Type u_2} : Term Var → Term Var
Right constructor of a sum.
- case {Var : Type u_2} : Term Var → Term Var → Term Var → Term Var
Case matching on a sum.
Instances For
Free variables of a type.
Equations
Instances For
Free variables of a binding.
Equations
Instances For
Free type variables of a term.
Equations
- (Cslib.LambdaCalculus.LocallyNameless.Fsub.Term.bvar a).fvTy = ∅
- (Cslib.LambdaCalculus.LocallyNameless.Fsub.Term.fvar a).fvTy = ∅
- (Cslib.LambdaCalculus.LocallyNameless.Fsub.Term.abs σ t₁).fvTy = σ.fv ∪ t₁.fvTy
- (Cslib.LambdaCalculus.LocallyNameless.Fsub.Term.tabs σ t₁).fvTy = σ.fv ∪ t₁.fvTy
- (t₁.tapp σ).fvTy = σ.fv ∪ t₁.fvTy
- t₁.inl.fvTy = t₁.fvTy
- t₁.inr.fvTy = t₁.fvTy
- (t₁.app t₂).fvTy = t₁.fvTy ∪ t₂.fvTy
- (t₁.let' t₂).fvTy = t₁.fvTy ∪ t₂.fvTy
- (t₁.case t₂ t₃).fvTy = t₁.fvTy ∪ t₂.fvTy ∪ t₃.fvTy
Instances For
Free term variables of a term.
Equations
- (Cslib.LambdaCalculus.LocallyNameless.Fsub.Term.bvar a).fvTm = ∅
- (Cslib.LambdaCalculus.LocallyNameless.Fsub.Term.fvar a).fvTm = {a}
- (Cslib.LambdaCalculus.LocallyNameless.Fsub.Term.abs σ t₁).fvTm = t₁.fvTm
- (Cslib.LambdaCalculus.LocallyNameless.Fsub.Term.tabs σ t₁).fvTm = t₁.fvTm
- (t₁.tapp σ).fvTm = t₁.fvTm
- t₁.inl.fvTm = t₁.fvTm
- t₁.inr.fvTm = t₁.fvTm
- (t₁.app t₂).fvTm = t₁.fvTm ∪ t₂.fvTm
- (t₁.let' t₂).fvTm = t₁.fvTm ∪ t₂.fvTm
- (t₁.case t₂ t₃).fvTm = t₁.fvTm ∪ t₂.fvTm ∪ t₃.fvTm
Instances For
A context of bindings.