λ 演算学习

最近为了学习Lambda表达式,特地学习了λ演算,函数式编程教程等许多文章,网络上的资料还是蛮多的,收获颇深,特此做了一个小总结


λ 演算(英语:lambda calculus,λ-calculus)

lambda演算是由Alonzo Church设计的一个正式的数学系统,用于探讨函数,函数应用和递归(recursion)

1.定义

形式化地,我们从一个标识符(identifier)的可数无穷集合开始,比如{a, b, c, ..., x, y, z, x1, x2, ...},则所有的lambda表达式可以通过下述以BNF范式表达的上下文无关文法描述:

  1. <表达式> ::= <标识符>       
  2. <表达式> ::= (λ<标识符>.<表达式>)
  3. <表达式> ::= (<表达式> <表达式>) 

前两条规则用来生成函数,而第三条描述了函数是如何作用在参数上的在λ演算中,函数是通过λ表达式匿名定义的。例如:

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

并且只要λ表达式操作符操作符被绑定到它后面的整个表达式

       例如:

  1. 表达式λx.(x+1),可以简写为λx.x+1
  2. 表达式 (λx.x x)(λy.y),可以简写成λ(x.x x) λy.y 
  3. 表达式 λx. (λy. ( x+y)),可以简写为λx. λy. ( x+y)

类似λx.(x y)这样的lambda表达式,是未定义一个函数的,因为变量y的出现是自由的,即它并没有被绑定到表达式中的任何一个λ上,所以一个lambda表达式的自由变量的集合是通过下述规则定义的:

  1. 在表达式V中,V是变量,则这个表达式里自由变量的集合只有V,比如表达式x,则自由变量的集合就是x
  2. 在表达式λV.E中(V是变量,E是另一个表达式),自由变量的集合是E中自由变量的集合减去变量V。因而,E中那些V被称为绑定在λ上。
  3. 在表达式 (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是同一个函数,修改了变量,不会改变表达式的含义,尽管如此,这条规则并非像它看起来这么简单,关于被绑定的变量能否由另一个替换有一系列的限制。而形式化的描述就是:若VW均为变量,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))
    以此类推。直观地说,lambda 演算中的数字 n 就是一个把函数 f 作为参数并以 f 的 n 次幂为返回值的函数。换句话说,Church 整数是一个高阶函数 -- 以单一参数函数 f 为参数,返回另一个单一参数的函数。
(注意在 Church 原来的 lambda 演算中,lambda 表达式的形式参数在函数体中至少出现一次,这使得我们无法像上面那样定义 0) 在 Church 整数定义的基础上,我们可以定义一个后继函数,它以 n 为参数,返回 n + 1:
posted @ 2017-10-26 10:16  哈久克路  阅读(3860)  评论(1编辑  收藏  举报