圖靈機不可判定問題

一. 圖靈機簡介
       圖靈機(Turing Machine)有有限個狀態。其中一個狀態是開始狀態。這些狀態的一個子集是接受狀態,還有一個子集是拒絕狀態。接受狀態子集和拒絕狀態子集不相交(不能有一個狀態既是接受狀態,也是拒絕狀態)。

       有一個字符集Σ,圖靈機以Σ上的字符串ω作爲輸入(ω∈Σ*,Σ*是一個集合,它的元素是:由0個或多個Σ上的字符組成的有限長度的字符串)。圖靈機還有一個字符集Γ,是”帶“(tape)字符集。Γ包含Σ中的所有字符,還必須有一個Σ中沒有的字符,就是空白字符。圖靈機的帶(tape)上一開始默認都是空白字符。圖靈機的帶,是一個無限長的帶子,分成一個個的單元格,每一個單元格上寫一個字符(初始都是空白符)。圖靈機有一個讀寫頭,總是位於帶的某一個單元格之上。讀寫頭對當前的單元格進行讀寫。讀寫頭可以順着帶子左右移動,但一次只能移動一個單元格。Γ就是圖靈機可以向帶子上寫的字符的集合。

       圖靈機的動作是這樣的:根據當前所處的狀態和當前讀到的字符,在當前單元格上寫下一個字符,向左或右移動一個單元格,進入另一個狀態(對於這些動作的規定,就是圖靈機的轉移函數δ)。一開始,將輸入字符串ω(ω∈Σ*)放在帶子上,把圖靈機的讀寫頭對準ω的第一個字符,並讓圖靈機處於開始狀態。然後圖靈機就開始一步一步地運行:讀字符、寫字符、移動讀寫頭、進入新狀態,然後再重複......直到圖靈機進入某一個接受狀態,這時圖靈機停機並接受ω。圖靈機也有可能進入一個拒絕狀態而停機,這種情況下圖靈機拒絕ω。除了這兩種情況,還有第三種情況:那就是圖靈機永遠不會停機。圖靈機既不進入接受狀態,也不進入拒接狀態,而是一直運行下去。後兩種情況,合稱圖靈機不接受ω。

       所以,對於Σ*中的一個字符串ω,這個圖靈機要麼接受它,要麼不接受它。圖靈機不接受ω,有可能是圖靈機拒絕ω,也有可能圖靈機不停機。一個圖靈機接受的所有字符串構成的集合(是Σ*的一個子集)作爲一個語言(字符串集合即爲”語言“),就是這個圖靈機”識別“的語言。

       有一類圖靈機,它們對於任何輸入字符串ω都停機(要麼接受,要麼拒絕。兩者必居其一)。這類圖靈機被稱爲判定器。被判定器識別的語言稱作被這個判定器”判定“(這類語言稱作”可判定語言“)。如果把識別一個語言作爲”計算“的通用模型(這點以後說明),那麼判定器就是可以明確地給出計算結果的圖靈機。要麼”是“,要麼”不是“。

       一個圖靈機的“程序”,就是固化在它的狀態集以及轉移函數δ中的“動作”。但也可以構建一個”通用圖靈機“,它的輸入字符串是一個”序列化“了的圖靈機M和一個字符串ω。”通用圖靈機“在字符串ω上模擬圖靈機M的行爲,產生和M一樣的結果(接受、拒絕或不停機)。一個圖靈機只有有限個狀態、有窮字符集Σ和帶字符集Γ,以及定義域和值域都是有窮離散集合的轉移函數δ,所以只要約定好了格式,一個圖靈機就可以用一個字符串來描述(序列化成了一個字符串)。”通用圖靈機“有點像可存儲程序的馮.諾依曼計算機。

二. 計算、算法與圖靈-邱奇論題
       你也許會覺得:圖靈機是幹嗎使的?答案:計算。那什麼是計算?圖靈機乾的事情就是計算。那2×3=6圖靈機能算麼?如果你把"aa|aaa"作爲輸入字符串ω提供給某個圖靈機,這個圖靈機停機,並在帶子上留下aaaaaa。你給了它2個a和3個a,它給了你6個a,它不就是計算了2×3=6麼。

       這裏對”圖靈機編程“不做詳細介紹了。總之圖靈和邱奇證明,任何有步驟的、確定的計算過程,都可以由圖靈機實現。任何可執行計算的裝置:算盤、珍尼紡紗機、超級計算機等等,都可以由一臺圖靈機模擬。也就是說:任何計算裝置,都無法超過圖靈機的能力。圖靈機也就定義了計算和算法。

       一切計算問題都可以等價於字符串接受/不接受問題,也就是語言的識別(也許是判定)問題。也就是說一切”計算“,都可由圖靈機進行。

