halting problem 詳解

在講解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: 其實這個問題我認爲也證明了我們不能通過計算機完成所有的事情

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章