不可解問題之停機問題(Undecidable Problem Halting Problem)


計算機技術已運用到人類生活的方方面面,幫助人類解決各種問題。可你是否有想過,計算機是否能為人類解決所有問題呢?

 

假如你是一個程序猿,你已編寫過很多程序。有些程序一下子就能出結果,有些程序則好久都沒有顯示結果。你不知道這些程序到底最終是否會顯示結果。你突然靈光一現---“能不能設計一個程序,用於檢測任意程序最終會停止運行還是會無限運行下去”。這樣,你就不用為了得到程序的結果而等很久,有時甚至還無法確定到底是不是程序本身出現了問題,導致程序無限循環。

 

說干就干,你為這一想法設計的思路如下:

定義一個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年就證明,沒有這樣一個通用的算法存在,此算法在所有可能的輸入參數下可以解決停機問題。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM