Strong normalization (termination) for full beta-reduction of untyped lambda calculus.
A single β-reduction step preserves strong normalization.
Multiple β-reduction steps also preserve strong normalization.
Free variables are strongly normalizing.
An application is strongly normalizing if the left and right terms are strongly normalizing, as well as all possible future top level abstraction application beta reductions
The left side of a strongly normalizing application is strongly normalizing.
The right side of a strongly normalizing application is strongly normalizing.
A neutral term is a term of the form v t₁ … t_n where v is a variable and t₁ … t_n are strongly normalizing terms.
- bvar
{Var : Type u}
(n : ℕ)
: (Term.bvar n).Neutral
Just a bound variable is neutral.
- fvar
{Var : Type u}
(x : Var)
: (Term.fvar x).Neutral
Just a free variable is neutral.
- app
{Var : Type u}
(t1 t2 : Term Var)
: t1.Neutral → Relation.SN FullBeta t2 → (t1.app t2).Neutral
Applying a strongly normalizing term to a neutral term yields a neutral term.
Instances For
Neutral terms only reduce to other neutral terms in multiple steps
Neutral terms are strongly normalizing.
A lambda abstraction is strongly normalizing if its body is strongly normalizing.
A term of the form λ M N P_1 … P_n is strongly normalizing if
- N is strongly normalizing,
- M ^ N P₁ … Pₙ is strongly normalizing,
- N is locally closed,
- M ^ N P₁ … Pₙ is locally closed