計算的極限(一) 所有機器的機器,與無法計算的問題

2021-07-10 06:58:42 字數 3785 閱讀 3924

在圖靈誕辰100周年之際,獻給這位偉大的開拓者。

計算無處不在。

計算似乎無所不能,宛如新的上帝。但即使是這位「上帝」,也逃不脫邏輯設定的界限。

第一位發現這一點的,便是圖靈。

《計算的極限》系列所有機器的機器

圖靈機非常簡單,只要明白了它的運作過程,任何乙個受過足夠訓練的計算機系本科生都可以寫出乙個模擬圖靈機執行的程式。只消輸入狀態轉移表和紙帶的輸入內容,程式就可以一步一步模擬相應的圖靈機在紙帶上爬來爬去的過程。對於一些熟悉圖形程式設計的程式設計師來說,做個模擬動畫也問題不大。即使不用計算機,靠人手一步步操作,也是一件小孩子也能完成的事。圖靈機就是這麼簡單的一種機器。

雖然看上去簡單,但實際上圖靈機能做的事情遠遠超出一般的想象。只要有足夠長的紙帶和足夠好的耐心,今天的電腦能做的計算,一台精心設計的圖靈機也能完成。訣竅在於,電腦中的電路是有限的,電路的狀態也是有限的,我們可以用圖靈機去模擬電腦中的電路狀態。只要有足夠長的紙帶,那就可以模擬出足夠大的暫存器、記憶體和硬碟;而cpu中的電路,雖然所有可能的狀態極其多,但終究是有限的,可以用圖靈機模擬,雖然這台圖靈機的狀態轉移表將會有著令人頭痛的大小,以及令人偏頭痛的複雜程度。但是,從原則上來說,用圖靈機模擬一台電腦是完全可能的,雖然每次「讀寫記憶體」時,讀寫頭都需要花長得令人咋舌的時間在紙帶上來回奔波。

也就是說,從原則上來說,只要配備適當的輸入和輸出裝置,以及極其好的耐心,我們完全可以用圖靈機上網、玩遊戲甚至執行自己寫的程式。特別地,存在一台特定的編寫程式專用的圖靈機t,我們可以在紙帶上寫程式,將它輸入到t,然後t就能執行這個程式。那麼,如果我們將方才本科生寫的那個可以模擬任意圖靈機執行的程式(暫且把它稱為程式p),寫在紙帶上輸入到t中,讓t去執行的話,原本的機器t就搖身一變,變成了一台可以根據輸入的狀態轉移表來模擬任何一台圖靈機的圖靈機。

更精確地說,因為程式p的長度是有限的,我們可以將它直接寫進原來機器的狀態轉移表,得到一台新的機器utm。utm會在紙帶上讀取兩樣東西:一台圖靈機m的狀態轉移表的二進位制編碼,以及作為m的初始輸入的紙帶資料。然後,utm會根據m的狀態轉移表和初始輸入資料,在紙帶上模擬m的運作過程。換言之,utm是一台可以模擬任何圖靈機的圖靈機。它是所有機器的機器,所謂的通用圖靈機(universal turing machine)。當然,通用圖靈機並不是唯一的,只要一台圖靈機能完成根據狀態轉移表模擬任意圖靈機的任務,它就是通用圖靈機。

通用圖靈機的想法,在如今這個計算機氾濫的時代,似乎並不新鮮。但在圖靈的2023年,電子計算機甚至仍未問世,機械計算機還只能執行內設的一套指令。即使是charles babbage和ada lovelace的超越時代的設想,其中執行外部程式的概念也相當含混不清。在這種歷史背景下,要歸納出通用圖靈機這個概念,本身就需要極為豐富的想象力,而且這種圖靈機是否存在,這是個遠非顯然的問題。而圖靈不僅設想到了這個概念,而且正確地判斷出它的存在性,這需要何等非凡的直覺!

但單純的直覺終究不能令人信服,數學家講究的是邏輯和證明。而要證明通用圖靈機的存在,最直接的方法莫過於直接給出乙個通用圖靈機的例項。這並不簡單,如果讀者想嘗試一下的話,我建議先嘗試構造乙個能做二進位制加法的圖靈機。為了降低難度,可以假設紙帶上有第三種符號,表示空白,但即使如此,要構造乙個能做加法的圖靈機,遠比想象中的困難。可想而知,通用圖靈機的構造肯定更為複雜繁瑣。即使是圖靈,他在一開始給出的構造也是有問題的,而這些問題甚至在後來的勘誤中也沒有成功修正。比構造更麻煩的是證明給出的圖靈機的確是一台通用圖靈機,在圖靈解決希爾伯特可判定性問題的**中,有關通用圖靈機的構造和證明佔了相當大的篇幅。這部分非常繁複瑣碎,而且其中還有錯誤,如果細細研讀的話,絕對有誘發劇烈偏頭痛的危險。

幸運的是,無論細節多麼複雜,圖靈的想法還是被邏輯學家們接受了。一旦領會到圖靈機的能力,接受了通用圖靈機的構想,再檢查幾個能完成基本任務的圖靈機之後,大部分數學家都會認為通用圖靈機的確存在,儘管他們並不一定會細看圖靈的詳細構造。而現代電子計算機的發展,更是驗證了通用圖靈機的存在:每一台電腦都相當於一台通用圖靈機。

