【问题标题】:Is there a "good enough" solution for the halting problem?停止问题是否有“足够好”的解决方案?
【发布时间】:2011-01-28 20:02:15
【问题描述】:

众所周知,停止问题没有明确的解决方案,即 a) 返回 true 程序确实停止了,并且 b) 处理任何输入,但我想知道是否有足够好的解决方案问题,可能可以完美处理某些类型的程序流程,或者能够识别何时无法正确解决问题,或者正确率很高,等等。 ...

如果是这样,它们有多好,它们依赖于哪些想法/限制?

【问题讨论】:

  • 与实际问题相比,停机问题与其说是一个实际问题,不如说是一个证明可计算性极限的实验?
  • 不,这是一个非常有用的问题。以下是暂停问题可以回答的一些现实问题:我的程序是处于无限循环中,还是即将结束?这个 C++ 程序会编译吗?我的 PostScript 文档有多少页?
  • 除了停机问题一般无法解决。您正在谈论具有特定输入的特定程序,因此可以确定它们是否会停止。
  • 派对迟到了,但现在应该在Computer Science
  • @MikeW 很可能,但我们不会迁移超过 30 天的帖子。 (事实上​​,在这种情况下没有接口可以这样做)。

标签: halting-problem


【解决方案1】:

通常的方法是将程序行为限制为effectively calculable 算法。例如,simply typed lambda calculus 可用于确定算法总是停止。这意味着简单类型的 lambda 演算不是图灵完备的,但它仍然足够强大,可以表示许多有趣的算法。

【讨论】:

【解决方案2】:

可以完美处理某些类型的程序流的那些

这很容易,而且你的“某些类型”越窄越容易。原始示例:判断以下代码是否终止,对于x 的任意起始值:

void run(int x)
{
    while(x != 0)
    {
        x = x > 0 ? x-2 : x+2;
    }
}

解决方案比代码本身要短。

或能够识别何时无法正确解决问题

再简单一点:以上面的程序为例,当程序不符合固定的窄模式时,让它回复“否”。

或者正确率很高的那个

您如何定义无限组可能输入的“高”百分比?

【讨论】:

  • OP 的问题实际上对于非平凡的程序来说变得很有趣。
【解决方案3】:

证明循环停止的一种方法是识别一些整数变量(不一定在程序中明确显示),每次执行循环时该变量总是减小,并且一旦该变量小于零,循环将终止。我们可以将此变量称为循环变体。

考虑以下小sn-p:

var x := 20;
while (x >= 0) {
    x := x - 1
}

在这里,我们可以看到每次执行循环时 x 都会减小,并且一旦 x

更复杂的例子呢?考虑一个有限的整数列表,L = [L[0], L[1], ..., L[n]]。如果 x 是 L 的成员,in(L, x) 为真。现在考虑以下程序:

var x := 0;
while (in(L, x)) {
    x := x + 1
}

这将搜索自然数 (0, 1, 2, ...),并在找到不在 L 中的 x 值时停止。那么,我们如何证明它终止了? L 中必须有一个最大值——称之为 max(L)。然后我们可以将我们的变体定义为max(L) - x。为了证明终止,我们首先必须证明max(L) - x 总是在减少——不是太难,因为我们可以证明 x 总是在增加。然后我们要证明循环将在max(L) - x < 0 时终止。如果max(L) - x < 0,则max(L) < x,这意味着x不可能在L中,因此循环将终止。

【讨论】:

    【解决方案4】:

    【讨论】:

      【解决方案5】:

      有时机器是否会停止是显而易见的,即使它非常大。一旦您确定了一种模式,例如“倒计时”变量的存在,您就可以编写一个小型机器,该机器适用于任何拥有它的机器。那是一个无限大的家庭,但在所有可能的机器中微不足道。大多数人工编写的机器在它们的大小上都有非常简单的行为,所以如果其中很多可以在实际时间/空间内解决,我不会感到太惊讶,但我不知道如何衡量。

      为了让您了解“他们有多好”这个问题有多难,这里有一个非常具有理论意义的问题:对于给定的尺寸 N,有多少台尺寸为 N 的机器停机?这是不可计算的(因为可以计算它的机器可以用来解决停机问题)并且对于 N>4 是未知的。

      【讨论】:

        【解决方案6】:

        是的,只需使状态空间有限,并且(理论上)所有输入都可能。 (简单地遍历所有可能性。)

        所以理论上任何程序都可以在真实计算机上运行。 (您可能必须使用比执行程序的 RAM 更大的计算机来进行分析。当然,分析会花费非常长的时间。) p>

        也许你想要一些更实用的东西。在这种情况下,请考虑语言。尽管您可以提供无限多的程序作为输入,但可以很快确定语法正确/不正确的问题(取决于语言的种类和输入长度)。 (注意:我们不是在讨论执行输入程序,只是确定它在语法上是否正确。)

        【讨论】:

          猜你喜欢
          • 2012-03-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-11-27
          • 2019-06-07
          相关资源
          最近更新 更多