Documentation

Cslib.Languages.LambdaCalculus.LocallyNameless.Untyped.FullEta

η-reduction for the λ-calculus #

A single η-reduction step.

  • eta {Var : Type u} {M : Term Var} : M.LC(M.app (bvar 0)).abs.Eta M

    The eta rule: λx. M x ⟶ M, provided x is not free in M.

Instances For
    Equations
    • One or more equations did not get rendered due to their size.
    Instances For
      Equations
      • One or more equations did not get rendered due to their size.
      Instances For

        The right side of an η-reduction is locally closed.

        Left congruence rule for application in multiple reduction.

        Right congruence rule for application in multiple reduction.

        theorem Cslib.LambdaCalculus.LocallyNameless.Untyped.Term.FullEta.invert_step_app_fvar {Var : Type u} {M N : Term Var} {x : Var} (step : (M.app (fvar x)).FullEta N) :
        ∃ (M' : Term Var), N = M'.app (fvar x) M.FullEta M'
        theorem Cslib.LambdaCalculus.LocallyNameless.Untyped.Term.FullEta.step_not_fv {Var : Type u} {M M' : Term Var} [HasFresh Var] [DecidableEq Var] {w : Var} (step : M.FullEta M') (hw : wM.fv) :
        wM'.fv

        An η-reduction step does not introduce new free variables.

        theorem Cslib.LambdaCalculus.LocallyNameless.Untyped.Term.FullEta.eta_subst_fvar {Var : Type u} {M M' : Term Var} [HasFresh Var] [DecidableEq Var] {x y : Var} (step : M.FullEta M') :

        Substitution of a fresh variable preserves an η-reduction step.

        theorem Cslib.LambdaCalculus.LocallyNameless.Untyped.Term.FullEta.step_abs_close {Var : Type u} {M M' : Term Var} [HasFresh Var] [DecidableEq Var] {x : Var} (step : M.FullEta M') (lc_M : M.LC) :
        (M.close x).abs.FullEta (M'.close x).abs

        Abstracting then closing preserves a single η-reduction step.

        Abstracting then closing preserves multiple reductions.

        theorem Cslib.LambdaCalculus.LocallyNameless.Untyped.Term.FullEta.redex_abs_cong {Var : Type u} [HasFresh Var] [DecidableEq Var] {M M' : Term Var} (xs : Finset Var) (cofin : xxs, Relation.ReflTransGen FullEta (M.open' (fvar x)) (M'.open' (fvar x))) (lc_M : M.abs.LC) :

        Multiple reduction of opening implies multiple reduction of abstraction.

        theorem Cslib.LambdaCalculus.LocallyNameless.Untyped.Term.FullEta.step_subst_cong_r {Var : Type u} [HasFresh Var] [DecidableEq Var] {x : Var} (s t t' : Term Var) (st : t.FullEta t') (lc_s : s.LC) (lc_t : t.LC) :
        theorem Cslib.LambdaCalculus.LocallyNameless.Untyped.Term.FullEta.step_open_cong_r {Var : Type u} [HasFresh Var] [DecidableEq Var] {s t t' : Term Var} (lc_s : s.abs.LC) (lc_t : t.LC) (step : t.FullEta t') :
        theorem Cslib.LambdaCalculus.LocallyNameless.Untyped.Term.FullEta.step_subst_cong_l {Var : Type u} [HasFresh Var] [DecidableEq Var] {x : Var} (s s' N : Term Var) (step : s.FullEta s') (lc_N : N.LC) :
        s[x:=N].FullEta (s'[x:=N])