为什么在lambda演算中使函数匿名很重要?


19

我正在看Jim Weirich的演讲,标题为“ 函数式编程历险记 ”。在本讲座中,他介绍了Y组合器的概念,该概念实质上是为高阶函数找到固定点的。

正如他提到的那样,动机之一是能够使用Lambda微积分来表达递归函数,从而保持Church的理论(可以使用Lambda微积分来计算任何可有效计算的理论)。

问题在于函数不能简单地这样调用自身,因为lambda演算不允许使用命名函数,即

n(x,y)=x+y

不能使用名称“ ”,必须匿名定义:n

(x,y)x+y

为什么lambda演算具有未命名的函数很重要?如果命名函数违反了什么原则?还是我只是误解了吉姆的视频?


4
这听起来根本不重要。您可以将分配给变量,然后为函数指定名称。Ñ(x,t)x+yn
Yuval Filmus 2014年

@YuvalFilmus是的,您可以将名称绑定到函数。我认为真正的问题是困惑,这是为什么在lambda演算中,函数不能用这样的名称本身进行调用?为什么我们需要像Y运算符这样的技术来执行递归函数?希望下面的回答对您有所帮助。
2014年

1
@ Jerry101缺乏自我应用的历史原因是 -calculus旨在成为数学的基础,而自我应用的能力使这种基础立即变得不一致。因此,这种明显的无能(我们现在知道可以解决)是 -calculus 的设计功能。λλλ
Martin Berger 2014年

@MartinBerger请多说。原因与我的答案不一致?还是出于其他原因?
2014年

1
@ Jerry101在这样的数学基础上可以证明0 = 1的意义上是不一致的。在Kleene和Rosser显示纯的,未类型化的演算的不一致之后,简单类型演算被开发为一种替代方法,不允许我们定义诸如的定点组合器。但是,如果将递归添加到简单类型的 -calculus中,则再次变得不一致,因为每种类型都由一个非终止程序占用。λ ÿ λλλYλ
Martin Berger 2014年

Answers:


24

关于这个问题的主要定理是由16世纪末的英国数学家威廉·莎士比亚William Shakespeare)提出的。他的有关该主题的最著名论文名为“ 罗密欧与朱丽叶 ”(Romeo and Juliet),于1597年发表,尽管这项研究工作是在几年前进行的,但受到了亚瑟·布鲁克和威廉·画家的启发。

他的主要结果在第二幕中阐明场景II著名的定理

名字叫什么?我们称之为玫瑰的
名字,闻起来会很甜;

该定理可以直观地理解为“名称无助于意义”。

本文的大部分内容是一个补充定理的例子,表明尽管名称没有任何意义,但它们却是无穷无尽的问题的根源。

正如莎士比亚所指出的,名称可以在不改变含义被改变,这是后来被称为操作 γ变换α邱奇和他的追随者。结果,确定名称表示的内容不一定简单。这引起了许多问题,例如,开发了一个环境,其中指定了名称-含义关联,并且在尝试确定与名称关联的含义时会知道当前环境是什么的规则。这使计算机科学家感到困惑了一段时间,从而导致了诸如臭名昭著的Funarg问题之类的技术难题。。在某些流行的编程语言中,环境仍然是一个问题,但通常更具体地认为它在物理上是不安全的,几乎与莎士比亚在其论文中提出的示例一样致命。

这个问题也与形式语言理论中提出的问题非常接近,即必须将字母和形式系统定义为同构,以便强调字母符号是抽象实体,而与它们如何“实现”无关。一些集合中的元素。

莎士比亚的这一重大成果也表明,科学然后从魔术和宗教中脱颖而出,其中存在或意义可能具有真实名称

所有这一切的结论是,对于理论工作而言,即使对于实际工作和日常生活而言可能更简单,但不要被名称所困扰通常更为方便。但是请记住,并不是每个人都叫妈妈是你的母亲。

注意
这个问题最近由20世纪的美国逻辑学家 Gertrude Stein提出。但是,她的数学家同事们仍在思考她的主要定理的确切技术含义:

玫瑰是玫瑰,是玫瑰是玫瑰。

于1913年发表在一篇名为“圣艾米丽”的短文中。


3
附加说明:在最近的几十年中,(计算机科学领域)“ rose”已被“ foobar”(及其部分)取代,作为与其他名称一样好的名称的典型示例。这种偏好显然是由美国铁路工程师引入的。
FrankW 2014年

就是说,常用概念的规范名称对于有效沟通很重要。
拉斐尔

1
@Raphael Agreed,但我将其归入日常生活类别。我们如何知道真正规范的界限?仍然,当我看到学生们采用所有术语,符号和定义(甚至某些定理的表述方式)来获得上帝赋予的不变真理时,我仍然经常感到担忧。即使在这里,在SE上,学生也会提出问题,却没有意识到我们可能不知道他们的符号或他们在课堂上使用的定义。真实姓名的魔力并不容易消失。
2014年

10

λλπνx.Pπ

λλλ

letf=MinN(λf.N)Mλ


1
我认为OP希望能够命名函数,而不是禁止匿名函数。这就是说,我认为任何关于匿名函数需求的λ微积分要求在Lisp / Scheme或ML之类的语言中也会显示出来。就Lisp / Scheme而言,评估者的元循环性应该可以根据需要创建新名称,尽管我不确定我是否会希望在正式系统中采用这种方式。当递归允许本地重用已经使用的名称时,使用无数个函数不一定是问题。
2014年

λλ

最后一行应该读为(lambda f。N)M吗?
的人乔

@JoethePerson是的,发现得很好。固定。谢谢。
马丁·伯杰

4

我认为这个想法是不必要的。任何看起来需要名称的内容都可以写为匿名函数。

您可以想到lambda演算,例如汇编语言。在有关汇编的演讲中,有人可能会说:“汇编语言中没有面向对象的继承树。” 然后,您可能会想出一种实现继承树的聪明方法,但这并不是重点。关键是在物理计算机编程的最基本级别上不需要继承树。

在lambda演算中,重点在于,在最基本的级别描述算法不需要名称。


4

到目前为止,我在这里很喜欢这3个答案-尤其是@babou的Shakespearen分析-但他们并没有阐明我认为问题的实质。

只要将函数应用于函数,λ演算就会将名称绑定到函数。问题不在于缺乏名称。

“问题是一个函数不能简单地调用自身”。

(在纯Lisp中,名称->函数绑定不在函数主体的范围内。对于以其名称进行调用的函数,该函数必须引用引用该函数的环境。Pure Lisp没有循环数据结构。不纯Lisp会通过更改函数所引用的环境来实现此功能。)

正如@MartinBerger所指出的那样,λ演算不让名称自行调用的历史原因是试图在使用λ演算作为包括演绎逻辑在内的数学基础时排除Curry的悖论。这是行不通的,因为即使没有自引用,Y组合器之类的技术也允许递归。

从维基百科:

如果我们可以定义函数的r = (λ.x x x ⇒ y)r r = (r r ⇒ y)

如果r r为true,y则为true。如果r r为假,r r ⇒ y则为真,这是一个矛盾。所以y是真实的,如y可以是任何声明,声明任何可证明是正确的。

r r是一个非终止计算。逻辑r r是不存在的值的表达式。


λ.x xxxxx

@RohanPrabhu λ.x x x转换为Lisp (lambda (x) (x x))和JavaScript function (x) {return x(x);}x⇒y意思是x implies y,与...大致相同(NOT x) OR y。参见en.wikipedia.org/wiki/Lambda_calculus
Jerry101

感谢您回答这个令人尴尬的菜鸟问题!
Rohan Prabhu 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.