如果你不自己调用它,是否可以制作暂停功能?

时间:2014-06-06 18:21:44

标签: recursion logic computation-theory halting-problem

解决停止问题的不可能性的标准证明通常是这样的

//does_halt() takes a function as input and returns true if it will ever finish computing

function paradox()
    {if does_halt(paradox())
        {
          while(true){}
        }
    }        

这个证明要求你递归地调用暂停函数,但是只要不调用它就可以创建一个总是计算正确结果的暂停函数吗?

2 个答案:

答案 0 :(得分:2)

该证明不需要递归。你错过了这一点!你不会调用悖论,而是像高阶函数一样传递它。在Scheme和它的用法中使用此功能:

;; does operation passed as x to 2 and 5
(define (do2by5 x)
  (x 2 5))

;; examples    
(do2by5 +)    ; ==> 7
(do2by5 *)    ; ==> 10
(do2by5 expt) ; ==> 32

如您所见,我未在我的示例中应用+*expt。我只是把它作为一个论点。使用它的是do2by5。在你的悖论中,你似乎称之为悖论,因为你在名称中添加了()。这是错误的,因为does_halt应该像我的do2by5一样采用函数参数。以下是我将如何在Scheme中编写它:

;; this procedure does not halt!
(define (forever)
  (forever))

(define (paradox x)
 (if (halt? paradox) ; see I'm not calling it but passing it
     (forever)
     'im-finished))

现在真正的果汁当然是halt?,当然不可能实施,paradox证明你无法做出这样的功能。

暂停问题tvivia: 如果您需要调查的资源比可以容纳分析程序的最小机器大得多,那么您可以实际为有限大小的内存生成有限大小的代码halt?。例如。作为一个例子,这里有一个用于所有3个字节的BrainFuck程序简化为仅图灵完成(例如,没有,.):

(define (bf3halt? x)
  (not (member x '("+[]" "-[]"))))

对于更大的示例,您可以在虚拟环境中运行程序哈希内存状态和程序计数器。如果您再次遇到相同的内存和程序计数器,则会出现无限循环并返回false。 (现在你看到halt?的内存需求可以达到code size参数运行时参数的内存消耗量。

答案 1 :(得分:0)

当然,但你必须记得,计算理论是理论,并且在无限和物理上是不可能的。

function paradox1() {
   if (does_halt(paradox2())
       return true;
   else
       return false;
}
function paradox2() {
   if (does_halt(paradox3())
       return true;
   else
       return false;
}
function paradox3() {
   if (does_halt(paradox4())
       return true;
   else
       return false;
}
function paradox4() {
   if (does_halt(paradox5())
       return true;
   else
       return false;
}
etc etc etc _infinitely_

这是一个有效的图灵机程序,并且更清楚地说明如何无法判断将来会发生什么。