三. 圖靈機不可判定問題
       上面說,有些語言(字符串集合)可被一個判定器(總會停機的圖靈機)判定(識別)。給一個字符串ω,這個判定器得出結論:ω是否屬於這個語言。這些語言是”可判定“語言。那麼是否存在不可判定語言?也就是是否存在一個語言,不存在一個判定器可以判定它?答案是”是“。設想下面的語言:

       A = {(<M>,ω) | <M>是表示圖靈機M的字符串,ω是一個字符串。M接受ω}

       也就是,語言A中的字符串都有兩部分組成:第一部分是一個圖靈機M的字符串表示<M>;第二部分是一個字符串ω。且M接受ω。

       假設語言A是可判定的,也就是存在一個判定器H。當M接受ω時,H接受(<M>,ω);當M不接受ω時,H拒絕(<M>,ω)。(注意H是一個判定器,它總會停機,接受或拒絕(<M>,ω))。那麼我們對H稍加改造,將它的結果取一下反:當M接受ω時,H拒絕(<M>,ω);當M不接受ω時,H接受(<M>,ω)。這很容易,只要把H的接收狀態和拒絕狀態互換一下身份即可。

       然後我們可以再對H做一個變化,它的輸入字符串僅僅是一個圖靈機M的序列化字符串<M>,餵給這個M的輸入不再是某個字符串ω,而就是字符串<M>本身。那麼H的行爲就變成了:輸入給它一個表示某個圖靈機的字符串<M>。把<M>當做給圖靈機M的輸入,若M接受<M>,則H拒絕<M>;若M不接受<M>,則H接受<M>。

       精彩之處到了:若把H自己的序列化字符串<H>提供給H會發生什麼?當H接受<H>時,H拒絕<H>;當H不接受<H>時,H接受<H>。理髮師悖論。唯一的結論只能是,H不可能存在。就是說對於語言A,不可能構造一個判定器去判定它。A是不可判定語言。不可判定語言是存在的。

  再換一種方式說一遍(不帶任何符號,爭取用話說明白):假如存在一個判定器(還記得判定器麼?就是總會停機的圖靈機,要麼接受,要麼拒絕,反正不會不停機),以一個圖靈機的描述(也是一個字符串)和一個字符串作爲輸入。它可以判定這個圖靈機是否接受這個字符串,也就是:這個圖靈機接受這個字符串,我這個判定器就停機接受;這個圖靈機不接受這個字符串,我這個判定器就停機拒絕。(注意我這個既然是判定器,它就能做到上邊說的)。那麼以這個判定器爲基礎,就可以構造另一個判定器,這個判定器只拿一個圖靈機的描述(一個字符串)當輸入,然後把這個描述本身當做給這個圖靈機的輸入,判斷這個圖靈機是否接受它自己的描述:它接受,我判定器就停機並接受;它不接受,我判定器就停機並拒絕。然後以這個判定器爲基礎,再改造一下。這次改造簡單,只是把接受和拒絕反一下:判定器的輸入是一個圖靈機的描述(一個字符串),然後判定這個圖靈機是否接受它自己的描述:它接受,我判定器就停機且接受;它不接受,我判定器就停機且拒絕。沒問題吧。好!現在把我這個判定器自己的描述輸入給它,它將如何?它將在自己接受自己的描述時拒絕自己的描述;在自己不接受自己的描述時接受自己的描述。悖論了!

       如果存在不可判定語言,那麼必然存在不可識別語言。就是無法構造一個圖靈機,接受這個語言的每一個字符串(用不着拒絕每一個不屬於這個語言的字符串,因爲這裏說的是識別,而不是判定)。因爲:如果一個語言L和它的補^L都是圖靈機可識別的,那麼L是可判定的。證明:設識別L的圖靈機是M1,識別^L的圖靈機是M2。構造圖靈機M,它在字符串ω上交替地一步一步地模擬M1和M2。因爲一個字符串要麼屬於L,要麼屬於^L,也就是對於一個字符串ω,要麼M1進入接受狀態,要麼M2進入接受狀態。於是M總會看到M1或M2(之一)進入接受狀態。如M1進入接受狀態,則M停機並接受ω;若M2進入接受狀態,則M停機拒絕ω。那麼M就成了語言L的一個判定器。所以如果一個語言不可判定,必然它或者它的補是不可識別的。不可識別語言是存在的。

       一個不可判定的語言,就是一個不可計算的問題。那是一個超出了計算機能力的問題,一個不能被任何有步驟的、確定性的算法所能解決的問題。那是什麼樣的問題?也許是女人心吧。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章