Skip to main content

Lambda Calculus

Syntax

Basic(BNF范式):

λ  expression/terms:M,N::=x  λx.M  M NLambda abstraction:λx.MLmabda application:(M N)e.g.(λx.M)3\begin{aligned} \lambda~~\mathrm{expression}/\mathrm{terms} & :\quad M, N::= x~|~ \lambda x.M~|~M~N \\ \mathrm{Lambda~abstraction} & :\quad \lambda x.M \\ \mathrm{Lmabda~application} & :\quad (M~N) \quad e. g. (\lambda x.M)3 \end{aligned}

约定:

Body of λ\lambda extends as far to the right as possible(左结合):

λx.M N=λx.(M N)\lambda x. M~N=\quad \lambda x.(M~N)

Function applications are left-associative(左相关):

M N P=(M N) P,not M (N P)M~N~P = (M~N)~P, \mathrm{not}~M~(N~P)

Higher-order Functions

Functions can be returned as return values:

λx.λy.xy\lambda x.\lambda y.x-y

Functions can be passed as arguments:

(λf.λx.f x)(λx.x+1)2(\lambda f.\lambda x.f~x)(\lambda x.x+1)2

Curried Functions

λ\lambda abstraction是单参数的函数(虽然计算上多参数和单参数是一样的),并且可以相互转换。

λ(x,y).xyCurryλx.λy.xy\lambda(x, y).x-y\rightarrow_{Curry}\lambda x.\lambda y.x-y

Uncurry:逆过程。

Free and Bound Variables(α\alpha-equivalence)

For λx.x+y\lambda x.x+y: xx is bound variable, yy is free variable.

Bound variable can be renamed: λz.z+y\lambda z. z+y, (x+y)(x+y) is the scope of binding λx\lambda x,即Bound variable是一个placeholder,占位符,改名后实际上还是保持后文提及的α\alpha-equivalence。

However, name of free variable does matter.

Formal definitions of free variable

fv(x):the set of free variables infv(x):{x}fv(λx.M):fv(M)/{x}fv(M N):fv(M)fv(N)\begin{aligned} fv(x): & \quad \mathrm{the~set~of~free~variables~in} \\ fv(x): & \quad \{x\} \\ fv(\lambda x.M): & \quad fv(M) / \{x\} \\ fv(M~N): & \quad fv(M)\cup fv(N) \end{aligned}

bound variable definiation is meaningless.

α\alpha-equivalence

λx.M=λy.M[y/x]\lambda x.M = \lambda y.M[y/x]

其中 M[y/x]M[y/x]表示yy替换xx

Semantics

β\beta-reduction

(λx.M)NM[N/x](\lambda x.M) N \rightarrow M[N/x]

Repeatedly apply reduction rule to any sub-term.


x[N/x]:Ny[N/x]:y(M P)[N/x]:(M[N/x])(P[N/x])(λx.M)[N/x]:λx.M(λy.M)[N/x]:λy.(M[N/x])if yfv(N)(λy.M)[N/x]:λz.(M[z/y][N/x])ifyfv(N)&z fresh\begin{aligned} x[N/x]: & \quad N \\ y[N/x]: & \quad y \\ (M~P)[N/x]: & \quad (M[N/x])(P[N/x]) \\ (\lambda x.M)[N/x]: & \quad \lambda x.M \\ (\lambda y.M)[N/x]: & \quad \lambda y.(M[N/x]) & \mathrm{if~y}\notin fv(N) \\ (\lambda y.M)[N/x]: & \quad \lambda z.(M[z/y][N/x]) & \mathrm{if} y \in fv(N) \& \mathrm{z~fresh} \end{aligned}

Reduction Rules

(λx.M)NM[N/x](β)\frac{}{(\lambda x.M)N\rightarrow M [N/x]}(\beta) MMM NM N\frac{M\rightarrow M'}{M~N\rightarrow M'~N} NNM NM N\frac{N\rightarrow N'}{M~N\rightarrow M~N'} MMλx.Mλx.M\frac{M\rightarrow M'}{\lambda x.M\rightarrow \lambda x.M'}

