该证明不需要递归。你错过了重点!你不叫悖论,而是像高阶函数一样传递它。在 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
应该像 my 一样采用函数参数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 程序都被简化为仅图灵完备的程序(例如,没有,
and .
):
(define (bf3halt? x)
(not (member x '("+[]" "-[]"))))
对于一个更大的示例,您可以在虚拟环境中运行程序,散列内存状态和程序计数器。如果您再次遇到相同的内存和程序计数器,您就会有一个无限循环并且可以返回 false。(现在您看到运行时参数的内存需求halt?
可以达到code size
参数的内存消耗)