由于作业需要,开始学习λ演算,顺便开始写博客,也记录一下学习历程。
下面简单介绍λ演算的三个规则(红色部分非原创,参考自wxb_nudt的博客《Lambda演算学习笔记》)。
λ-项是左结合的,λx.xx=(λx.x)x
α-变换
α变换表达了λ演算中约束变量的名称是不重要的,例如λx.x和λy.y是相同的函数。因此,将某个函数中的所有约束变量全部换名是可以的。
首先是一个说明:如果M,N是λ-项,x在M中有自由出现,若以N置换M中所有x的自由出现(M中可能含有x的约束出现),我们得到另一个λ-项,记为M[x/N]。
α-变换规则如下:
λx.M=λy.M[x/y] 如果y没有在M中自由出现,并且只要y替换M中的x,都不会被M中的一个λ绑定。
例子:λx.( λx.x)x = λy(λx.x)y
α-变换主要用来表达函数中的变量换名规则,需要注意的是被换名的只能是M(函数体)中变量的自由出现。
β-归约
β-归约表达的是函数应用或者函数代入的概念。前面提到MN是合法的λ-项,那么MN的含义是将M应用到N,通俗的说是将N作为实参代替M中的约束变量,也就是形参。β-归约的规则如下:
(λx.M)N-->M[x/N] 如果N中所有变量的自由出现都在M[x/N]中保持自由出现
β-归约是λ演算中最重要的概念和规则,它是函数代入这个概念的形式化表示。
一些例子如下:
(lx.ly.y x)(lz.u)®ly.y(lz.u)
(lx. x x)(lz.u)®(lz.u) (lz.u)
(ly.y a)((lx. x)(lz.(lu.u) z))®(ly.y a)(lz.(lu.u) z)
(ly.y a)((lx. x)(lz.(lu.u) z))→(ly.y a)((lx. x)(lz. z))
(ly.y a)((lx. x)(lz.(lu.u) z))→((lx. x)(lz.(lu.u) z)) a
η-变换(η-conversion)
η-变换表达了“外延性”(extensionality)的概念,在这种上下文中,两个函数被认为是相等的“当且仅当”对于所有的参数,它们都给出同样的结果。我理解为,对于所有的实参,通过β-归约都能得到同样的λ-项,或者使用α-变换进行换名后得到同样的λ-项。
例如λx.fx与f相等,如果x没有在f中自由出现。
由β-归约,对所有的 y 有 (λ x . f x) y = f y,可得 λ x . f x = f,故η-变换成立。
两道作业题目及解答如下(如有错误,欢迎指正):
证明:YF=λg.(λf.g(ff))(λf.g(ff))F
=(λf.F(ff))(λf.F(ff)) (1)α变换,[g/F]
=ww (2)令w=(λf.F(ff))
=(λf.F(ff))w
=F(ww) (3)β规约,将w代入f
=F(YF) 由(2)知ww==YF
证毕。
2. 利用λ规约法则将(λp.λq.λr.p q r)(λp.λq.p q r)化到最简
解:(λp.λq.λr.p q r)(λp.λq.p q r)
=(λp.λq.λr.p qr)(λq.r q) β规约,将r代入p
=(λp.λq.λr.p qr)r η变换
=(λp.λq.λw.p q w)r α变换,[r/w]
=λq.λw.r q w β规约,将r代入p