計算機技術已運用到人類生活的方方面面,幫助人類解決各種問題。可你是否有想過,計算機是否能為人類解決所有問題呢?
假如你是一個程序猿,你已編寫過很多程序。有些程序一下子就能出結果,有些程序則好久都沒有顯示結果。你不知道這些程序到底最終是否會顯示結果。你突然靈光一現---“能不能設計一個程序,用於檢測任意程序最終會停止運行還是會無限運行下去”。這樣,你就不用為了得到程序的結果而等很久,有時甚至還無法確定到底是不是程序本身出現了問題,導致程序無限循環。
說干就干,你為這一想法設計的思路如下:
定義一個all_mighty_program,其輸入參數是需測試的程序本身和其輸入
如果該程序最終停止運行,返回True
如果該程序最終無法停止運行,則返回False
然后你根據此寫了一段偽代碼(pseudocode):
def all_mighty_program (code, code_input): if code (code_input) halts: return True else: return False
那么有沒有什么測試程序能使上面的這段偽代碼失效呢?為此,你需要進行反證。
首先,需測試的程序有兩種可能性:
1,該程序最終會返回某值
2,該程序會無限循環下去
對於第一種可能性:在某個條件下,該程序最終會返回某值,也就是說該程序最終會停止運行。
需要把這個條件設計成與上面的偽代碼相反。既然上面的偽代碼是測試程序最終停止運行返回True,那么把條件設計成:當上面的偽代碼返回False時,測試程序最終會停止。
同樣,對於第二種可能性:在某個條件下,該程序會無限循環下去,也就是說該程序最終會無限運行下去。
需要把這個條件設計成與上面的偽代碼相反。既然上面的偽代碼是測試程序最終無法停止運行返回False,那么把條件設計成:當上面的偽代碼返回True時,測試程序最終會無限循環下去。
寫成偽代碼如下:
def code (code_input): if all_mighty_program (code, code_input) is False: return True else: loop forever
由此可以看出,這兩段偽代碼的邏輯是矛盾的。當all_mighty_program (code, code_input)是False時(也就是code會無限循環下去時),code (code_input)是返回True值的(也就是code最終會停止運行)。
停機問題(Halting Probelm)是決定任意程序最終是會停止運行還是會無限運行下去的問題。
Alan Turing在1963年就證明,沒有這樣一個通用的算法存在,此算法在所有可能的輸入參數下可以解決停機問題。