計算機簡史第四章 電子時代之圖靈機

peterjxl發表於2024-06-10

講講圖靈對計算機的貢獻

圖靈機發明的背景

阿蘭·馬蒂森·圖靈 (Alan Mathison Turing)於 1921 年出生在倫敦, 從小就表現出驚人數學和科學能力。

艾倫·麥席森·圖靈(Alan Mathison Turing),1912-1954,英國數學家、計算機學家、邏輯學家、密碼學家、哲學家、理論生物學家。(圖片來自維基百科)

他對電腦科學的建樹始於 1935 年,當時他是劍橋國王學院的碩士生,他開始解決德國數學家 大衛·希爾伯特提出的問題: Entscheidungsproblem (德語),即“可判定性問題”: 是否存在一種演算法,輸入正式邏輯語句,輸出準確的"是"或"否"答案?

如果這樣的演算法存在, 可以回答比如 "是否有一個數大於所有數?" (雖然我們知道答案:沒有)。但有很多其他非常難以解決的數學問題,我們想知道答案,因為如果我們知道是沒有解決方法的,就不用花時間去嘗試解決了。

美國數學家阿隆佐·丘奇, 於 1935 年首先提出解決方法,開發了一個叫“Lambda 運算元”的數學表達系統,證明了這樣的演算法不存在。雖然“Lambda 運算元”能表示任何計算,但它使用的數學技巧難以理解和使用。

同時在大西洋另一邊,阿蘭·圖靈 想出了自己的辦法來解決"可判定性問題",提出了一種假想的計算機,現在叫圖靈機(Turing Machines),圖靈機提供了簡單又強大的數學計算模型。

雖然用的數學不一樣,但圖靈機的計算能力和 Lambda 運算元一樣,同時因為圖靈機更簡單,所以在新興的計算機領域更受歡迎。

什麼是圖靈機

圖靈機是圖靈受打字機的啟發而假想出來的一臺理論計算裝置。假設我們有

  • 無限長的紙帶,紙帶可以儲存符號
  • 一個狀態變數,儲存當前狀態
  • 一個讀寫頭,可以讀取和寫入 紙帶上的符號。
  • 一組規則,描述機器做什麼。規則是根據當前狀態 + 讀寫頭看到的符號,決定機器做什麼,結果可能是在紙帶寫入一個符號,或改變狀態,或把讀寫頭移動一格,或執行這些動作的組合。

為了更好理解,我們舉一個例子:讓圖靈機讀一個以零結尾的字串,並計算 1 的出現次數是不是偶數。如果是,在紙帶上寫一個 1;如果不是,在紙帶上寫一個 0。

首先要定義“圖靈機”的規則:

  • 機器的初始狀態:由於還沒開始計算,當前的 1 的出現次數是 0,是偶數
  • 如果當前狀態是"偶數", 當前符號是 1,那麼把狀態更新為"奇數",把讀寫頭向右移動
  • 如果當前狀態是"奇數", 當前符號是 1,那麼把狀態更新為"偶數",把讀寫頭向右移動
  • 如果當前狀態為偶數,當前符號是 0,意味著到了字串結尾,那麼在紙帶上寫一個 1,並且把狀態改成 停機(halt),狀態改為"停機" 是因為圖靈機已完成計算
  • 如果當前狀態為奇數,當前符號是 0,意味著到了字串結尾,那麼在紙帶上寫一個 0,並且把狀態改成 停機(halt),狀態改為"停機" 是因為圖靈機已完成計算

定義好了起始狀態 + 規則,就像寫好了程式,可以開始輸入了。假設把"1 1 0"放在紙帶上,有兩個 1,是偶數。注意,規則只讓讀寫頭向右移動,其他部分無關緊要,為了簡單所以留空。

"圖靈機"準備好了,開始!機器起始狀態為"偶數",看到的第一個數是 1,符合最上面那條規則,所以執行對應的步驟,把狀態更新到"奇數", 讀寫頭向右移動一格:

