高效编程语言


32

不可能编写一种编程语言来允许所有输入都停止的机器,而没有其他输入。但是,为任何标准复杂性类定义这样的编程语言似乎都很容易。特别是,我们可以定义一种语言,在其中我们可以表达所有有效的计算,并且只能表达有效的计算。

例如,对于类似东西:采用您喜欢的编程语言,然后在编写程序(对应于Turing Machine M ')之后,在标头中添加三个值:整数c和整数k,以及默认输出d。当程序被编译,输出图灵机中号给定输入X大小的Ñ运行中号'Xç Ñ ķ步骤。如果在步骤上升之前没有停止,则输出默认输出PMckdMxnMxcnkMcnkd。除非我没有记错,否则这种编程语言将使我们能够用表示所有计算,仅此而已。但是,这种提议的语言本质上是无趣的。P

我的问题:是否有编程语言以非平凡的方式捕获可计算函数(例如所有有效的可计算函数)的子集?如果没有,这是否有原因?


7
捕获可计算功能子集的编程语言的一些简单示例:正则表达式和无上下文语法。
Jukka Suomela 2011年

2
实际上,捕获像P V这样的复杂性类的语言(以与原始递归函数相似的方式定义,用递归替换为有界递归)是很有趣的(至少从理论上来说)。:)PPV
Kaveh

线性和整数编程捕获可计算函数的有趣子集。
迭戈·德埃斯特拉达

数据记录只能表示多项式时间算法,但我不知道它是否可以表示所有多项式时间算法。
Jules 2012年

著名的论文《全面功能编程》提出了这样的观点,即没有不确定的停止问题的编程语言实际上是实用且有用的。jucs.org/jucs_10_7/total_functional_programming

Answers:


32

试图仅表示多项式时间计算的一​​种语言是软lambda演算。它的类型系统植根于线性逻辑。最近的论文讨论了多项式时间计算,并提供了基于这种方法的最新发展的很好的总结。马丁·霍夫曼(Martin Hofmann)致力于该主题已有相当长的一段时间。在这里可以找到较早的相关论文清单; 他的许多论文都朝着这个方向发展。

其他工作采用以下方法来验证程序是否使用了一定数量的资源: 从属类型类型化汇编语言

还有其他方法是基于资源受限的形式计算,例如环境演算的变体。

这些方法的特点是类型良好的程序可以满足一些预先指定的资源范围。资源绑定可能是时间或空间,并且通常取决于输入的大小。

该领域的早期工作是将结石高度归一化,这意味着所有类型良好的程序都将停止。系统F(又称多态lambda演算)正在高度规范化。它没有定点运算符,但是表达性很强,尽管我不知道它对应的是什么复杂度类。根据定义,任何高度归一化的演算都表示某种终止计算。

编程语言Charity是一种非常有表现力的功能语言,会在所有输入上停止。我不知道它可以表达什么复杂度类,但是Ackermann函数可以用Charity编写。


您在这里“至少”是什么意思?
nponeccop 2011年

“至少”在这里是指“一些”。我将更改答案以使其更加精确。
戴夫·克拉克

我很确定,在系统F中定义的函数的复杂性是随时间终止输入的“二阶算术的某些可证明的总函数”的函数类。这不是一个非常常规的复杂性类,但仍然...
科迪2012年

cody:根据Wadler的“免费定理”,系统F可以表示“可以在二阶Peano算术中证明的所有递归函数”,并且“包括Ackermann函数”。我不确定您所描述的是否相同。Charity的主要功能是对codata的支持,而我认为Agda的终止检查比Coq和System F都具有更高的表达能力,同时还可以保证终止。
Blaisorblade


8

我还想提到隐式复杂性理论作为对此的一种方法,因为我已经看到它出现在几个与问题相关的问题中。引用Neel Krishnaswami的回答

基本技术是将复杂度类别与线性逻辑的子系统(所谓的“轻线性逻辑”)相关联,其思想是对于给定的复杂度类别(例如LOGSPACE, PTIME等)。然后通过Curry-Howard获得一种编程语言,在该语言中,给定类中的程序可以精确地表达。


5

我很惊讶没有人提到原始递归。通过限制到有界循环(即必须在循环开始之前计算每个循环的迭代次数),结果程序是原始递归的,因此是合计的。道格拉斯·霍夫施塔特(Douglas Hofstadter)提出了一种编程语言BLOOP,该语言只允许所有原始递归函数。


1
它是所有函数的适当子类,但是将其称为“高效”函数类可能有点麻烦。
拉斐尔

我想您可以使用Cobham将P描述为多项式有界递归来对其进行修改,以捕获PP
卡夫

其他人提到系统F和其他高度规范化的语言,它们在某种意义上仅支持“原始递归”。但是,由于它们支持一流的功能,因此可以编写更多程序(例如Ackermann函数)。
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.