存在编程语言 - 保证终止

时间:2011-12-07 09:08:45

标签: programming-languages

是否存在编程语言,始终保证终止?

如果您只有if / else语句,那么可以确定程序将终止吗?

6 个答案:

答案 0 :(得分:12)

是的,当然有一些非图灵完备语言可以保证终止(或者至少提供具有这种保证的子集):

在大多数情况下,它只允许通过严格的子项进行递归调用(并且,对于Church算术,它意味着总是减少正整数计数器)。

令人惊讶的是,这并不像它看起来那样有限,而且这些语言非常适合于各种各样的问题。

Terminator项目也很有趣。

答案 1 :(得分:4)

保证终止的编程语言不是turing complete。 [否则,Halting Problem将是一个微不足道的问题,事实证明这不是图灵机的情况。

您可能会将regular expressions称为此问题的弱编程语言,并且它具有您所寻求的功能。

答案 2 :(得分:2)

Datalog是每个程序终止的真实编程语言的一个例子。

答案 3 :(得分:1)

您无法预测程序是否会因程序的一般情况而停止(这就是所谓的“The Halting Problem”)。

“标准”编程语言相当于图灵机,因此无法预测用这种语言编写的程序是否会停止。

如果限制编程语言,则术语会发生变化,在某些情况下,此类模型的暂停程序可能是可解决的,但对于通用程序编程语言则不然。

答案 4 :(得分:1)

正如您已经看到的(在其他答案中),一个与图灵机一样强大的程序,如果它停止或无法预测,则无法预测。虽然我们的计算机不是图灵机(它们几乎不是线性有界自动机,如果你真的想要精确,它们只是具有大量状态的DFA。这是因为有限的内存)

理论上,您可以确定我们传统计算机中的任何程序是否可以停止。然而,该程序可能需要O(2^(32)*n)(n是内存的大小)内存和时间几乎不可能。 (如果你想要算法,运行程序并在每一步保存整个内存的状态,检查你是否到达相同的内存快照。由于内存有限,此算法将停止。)

所以现在问题归结为可预测的语言的属性,例如多项式时间。回答这个问题并不容易,但很容易想到一些例子:

  • 没有循环的程序,始终停止
  • 使用足够少的内存的程序,可以检查它是否停止。不幸的是,至少以一种天真的方式,这需要为每个可能的初始状态运行我上面提到的算法,这意味着少量内存也可能像10个字节!

用始终停止的语言编写的程序将是一个非常弱的算法。原因是你无法达到同样的状态。如果你这样做,你就可以陷入困境。想象一下用这种语言写的游戏,当你四处走动时,如果你踩到一些瓷砖,游戏就会消失。即使是一个简单的程序,它获取两个数字并打印总和然后重复也无法写入。

最后,也许那些永远停止的语言中最不愚蠢的一种就像我们的普通语言一样,但只是在7天之后杀死该程序。

答案 5 :(得分:0)

这是一个难题,因为它取决于您对编程语言的定义。一种可能的定义要求必须能够使用该语言模拟任何图灵机(忽略实际机器的有限内存引起的实际限制)。如果您的定义包含该要求或其等价物,那么答案就是否定,因为图灵机不会因某些输入而停止。

但是,有限制的计算机语言可以合理地称为编程语言(忽略上面讨论的要求),至少在原则上(我不知道它们是否实际已经实现)。我称之为for-language的一种语言是:它支持直线程序,if-then-else子句和形式的受限循环

for i = E1 to E2 step E3
   ... code ...
end for

其中归纳变量i是不可分配的(并且无法形成指向i的指针)。这种语言只表达终止程序的原因是每个循环可以采用的最大迭代次数,在循环开始时就已知。

可以使用类似于for-language的语言编写相当多的程序,但是有一些计算问题是不可能的。我相信一个着名的例子是计算阿克曼函数。