λ演算概述

λ演算(Lambda-calculus)是一套用于研究函数定义、应用和递归的形式系统。它由阿兰佐·丘奇(Alonzo
Church)和史蒂芬·科尔·克林(Stephen Cole Kleene)在20世纪三十年代引入。

丘奇运用λ演算在1936年给出“判定性问题”(Entscheidungs
problem)的一个否定的答案。关于两个λ演算表达式是否等价的命题无法通过一个通用的算法来解决,这是不可判定性能够证明的头一个问题,甚至还在停机问题之先。

λ演算对函数式编程有巨大的影响,特别是Lisp 语言。

λ演算被称为最小的通用编程语言。λ演算可以用来清晰地定义什么是一个可计算函数。它包括一条变换规则(变量替换)和一条函数定义方式。λ演算之通用在于,任何一个可计算函数都能用这种形式来表达和求值。

因而,λ演算是等价于图灵机的。尽管如此,λ演算强调的是变换规则的运用,而非实现它们的具体机器,可以认为这是一种更接近于软件而非硬件的方式。

语法规则

任何λ表达式都可以通过下述三条BNF范式描述:

范式1、<expr> ::= <identifier>

范式2、<expr> ::= (λ <identifier> . <expr>)

范式3、<expr> ::= (<expr> <expr>)

范式1和范式2描述了“函数定义”,而范式3描述了“函数应用”。

上述BNF范式中的圆括号在不会产生歧义的情况下可以省略。如下假定保证了省略圆括号不会产生歧义:

假定1、函数的应用是左结合的(即从左到右进行计算)

假定2、λ操作符要绑定到它后面的整个表达式

例如, ((λ x. (x x)) (λ y. y)) 可以简写成
(λ x. x x) λ y. y。

在λ演算中,每个表达式都代表一个只有单一参数的函数,这个函数的参数本身也是一个只有单一参数的函数,同时,函数的值是又一个只有单一参数的函数。

函数定义

在λ演算中,函数是通过λ表达式匿名定义的,这个表达式说明了此函数将对其参数进行什么操作。例如:

f (x) = x + 2 在λ演算中表示为λ x. x +
2

因为λ x. x + 2表示了一个函数,所以我们通常称λ x. x +
2
是一个函数。

下面的表格是对这个函数的结构的描述:












lambda

parameter

dot

operation

λ

x

.

x + 2

从表格可以看出,表达式λ x. x + 2
定义了一个函数,这个函数对其参数x进行了加二操作。

值得注意的是,如果一个λ表达式定义了一个函数,尽管这个函数的参数没有被赋值,这个表达式也是有值的,这个值就是这个表达式本身。

也就是说,在λ演算中,的概念并不仅仅说一个数字是一个值,一个表达式也可以是一个值。这也是为什么说λ演算对函数式编程语言有有巨大的影响的原因。在函数式编程语言里,函数也可以作为参数传递给其他函数的理念就是来自于此。

函数应用

函数定义表达了函数对其参数进行什么操作。而给函数指定一个实际的参数,将会触发函数对这个参数进行实际的操作,这个过程成为函数应用

以函数 λ x. x + 2 为例,如果给参数 x
指定一个值3,那么将会得到结果5。这个过程称为:“将函数 λ x. x +
2
应用在参数3上”。

而写法上,就如同“范式3”,像下面这样:

(λ x. x + 2) 3

上面在描述函数应用的时候,仅仅讨论了将函数应用在数字上的情况,例如,“将函数 λ x. x + 2
应用在参数3上”这种情况:(λ x. x + 2) 3

如果将函数λ x. x + 2 应用在一个函数(比如 λ y. y +
1
)上呢?显然,只要把3 替换成 λ y. y + 1 就可以了:

(λ x. x + 2) (λ y. y + 1)

这得到的仍旧是一个函数,只不过这个函数的参数也是一个函数。下面讨论把这个新得到的函数再应用到数字3上:

(λ x. x + 2) (λ y. y + 1) 3

根据λ演算的两条假定,整个表达式的演算顺序是下面这样的:

1)  (λ y. y +
1)
应用到数字3上,得到4

2)  (λ x. x +
2)
应用到4上,得到6

注意,虽然λ演算的“假定1”规定函数应用是左结合的,但是“假定2”限制了“λ操作符要绑定到它后面的整个表达式上”。

显然“(λ y. y + 1) 3”是一个整体,所以要先计算出“(λ y. y
+ 1) 3
”的值,再把(λ x. x + 2)应用到计算出的值上。

高阶函数定义和应用

上面对函数的讨论中,只涉及了单一参数函数。

那么,怎样定义一个有多个参数的函数呢?前面讲过,在λ演算体系中,任何函数都只允许有一个参数,有多个参数的函数是不合法的。

例如,f(x, y) = x +
y
是一个有两个参数的函数,你无法写出一个类似下面这样的λ表达式来表示这个函数:λ x, y. x +
y

因为根据“范式1范式2范式3”,这种写法是错误的。但是范式允许你写出如下的表达式:

λ x. λ y. x + y

这条表达式的涵义是:参数为x的函数,对参数x进行了“λ
y. x + y
”操作。

如果将函数λ x. λ y. x +
y
应用到数字23上时,写法如下:

(λ x. λ y. x + y) 2 3

这个表达式实际是按照如下顺序进行了一系列计算:

1)  (λ x. λ y. x +
y)
应用到2上,得到λ y. 2 + y

2)  将得到的λ y. 2 +
y
应用到3上,得到5

从上面这两条计算过程来看,λ x. λ y. x + y实际应该写为λ x.
(λ y. x +
y)
,也就是说,在这个表达式应用到两个参数上的过程中,实际上是先应用到第一个参数上,得到一个中间结果,这个中间结果也是一个函数,再把这个新的函数应用到第二个参数上。

函数的值又是一个函数,在数学上,前一个函数被称为高阶函数。而上面的论述,阐明了λ演算体系中,对高阶函数的定义。

(λ x. λ y. x + y) 2
3
这个表达式的计算顺序似乎有违λ表达式范式和假定。“2
3
”在符合“范式3”,它理应是一个整体。那为什么不是把“(λ x. λ y. x +
y)
”直接应用到“2
3
”上,而是要先应用到2上,再应用到3上呢?

在我能查到的λ演算相关的文献中,其观点基本都是把23分开不作为一个整体对待的。我是这样认为的,“2
3
”虽然在语法上不违背“范式3”,但是它在语义上是不合理的,没有实际意义,所以要分开为两部分。

BNF对语法的表述较为完备,但是对语义的表述则不够好。所以在理解λ演算的过程中,要从表达式的意义上检查其正确性,而不能硬套范式和假定。

时间: 2024-11-10 19:03:50

λ演算概述的相关文章

刨根问底:ext3/ext4文件系统最大空间及单个文件大小演算法则

从ext3和ext4文件系统来窥探空间和文件大小的演算法则 学习操作系统就不得不研究磁盘以及磁盘文件系统,磁盘是底层物理设备,而文件系统则是管理磁盘的上层工具,文件系统规划了磁盘存放数据的格式,确定了一个操作系统能够支持多大的磁盘空间,每个分区能够支持多大的数据空间,以及每个文件所能支持的大小.通常对系统管理员而言,最需要的知道的就是最大磁盘空间,最大分区空间以及最大文件的大小.本论题只讨论这三种大小到底是怎么算出来的,而不是死记硬背.知道了原理,以后不管遇到什么文件系统,都会有章可循,至少知道

第一课 MongoDB 概述与安装

1.课程大纲 本次课主要介绍 MongoDB 背景知识和 MongoDB 的安装与配置,让大家对 MongoDB 有一个初认识. 其基本的知识点包含: NoSQL数据库概述 MongoDB 数据库简单介绍 Linux 下安装 MongoDB 数据库 Mac 和 Windows 下安装 MongoDB 数据库 2.课程简单介绍 MongoDB是由MongoDB.inc研发的一款NoSQL类型的文档型数据库,MonogoDB名字来源于英文单词humongous,这个单词的意思是巨大无比.暗喻Mong

