不可解問題(Undecidable Decision Problem)指的是這樣一種問題:他無論如何也不可能有一個正確的算法來解決。雖然不可思議,但這種問題被證明確實是存在的。圖靈在1936年(那時還沒電腦,我們的父親是在沒有設備支持的純理論基礎上提出來的,致敬)提出了第一個不可解問題的實例:The Halting Problem。
The Halting Problem是問,輸入一段程序代碼和一個針對此程序的輸入,能否編程判斷運行這個程序後程序是否會終止。
這個問題的答案是否定的。也就是說,不可能有一種算法可以正確判斷一個指定的程序運行後,給予指定的輸入,程序最後出不出得來。換句話說,The Halting Problem是一個不可解問題。
雖然這感覺似乎不可能,但在嚴格的證明下誰也無法發言反對。
證明過程非常簡單,假設The Halting Problem是有解的,並且已經用程序實現了,那麼我們只需要再編寫一個程序Program Bug,就會發現存在矛盾。
反證:既然解決The Halting Problem的算法已經實現了,那麼我們一定能定義一個函數Function Halting(a,b:input_type):boolean;
其中,a是讀入的程序源碼,b是輸入數據。這個函數的功能就是返回對於指定的程序源碼和輸入數據,程序是否能順利退出。
下面編寫一個程序:Program Bug;
var
code:input_type;
begin
get(code); //讀入code
if halting(code,code) then repeat until false
else halt;
end.
好,現在運行Bug這個程序,並且輸入Bug這個程序本身的代碼。這樣,halting(code,code)其實質就是在判斷這個Bug程序本身了。如果The Halting Problem認爲Bug程序會正常退出,那麼就讓程序進入一個死循環,否則立即退出程序。矛盾產生。