λ \lambda λ演算学习笔记(二)——基本运算
α \alpha α替换和 β \beta β化简
λ \lambda λ演算的基本运算有两种
- 参数换名,即将一个函数声明中的参数名改为另一个符号.比如对数学函数 f ( x ) = x f(x)=x f(x)=x,其 λ \lambda λ表达式为 λ x . x \lambda x.x λx.x.如果我们把自变量的名字改成y,则可以得到 f ( y ) = y f(y)=y f(y)=y和 λ y . y \lambda y.y λy.y,显然改名之后得到的新函数和原来的函数相等.因为对同样的输入,它们必然得到同样的输出.参数改名在 λ \lambda λ演算中有个专有名词叫 α \alpha α替换.
- 调用求值, 对函数调用表达式,用实参代替形参,然后代入函数体,得到新的结果.它对应数学上的用具体值代入函数,然后求值的过程.在 λ \lambda λ演算中对应的专有名词叫 β \beta β替换或者 β \beta β归约.我更习惯叫 β 化 简 \beta化简 β化简,或者简称化简.下面看一个例子
设 f = λ x λ y . ( x y ) f=\lambda x \lambda y. (x y) f=λxλy.(xy) , a = λ z . z a=\lambda z. z a=λz.z,那么表达式 f a b f a b fab的求值(化简)过程为
- 首先计算(f a),即用符号a替换f的f的函数体中的参数名x,得到
(
f
a
)
=
λ
y
.
(
a
y
)
(f a)=\lambda y.(a y)
(fa)=λy.(ay)
,这一步的结果得到的一个新的函数声明表达式,
我们可以设 t = ( f a ) = λ y . ( a y ) t=(f a)=\lambda y.(a y) t=(fa)=λy.(ay) - 然后继续计算(t b),即用符号b替换f的t的函数体中的y,得到(a b)
- 由于a又是一个函数声明,所以可以继续化简,用b替换a的函数体中的所有形参z,最后得到b
- 即最终化简结果为f a b= b
λ \lambda λ 表达式的等价判断
在数学上,我们会看到两个函数的表达式虽然不同,但是实际是同一个函数的情形.比如设
f
(
x
)
=
x
+
2
f(x)=x+2
f(x)=x+2 ,
g
(
t
)
=
3
+
t
−
1
g(t)=3+t-1
g(t)=3+t−1,显然对任意
x
x
x,都有
f
(
x
)
=
g
(
x
)
f(x)=g(x)
f(x)=g(x),所以
f
=
g
f=g
f=g.
在
λ
\lambda
λ演算中也有类似情形.两个看起来不同的函数声明,对同样的输入会得到同样的输出.则我们称这两个表达式等价.
比如考虑
f
=
λ
a
.
(
λ
b
.
b
)
a
f=\lambda a.(\lambda b.b) a
f=λa.(λb.b)a和
g
=
λ
z
.
z
g=\lambda z. z
g=λz.z,则可以验证对任意符号x,都有
(
f
x
)
=
x
(f\ x)=x
(f x)=x,
(
g
x
)
=
x
(g\ x)=x
(g x)=x,所以
f
f
f和
g
g
g等价,即他俩对应的是同一个数学函数.有一个重要结论,如果两个函数声明表达式
M
M
M和
N
N
N等价, 那么对某个含
M
M
M的新表达式
P
P
P,把
M
M
M全部替换为
N
N
N,则新表达式和原表达式仍然等价,即对同样的实参,求值之后的结果相同.
λ
\lambda
λ 表达式等价的概念在下一个笔记中会用到.