根据我对停止问题不可计算的证明的理解,该问题不是可计算的,因为如果我们有一个程序P(x)计算该程序x是否停止,则在将P作为输入输入时得到了一个悖论。相同的P,具有:P(P),试图确定P是否暂停使用P本身。
所以我的问题是:暂停程序是否可以由程序P计算为P本身用作输入的所有其他程序?换句话说:止步问题是否仅在这种特殊情况下无法计算,或者证明更笼统,而我缺少某些东西?
根据我对停止问题不可计算的证明的理解,该问题不是可计算的,因为如果我们有一个程序P(x)计算该程序x是否停止,则在将P作为输入输入时得到了一个悖论。相同的P,具有:P(P),试图确定P是否暂停使用P本身。
所以我的问题是:暂停程序是否可以由程序P计算为P本身用作输入的所有其他程序?换句话说:止步问题是否仅在这种特殊情况下无法计算,或者证明更笼统,而我缺少某些东西?
Answers:
如果是任何可计算函数,则定义为
对于k,v的任何选择,也是可计算的。
基本上,如果你有一个程序,其计算的所有的除了,则可以‘修复’该情况下(例如使用一个if then else
),并得到另一程序,其计算为全部。
因此,如果您可以计算“除一种情况之外”的停止函数,则还可以计算该停止函数(无例外)。由此,您可以像往常一样获得矛盾。
结论:不,您不能将停顿问题确定为“除了一种情况”(也不能确定为“除少数情况之外”)。
程序P是否可以计算除P本身以外的所有其他用作输入的暂停问题?
不。考虑程序的无穷序列,其中P i是“将头部i 向右移动,然后i 向左移动,然后精确地执行P会做的事情”。这些程序中的每个程序对于每个输入都产生与P完全相同的输出 (包括如果 永远循环则永远循环),但是它们都是不同的程序。
而且,仅要求在功能上与其自身不等效的程序上工作,就无法解决此问题,因为该属性也是不确定的。当限制在这些实例上时,也许问题是可以决定的(尽管我怀疑不是),但是实例集是不确定的,因此您实际上无法执行限制。
有一些算法可以表明某些类别的程序会停止运行。例如,
虽然没有算法来确定任意程序是否暂停,但大多数代码都被设计为暂停(像大多数子例程一样)或不暂停(像处理事件的无限循环),并且可以通过算法确定哪个是哪个。换句话说,您可以使用一种算法来回答“暂停”,“不暂停”或“ I dunno”,并且可以将这种算法设计为涵盖足够有用的程序。
矛盾证明不一定要详尽无遗,一个反例就足够了。暂停问题无法确定的证明为您提供了P的一个示例,无法确定其暂停属性。该证明并没有说明P是唯一这样的程序,实际上,可能存在构造完全不同的P类的独立证明。
您可以通过限制要使用的程序的空间来获得一些结果,尽管这些限制必须相当严格。例如,如果确保您可以在100步之内暂停或永久运行该程序,则确定是否暂停该程序很容易。
一个更复杂的情况是,您知道程序最多为100个字符长。由于只有有限的许多程序具有该长度,因此存在一些步骤,这是该程序终止时可以运行多长时间的上限。但是,无法将程序长度k映射到最大步数B B (k )的功能。