Answers:
在实践中可能需要做几件事,而这些问题不能直接在lambda演算中表达。
SF演算就是一个例子。它的表达能力不是新闻。本文有趣的部分(幻灯片中未显示)是其背后的类别理论。SF演算类似于Lisp实现,在Lisp实现中,您允许函数检查其参数的表示形式-因此您可以编写诸如(print (lambda (x) (+ x 2)))
⟹之类的东西"(lambda (x) (+ x 2))"
。
另一个重要的例子是Plotkin的parallel或。直观地讲,有一个普遍的结果表明,lambda演算是顺序的:带有两个参数的函数必须首先选择一个。这是不可能的写一个lambda术语or
使得(or
⊤⊥)⟹ ⊤
,(or
⊥⊤)⟹⊤和or
⊥⊥⟹⊥(其中⊥是一个非终止术语和⊤是终止的术语)。之所以称为“并行或”,是因为并行实现可以使每个归约减少一个步骤,并在其中一个自变量终止时停止。
您在lambda演算中无法做的另一件事是输入/输出。您必须为此添加额外的原语。
当然,所有这些示例都可以通过添加一个间接级别(实际上将lambda项表示为数据)在lambda演算中表示。但是随后模型变得不那么有趣了,您将失去建模语言中的函数与lambda抽象之间的关系。
您问题的答案取决于如何定义“计算”和“代表”。另一方面,sclv提到的LtU上的线程主要是由于各种术语的定义不一致而互相交谈的人。
区别当然不是计算能力之一-所考虑的每个系统都是图灵等效的。问题在于,仅图灵等效性并不能真正表达表达式的结构或语义。因此,在需要复杂编码或非平凡初始状态的极简计算模型中,甚至可能不清楚系统是否具有通用计算能力,或者是否有人通过对系统的解释而产生通用性幻想。例如,请参阅此邮件列表有关2状态3符号图灵机的讨论,尤其是Vaughan Pratt提出的问题。
无论如何,所区分的是:
图灵等效性仅表示系统满足任何可计算功能的第三个条件,而无论是形式化的逻辑系统还是编程语言(无论实际差异如何),它都是我们最关心的第一个条件。
这是一个非常非正式的描述,但是可以更精确地确定基本思想。在上述LTU线程可以发现几个 引用沿着类似的路线现有的工作。
Schönfinkel的组合逻辑和Church的λ演算最初都是作为逻辑推理的精炼抽象而设计的,因此,它们的结构非常整齐地映射到逻辑推理上,反之亦然。它们还带有可扩展性的假设,例如eta归约规则所描述的:λx. f x
,在x
中不发生f
,等效于仅f
一个。
在实践中,非常严格的可扩展性概念可能会太过局限,而不受约束的可扩展性会使关于子表达式的局部推理变得困难或不可能。
SF演算是一种改进的组合器演算,它提供有限形式的内涵分析作为原始操作:解构部分应用的表达式的能力,但不能解构原始值或未规范化的表达式。碰巧可以很好地映射到ML样式编程语言中发现的模式匹配或Lisps中发现的宏之类的想法,但是如果没有有效地实现用于评估“内涵”项的解释器,就无法在SK或λ微积分中描述。
因此,总而言之:在可能的最佳表示形式最有可能涉及实现SF-演算解释器的意义上,SF-演算不能直接在λ-演算中表示,其原因是基本的语义差异:表达式是否具有内部结构,还是纯粹由外部行为来定义?
巴里·杰伊(Barry Jay)的SF演算能够研究其所应用的术语的结构,这是无功能的。Lambda演算和传统的组合逻辑纯粹是功能性的,因此无法做到这一点。
lambda演算有许多扩展,它们做的事情违反了纯度,其中大多数都需要在某种程度上修复重写策略,例如添加状态,控件(例如,通过延续)或逻辑变量。