1. 首先你要知道:为什么在证明一个命题时,反证法是有用的。
反证法即首先假设结论不成立,由该假设推导出某个命题的正反两方面,这违反了矛盾律(理论体系发相容性/自恰性),故假设不成立,故结论成立。
可以去知乎上搜:反证法是什么?——东京理科大学2002年高考第三题(数学系)
2. 解决图灵停机问题的程序存在吗?答案是“不存在这样的程序”。
怎么证明这个命题呢?用反证法。
首先假设:“存在这样的程序”。(为了方便,下面代码中我省去了a的输入---原图灵停机中,a是有输入的):
function halting(program a)
{
if(a停机) return true; //a停机,halting就返回真
else false; //a不停机,halting就返回假
}
按照反证法,现在我要引出一个该程序对应的矛盾。
program bug(halting f, program bug) //使传递的program参数就是自身
{
if(f(bug)) repeat; //如果通过f验证出bug停机,则bug不停机
else return; //如果通过f验证出bug不停机,则bug停机
}
现在运行:
bug(f,bug)
去看bug到程序,并推导结论:如果里面的参数bug停机,则repeat,最外层的bug不停机。如果里面的参数bug不停机,则return,即外面的bug停机。
因此得到矛盾:当bug的参数为自身时,bug又停机又不停机。
因此假设不成立 => 因此最初要证明的命题成立:"不存在这样的程序"。
上述内容参考:martix67的blog(“不可解问题”)。
3. 这个悖论和罗素悖论(理发师悖论)以及类似的“我说的话都是假话”一样,都是集合自指,产生了a=!a的矛盾。
图灵停机问题属于CS中的内容。建议继续看看图灵机的模型思想,然后你就大概理解了计算机的体系。