Lambda演算和组合逻辑是否相同?


26

我目前正在阅读Hindley和Seldin撰写的“ Lambda微积分和组合器 ”。我不是专家,但是由于参与函数式编程(从Lisp和SICP​​开始,现在到R和Haskell),所以一直对lambda微积分感兴趣。

在“ 二进制演算和组合逻辑”约翰·特朗普说:

CL可以看作是Lambda演算的子集...理论在很大程度上是相同的,在存在可扩展性规则的情况下变得等效。

在什么条件下,人们会使用组合逻辑而不是lambda微积分

任何参考将不胜感激。


看看HP Barendregt撰写的“ Lambda演算:其语法和语义”。
卡夫

Answers:


15

组合逻辑的区别在于它是无变量的。这有时在变数状态棘手的元数学和哲学逻辑中很有用。

它在实现中也可能有用,因为管理变量可能很麻烦。参见,例如,休斯(Hughes),1982,超级组合:适用语言的新实现方法


3
组合逻辑不再被认为在实现中有用,并且因为“管理变量可能令人头疼”而从未使用。组合器和变体用于实现懒惰语言的图约简,但如今,Haskell(最著名的惰性语言)使用更为合理的技术来实现图约简。
Blaisorblade

例如参见S.佩顿-琼斯,1992年,“实现对股票硬件懒函数式语言:在骨气无需生成代码G-机” - research.microsoft.com/copyright/accept.asp?path=/users/simonpj/...
Blaisorblade

2
@Blaisorblade:组合器和变体用于实现懒惰语言的图约简 -注意:Haskell和ghc并不相同,文献中包含几种基于超级组合器的Haskells。但是,的确,函数式编程的最新技术已经发现处理环境的效率优势胜过其复杂性。您仍然会看到超级组合器,例如在高阶逻辑编程中使用的超级组合器,但事实并非如此。超级组合器仍然是用于实现高阶编程的技术清单的一部分。
查尔斯·斯图尔特

超级组合器只能避免自由变量,不能避免自由变量,因此恕我直言,它们本身不能被视为组合逻辑的使用。它们大多是特殊的lambda术语。超级组合器,lambda提升程序(如果有的话,不确定)和GHC的实现(由于纯净,可以从宿主函数中复制从闭包到其自由变量的指针)之间的差异要小得多。话虽如此,我也正在考虑最近的Utrecht Haskell编译器,该编译器与GHC非常相似,但是IIRC使用lambda-lifting。仍然不是CL。
Blaisorblade

我不知道高阶逻辑编程-我在上面找到了这篇文章:springerlink.com/content/t68777w270713p5n。不幸的是,我不太可能有时间阅读它。
Blaisorblade

4

参考John Tromp的评论,我想指出组合逻辑与lambda微积分很大的不同。由于您的兴趣来自函数式编程,因此您真的不想对组合逻辑了解太多。

我最喜欢的组合逻辑教程是在剑桥大学的这些讲义中

但是,介绍它们是为了解释所谓的惰性(或应用性)语言的实现;正如我之前的评论中提到的那样,这种技术现在已经过时了。


由于不再使用组合语言来实现惰性/应用语言,因此目前的技术水平是什么?是否有名称/类别对这些技术进行分类?
CMCDragonkai

@CMCDragonkai看评论到cstheory.stackexchange.com/a/306/989讨论。简短的实用答案是“请参阅有关GHC用途的文章”:有多种不同的技术(包括STG机器和诸如严格性分析之类的优化方法)结合在一起,可以使懒惰的程序更快。
Blaisorblade
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.