λ 演算学习
最近为了学习Lambda表达式,特地学习了λ演算,函数式编程教程等许多文章,网络上的资料还是蛮多的,收获颇深,特此做了一个小总结
λ 演算(英语:lambda calculus,λ-calculus)
lambda演算是由Alonzo Church设计的一个正式的数学系统,用于探讨函数,函数应用和递归(recursion)
1.定义
形式化地,我们从一个标识符(identifier)的可数无穷集合开始,比如{a, b, c, ..., x, y, z, x1, x2, ...},则所有的lambda表达式可以通过下述以BNF范式表达的上下文无关文法描述:
- <表达式> ::= <标识符>
- <表达式> ::= (λ<标识符>.<表达式>)
- <表达式> ::= (<表达式> <表达式>)
前两条规则用来生成函数,而第三条描述了函数是如何作用在参数上的在λ演算中,函数是通过λ表达式匿名定义的。例如:
f (x) = x + 2 在λ演算中表示为λ x. x + 2
注意,如果一个λ表达式定义了一个函数,尽管这个函数的参数没有被赋值,这个表达式也是有值的,这个值就是这个表达式本身,在λ演算中,值的概念并不仅仅说一个数字是一个值,一个表达式也可以是一个值.
λ演算只有三类表达式,而每条表达式就代表一个函数,而函数只有一个参数,也就是单参,并且返回一个值,函数是通过λ表达式匿名地定义的,比如函数f(x)=x+1,对应的λ表达式为λx.(x + 1)
通常对于括号,如果不产生歧义的时候是可以被省略的,因为函数的"作用"是左结合的
比如 (λx.x)(λx.1-x),依次代 (λx.1-x)进函数(λx.x),就是λx.1-x
并且只要λ表达式操作符操作符被绑定到它后面的整个表达式
例如:
- 表达式λx.(x+1),可以简写为λx.x+1
- 表达式 (λx.x x)(λy.y),可以简写成λ(x.x x) λy.y
- 表达式 λx. (λy. ( x+y)),可以简写为λx. λy. ( x+y)
类似λx.(x y)这样的lambda表达式,是未定义一个函数的,因为变量y的出现是自由的,即它并没有被绑定到表达式中的任何一个λ上,所以一个lambda表达式的自由变量的集合是通过下述规则定义的:
- 在表达式V中,V是变量,则这个表达式里自由变量的集合只有V,比如表达式x,则自由变量的集合就是x
- 在表达式λV.E中(V是变量,E是另一个表达式),自由变量的集合是E中自由变量的集合减去变量V。因而,E中那些V被称为绑定在λ上。
- 在表达式 (E E')中,自由变量的集合是E和E'中自由变量集合的并集。
例,对于表达式λx.x(我们将第一个x视作变量,第二个x视作表达式),其中表达式x中,由1,它的自由变量集合是x,又由2,表达式λx.x的自由变量的集合是表达式x的自由变量集合减去变量x。所以对于表达式λx.x,它的自由变量集合是空。
例,对于表达式λx.x x由形式化描述的第3点,我们把它看作((λx.x)(x)),(λx.x)和(x)分别为表达式,由上一例知道(λx.x)的自由变量集合为空,表达式(x)的变量集合为变量x,所以对于λx.x x,它的自由变量集合为x与空的并,即x,
自由变量的集合,之后会进行讨论
λ演算有两个最基本的概念"代入"和"置换","代入"就是α-变换,""置换"就是"Beta规约"
2.α-变换
Alpha-变换规则被绑定的变量名称是不重要的,比如说λx.x和λy.y是同一个函数,修改了变量,不会改变表达式的含义,尽管如此,这条规则并非像它看起来这么简单,关于被绑定的变量能否由另一个替换有一系列的限制。而形式化的描述就是:若V与W均为变量,E是一个λ表达式,则E[V:=W]是指把表达式E中所有的V的自由出现都替换为W,比如λx.(λx.x) x这样的表达式和λy.(λx.x) y是一样的,
3.β-归约
Beta规约是非常有趣的,它表达的是函数作用的概念,比如λx.(x+1) 1,即这个λ表达式x+1作用与1上,结果为λx.(x+1)=1+1=2,其中表达式为x+1,而标识符就是x
形式化陈述了若所有的E'的自由出现在E [V:=E']中仍然是自由的情况下,有
- ((λV.E) E') == E [V:=E']
成立,对上述等价关系的一个更具操作性的定义可以这样获得:不允许任何beta归约的lambda表达式被称为Beta范式。因为并非所有的lambda表达式都存在与之等价的范式,若存在,则对于相同的形式参数命名而言是唯一只允许从左至右来应用规则
4.η-变换
eta-变换,第三条规则,来形成一个等价关系,η-变换表达了“外延性”(extensionality)的概念,两个函数被认为是相等的“当且仅当”对于所有的参数,它们都给出同样的结果,
λx.fx f,只要 x 不是 f 中的自由出现。
5.λ演算中的运算
在λ演算中有许多的方式可以定义自然数,但是最常见还是Church整数,以下是它们的定义
- 0 = λ f. λ x. x
- 1 = λ f. λ x. f x
- 2 = λ f. λ x. f (f x)
- 3 = λ f. λ x. f (f (f x))