然後又看到 1, 但機器狀態是"奇數",所以執行第三條規則,使機器狀態變回"偶數",讀寫頭向右移動一格:

最後看到 0,並且機器狀態是 偶數,所以執行第二條規則,在紙帶上寫 1,表示"真" 的確有偶數個 1,然後機器停機。

這就是圖靈機的原理,很簡單對吧?你可能覺得“有什麼大不了的”?

圖靈證明了:這個簡單假想機器,如果有足夠時間和記憶體,可以執行任何計算。它是一臺通用計算機,剛才的程式就是個簡單例子,只要有足夠的規則,狀態和紙帶可以創造任何東西,瀏覽器,魔獸世界,任何東西!當然這樣做效率很低,但理論上可行,所以圖靈機是很強大的計算模型。

事實上,就可計算和不可計算而言,沒有計算機比圖靈機更強大,和圖靈機一樣強大的,叫 "圖靈完備"。每個現代計算系統 比如膝上型電腦,智慧手機,甚至微波爐和恆溫器內部的小電腦,都是"圖靈完備"的。

為了回答可判定性問題,他把圖靈機用於一個有趣計算問題:"停機問題“。

停機問題

在試想一下,在有些情況下,一臺圖靈機如果長時間沒有輸出結果,那麼它很可能陷入了死迴圈或永無止境的計算中。這是我們不願看到的,因為機器可能執行 1 分鐘後停機,也可能執行 10 天半個月甚至幾十年才停機,亦或者永遠也不會停機,這個很難靠人為判斷。

說人話:如果一個數學問題是沒有解的,但花了 10 天半個月甚至幾十年才發現是沒有解決辦法,或者永遠都沒有解決辦法,那麼就白白花費了很多時間。

假設我們構建出一臺圖靈機 H,它接收其他圖靈機及其輸入資訊作為輸入,並能夠判定其是否會停機,就解決了上面的煩惱——構建這樣的機器難度雖大,但理論上是可行的。

這就是著名的停機問題(halting problem)。

令 H 表現如下圖所示,如果其判定物件會停機則輸出 1,反之輸出 0。

圖靈機H執行流程

我們再構建一臺圖靈機 G,其執行流程如下圖所示。如果 H 輸出 1,說明 G 會停機,但事實上它將陷入迴圈;如果 H 輸出 0,說明 G 不會停機,但事實上它將停機。

圖靈機G執行流程

因此,不存在一臺圖靈機,可以判定任意圖靈機是否會停機。

聽起來可能有點繞,其實可以理解為,G 就是故意針對圖靈機 H 的。你認為我是不永久的,我就一直永久;如果你認為我是永久的,我就退出;也就是說,你是無法判斷我是否會停機的。這說明了不存在這樣的圖靈機,能夠判斷停機問題。

更多可以參考如下部落格:

如何通俗地解釋停機問題(Halting Problem)?https://www.zhihu.com/question/20081359/answer/22043224

停機問題、Chaitin 常數與萬能證明方法:http://www.matrix67.com/blog/archives/901

深遠影響

圖靈的工作參透了數學和計算機的本質關係——計算機是為解決數學問題而誕生的,卻又基於數學,因而數學自身的極限也便框定了計算機的能力範圍。

圖靈雖然證明了沒有任何機器可以解決所有數學問題,卻也證明了機器可以完成所有人類能完成的計算工作,從如今的應用看來,後一個結論的意義重大得多。

如今的所有通用計算機都是圖靈機的一種實現,兩者的能力是等價的。當一個計算系統可以模擬任意圖靈機(或者說通用圖靈機)時,我們稱其是圖靈完備的(Turing complete);當一個圖靈完備的系統可以被圖靈機模擬時,我們稱其是圖靈等效的(Turing equivalent)。

圖靈完備和圖靈等效成為衡量計算機和程式語言能力的基礎指標,如今幾乎所有的程式語言也都是圖靈完備的,這意味著它們可以相互取代,一款語言能寫出的程式用另一款也照樣可以實現。

相關文章