η-reduction for the λ-calculus #
@[reducible, inline]
Full η-reduction, defined as the congruence closure of the base η-rule.
Equations
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
theorem
Cslib.LambdaCalculus.LocallyNameless.Untyped.Term.FullEta.redex_app_l_cong
{Var : Type u}
{M M' N : Term Var}
(redex : Relation.ReflTransGen FullEta M M')
(lc_N : N.LC)
:
Relation.ReflTransGen FullEta (M.app N) (M'.app N)
Left congruence rule for application in multiple reduction.
theorem
Cslib.LambdaCalculus.LocallyNameless.Untyped.Term.FullEta.redex_app_r_cong
{Var : Type u}
{M M' N : Term Var}
(redex : Relation.ReflTransGen FullEta M M')
(lc_N : N.LC)
:
Relation.ReflTransGen FullEta (N.app M) (N.app M')
Right congruence rule for application in multiple reduction.
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 : w ∉ M.fv)
:
w ∉ M'.fv
An η-reduction step does not introduce new free variables.
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)
:
Abstracting then closing preserves a single η-reduction step.
theorem
Cslib.LambdaCalculus.LocallyNameless.Untyped.Term.FullEta.redex_abs_close
{Var : Type u}
{M M' : Term Var}
[HasFresh Var]
[DecidableEq Var]
{x : Var}
(steps : Relation.ReflTransGen FullEta M M')
(lc_M : M.LC)
:
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 : ∀ x ∉ xs, 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.steps_subst_cong_r
{Var : Type u}
[HasFresh Var]
[DecidableEq Var]
{x : Var}
(s t t' : Term Var)
(st : Relation.ReflTransGen FullEta t 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')
:
Relation.ReflTransGen FullEta (s.open' t) (s.open' t')
theorem
Cslib.LambdaCalculus.LocallyNameless.Untyped.Term.FullEta.steps_open_cong_r
{Var : Type u}
[HasFresh Var]
[DecidableEq Var]
{s t t' : Term Var}
(lc_s : s.abs.LC)
(lc_t : t.LC)
(steps : Relation.ReflTransGen FullEta t t')
:
Relation.ReflTransGen FullEta (s.open' t) (s.open' t')
theorem
Cslib.LambdaCalculus.LocallyNameless.Untyped.Term.FullEta.close_eta_steps
{Var : Type u}
{M N : Term Var}
[HasFresh Var]
[DecidableEq Var]
{x : Var}
(hx_M : x ∉ M.fv)
(st_M : Relation.ReflGen FullEta (M.open' (fvar x)) N)
:
Relation.ReflGen FullEta M.abs (N.close x).abs
theorem
Cslib.LambdaCalculus.LocallyNameless.Untyped.Term.FullEta.steps_subst_cong_l
{Var : Type u}
[HasFresh Var]
[DecidableEq Var]
{x : Var}
(s s' N : Term Var)
(steps : Relation.ReflTransGen FullEta s s')
(lc_N : N.LC)
: