我试图理解为什么写一个程序H是不可能的,它可以检查特定输入上的另一个程序P是否会停止(暂停问题),但我无法清楚地了解它。
虽然直觉说如果这个程序H试图运行一个不会停止的程序P,那么H本身就会进入一个循环。但我不认为这是证明背后的想法。
有人可以用简单的外行术语解释证据吗?
答案 0 :(得分:4)
证明背后的想法是矛盾的。
假设有一个停机问题机器M
解决了停机问题,如果某个输入程序没有完成则会产生0
,如果它会完成1
。 M
保证完成。
创建新计算机H
。
H
使用M
(本身)的输入运行H
,如果M
回答1,则进入无限循环,否则 - 停止。
现在,如果您在输入M
上运行H
会怎样?
如果答案是1
- 而不是错误,那么H
会运行M
,并且会进入无限循环。
如果答案是0
- 那也是错误的,因为H
会停止。
因此,它与M
正确的假设相矛盾 - 因此没有M
。
直观 - 就像说没有神谕这样的东西,因为如果"你"告诉我你是一个神谕,我问你 - 我要举起哪条胳膊?
然后,我会等你的回答 - 而反之亦然 - 这与甲骨文确实是神谕的说法相矛盾。
答案 1 :(得分:2)
图灵对此使用了proof by contradiction(又称为荒谬减少):
我们的想法是假设 实际上是这样一台机器H
给出任何程序p
而输入i
会告诉我们天气{{1}停止。
鉴于此p
,我们可以修改它并创建一台新机器
我们会在H
的输出后添加另一部分,这样如果H
输出是,我们的机器将无限循环,
如果H
输出否,我们的新机器将停止运行
我们会拨打新计算机H
。
现在,当我们向自己提供H+
时(例如,程序H+
和输入p
),就会发生悖论。
那是因为如果i
停止了,我们会得到一个肯定答案(来自H+
部分),但是永远循环< / em>的。
但是,如果H
没有停止,我们会得到一个无答案(来自H+
部分),但是停止。
这在computerphile episode中非常清楚地解释了。