java面向对象:面向对象的思想和概述

1:面向对象思想 面向对象是基于面向过程的编程思想. 面向过程:强调的是每一个功能的步骤 面向对象:强调的是对象,然后由对象去调用功能 2:面向对象的思想特点 A:是一种更符合我们思想习惯的思想 B:可以将复杂的事情简单化 C:将我们从执行者变成了指挥者 开发,设计,特征 面向对象开发 就是不断的创建对象,使用对象,指挥对象做事情. 面向对象设计 其实就是在管理和维护对象之间的关系. 面向对象特征 封装(encapsulation) 继承(inheritance) 多态(polymorphism

java基础总结——概述

  一.java语言概述 来自维基百科 https://zh.wikipedia.org/wiki/Java Java是一种计算机编程语言,拥有跨平台.面向对象.泛型编程的特性,广泛应用于企业级Web应用开发和移动应用开发. 任职于太阳微系统的詹姆斯·高斯林等人于1990年代初开发Java语言的雏形,最初被命名为Oak,目标设置在家用电器等小型系统的程序语言,应用在电视机.电话.闹钟.烤面包机等家用电器的控制和通信.由于这些智能化家电的市场需求没有预期的高,Sun公司放弃了该项计划.随着1990

译-BMC Remedy Action Request System权限控制概述

原文链接:Access control overview 说明: BMC Remedy Action Request System是BMC ITSM产品平台,简称AR 或者Remedy,可实现基于ITIL标准的整个IT管理流程的实施定制.该平台可实现多种权限级别的管理,包括人员.组.角色,以及表.字段.行级别等.本文可以用作其他对权限要求比较精细的系统参考. 为了便于理解,部分名词翻译如下: Server:服务器Form (or table):表单Field (or column):字段Acti

Aircrack-ng: (1) 概述

作者:枫雪庭 出处:http://www.cnblogs.com/FengXueTing-px/ 欢迎转载 目录 一.概述 二.工具与命令介绍 Linux命令 (1) ifconfig (2) macchanger (3) iwconfig (4) iwlist Aircrack-ng 工具 (1) airmon-ng (2) airodump-ng (3) aireplay-ng (4) aircrack-ng 其他Aircrack-ng工具 一.概述 Aircrack-ng是一款用于破解无线

NHibernate框架与BLL+DAL+Model+Controller+UI 多层架构十分相似--『Spring.NET+NHibernate+泛型』概述、知识准备及介绍(一)

原文://http://blog.csdn.net/wb09100310/article/details/47271555 1. 概述 搭建了Spring.NET+NHibernate的一个数据查询系统.之前没用过这两个框架,也算是先学现买,在做完设计之 后花了一周搭建成功了.其中,还加上了我的一些改进思想,把DAO和BLL之中相似且常用的增删改查通过泛型T抽象到了DAO和BLL的父类中,其DAO 和BLL子类只需继承父类就拥有了这些方法.和之前的一个数据库表(视图)对应一个实体,一个实体对应一

排序算法--概述和参考

1 概述 排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存. 我们这里说说八大排序就是内部排序. 当n较大,则应采用时间复杂度为O(nlog2n)的排序方法:快速排序.堆排序或归并排序序. 快速排序:是目前基于比较的内部排序中被认为是最好的方法,当待排序的关键字是随机分布时,快速排序的平均时间最短: 2 参考 http://blog.csdn.net/hguisu/article/details/77

Css3之高级-7 Css动画(概述、关键帧、动画属性)

一.动画概述 动画概念 - 过渡属性只能模拟动画效果 - animation 属性可以制作类似 Flash 动画 - 通过关键帧控制动画的每一步 - 使元素从一种样式逐渐变化为另一种样式 - 实现复杂的动画效果 - 浏览器兼容性 - 最新版本支持良好 - Chrome 和 Safari 需要前缀 -webkit- - FireFox 需要前缀 -moz- - Opera 需要前缀 -o- 动画示例 - 声明动画 - 创建一个已命名的动画 - 使用 @keyframes 声明动画的关键帧 - 为元