《圖靈的祕密》可計算數的證明 寫給程式設計師看的數學

袁野發表於2012-12-17

圖靈構造了虛擬的圖靈機並且通過圖靈機證明了:圖靈機本質上會被限定在它能做的事情中。

圖靈在論文的引言中就指出了,雖然可計算數很多,並且在很多方面與實數相似,但是本質上它是可數的。(這裡指的可數是指可數的無窮)。在圖靈機的構造中,圖靈首先是使用了一系列的符號來標誌各種操作,然後將各種符號對映成單獨的數字,從而將各種命令的組合轉換成了一個整數,也就是描述數。圖靈通過證明每個可計算序列都至少對應著一個描述數(至少一個是因為一個可計算序列可以通過不同的命令序列來計算),但並不存在著一個描述數對應著多個可計算序列。因此既然整數是可數的,而可計算序列又和描述數存在著一對多的關係,那麼可計算序列也是可數的,即可計算數是可數的。另外,作為延伸,由於可計算數是可數的,但是實數是不可數的,所以我們可以說實數中存在著很多不可計算的實數,而這些不可計算的實數並不是我們在傳統意義上所說的超越數。因為其實圖靈機是可以計算某些非隨機(數字排列上有著一定規律)的“超越數”。

這裡插一條與圖靈論文無關的文字:圖靈機並無法計算數位完全隨機的“超越數”,因為計算機軟體本身並無法實現完全的隨機,而只能生成偽隨機序列。那麼如果要生成數位完全隨機的超越數,只能通過RNG(硬體隨機數生成器),來通過環境噪聲或者量子過程來產生隨機數,如果我們定義一個圖靈機來複制RNG,這時我們則需要定義不可數的狀態格局,這也並不滿足圖靈機的意義。但是以上的可計算數有個小問題。先回顧下什麼是可計算數?如果存在一個演算法,能夠給出小數點後任意位數的數字,我們就說這個數是可計算數。而之前我們基於的前提假設是可計算數的數位是非隨機的,但是其實也許大多數實數的隨機性只是一個幻想,比如,PI的數位看起來是隨機的,但是PI本身卻是可計算的(簡單來說我們可以寫出一段程式,來計算出PI的任意位數的值),也許表現出隨機性的實數只是因為我們還並未發現其底層的數字結構,也就是說,存在著我們表面看起來“隨機”的可計算數。(其實書中把這一段插進去太坑了,而且不知道是翻譯的問題還是原書的問題,這段的文字表意是有很大的誤導性的)

圖靈整篇Paper的終極意義並不在於證明可計算數是否可數,而在於證明可判定性是否成立。於是圖靈其實只是把“可計算數可數”這一論段作為了證明可判定性的一個前提因素。接下來圖靈從對角線方法切入這一命題,與康托爾證明實數不可數的方法一樣,圖靈用同樣的方式來證明可計算數也是不可數的。但是?不可數麼?圖靈給出了反對的理由,這個證明的前提假設是錯的。

例如對角線方法在證明可計算數是否可數時,基於的前提假設是:

<1> 我們要列舉出所有的可計算數加在Beta序列裡。

<2> 我們要保證Beta序列裡的每一個“可計算數”都是可計算數。

回頭來看,因為圖靈對可計算數的定義是可以通過有限方法計算出來的數,所以一定存在著一個計算序列來標識這個可計算數。

所以為了計算Beta序列,需要存在著一種通用的方法來判斷特定的整數是否是非迴圈機的描述數,換句話說,也就是來構造出一個機器,這個機器的作用是判斷圖靈機是否是非迴圈的圖靈機,即用機器來判定機器。這樣,圖靈就把可計算數是否可數的問題轉換成了判斷是否存在機器來判定某個正整數是否為非迴圈機的描述數。

這裡我們再構造一個數字x,x的定義為從1開始列舉所有的數,對每一個數都判斷這個數是否是一個合法的描述數,如果是再判斷該描述數標識的圖靈機是否是非迴圈的;如果是則計算這個數直到第n位(n的意思是到目前為止,有多少個非迴圈機的描述數 + 1,我們再次賦給其一個符號R(n)),把該位的值賦給x的第n位。舉個例子:3 133 225 317是第一個非迴圈機的描述數,那麼R(n)=1+1=2,然後計算該描述數的第二位,發現為1,所以此時x = _1。

我們通過上面的描述可以簡單來說,如果機器B檢測描述數N,如果N是合法的,那麼R(N) = R(N-1) + 1,然後計算N的前R(N)位,否則R(N) = R(N-1)。

圖靈構造了三臺圖靈機,A負責生成描述數並且作為一個總的排程器,B負責判斷該描述數是否合法(即是否是非迴圈及的描述數),C負責根據合法的描述數執行命令。那麼A為了能夠讓B對其輸出作出檢查,則需要事先來得知並判斷B的標準描述,以防止自己的輸出不符合B的標準描述而讓B當機,而B的目的則是對A做出檢查,然後交給C執行。

由於我們對B的要求是能夠對N做出判定,所以B一定是非迴圈的(即能在有限的步數內對N做出一個確定可終止的輸出)。如果N是不合法的,那麼第N步終止。否則,意味著描述數為N的圖靈機是非迴圈的,因此第R(N)個數字是可以在有限的步數算出來的,於是當計算並將其寫入到x的第R(N)位後,第N步終止。所以A是非迴圈的,因為A只是生成一個數字,並且呼叫B,然後執行C。

所以A也是一臺圖靈機,也有著自己的描述數,那麼在執行該程式計算x的時候,一定會有一個時刻,A在處理自己的描述數,也就是說A需要來判斷自己是不是非迴圈的。 這是最重要的一步。我們來模擬下這個過程,在之前的步驟中,A生成並分析了從1到K-1的所有的正整數,並且得到了x的前R(K-1)位。現在用程式來模擬A做的事情是這樣的:

if check(k):
x = execute(k)
y = execute(R(k))
arr[y] = x
return arr;

這裡的問題就在於A一直在執行自己,那麼每一次都需要執行到計算R(k)的步驟上,而R(k) = R(k-1) + 1,所以就需要回頭重新計算R(k-1),所以這會是一個無限的迴圈。而之前我們又假設A是一個非迴圈機。所以這是矛盾的。

由此我們證明沒有一個通用的過程能判斷一個機器是否是非迴圈的。同理,也沒有這樣的機器,當給定了一個機器A的標準描述時,來判斷A是否列印過給定的符號。

本文轉自豆瓣網友:飛林沙,《圖靈的祕密》的筆記-可計算數的證明
原文連結:http://book.douban.com/annotation/23163928

相關文章