箭头表示一种规约的relation,而非等号。

subsitution 用等号,reduction 用箭头。

Normal form

β\beta-redex: a term of the form (λx.M)N(\lambda x.M)N(reducible expression).

β\beta-normal form: a term containing no β\beta-redex,即不能再β\beta-reduction.

Church-Rosser Property(合流性)

Terms can be evaluated in any order, final result (if there is one) is uniquely determined.

Formalize:

MMzeroormore steps of:M0MiffM=MMk+1MiffM.MM&MkMMMiffk.MkM\begin{aligned} M\rightarrow^* M' & \quad \mathrm{zero-or-more~steps~of}: \\ M\rightarrow^0 M' & \quad \mathrm{iff}\quad M = M' \\ M\rightarrow^{k+1} M' &\quad \mathrm{iff}\quad\exists M''. M\rightarrow M'' \And M''\rightarrow^k M'\\ M\rightarrow^* M' & \quad\mathrm{iff}\quad\exists k.M\rightarrow^k M' \\ \end{aligned}

For all M, M1 and M2, if MM1M\rightarrow^*M_1 and MM2M\rightarrow^*M_2, then there exists M’ such that M1MM_1\rightarrow^*M' and M2MM_2\rightarrow^*M'

推论:

由于α\alpha-equivalence, every term has at most one normal form.

对一个term有多个β\beta-redex: Good news: 无论哪个备选,至多一个normal form

Bad news: 一些规约策略可能无法找到normal form(no terminating, e.g. (λx.x x)(λx.x x)(\lambda x.x~x)(\lambda x.x~x)).

Reduction strategies

alt text

Normal-order reduction: choose the left-most, outer-most redex first (Normal-order reduction will find normal form if exists)

Applicative-order reduction: choose the left-most, inner-most redex first

将reduction类比编程语言中的evaluation strategies:

  1. Call-by-name (类似 normal-order),实参不急着求值,而是代入到函数体里(ALGOL 60)
  2. Call-by-need(缓存版call-by-name),即lazy evaluation(Haskell)
  3. Call-by-value(类似applicative-order),即eager evaluation(C)。

subtle difference:

  • under lambda,因此允许函数体内的优化,可能导致non-terminate(i.e. λx.((λy.yy)(λy.yy))λx. ((λy. y y) (λy. y y)))
  • Evaluation strategies:不会 reduces under lambda

Evaluation

仅对closed terms(无free variable)求值,并不总是reduce至normal form,会停在包含canoical form(比如一个abstraction)上。

alt text

If normal-order reduction terminates, the reduction sequence must contain a first canonical form.

另外,evaluation按normal-order 进行。和reduction一样,evaluation也可能no terminate。

Normal-order evaluation rules:

λx.M    λx.M(Term)\frac{}{\lambda x.M \implies \lambda x.M}(Term) M    λx.MM[N/x]    PMN    P(β)\frac{M\implies \lambda x.M'\qquad M'[N/x]\implies P}{MN\implies P}(\beta)

small-step版:

(λx.M)NM[N/x](β)\frac{}{(\lambda x.M)N \rightarrow M[N/x]} \quad (\beta) MMMNMN\frac{M \rightarrow M^{\prime}}{M N \rightarrow M^{\prime} N}

和reduction相比少了两个规则,因为evaluation不想提前化简,只需要到canoical即可。

example:

alt text


eager evaluation:

Postpone the substitution until the argument is a canonical form.

No need to reduce many copies of the argument separately.

λx.M    Eλx.M(Term)\frac{}{\lambda x.M\implies_E \lambda x.M}(Term) M    Eλx.MN    ENM[Nx]    EPMN    EP(β)\frac{M\implies_E \lambda x.M' \quad N\implies_E N' \quad M'[N'x]\implies_E P}{M N \implies_E P}(\beta)

small-step版:

(λx.M)(λy.N)M[(λy.N)/x](β)\frac{}{(\lambda x.M)(\lambda y.N) \rightarrow M[(\lambda y.N)/x]} \quad (\beta) MMMNMN\frac{M \rightarrow M^{\prime}}{M N \rightarrow M^{\prime} N} NN(λx.M)N(λx.M)N\frac{N \rightarrow N^{\prime}}{(\lambda x.M) N \rightarrow (\lambda x.M) N^{\prime}}

Programming in λ\lambda-calculus

True=λx.λy.xFalse=λx.λy.ynot=λb.b False Trueand=λb.λb.b b Falseor=λb.λb.b True bif b then M else N=b M Nnot=λb.λx.λy.b y x\begin{aligned} \mathrm{True} = & \lambda x. \lambda y. x \\ \mathrm{False} = & \lambda x. \lambda y. y \\ \mathrm{not} = & \lambda b. b~\mathrm{False~True}\\ \mathrm{and} = & \lambda b. \lambda b'. b~b'~\mathrm{False}\\ \mathrm{or} = & \lambda b. \lambda b'. b~\mathrm{True}~b'\\ \mathrm{if~b~then~M~else~N} = & b~M~N \\ \mathrm{not'} = &\lambda b.\lambda x.\lambda y. b~y~x \end{aligned}

Church numerals:

0=λf.λx.x1=λf.λx.f xn=λf.λx.fn xsucc=λn.λf.λx.f(n f x)succ=λn.λf.λx.n f(f x)iszero=λn.λx.λy.n(λz.y)x\begin{aligned} 0 = & \lambda f.\lambda x. x \\ 1 = & \lambda f.\lambda x. f~x \\ n = & \lambda f.\lambda x. f^n~x \\ succ = & \lambda n.\lambda f.\lambda x. f(n~f~x) \\ succ' = & \lambda n.\lambda f.\lambda x. n~f(f~x) \\ iszero = & \lambda n.\lambda x.\lambda y. n (\lambda z.y) x \\ \end{aligned}

Pairs/Tuple:

(M,N)=λf.fMNπ0=λp.p(λx.λy.x)π0=λp.p(λx.λy.y)(M1,...,Mn)=λf.fM1 ... Mnπi=λp.p(λx1...λxn. xi)\begin{aligned} (M, N) = & \lambda f.f M N \\ \pi_0 = & \lambda p.p(\lambda x.\lambda y.x) \\ \pi_0 = & \lambda p.p(\lambda x.\lambda y.y) \\ (M_1, ..., M_n) = & \lambda f.f M_1~...~M_n \\ \pi_i = & \lambda p. p(\lambda x_1...\lambda x_n.~x_i) \\ \end{aligned}

Fix point

如何对类fact(n)=if(n==0) then 1 else nfact(n1)fact(n) = if (n == 0)~then~1~else~n * fact(n-1)的递归函数进行进行编码?

在数学上,我们对不动点的定义为f(x)=xf(x) = x,对函数而言,可以有0、有限到无限个不动点。

上面的函数我们可以转换为:fact=(λf.λn.if(n==0)then 1 else nf(n1))factfact = (\lambda f.\lambda n. if (n == 0) then~1~else~n*f(n - 1))fact。而对此,设:

F=λf.λn.if(n==0)then 1 else nf(n1)F = \lambda f.\lambda n. if (n == 0) then ~ 1~else~n*f(n - 1)

那么有:fact=βF factfact =_\beta F~factfactfactFF的不动点。

Fixpoint combinator是更高层的function~h,其满足:

对所有的函数f,(h f)的都是f的不动点:h f=βf (h f)h~f =_\beta f~(h~f)

对此,有:

Turing's fixpoint combinator Θ\Theta: A=λx.λy.y(x x y)Θ=A AA = \lambda x.\lambda y. y (x~x~y),\Theta = A~A

Curry's fixpoint combinator YY: λf.(λx.f(x x))(λx.f(x x))\lambda f.(\lambda x. f(x~x))(\lambda x. f(x~x))