Lambda演算似乎并不抽象。我看不出重点


18

潜在的问题:

是什么演算为我们做,我们不能与基本功能属性和符号在中学代数一般学吗?

首先,抽象在lambda演算的上下文中是什么意思?我对“抽象”一词的理解与某种概念的概念概括-机器不同。

但是,lambda函数通过消除函数名称来防止某种程度的抽象。例如:

f(x) = x + 2
h(x, y) = x + 5 y

但是,即使不定义这些功能的机制,我们也可以轻松地讨论它们的组成。例如:

1. h(x, y) . f(x) . f(x) . h(x, y) or 
2. h . f . f . h

我们可以根据需要包含参数,也可以完全抽象以概述发生的情况。而且我们可以快速将它们简化为一个功能。让我们看一下构成2。我可以根据自己的重点来写一些学生的细节层次:

g = h . f . f . h
g(x, y) = h(x, y) . f(x) . f(x) . h(x, y)
g(x, y) = h . f . f . h = x + 10 y + 4

让我们使用lambda演算执行以上操作,或者至少定义函数。我不确定这是正确的,但我相信第一和第二个表达式会增加2。

(λuv.u(u(uv)))(λwyx.y(wyx))x

并乘以5y。

(λz.y(5z))

与其说是抽象,不如说是加法,乘法等含义的精髓。在我看来,抽象是指更高层次而不是更低层次。

此外,我正在努力了解为什么lambda演算甚至是一回事。有什么好处

(λuv.u(u(uv)))(λwyx.y(wyx))x

过度

h(x) = x + 5 y

或组合符号

Hxy.x+5y

甚至Haskell的符号

h x y = x + 5 * y

再说一遍,lambda演算对我们有什么作用,而f(x)样式的函数属性和符号是我们不熟悉的,这是我们做不到的。


9
您举一个Haskell的例子很有趣,因为Haskell是基于lambda演算的。Lambda演算与任何特定符号无关。这是一个计算模型,等效于图灵机,其中“一切都是功能”。
Yuval Filmus

2
是的,有人告诉我它是基于lambda演算。我还没有看到一个对我有意义的问题,那就是为什么haskell是基于lambda演算而不是公正的。。。我在小学学习的功能的基本属性。这确实是整个问题的要点。
JDG

6
难道“马上就没有目的”几乎是“抽象”的定义吗?:-)
David Richerby,2013年

1
我不会说这是贬义。通过微积分可以对功能进行处理。但是我可以看到如何被解释为中学。我会调整的
JDG

6
我怀疑您实际上对“中学代数函数表示法”有一个正式的定义。如果您对此类函数有任何定义,则可能是集合理论,没有计算意义。lambda演算的部分意义在于以自己的方式理解这种表示法,而且我敢说是从多项式函数或演算之类的特定应用程序中抽象出来的。
德里克·埃尔金斯

Answers:


24

Lambda演算如此重要的原因有很多。

一个非常重要的原因是lambda演算允许我们拥有一种计算模型,其中可计算的函数是一等公民。

人们不能用中学代数的语言表达高阶函数

以lambda表达式为例

λFλGλXFGX

这个简单的表达式向我们表明,在lambda演算中,函数组合本身就是一个函数。在中学代数中,这不容易表达。

在lambda演算中,很容易表示一个函数将返回一个函数作为其结果。

这是一个小例子。表达式(这里我假设具有加和整数常量的应用的lambda演算)

λFλGλXFGXλXX+2

将减少到

λg.λx.g(x)+2

还要注意,在lambda演算中,函数是表达式,而不是形式为。这使我们从命名函数的需求中解放出来,无需在表达式的句法类别和定义的句法类别之间进行区分。f(x)=e

同样,当表达高阶函数变得不可能(或从符号上来说很麻烦)时,将类型分配给表达式也将遇到问题。

功能组成具有多态类型

α.β.γ.(βγ)((αβ)γ)

在Hindley-Milner类型系统中。

λ演算的一个很强的卖点就是类型化λ演算的精确概念。函数编程语言的各种类型系统(例如Haskell和ML系列)都基于lambda演算的类型系统,这些类型系统以数学定理的形式提供了有力的保证:

如果程序的类型正确,并且e减少为残差e ,那么e 也将被良好类型化。eeee

如果的类型正确,则e将不会显示某些错误。ee

