在講解halting problem 問題之前,我們先來看一張圖和一個小故事
- 圖片:
圖片來自網絡,如有侵權請聯繫刪除
- 故事:
理髮師悖論:
在一個村子裏只有有一個理髮師,他說他只給不給自己理髮的人理髮
那麼他是否給自己理髮?
請思考一下這個圖和這個小故事
雖然這兩個傢伙個halting problem 不完全一致,但是有類似的地方
halting problem 是什麼?
對任何一個程序給定一個輸入,我們能否確定它是否會停止
可以轉化成下面的這個概念
有沒有一個特殊的程序,可以判斷其他程序在接受一個輸入並運行的時候是否能夠停止, 即類似於是否有一個可以判斷其他程序能夠處理什麼問題的程序
看上去這個問題的答案應該是 true,
但是我們來看一看詳細證明:
- 假設有一個函數 h(program,input) 它接受兩個參數,一個是需要檢測的程序,一個是對應的輸入數據,如果這個輸入導致這個程序能夠停止,那麼這個函數返回true, 否則返回 false
- 然後我們現在有這樣一個程序:
program(i){
if(h(program,i){
whlie(true);
}
else{
return;
}
}
解釋:
- 首先我們通過函數h() 判斷對於輸入i, 能否使這個程序停止
- 如果能夠使這個程序停止,那麼我們讓這個程序無限循環
- 如果不能夠使這個程序停止,那麼我們讓這個程序停止
也就是說我們通過h()函數 判斷這個程序能夠正常停止它卻不會停止,但是判斷它不會正常停止的時候它卻正常停止.
就等於說這個h() 函數的判斷是錯誤的, 不存在這樣的一個函數.
與我們的假設相矛盾,證明假設錯誤,即沒有這樣一個函數
也就是說 對任何一個程序給定一個輸入,我們不能確定它是否會停止
這裏有點像一個槓精的感覺,但是這確實是一個無懈可擊的反例,因爲對於一個反證法我們只要能找出矛盾,證明它,當一回槓精又有何不可呢?
PS: 其實這個問題我認爲也證明了我們不能通過計算機完成所有的事情