Programming languages 程序设计语言的存在性-保证终止

Programming languages 程序设计语言的存在性-保证终止,programming-languages,Programming Languages,是否存在一种编程语言,在这种语言中,您总是可以保证终止 如果只有If/else语句,那么可以确保程序将终止吗?一种保证不会终止的编程语言。[否则,这将是一个微不足道的问题,这已被证明不是图灵机器的情况] 对于这个问题,您可以将其称为弱编程语言,它具有您所寻求的功能。您无法预测一个程序是否会因为一个程序的一般情况而停止(这就是所谓的“”) “标准”编程语言相当于图灵机,因此无法预测用该语言编写的程序是否会停止 如果您限制您的编程语言,术语会发生变化,并且在某些情况下,此类模型的停止程序可能是可解的

是否存在一种编程语言,在这种语言中,您总是可以保证终止


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

一种保证不会终止的编程语言。[否则,这将是一个微不足道的问题,这已被证明不是图灵机器的情况]


对于这个问题,您可以将其称为弱编程语言,它具有您所寻求的功能。

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

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

如果您限制您的编程语言,术语会发生变化,并且在某些情况下,此类模型的停止程序可能是可解的,但这不是通用编程语言的情况。

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

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

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

  • 没有循环的程序总是停止
  • 使用足够小内存的程序,可以检查它是否停止。不幸的是,至少以一种天真的方式,这需要在每个可能的初始状态下运行我上面提到的算法,这意味着少量内存可能相当于10个字节
用一种总是停顿的语言编写的程序将是一个非常弱的算法。原因是你永远无法达到同样的状态。如果你这样做,你可能会陷入一个循环。想象一下,一个用这种语言编写的游戏,当你四处走动时,如果你踩了两次瓷砖,游戏就会死掉。即使是一个简单的程序,得到两个数字,然后打印总和,然后重复,也无法编写


最后,在那些总是停下来的语言中,也许最不愚蠢的是一种与我们的普通语言类似的语言,但在7天后就杀死了程序。

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

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

for i = E1 to E2 step E3
   ... code ...
end for
其中感应变量
i
不可赋值(并且无法形成指向
i
的指针)。这种语言只能表示终止程序的原因是,每个循环都有一个最大的迭代次数,在循环开始时就知道了


相当多的程序可以使用类似于for语言的语言编写,但有些计算问题是无法解决的。我认为,一个著名的例子是计算阿克曼函数。

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

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

而且,令人惊讶的是,这并不像看上去那么有限,而且这些语言完全适合于非常广泛的问题


这个项目可能也很有趣。

是一个真正的编程语言的例子,每个程序都会终止。

我想,也许可以回顾一下与图灵机器的关系,以及编程语言“图灵完成”的含义:“停止问题是一个关于固定图灵完整计算模型上计算机程序属性的决策问题,即可以用某种给定的编程语言编写的所有程序,这些语言的通用性足以等同于图灵机器。”(当然,如果一种语言不是TC,那么……除了对一般编程不太有用之外……)为什么投票不太接近?这是一个非常有效的问题。@pst,非图灵完全语言对一般编程非常有用。没有那么多的问题不能用Coq解决。@SK logic有一个例子说明它被用于“通用编程”?(也许我们有不同的定义;-)@pst,一个完整的C编译器足够“通用”了吗?这是用Coq编写的:它不属于cstheory,如果是研究级问题,这个网站。@amit-没有本科生网站吗?这是一个