Lambda Calculus in Lean

1.5. Examples🔗

The usual lambda-calculus constants are represented directly as L0 terms. The examples after the definitions are checked reduction derivations.

def I : L0 := L0[λ 0]def T : L0 := L0[λ λ 1]def F : L0 := L0[λ λ 0]def N : L0 := L0[λ 0 {F} {T}]def N' : L0 := L0[λ λ λ 2 0 1]def A : L0 := L0[λ λ 1 0 {F}]def M : L0 := L0[λ λ λ 0 2 1]example : NormalForm I := I.NormalForm All goals completed! 🐙example : NormalForm T := T.NormalForm All goals completed! 🐙example : NormalForm F := F.NormalForm All goals completed! 🐙example : NormalForm N := N.NormalForm All goals completed! 🐙example : NormalForm N' := N'.NormalForm All goals completed! 🐙example : NormalForm A := A.NormalForm All goals completed! 🐙example : NormalForm M := M.NormalForm All goals completed! 🐙example : L0[{I} 3] →β₀ L0[3] := I.app (var 3) →β₀ var 3 All goals completed! 🐙example : L0[{I} 3] →β₀* L0[3] := I.app (var 3) →β₀* var 3 rt_step { All goals completed! 🐙 }example : L0[{T} 3 4] →β₀* L0[3] := (T.app (var 3)).app (var 4) →β₀* var 3 All goals completed! 🐙example : L0[{F} 3 4] →β₀* L0[4] := (F.app (var 3)).app (var 4) →β₀* var 4 All goals completed! 🐙example : L0[{N} {T}] →β₀* L0[{F}] := N.app T →β₀* F calc _ = L0[{N} {T}] := N.app T = N.app T All goals completed! 🐙 _ = L0[(λ 0 {F} {T}) {T}] := N.app T = (((var 0).app F).app T).lam.app T All goals completed! 🐙 _ →β₀ L0[{T} {F} {T}] := (((var 0).app F).app T).lam.app T →β₀ (T.app F).app T All goals completed! 🐙 _ = L0[(λ λ 1) {F} {T}] := (T.app F).app T = ((var 1).lam.lam.app F).app T All goals completed! 🐙 _ →β₀ L0[(λ {F}) {T}] := ((var 1).lam.lam.app F).app T →β₀ F.lam.app T All goals completed! 🐙 _ →β₀ L0[{F}] := F.lam.app T →β₀ F All goals completed! 🐙example : L0[{N} {F}] →β₀* L0[{T}] := N.app F →β₀* T calc _ = L0[{N} {F}] := N.app F = N.app F All goals completed! 🐙 _ = L0[(λ 0 {F} {T}) {F}] := N.app F = (((var 0).app F).app T).lam.app F All goals completed! 🐙 _ →β₀ L0[{F} {F} {T}] := (((var 0).app F).app T).lam.app F →β₀ (F.app F).app T All goals completed! 🐙 _ = L0[(λ λ 0) {F} {T}] := (F.app F).app T = ((var 0).lam.lam.app F).app T All goals completed! 🐙 _ →β₀ L0[(λ 0) {T}] := ((var 0).lam.lam.app F).app T →β₀ (var 0).lam.app T All goals completed! 🐙 _ →β₀ L0[{T}] := (var 0).lam.app T →β₀ T All goals completed! 🐙example : L0[{N'} {T}] →β₀* L0[{F}] := N'.app T →β₀* F All goals completed! 🐙example : L0[{N'} {F}] →β₀* L0[{T}] := N'.app F →β₀* T All goals completed! 🐙example : L0[{N} {T}] →β₀* L0[{F}] := N.app T →β₀* F All goals completed! 🐙example : L0[{N} {F}] →β₀* L0[{T}] := N.app F →β₀* T All goals completed! 🐙example : L0[{N'} {T}] →β₀* L0[{F}] := N'.app T →β₀* F All goals completed! 🐙example : L0[{N'} {F}] →β₀* L0[{T}] := N'.app F →β₀* T All goals completed! 🐙example : L0[{A} {T} {T}] →β₀* L0[{T}] := (A.app T).app T →β₀* T All goals completed! 🐙example : L0[{A} {T} {F}] →β₀* L0[{F}] := (A.app T).app F →β₀* F All goals completed! 🐙example : L0[{A} {F} {T}] →β₀* L0[{F}] := (A.app F).app T →β₀* F All goals completed! 🐙example : L0[{A} {F} {F}] →β₀* L0[{F}] := (A.app F).app F →β₀* F All goals completed! 🐙def Z : L0 := L0[λ λ 0]def S : L0 := L0[λ λ λ 1 (2 1 0)]def Plus : L0 := L0[λ λ 1 {S} 0]end L0