Scheme的call / cc可以实现所有已知的控制流结构吗?


13

页面“高级方案:有些顽皮”指出:

延续是一个强大的控制流构造,几乎可以任何其他控制流结构中得出。

我以为Scheme的call/cc(*)与Peter Landin的J运算符相关,可以用于实现任何已知的控制流结构?

对于“控制流结构”,我特别考虑了Wikipedia对它们的描述,例如,异常,协程,绿色线程等。

具体来说,有没有使用不能实现的控制流结构的示例call/cc

(*)我无法挖掘出任何可以证明call/cc像J运算符一样强大的论文。 Felleisen的一篇论文(我还没有读过,并且承认很难完全理解它)对此进行了调查,似乎可以得出结论,即使它们处于不同的复杂性类别中,它们在形式上也是等效的。

(还请注意,我已根据以下评论更新了问题)

更新资料

基于下面@Neel的出色回答,我看了一些评论定界和不定界延续的网站,确实看来,尽管call/cc不定界是不够的。同时,第一级,分隔延续(像shift/reset可以被使用,似乎表达任何控制流结构。


5
“控制流结构”的正式定义是什么?
Huck Bennett

4
回复:无界延续。您读过Hayo Thielecke的参考论文吗?实际的主张是,在没有国家的情况下,由所提供的call/cc无限延续不能表达例外。(正如Thielecke继续指出的那样,可以通过传递两个延续来实现异常,一个延续给程序,另一个延续给异常处理程序,但这不仅需要执行。)call/cc
rici

@Rici:我只浏览了前几页。(看论文花了我长时间)。感谢您的评论!
csl

@HuckBennett我没有一个正式的定义,但非正式地,我的意思是它在en.wikipedia.org/wiki/Control_flow中所描述的内容-具体来说,我的意思是您可以使用延续来表达,更重要的是,实现协程,绿色线程,异常,转义语句,amb-operator等。
csl

2
@csl除了使“控制流结构”的含义更加精确之外,您还需要更加清楚“表达”某种东西的含义。这是一个难题,您对问题的答案在很大程度上取决于您算作表情。毕竟,您始终可以以某种方式为图灵机编码,该图灵机对带有例外(例如Java)的语言的解释器进行编码。但这可能不是您要记住的,因此您需要对“表达式”的概念施加严格的约束(例如,组成和/或完全抽象)。
Martin Berger

Answers:


11

在这个答案中,我将Felleisen 1991 年在“编程语言的表达能力”的意义上将“可表达的”理解为“宏可表达的” 。(直观上,如果您可以将语言功能定义为本地源转换,而无需使用整个程序转换,则该语言功能是宏可表示的。)

使用此定义,答案是否定的:定界控件在lambda微积分+ call / cc中不是宏可表达的。用call / cc表示定界控制运算符。为了实现控制定界符(移位/重置的重置部分),您需要某种状态来模拟连续标记,本质上是对堆栈进行编码以模拟连续标记的动态寿命。

但是,在以下意义上,定界控制是普遍的效果。在他的博士论文安德烈Filinski表明,任何可表达的副作用是可编码的使用任一分隔延续,或呼叫/立方厘米和状态的一个单元格。粗略地说,“可表达的副作用”是指其单调类型可以根据编程语言的类型定义的任何效果。

令人惊讶的是,这种想法在实践中似乎很有趣。在过去的十年中,戈登·普洛特金(Gordon Plotkin)和约翰·鲍尔(John Power)提倡采用效应理论的代数语义的思想:该思想是指定感兴趣的副作用运算,以及期望它们满足的方程,然后您可以通过采用免费的monad来获得该语义的一般含义。

Matija Pretnar和Andrej Bauer采用了这种数学方法,然后以其Eff语言实现了这种方法,从而发明了一种新的语言结构,称为“效果处理程序”:您可以编写使用一组命令性功能的代码,然后为命令性功能赋予语义通过编写一组处理程序,说明如何实现每个有效操作。


但是,如果定义为:“您可以使用Scheme和call / cc 实现任何控制流结构”(没有仿真),那么答案必须是“ 是”?查看LtU讨论lambda-the-ultimate.org/node/966,似乎Oleg Kiselyouv在Scheme中使用call / cc实现了所有四个F运算符:okmij.org/ftp/continuations/…-摘录“代码依赖daccess-ods.un.org daccess-ods.un.org在呼叫/ cc上捕获无限的连续性,并使用一个全局可变单元。事实证明,这足以实现其他F运算符。...“-F-至+ F + F”。
csl

我确实承认您使用Felleisen的“宏可表达性”作为回答的框架,但是正如您所看到的,我已经改变了我的问题,以明确表示“使用call / cc实现[在Scheme中]”。尽管Oleg Kiselyov需要引入一个全局可变单元来实现所有四个F运算符以进行定界延续,但我认为这并不意味着“该程序的重​​大,全局重组”-当然,实际上是这样。
csl

我将接受这个答案。我还要指向okmij.org/ftp/continuations/undelimited.html#delim-vs-undelim上的文本,其中包含其他指针。似乎可以使用一流的,划定的延续(例如shift / reset)来实现任何控制流结构。从链接:“一流的定界延续可以表达任何可表达的计算效果,包括异常和可变状态。”
csl
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.