解决停止问题的不可能性的标准证明通常是这样的
//does_halt() takes a function as input and returns true if it will ever finish computing
function paradox()
{if does_halt(paradox())
{
while(true){}
}
}
这个证明要求你递归地调用暂停函数,但是只要不调用它就可以创建一个总是计算正确结果的暂停函数吗?
答案 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_
这是一个有效的图灵机程序,并且更清楚地说明如何无法判断将来会发生什么。