作为程序对应的证明尤其值得注意。Curry-Howard同构(请参见例如https://www.rocq.inria.fr/semdoc/Presentations/20150217_PierreMariePedrot.pdf)显示,简单类型的lambda演算与直觉命题逻辑之间存在非常精确的对应关系:每种类型对应的逻辑公式φ Ťϕ T的证明与类型T的lambda项相对应,并且该术语的beta缩减与在证明中进行切除消除相对应。TϕTϕTT

我敦促那些认为中学代数是lambda演算的不错选择的人开发出高阶,多态类型的中学代数以及适当的Curry-Howard同构概念。如果您甚至可以基于中学代数计算出一个交互式的证明助手,从而使我们能够证明使用基于Lambda微积分的证明助手(例如Coq和Isabelle)形式化的许多定理,那就更好了。然后,我将开始使用中学代数,因此,我敢肯定,会有很多其他人和我在一起。


这是很好的解释。听说在lambda演算中更好地表示高阶函数(例如合成)和类型是令人鼓舞的,这甚至有助于使证明和可证明的代码更加便利。我看不到您提到的大部分内容以及为什么传统表示法不够用(例如,关于不需要单独的定义语法f(x)= e)的后果,但是您可以列举其中一些原因,这对您很有帮助。它使人感觉到λ演算可以改善哪些领域。
JDG

当然可以介绍let形式的本地定义但这些都已经在演算作为语法来表示λ X ë Ë '。lambda演算使我们无需命名函数就可以表达函数,就像(在中学代数中!)可以说数字 4一样,而不必通过一些变量来命名函数一样。X=ËËλXËË4
汉斯·赫特尔16/12/4

5

当初次向年轻人描述功能时,它们实质上是通过图形(图)或公式来标识的;这是在形式主义数学趋势出现之前历史上对函数的理解。如今,正如第一年微积分所讲授的那样,函数是实函数,即从R的函数。[R[R

Lambda演算中的函数更为通用。确切的定义取决于您的lambda演算是键入还是未键入。在纯无类型的lambda演算中,所有都是函数。这比微积分的实际功能要通用得多。

甚至过程语言有时也会使用lambda演算中的想法。C语言中的sort函数接受比较函数作为参数,用于比较元素。Lambda演算的意义更加深远–函数不仅接受函数作为输入,还可以输出它们。

Lambda演算是一种等效于Turing机器的计算模型。它是一个完整的系统。纯lambda演算没有原始词“ 5”或“ +” –可以在演算内部定义它们,就像“ 5”和“ +”不是集合论的原始词一样。(出于效率考虑,实用的编程语言在本地实现自然数。)

我怀疑您对lambda演算不印象深刻的原因之一是,它的思想已经在编程语言中泛滥成灾,以至于看起来不再具有创新性。


“我怀疑您对lambda演算不满意的原因之一” Therin提出了我要问的问题:lambda演算对我们有什么作用?换句话说,当我们不使用lambda演算时,会发生什么。当我们使用lambda演算时,我们会得到什么?如果lambda演算是人们第一次想到,那么如果函数自己可以创建函数,那会给人留下深刻的印象吗?在我最初的python程序中,文本包含了后来评估的功能,就像将决策任务委托给其他人一样。似乎很明显?
JDG

那是在我什么都不知道之前。我只是觉得代码一遍又一遍很烦人,而编程应该可以帮助我自动生成功能,包括函数本身。
JDG

2
Python支持函数式编程。最初的编程语言没有。如果您使用FORTRAN进行编程,则不会创建包含文本的程序,该文本包含稍后评估的功能。您甚至没有注意到它,而是利用了lambda演算中的思想所提供的功能。
Yuval Filmus

2
Eval起源于LISP,它受到lambda演算的强烈影响。在FORTRAN,C,COBOL和许多其他编程语言中,这种事情是不可能的。
Yuval Filmus

是的,python支持函数编程---但我不确定它的eval()能力是否受到λCalc的启发---您不必λCalc来思考:我想自动生成以后可以评估的代码。这就好比说λCalc必须思考:“我要告诉Miranda在如何管理部门方面运用她的最佳判断”,换句话说,就是让一个函数生成自己的函数。您不需要λCalc就可以考虑委派高级任务。如果你想谈论从λCalc汲取灵感,这是比较合适的点拉姆达功能,内涵等
JDG

4

X2XX2

λXX2X2

FFX=X2F

在编程语言中使用lambda表达式具有类似的优势;您可以在需要的地方编写该函数的功能,而不必在程序的其他位置定义一个全新的函数。

ddXX2ddXX2


θVV

θvF=Fv

许多人发现这种双重评估表示法令人困惑和/或令人不安,以及递归使用函数的逐点定义。Lambda抽象版本

θ=λvλFFv

没有那个问题。


最后,有一个抽象的无意义定理,即“简单类型的lambda演算”与“笛卡尔封闭类别”基本上是同一件事—因此,如果您发现自己想在笛卡尔封闭类别中进行计算,则使用它可能是一个好主意只需键入lambda演算即可。


我回到这个问题,并找到很好的答案。谢谢。总的来说,这里的答案很有趣。
JDG

4

我会先说我不是这个主题的专家,但是我确实花了一些时间研究它,而在任何主题中对我来说最有趣的事情之一就是它背后的历史。因此,对我来说,了解lambda微积分的一些历史历史有助于解释为什么它有用。

简短的摘要是,在1900年代初期,集合论开始兴起,并且根据集合对数学进行了重新构想之后,一些数学家注意到,尽管集合论定义允许您声称存在某种结构,但它们并没有告诉您如何构造并计算。因此,集合理论的定义是非建设性的。数学家开始怀疑,是否有一种方法可以发展出建设性的定义,而不仅仅是证明某物事实,而是证明它是怎样的

来自维基百科

在数学中,构造性证明是一种证明方法,它通过创建或提供一种创建对象的方法来证明数学对象的存在。这与非构造证明(也称为存在证明或纯存在定理)相反,后者证明了特定种类的对象的存在而没有提供示例。

然后表明,λ演算和图灵机都可以代表任何可计算的函数,因此是等效的。

理论上,任何数学函数或概念都可以以lambda微积分形式进行编码和计算。这意味着lambda演算可以是一个完全独立的数学基础,尽管显然是极其繁琐的。

Lambda演算在您不会使用它编写代码的意义上不是“有用的”,但它确实构成了用于描述程序及其动态效果的指称语义的基础。这用于程序正确性和语义含义的讨论中。显然,它也极大地影响了函数式编程语言的开发,这些语言从lambda演算中汲取了整个执行概念。

希望能有所帮助。

编辑添加:刚才我指向这篇论文,它显示了拓扑,lambda微积分和物理之间的关系。简要浏览一下,我遇到了这个奇妙的说法:

图灵机可以看作是计算机硬件的理想化,简化模型,而lambda演算更像是软件的简单模型。从诗意上讲,lambda演算描述了一个宇宙,其中一切都是程序,一切都是数据:程序就是数据

关键在于,lambda演算是软件计算的理想化模型,因此与任何编程语言中的特定实现均无关。它为纯计算建模


有关历史的更多信息:斯坦福大学哲学百科全书中的λ微积分的简要历史。他们一生中无法处理的条目更多。
David Tonhofer


3

Lambda演算并不是设计成一种编程语言。实际上,它是在1930年代创建的,甚至比我们拥有可编程计算机还要早几十年。相反,它是作为研究计算本身的形式模型而创建的。如果您对它这么容易表达代码或数学函数感到失望,那是因为这不是它的目的。


1
“几十年来我们甚至没有可编程计算机” –错误。可编程计算机曾经存在(如果不是通用的话),并且第一批通用计算机是在1930年代建造的。
拉斐尔

-2

存在Lambda演算,因此可以创建匿名(aka Lambda)函数。如果您不删除函数名,则名称空间可能会变得混乱,并且可用函数名可能用完。这在处理所谓的“高阶函数”(由于明显的原因而返回函数(或函数指针))时尤其重要。

本质上,lambda函数等效于局部范围的变量。没有lambda函数的函数式编程类似于没有局部变量的过程式编程,这是一个糟糕的主意。

“为什么lambda演算甚至是一回事”数学家喜欢冗余。lambda微积分在数学中很少使用,因为您已经发现该符号不是很有用。

“如果您甚至可以基于中学代数计算出一个交互式证明助手,这将使我们能够证明使用基于Lambda微积分的证明助手(例如Coq和Isabelle)形式化的许多定理,那会更好。我会更好。然后开始使用中学代数,因此,我敢肯定,还会有很多其他人和我在一起。” 您听说过元数学吗?此处不涉及任何λ演算,可以证明许多coq / isabelle定理


除了一些意见之外,此答案还提供什么?
拉斐尔

@Raphael错误信息。这个答案大部分甚至都没有道理。不乏名字。“ Lambda函数”不等同于局部范围的变量;这甚至没有意义。我假设这是指let,但是虽然let可以使用匿名函数进行编码,但显然您不能采用其他方法。函数式编程并没有要求“lambda函数”,例如Backus的FP剑麻
德里克·埃尔金斯

我主要是想对汉斯的答案发表评论,但因果报应不足。所以我决定将评论变成一个完整的答案
SN
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.