Lambda微积分纯粹是语法吗?


29

我已经阅读了几周有关Lambda演算的信息,但是我还没有看到与现有数学函数有实质性区别的任何东西,我想知道这是否只是一种记号问题,或者是否有任何新的含义由lambda演算公理创建的属性或规则不适用于每个数学函数。因此,例如,我读过:

“可以有匿名函数”:Lambda函数不是匿名函数,它们全称为lambda。如果名称不重要,则可以用数学符号将相同的变量用于不同的功能。例如,Galois Connection中的两个函数通常都被称为*。

“函数可以接受函数作为输入”:可以使用普通函数来完成此操作。

“功能是黑匣子”:只是输入和输出也是数学函数的有效描述...

这似乎是一个讨论或自以为是的问题,但我认为应该对这个问题有一个“正确”的答案。我想知道lambda演算是否只是用于数学函数的符号或语法约定,或者lambda和普通函数之间是否存在实质性或语义上的差异。


2
我不想对此做出完整的回答,但是函数不能接受函数作为输入。我可以写f(g(0)),但是我不能写f(g,0)。后者称为“功能”,并要求使用不同的规则。
Cort Ammon-恢复莫妮卡

@CortAmmon功能是函数。函数只是一组对(尽管严格来说,它是一个三元组(D,R,G),其中D是域R是范围,G是图(对集),这是我遇到的另一个小问题接受的答案,但这不在这里或那里)。因此,如果D是一组函数,并且在第一个元素是D中的一个函数的情况下使用对,那么您就有一个函数。检查维基百科:“功能是映射[功能] ...”
Neil

即所有功能都是功能,并非所有功能都是功能。但是所有适用于函数的规则都适用于函数
Neil

Answers:


63

具有讽刺意味的是,该标题是正确的,但并非以您似乎要说的方式出现,即“ lambda演算只是一种符号约定”是不正确的。

Lambda术语不是函数1。它们是语法,即页面上的符号集合。我们有处理这些符号集合的规则,最重要的是降低了beta。你可以有多个不同的是lambda项对应相同的功能。2

我将直接解决您的问题。

首先,lambda不是被重用的名称。这不仅会造成极大的混乱,而且我们不会编写(或),如果是函数的名称,我们将这样做,就像我们写。在我们可以将(如果由lambda项定义)替换为lambda项,产生类似含义,这意味着是可以表示函数的表达式,而不是声明一个函数的声明(名为λ(x)(λ x)λf(x)f(x)f(λy.y)(x)(λy.y)λ或其他任何内容)。无论如何,当我们超载术语/符号时,(希望如此)可以通过上下文消除歧义,对于lambda术语肯定不是这种情况。

您的下一点是可以的,但有点无关紧要。这不是具有团队Lambda条款和团队职能的竞赛,只有一个可以获胜。lambda术语的主要应用是研究和理解某些种类的功能。多项式不是函数,尽管我们经常草率地识别它们。学习多项式并不意味着人们认为所有函数都应该是多项式,也不是多项式必须“做”一些“新的”事才值得研究的情况。

集合理论函数不是黑盒子,尽管它们完全由它们的输入输出关系定义。(从字面上看它们它们的输入-输出关系。)Lambda术语也不是黑盒,也不由它们的输入-输出关系定义。如前所述,您可以使用不同的lambda术语来产生相同的输入-输出关系。这也强调了一个事实,即lambda术语虽然可以诱发功能,但它们不是功能。2

实际上,多项式和lambda项之间的类推非常接近,我怀疑您可能不理解多项式与其表示的函数之间的区别,因此我将详细说明。3通常,当引入多项式时,通常使用实系数,它们被视为特定类型的实函数。现在考虑线性反馈移位寄存器(LFSR)的理论。它主要是的(单变量)多项式的理论,但是如果我们将其视为函数,则最多有这样的函数。但是,在有无限多个多项式。4F2 F2F24F2看到这种情况的一种方法是,我们可以将这些多项式解释为函数以外的东西,实际上任何代数都可以。对于LFSR,我们通常将多项式解释为对比特流的运算,如果需要,可以将其表示为函数,尽管绝大部分此类功能都不在LFSR的解释图像中。F2F2F22N2N

