“ Alan Turing于1936年证明,不存在解决所有可能的程序输入对暂停问题的通用算法”
我是否可以找到一种通用算法来解决某些可能的程序输入对的暂停问题?
我是否可以找到一种或多种编程语言,对于每种使用该语言的程序,我都可以决定该程序是否终止或永远运行?
“ Alan Turing于1936年证明,不存在解决所有可能的程序输入对暂停问题的通用算法”
我是否可以找到一种通用算法来解决某些可能的程序输入对的暂停问题?
我是否可以找到一种或多种编程语言,对于每种使用该语言的程序,我都可以决定该程序是否终止或永远运行?
Answers:
我是否可以找到一种通用算法来解决某些可能的程序输入对的暂停问题?
是的,当然。例如,对于任何既不包含循环也不递归的程序,您可以编写一个算法返回“是,它终止”的算法,而对于任何while(true)
肯定会到达且不包含循环的程序,则返回“否,它不终止”的算法一个break语句,以及其他所有内容的“ Dunno”。
我是否可以找到一种或多种编程语言,对于每种使用该语言的程序,我都可以决定该程序是否终止或永远运行?
如果该语言是图灵完备的话,不是。
但是,有一些非图灵完整的语言,例如Coq,Agda或Microsoft Dafny,其停顿问题是可以确定的(并且实际上是由它们各自的类型系统决定的,从而使它们成为全部语言(即,可能不会终止的程序不会编译))。
我认为这里的所有答案都完全不正确。问题的答案是:假设程序打算停止,那么可以,您最好能够表明它停止了。如果您不能证明它容易停止,则应认为程序编写得很差,因此被质量控制部门拒绝。
是否实际可以编写合适的机器算法取决于输入的编程语言以及您的野心。一种编程语言的合理设计目标是使其易于证明终止。
如果语言是C ++,则您可能无法编写该工具,实际上,您不太可能使解析器运行,更不用说证明终止了。对于更好的结构化语言,您应该至少能够生成证明,或者至少使用某些假设来生成证明:在后一种情况下,工具应输出这些假设。一种类似的方法是将终止断言包含在语言中,并在工具会信任断言的复杂情况下使用它们。
最重要的是,似乎没有人似乎理解证明程序停止确实是可能的,因为打算编写此类停止程序的(优秀)程序员总是故意这样做,并且对它们为何终止并正确执行有一种心理印象:此类代码是有意为之的。这样写就可以清楚地看出它们已停止并且是正确的,并且如果合理的算法无法证明这一点(可能带有一些提示),则应拒绝该程序。
关键是:程序员不编写任何程序,因此不满足暂停定理的论断,结论也不适用。
极好的(无意中的问题)问题。实际上,有一些停止检测程序可以在有限的输入集上成功。这是一个活跃的研究领域。它与(自动)定理证明区域有很强的联系。
但是,计算机科学似乎没有“有时”成功的“程序”的确切术语。“算法”一词通常用于总是停止的程序。
这个概念似乎与概率论算法截然不同,在概率论算法中,CS理论家坚持认为其成功有一定的已知或可计算的可能性。
有一个术语“ 半算法”有时会使用,但显然是递归可枚举或不可计算的同义词。
因此,出于此目的,将它们称为quasialgorithms。这个概念不同于可决定与不可决定。
可能有人说不能比较拟算法。但实际上,这些拟算法似乎是自然的等级(部分排序)。假设一个拟算法可以检测到某些有限输入程序集X的停止。另一个B可以检测到集合Y的暂停。如果X ⊂ ý即X是合适的子集ÿ然后乙比“更强大的” 甲。
在CS中,到目前为止,“准算法层次结构”似乎只是非正式地研究。
它出现在繁忙的海狸研究[1]和PCP问题[2]中。实际上,对PCP的基于DNA的计算攻击可以看作是一种拟算法。[3] 在其他领域已经看到的定理证明[4]。
[1] 新千年攻击对繁忙的海狸问题
[3] Kari等人使用DNA解决有界的邮政对应问题
[4] 通过Cook等人的Comm。证明程序终止。ACM的
(因此,实际上这是一个非常深层的问题,defn应该放在TCS.SE上……也许有人可以以适合并保留的方式重新询问它)
只要所讨论的编程语言足够复杂(即,如果图灵完整),那么总会有该语言的程序无法证明可以终止。
由于除最原始的语言以外的所有语言都是图灵完整的(只需要变量和条件之类的东西),因此您实际上只能构建很小的玩具语言来解决停顿问题。
编辑:根据评论,让我更加明确:您可以设计的任何语言(可以解决暂停问题)都必须是图灵不完整的。这排除了包含一组适当的基本成分(例如“变量,条件和跳转”或@ sepp2k所说的通用“ while”循环)的语言。
显然,有几种实用的“简单”语言(例如定理求解器,例如Coq和Agda)。如果这些满足您对“编程语言”的概念,则可以调查它们是否满足某种完整性,或者暂停问题对于他们而言是否可以解决。
是的,您可以,但是我怀疑它会有用。您可能必须进行案例分析,然后才能查找最明显的案例。例如,您可以grep文件以获取代码while(true){}
。如果文件具有该代码,它将永远不会终止^。更一般而言,您可以说没有循环或递归的程序将始终终止,并且在某些情况下您可以保证程序将终止或不终止,但是即使对于中型程序,这也将非常困难,并且在许多情况下将无法为您提供答案。
tl; dr:是的,但是您将无法对大多数有用的程序使用它。
^是的,从技术上讲,如果该代码不在代码路径上,或者仍然有其他线程可以终止,那么我在这里要指出一点。