【问题标题】:Is solving the halting problem easier than people think?解决停机问题比人们想象的更容易吗?
【发布时间】:2021-11-03 01:04:22
【问题描述】:

尽管一般情况无法确定,但许多人仍然可以解决日常使用的问题。

在 cohen 关于计算机病毒的博士论文中,他展示了病毒扫描如何等同于停机问题,但我们有整个行业都围绕着这一挑战。

我也看过微软的终结者项目——http://research.microsoft.com/Terminator/

这让我问 - 停机问题是否被高估了 - 我们是否需要担心一般情况?

随着时间的推移,类型是否会变得完整 - 依赖类型看起来确实是一个不错的发展?

或者,换个角度来看,我们会开始使用非图灵完备的语言来获得静态分析的好处吗?

【问题讨论】:

    标签: language-agnostic


    【解决方案1】:

    解决停机问题比人们想象的要容易吗?

    我认为这和人们想象的一样困难。

    随着时间的推移,类型会变得完整吗?

    My dear, they already are!

    依赖类型看起来确实不错?

    非常喜欢。

    我认为非图灵完备但可证明的语言可能会有所增长。很长一段时间以来,SQL 都属于这一类(现在不再是),但这并没有真正削弱它的实用性。我认为这样的系统肯定有一席之地。

    【讨论】:

      【解决方案2】:

      哇,这是一个令人困惑的问题。

      首先:停机问题不是实际意义上的“问题”,而是“需要解决的问题”。它更像是关于数学本质的陈述,类似于哥德尔的不完备性定理。

      第二:构建一个完美的病毒扫描程序是棘手的(因为它相当于停止问题)正是“围绕这一挑战建立了整个行业”的原因。如果能设计出完美的病毒扫描算法,那只需要有人做一次,就不需要行业了。故事结束。

      第三:使用图灵完备的语言并不会消除“静态分析的好处”——它仅仅意味着静态分析存在局限性。没关系——无论如何,我们所做的几乎所有事情都会受到限制。

      最后:如果停机问题可以以任何方式“解决”,那肯定会“比人们想象的更容易”,因为图灵证明它是无法解决的。从数学的角度来看,一般情况是唯一相关的情况。具体案例属于工程问题。

      【讨论】:

        【解决方案3】:

        有很多程序可以解决停机问题,其中很多程序很有用。

        如果您有一个编译器会告诉您“暂停”、“不暂停”或“不知道”,那么它可以告诉您程序的哪个部分导致了“暂停”或“不暂停”知道”的条件。如果你真的想要一个绝对停止或没有停止的程序,那么你会修复那些“不知道”的单元,就像我们摆脱编译器警告一样。我想我们都会惊讶于尝试解决这个通常不可能的问题经常被证明是有用的。

        【讨论】:

        • 当我读研究生时,不可计算性被认为是不解决某些问题的原因。时代在变好。
        • 问题包含自己的答案,不是吗。
        • 任何给定的“不知道”都只是编译器分析程序能力的一个弱点(由于停机问题,我们知道它永远不可能完成),并且修复让你的编译器开心的事情对我来说似乎是浪费时间。
        【解决方案4】:

        作为一名日常程序员,我认为继续沿着路径解决停止式问题是值得的,即使您只是接近该限制而从未达到它.正如您所指出的,病毒扫描被证明是有价值的。谷歌搜索并不假装是“为 Y 找到最好的 X”的绝对答案,但它也非常有用。如果我释放了一种新型病毒(muwahaha),这是否会创建一个更大的解决方案集,或者只是针对现有的问题区域?不考虑技术上的差异,有的会务实开发并收取后续的“检测清除”服务。

        我期待为您的其他问题提供真正的科学答案...

        【讨论】:

          【解决方案5】:

          顺便说一句,我认为模板的图灵完整性表明暂停被高估了。大多数语言保证它们的编译器会停止;不是那么 C++。这会削弱 C++ 作为一门语言吗?我不这么认为;它有很多缺陷,但并不总是停止的编译不是其中之一。

          【讨论】:

          • 大多数 C++ 编译器将停止,因为它们只会评估有限数量的模板实例化步骤
          【解决方案6】:

          停机问题只有在一般情况下才真正有趣,因为如果停机问题是可判定的,那么所有其他不可判定的问题也可以通过归约来判定。

          所以,我对这个问题的看法是,不,在重要的情况下这并不容易。也就是说,在现实世界中,这可能没什么大不了的。

          另请参阅:http://en.wikipedia.org/wiki/Halting_problem#Importance_and_consequences

          【讨论】:

          • 这不仅“不容易”,而且相当不可能。
          【解决方案7】:

          我不知道人们认为它有多难,所以我不能说它是否更容易。但是,您的观察是正确的,问题的不可判定性(通常)并不意味着该问题的所有实例都是不可判定的。例如,我可以很容易地告诉你,像 while false do something 这样的程序会终止(假设 while 和 false 的语义很明显)。

          您提到的终结者项目之类的项目显然存在(在某些情况下甚至可能有效),因此很明显,并非所有项目都没有希望。还有一个竞赛(我相信每年),用于证明重写系统终止的工具,这基本上是一种计算模型。但在很多情况下,终止是很难证明的。

          查看它的最简单方法可能是将不可判定性视为问题实例化复杂性的最大值。每个实例化都在微不足道的范围内到这个最大值,如果最大值越高,您通常会发现实例化平均起来也更难。

          【讨论】:

            【解决方案8】:

            一个问题不可判定的事实并不意味着它不有趣:相反!所以是的,我们没有一个有效和统一的程序来解决所有程序的终止(以及许多其他关于软件的问题)并不意味着不值得寻找部分解决方案。从某种意义上说,这就是我们需要软件工程的原因:因为我们不能仅仅将任务委托给计算机。

            但是,您的问题的标题有点误导。我同意 DrPizza 的观点:终止问题与人们想象的一样困难。 此外,我们不必担心一般情况这一事实并不意味着终止问题被高估了:值得寻找部分解决方案因为我们知道一般解决方案很难.

            最后,关于依赖类型和子递归语言的问题,虽然部分相关,但确实是不同的问题,我不确定将它们混合在一起有什么意义。

            【讨论】:

              猜你喜欢
              • 2010-09-27
              • 1970-01-01
              • 2017-07-31
              • 2010-09-05
              • 2021-06-29
              • 1970-01-01
              • 2011-11-27
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多