这也适用于lambda术语,我们可以将它们都解释为函数以外的事物。与通常不计其数的无限功能集相比,它们都是更易于处理的对象。它们都比任意函数具有更多的计算能力。我可以编写一个程序来处理多项式(具有至少可以计算得出的系数)和lambda项。实际上,无类型的lambda项是可计算函数的原始模型之一。通常对这种更具符号/语法,计算/计算角度的观点比对lambda演算的更多语义解释更为重视,尤其是对于无类型的lambda演算。已输入Lambda术语是更易于管理的事物,通常(但并非总是)可以轻松地解释为集合理论函数,但是与非类型的Lambda演算相比,除了函数之外,Lambda术语通常还可以解释为更广泛的事物。他们也有自己的丰富的句法理论和与逻辑的深厚联系

1该问题可能会以其他方式出现。也许您对功能是什么有误解。

2这实际上并不是那么简单。对于未类型化的 lambda演算,天真地将任意lambda项解释为集合理论函数实际上没有任何意义。当您尝试阐明解释的范围时,您可以开始看到这一点。如果我将lambda项解释为集合的元素,我也希望能够将其解释为上的函数,并将其解释为的函数,因为我想将应用程序解释为函数应用程序。您最终得到(或对此的弱化),这仅对单例集成立。我们需要的无类型lambda演算是一个反身对象DDDDDD,对于集合的类别,没有非平凡的反身对象。对于输入的 lambda而言,这个故事有很多不同,但仍然可以说是不平凡的。

3如果您清楚知道这种区别,则此类比应该可以提供很多信息。

4对于特征0的字段(例如复数,实数,有理数或整数),不会发生此问题,因此,这种区分虽然仍然存在,但没有那么尖锐。


8
我不得不说这是一个了不起的回应。确实为我清除了一些长期的误会。谢谢!
6

4
希望我能对此做出详细回应!我想跟进很多事情。总体而言,尽管这对我非常有用,而且显然对其他一些人也非常有用,所以感谢您提供全面且经过深思熟虑的答案。
尼尔·

1
在这里,我只讨论一个问题,那就是您声称多项式不必“做”“新”就值得研究。当然可以!当然,根据您的领域,“新”的含义可能有所不同(例如,纯数学家不会区分列向量和行向量,因为它们是同构的,但统计学家可能会将此区分用于计算目的)。任何新的形式主义都必须为自己辩护。
尼尔·

2
@Neil:脚注2特别提供了一些非常清楚的证据,证明lambda演算“做了一些新的事情”,而“常规”函数却“做不到”。有关无充分依据的lambda表达式的更具体示例,请参见定点组合器。该教会的数字也作出值得一读,尤其是前任的功能。
凯文

1
我会添加lambda,因为函数不会做任何有用的事情。使用lambda唯一可以做的就是将其传递给lambda并返回lambda。您无法测试所得lambda的功能。您只能传递另一个lambda来获取另一个lambda作为回报。作为函数,“ lambda函数”集的行为与仅包含标识函数的单例集完全一样。仅通过将lambda的输入和输出视为表达式,您才能区分lambda。
弗洛里安·F

0

考虑一下变量的概念。在像basic这样的旧语言中,您没有动态分配,并且每个变量都需要一个名称。(这不是完全准确的,因为您有数组,但是这个主意是...)在许多问题中,您需要能够分配所需数量的变量,而不受程序定义的名称数量的限制。

Lambda函数可让您摆脱对函数名称的相同限制,使您的程序可以定义所需数量的函数,并将它们“存储”在与其他变量相同的复杂数据结构中。使用常规的命名函数无法做到这一点。


为什么我不能使用常规的命名函数执行此操作?如果我写f(x)=let g(y)=x+y in g这篇文章,每位数学家都会立即知道这是什么意思,并同意这是一个明智的数学对象(也许有一些关于弄清楚的域的质疑f)。如果我随后记下set {f(n) | n ∈ ℕ},它们也将非常高兴,该set 包含无限多个函数,并且特别是不受限于仅使用有限数量的名称。
丹尼尔·瓦格纳

问题是关于λ演算。尽管与此相关,但这与编程语言中的lambda函数并不相同。
Andy Dent
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.