Documentation

Cslib.Languages.LambdaCalculus.LocallyNameless.Fsub.Typing

λ-calculus #

The λ-calculus with polymorphism and subtyping, with a locally nameless representation of syntax. This file defines the typing relation.

References #

inductive Cslib.LambdaCalculus.LocallyNameless.Fsub.Typing {Var : Type u_1} [DecidableEq Var] :
Env VarTerm VarTy VarProp

The typing relation.

Instances For
    theorem Cslib.LambdaCalculus.LocallyNameless.Fsub.Typing.wf {Var : Type u_1} [DecidableEq Var] [HasFresh Var] {Γ : Env Var} {t : Term Var} {τ : Ty Var} (der : Typing Γ t τ) :
    Γ.Wf t.LC Ty.Wf Γ τ

    Typings have well-formed contexts and types.

    theorem Cslib.LambdaCalculus.LocallyNameless.Fsub.Typing.weaken {Var : Type u_1} [DecidableEq Var] [HasFresh Var] {Γ Δ Θ : Env Var} {τ : Ty Var} {t : Term Var} (der : Typing (Γ ++ Δ) t τ) (wf : (Γ ++ Θ ++ Δ).Wf) :
    Typing (Γ ++ Θ ++ Δ) t τ

    Weakening of typings.

    theorem Cslib.LambdaCalculus.LocallyNameless.Fsub.Typing.weaken_head {Var : Type u_1} [DecidableEq Var] [HasFresh Var] {Γ Δ : Env Var} {τ : Ty Var} {t : Term Var} (der : Typing Δ t τ) (wf : (Γ ++ Δ).Wf) :
    Typing (Γ ++ Δ) t τ

    Weakening of typings (at the front).

    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 τ) :
    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 σ) :
    Typing (Γ ++ Δ) (t[X:=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 Δ δ δ') :
    Typing (Context.map_val (fun (x : Binding Var) => x[X:=δ]) Γ ++ Δ) (t[X:=δ]) (τ[X:=δ])

    Type substitution within a typing.

    theorem Cslib.LambdaCalculus.LocallyNameless.Fsub.Typing.abs_inv {Var : Type u_1} [DecidableEq Var] {Γ : Env Var} {τ δ γ' : Ty Var} {t : Term Var} {γ : Ty Var} (der : Typing Γ (Term.abs γ' t) τ) (sub : Sub Γ τ (γ.arrow δ)) :
    Sub Γ γ γ' ∃ (δ' : Ty Var) (L : Finset Var), xL, Typing (x, Binding.ty γ' :: Γ) (t.open_tm (Term.fvar x)) δ' Sub Γ δ' δ

    Invert the typing of an abstraction.

    theorem Cslib.LambdaCalculus.LocallyNameless.Fsub.Typing.tabs_inv {Var : Type u_1} [DecidableEq Var] {Γ : Env Var} {τ δ : Ty Var} [HasFresh Var] {γ' : Ty Var} {t : Term Var} {γ : Ty Var} (der : Typing Γ (Term.tabs γ' t) τ) (sub : Sub Γ τ (γ.all δ)) :
    Sub Γ γ γ' ∃ (δ' : Ty Var) (L : Finset Var), XL, Typing (X, Binding.sub γ :: Γ) (t.open_ty (Ty.fvar X)) (δ'.open' (Ty.fvar X)) Sub (X, Binding.sub γ :: Γ) (δ'.open' (Ty.fvar X)) (δ.open' (Ty.fvar X))

    Invert the typing of a type abstraction.

    theorem Cslib.LambdaCalculus.LocallyNameless.Fsub.Typing.inl_inv {Var : Type u_1} [DecidableEq Var] {Γ : Env Var} {τ δ : Ty Var} {t : Term Var} {γ : Ty Var} (der : Typing Γ t.inl τ) (sub : Sub Γ τ (γ.sum δ)) :
    ∃ (γ' : Ty Var), Typing Γ t γ' Sub Γ γ' γ

    Invert the typing of a left case.

    theorem Cslib.LambdaCalculus.LocallyNameless.Fsub.Typing.inr_inv {Var : Type u_1} [DecidableEq Var] {Γ : Env Var} {δ : Ty Var} {t : Term Var} {T γ : Ty Var} (der : Typing Γ t.inr T) (sub : Sub Γ T (γ.sum δ)) :
    ∃ (δ' : Ty Var), Typing Γ t δ' Sub Γ δ' δ

    Invert the typing of a right case.

    theorem Cslib.LambdaCalculus.LocallyNameless.Fsub.Typing.canonical_form_abs {Var : Type u_1} [DecidableEq Var] {σ τ : Ty Var} {t : Term Var} (val : t.Value) (der : Typing [] t (σ.arrow τ)) :
    ∃ (δ : Ty Var) (t' : Term Var), t = Term.abs δ t'

    A value that types as a function is an abstraction.

    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 τ)) :
    ∃ (δ : Ty Var) (t' : Term Var), t = Term.tabs δ t'

    A value that types as a quantifier is a type abstraction.

    theorem Cslib.LambdaCalculus.LocallyNameless.Fsub.Typing.canonical_form_sum {Var : Type u_1} [DecidableEq Var] {σ τ : Ty Var} {t : Term Var} (val : t.Value) (der : Typing [] t (σ.sum τ)) :
    ∃ (t' : Term Var), t = t'.inl t = t'.inr

    A value that types as a sum is a left or right case.