λ演算

作者: maxkibble | 来源:发表于2017-03-14 03:40 被阅读121次

λ演算是一个具有与图灵机相同计算能力的形式系统,由图灵同学的老师Alonzo Church于20世纪30年代提出。


定义

对一个形式系统,我们的套路就是分析它的语法和语义。λ演算被很多人吹捧上天的优点就是它的语法和语义都极度简单,其语法如下:

t := x       (variable)
     λx.t    (abstraction)
     t t     (application)

类似谓词逻辑,这里给出绑定和自由变量的定义:

绑定: λx.t中,在t里出现的x称作被绑定
自由变量: x如果没有被绑定,就是一个自由变量

语义规则只有两条:

α-conversion: 可以一个abstraction中所有的绑定变量用另一种符号表示
例子: (λx.t[x]) → (λy.t[y])

β-reduction: 可以把一个abstraction中所有绑定出现的变量替换成参数
例子: ((λx.t) y) → (t[x:=y])

至此,λ演算的定义结束。


求值

研究语义时,我们需要关心一个语言是否满足confluence,termination两条重要性质。前者是指同一个式子在不同的推导下会得到同样的值;后者是指推导过程不会出现死循环。

为了描述方便,我们定义(λx.t) y这样的形式叫一个redex。

对于λ演算,共有4种求值策略:

  • full beta-reduction: 每一步都可以随机选取一个redex进行化简
  • normal-order: 一个λ表达式可以用一棵树来表示,每次只能选择树最接近根节点的redex进行化简(如果同一层有多个redex,从最左边的开始)
  • call-by-name: 很多同义词,惰性求值,正则序都是
  • call-by-value:应用序,每次函数传参时,一定要先求出参数值

这里偷懒了,想形式化定义这4中求值方法的朋友可以参见TAPL这本书的习题5.3.6。

λ演算在full beta-reduction下是满足confluence性质的,具体证明可以参考Church-Rosser属性。对于termination,我们是很容易写出一个死循环的λ表达式的。


证明图灵完备性

用λ演算逐步构造true,false,分支结构,自然数,加法,乘法,减法,不动点,递归等概念是很有趣的一个过程,强烈推荐初学λ演算的朋友自己推导一遍。可以参考神奇的λ演算

这篇文章在不动点那一节介绍了著名的Y-combinator,并且展示了它是如何帮助我们找到任意表达式的不动点的。但是在上一节介绍的call-by-value求值策略下,Y-combinator却是会带来死循环的递归构造方法。我们看一个例子:

[定义] Y-combinator: λf.(λx.f(x x)) (λx.f(x x))
[性质] Y g = g (Y g)
[例子] g = λf.λn. isZero n then 0 else plus n (f (pred n))
      sum = Y g
      sum 3 = Y g 3                                   (1)
            = g (Y g) 3                               (2)
            = g ((λx.g (x x)) (λx.g (x x))) 3         (3)
            ... ...

死循环的解释如下:在(2)步时,(Y g)和3都是g的参数,需要先求出(Y g)的值,把g带入Y之后,还需对(x x)优先求值,这样的操作会无限循环下去。因此在这里介绍一种新的Fixed-point Combinator。

[定义] Fixed-point Combinator:  λf. (λx. f (λy. x x y)) (λx. f (λy. x x y))
[性质] Fix g = g (Fix g)
[例子] g = λf.λn. isZero n then 0 else plus n (f (pred n))
      sum = Fix g
      sum 3 = Fix g 3
            = g (Fix g) 3
            = g ((λx. g (λy. x x y)) (λx.g (λy. x x y))) 3     (*)
            = plus 3 (Fix g 2)
            = plus 3 (plus 2 (Fix g 1))
            = plus 3 (plus 2 (plus 1 0))
            = 6

在Fix-point Combinator的推导中,在(*)步骤处,因为没有application,满足call-by-value继续向下进行的条件,所以可以继续推导下去。

相关文章

  • 第五讲 关系模型之关系演算

    关系演算 元组演算 元组演算的运用 简单运用元组演算公式 存在量词与全程量词 元组演算的等价性变化 四个典型示例 ...

  • λ演算

    λ演算是一个具有与图灵机相同计算能力的形式系统,由图灵同学的老师Alonzo Church于20世纪30年代提出。...

  • 演算

    大家信誓旦旦都说起负能量 纷纷 我便也信以为然 这时它已跑出了它的祖国 物理学和天文学的边界 它跑出了刚开学的高三...

  • Lambda演算

    一个前人写的有关Lambda演算的项目,里面包含了一个完整的关于Lambda演算的起源和讲解的pdf文件,还有能在...

  • 数据库Mooc笔记(6)关系域演算

    关系域演算 定义 关系域演算公式构造示例 关系演算的安全性 不产生无线关系和无穷验证的运算就是安全的。

  • 数据库Mooc笔记(5)关系元组演算

    关系元组演算 概述 关系元组演算公式的形式 关系元组演算公式的完整定义 原子公式及与与或非之理解与运用 存在量词与...

  • 推背图

    他善于演算 善于演算那些真言 谁在背后一推 把沉醉的人推回人间

  • 绝de阿七:回首青春往事,痛而无憾

    ​他在演算纸上密密麻麻地演算着 而他的人生也像这张演算纸 被烦恼密密麻麻的压着..... 拥有一个端点的是射线 拥...

  • 检查演算本

    验算是学习过程中的一种特有的行为习惯,它在很大程度上能体现出学生学习的思考过程与方法,因为它满载着我们分析问题、思...

  • 神奇的λ演算

    现在时兴讲函数式编程,弄得如果不会写两句λ表达式你都不好意思跟人说自己是敲代码的。所以我也就趁着这阵风头,琢磨琢磨...

网友评论

    本文标题:λ演算

    本文链接:https://www.haomeiwen.com/subject/mhlcnttx.html