通用圖靈機的存在,從側面說明了圖靈機這個計算模型的強大之處:圖靈機作為一類機器,其中乙個特例就可以模擬整個類別中的任意一台機器,宛如能折射大千世界的一滴水珠。但在這種強大的背後,隱隱也暗藏著不安定的因素。哥德爾不完備性定理告訴我們,有時候越強大的數學理論,因為能表達的概念太多,甚至連理論的命題和證明都能表達,反而會導致不能被證明的真命題的存在。如果乙個系統足以描述它自己,那魔法般的自指將是不可避免的。圖靈機如此強大,它的其中一台就可以模擬所有圖靈機,會不會導致不能用計算來回答的問題存在呢?

很不湊巧,答案是會。

無法計算的問題

在哥德爾不完備性定理的證明中,哥德爾構造了乙個描述了本身不可證明性的自指命題,通過這個命題完成了他的證明。要想照葫蘆畫瓢的話,那些關於圖靈機本身的問題,將會是很好的候補。

關於圖靈機,最簡單的問題是什麼呢?回想一下圖靈機的運作過程,一台圖靈機從初始狀態開始,根據紙帶上的內容,一邊不斷變換狀態,一邊更改紙帶的內容,如此往復永無休止,除非它遇上了表示停機的那個狀態,才能從這機械的計算過程中跳出,獲得靜息的安樂。乙個自然的問題是:一台圖靈機什麼時候會停機呢?

更嚴格地說,會不會停機並不是圖靈機本身的屬性,它跟紙帶的初始輸入也有關係。對於同一臺圖靈機,不同的紙帶輸入也可能導致不同的結果和行為。比如說,我可以設計一台圖靈機,它的任務只有乙個:一步一步向右移動,尋找輸入中的第乙個1。如果輸入紙帶上全是0的話,那麼,這台圖靈機自然不會停止;但只要紙帶上有乙個1,那麼它就會停止。所以,真正嚴謹的問題是:給定一台圖靈機m以及乙個輸入i,如果我們將i輸入m,然後讓m開始執行,這時m是會不停運轉下去,還是會在一段時間後停止?我們將這個問題稱為停機問題。

初看起來,停機問題並不難。既然我們有通用圖靈機這一強大的**,那麼只需要用它一步步模擬m在輸入i上的計算過程就可以了。如果模擬過程在一段時間後停止了,我們當然可以得出「m在輸入i上會停止」這個結論。問題是,在模擬過程停止之前,我們不可能知道整個計算過程到底是不會停止,它可能會在3分鐘後停止,可能要等上十年八載,更有可能永遠都不會停止。換句話說,用模擬的方法,我們只能知道某個程式在某個輸入上會停止,但永遠不能確定那些不停止的狀況。所以說,單純的模擬是不能解決停機問題的。

實際上,停機問題比我們想象中要複雜得多。

舉個例子,我們可以編寫乙個程式gc,它遍歷所有大於等於6的偶數,嘗試將這樣的偶數分成兩個素數的和。如果它遇到乙個不能被分解為兩個素數之和的偶數,它就停機並輸出這個偶數;否則,它就一直執行下去。用現代的工具編寫gc這樣的程式,對於計算機系的學生最多只能算一次大作業;用圖靈機實現的話,也不是什麼極端困難的事。然而,gc是否會停止可是牽涉到了哥德**猜想。如果哥德**猜想是正確的,每個大於等於6的偶數都能分解為兩個素數之和的話,那麼gc自然會一直執行下去,不會停機;如果哥德**猜想是錯誤的話,必定存在乙個最小的反例,它不能分解為兩個素數之和,而gc在遇到這個反例時就會停機。也就是說,gc是否永遠執行下去,等價於哥德**猜想是否成立。如果我們能判定gc是否會停止,那我們就解決了哥德**猜想。

數學中的很多猜想,比如說3x+1猜想、黎曼猜想等,都可以用類似的方法轉化為判斷乙個程式是否會停止的問題。如果存在乙個程式,能判斷所有可能的圖靈機在所有可能的輸入上是否會停止的話,那麼只要利用這個程式,我們就能證明一大堆重要的數學猜想。我們可以說,停機問題比所有這些猜想更難更複雜,因為這些困難的數學猜想都不過是一般的停機問題的乙個特例。如果停機問題可以被完全解決,我們能寫出乙個程式來判斷任意圖靈機是否會停機的話,那麼相當多的數學家都要丟飯碗了。

停機問題如此複雜,機械的計算看起來沒有足夠的力量來完全解決它。停機問題似乎是不可計算的。但要想嚴格證明這個結論,似乎仍要求助於深藏在圖靈機之中,那魔法般的自指。

區域網中的所有機器都能連線MySQL資料庫

我們要想讓區域網中的所有機器都能連線mysql資料庫,首先要給mysql開啟遠端連線的功能,在mysql伺服器上mysql命令列執行以下命令 命令 如下 grant all privileges on to root identified by abc with grant option flush...

區域網所有機器都能連線MySQL資料庫的設定命令

本文主要介紹了讓區域網中的所有機器都能訪問mysql資料庫的命令的設定,希望能對您有所幫助。我們要想讓區域網中的所有機器都能連線mysql資料庫,首先要給mysql開啟遠端連線的功能,在mysql伺服器上mysql命令列執行以下命令 命令 如下 grant all privileges on to ...

區域網所有機器都能連線MySQL資料庫的設定命令

sql grant all privileges on to root identified by abc with grant option flush privileges 其中上面兩行 的意思是給從任意ip位址連線的使用者名為root,密碼為abc的使用者賦予所有的許可權。其中的 為任意的ip...