算法問題:不可解問題(Undecidable Decision Problem)

    不可解問題(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程序會正常退出,那麼就讓程序進入一個死循環,否則立即退出程序。矛盾產生。

發佈了20 篇原創文章 · 獲贊 3 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章