艾倫·馬西森·圖靈是一位非凡的數學家、計算機科學的先驅者、破譯納粹的著名密碼謎的關鍵人物。 1952年 2月,他以「粗野的下流言行,觸犯了1885年刑事法修正條例第八條」的罪行,在英國曼徹斯特市被捕。在此之前不久,圖靈的家被盜,盜竊犯是他的朋友阿諾德·默里,一位19歲的無業青年,圖靈與他曾有過性關係。當圖靈向警察報告盜竊案時,曾把他與默里的關係告訴了警察,他天真地認為,皇家委員會即將使同性戀合法化。兩個月後,他因6次進行性騷擾受到審訊,並因總共 6次的性騷擾被判有罪,將送往監獄。他接受定期服用兩性化女性激素藥物的方案,進行「有機療法治療」,因此給他一年緩刑。1954年6月7日,41歲的圖靈吃了半個浸在氰化物溶液中的蘋果自殺。①
在人工智慧領域,圖靈取得了基本概念方面的兩項不朽成就:圖靈檢驗法和圖靈計算機。圖靈檢驗法是他確定計算機能否思考的方法。檢驗要求把計算機和任意選出的人與提問者分開,提問者要通過中間物向他們提出數量不限的問題。圖靈認為,如果提問者未能區別兩者之間是計算機還是人,那麼就意味著計算機正在思考。換句話說,如果計算機被認為是有智能的,那麼它就是智能型計算機。
要對圖靈通用計算機的概念進行解釋,需要一些基礎概念。當圖靈在英國劍橋大學時,1935年他就是在那裡成為英國皇家學院的一名研究員,他受到了物理學革命性發展的影響,該發展推翻了因果律和決定論的傳統概念。按照牛頓的世界觀,如果在自然體系方面掌握了足夠的知識,那麼整個未來都將是可以預測的。
1795年,法國數學家、同時又是牛頓迷的皮埃爾-西蒙·拉普拉斯是這樣論述智能的:「假如某一時刻有一種智能,這種智能可以包含所有的力量,並由此使自然界生氣勃勃,而且使組成自然界的各種生命都有各自的位置——智能的強大足以使許許多多數據服從於分析——它可以使最大物體的運動與最輕原子的運動都包含在同一公式之內;對於智能來說,沒有不能斷定的事物,而且未來也和過去一樣,都將出現在其眼前。」
然而,本世紀初,量子力學的提出,使未來完全根據現在和過去來決定的說法宣告結束。在30年代,由於量子力學,特別是由於觀察者總是影響著觀察結果的原理,使哲學界發生了大混亂,而英國劍橋大學正處在這種混亂的中心。圖靈發現這種概念是不穩固的,而且他也被引向數學,因為看來它所涉及的是絕對的實體,與觀察者無關。正如劍橋大學數論學家G.H.哈迪所說的,317是一個素數,不是因為我們想它是個素數,或者說我們的想法是以某種方式而不是另一種方式形成的,而是因為它就是一個素數,因為數學的實體性就是那樣建立的。
圖靈致力於解答某個疑難問題的工作,該問題切中了數學實體性的本質核心:是否有一機械方式確定數學中任何已知語句是正確的還是錯誤的?為了回答這個問題,他終於提出了「通用計算機」,即圖靈計算機的概念,這種概念可以例行地回答數學的問題。圖靈引入了能夠運算數學的計算機概念,目的在於強化數學作為與人類事物無關的學科的地位。然而可笑的是,圖靈發現,數學的某些問題是不能由計算機或人用機械的方法來解題的,例如,涉及非重複小數的數產生問題。
圖靈計算機是一個非凡的概念。不過從其一系列性能的觀點來看,它卻是非常有限的。即使你對計算機的程序設計一無所知(或許整個主題會使你吃驚),但圖靈計算機的如此有限性能,也會使你很快地理解它的「內部」工作情況,從而高興地為它編寫程序。然而,從計算的觀點看,它是能夠進行任何運算的,換句話說,數學家能夠進行的任何運算,想像的最大功率計算機也能夠進行運算。如果說,這種說法不是相當驚人的話,那麼讓我再隱晦地補充一句:圖靈計算機,不管它叫什麼名字,不一定是一部計算機。它可以是一個人或一組人。
那麼,這種圖靈計算機的基本原件是什麼?首先,它有一條長帶,設想它是一條窄窄的紙帶,紙帶上劃有許多豎線,把它分成許多方形單元。
如果已知某單元不是空白的,那麼它就含有有限字母符號中的某一種符號。圖靈計算機,能夠一次掃描紙帶的一個單元,通常都是從含有符號的最左邊單元開始。如果所掃描的單元是空白的,那麼計算機就會讓單元的空白留下,或者在單元中列印一個符號。如果所掃描的單元含有符號,那麼計算機就可以讓單元的符號留下不變,擦掉該符號並在該符號的位置上列印另一個符號,或者擦掉該符號並讓單元留下空白。然後計算機停機,或者立即掃描到左邊或右邊的單元。
計算機對所掃描的單元要做些什麼,下一個要掃描的是兩個相鄰單元的哪一個,這取決於計算機的狀態或內部構形,狀態數與符號數一樣,必須是有限的。計算機的狀態像一種思維狀態,即計算機在「思維」些什麼。要了解圖靈計算機的運算,用不著對其狀態的本質進行精確的、形而上的思考(或更抽象定義)。計算機的「程序表」規定了計算機對於符號與狀態的每一種可能組合將要做出的反應。
舉兩數相加一例,將會非常清楚地闡明這些抽象概念。假定我們以「一元」的記號寫出一些數字,其中整數 n用一串 n個*號來表示,在n個相連的單元內每單元一個*號。據此,**號表示2,*****表示5。一元記號的優點是只有一種符號*號,不需要10個不同的數字來表示任何已知的正整數。若要2加5,只要把**號和*****號列印在紙帶上,它們之間有一個空白單元,這樣兩串*號就可以區別開。
帶有圖解的程序表說明了計算機如何進行兩數相加的運算。但在討論程序表的特點之前,先要概括地描述加法的過程。聰明的計算機先找到兩個數之間的空白單元,在空白單元列印一個* 號(那麼在紙帶上留有一串的8個* 號),而後繼續下去,找到一串* 號的結束單元,並擦除掉最後一個* 號。這樣,在紙帶上就留有*******號,按一元記號,它就是7,即2加5的和。
現在讓我們再來看程序表。計算機的狀態通常列在最左邊的一欄內。在這個程序表內,共有3個狀態,編號分別為0、1和2。符號(和表示空白單元的詞「空白」)通常橫列在程序表的上方。在這個表內只有一個符號*號。
計算機在0狀態中開始,按照慣例,掃描紙帶上最左邊的符號(換句話說,掃描**號中的第一個*號)。程序表描述了計算機如何運算狀態0與符號*號的組合。計算機讓符號留下不變,掃描到右邊的下一個單元,並停留在狀態0中,那麼,計算機如何運算這個單元?由於計算機仍然處在狀態0中,而且單元中的符號還是一個*號,計算機仍按前面所述進行運算:只讓符號*號留下,掃描到右邊的下一個單元,並停留在狀態0中。
現在換到空白單元。程序表中狀態0與空白符號的組合說明了計算機是如何進行運算的。它列印了一個*號,再掃描到右邊的下一個單元,即進入狀態1。這時,這個單元中還是一個*號,而狀態1和符號*號的組合就描述出計算機的行為:掃描到右邊的下一個單元,並停留在狀態1中。這個步驟要重複4次,因為每次都是一個*號繼續出現。當計算機掃描到一串5個*號結束處的空白單元時,它會回到左邊的一個單元,並進入狀態2。這個單元中有一個*號,計算機會擦掉它。然後計算機停機,處於一種完成狀態。這種方法的作用是:相同的程序表都可以生成任何兩數的和,無論數的大小如何,只要以一元的記號寫出,兩數間有一個空白單元,就能算出。在狀態0,計算機只是掃描第一個數的每個單元,一直掃描到空白單元,再在其上列印一個*號。在狀態1,它則是掃描第二個數的每個單元,直到空白單元,再回掃,並停留在最後一個*號的單元上。在狀態2,它只是擦掉這個*號。於是,紙帶上就立即有了答案。
這種加法是眾所周知的有限數法,因為程序表包括數量有限的狀態和數量有限的符號。然而這種有限數法卻可以生成範圍無限的數。圖靈計算機要運算可以想像的任何數之和,紙帶的長度就必須是無限的,也就是說,如果紙帶僅有1,000個單元長,而它就不能運算大於1,000的數。
在圖靈計算機用這種方法完成兩數相加的運算時,紙帶將只有答案,而沒有原來的兩個數。如果有人試圖編寫一個帶有原來兩數的程序表,那麼他一開始就應該想到,圖靈計算機需要「計算」在兩串*號中的8個*號。然而令人感到意外,圖靈計算機不能進行這種計算。設想它掃描第一個*號時,就會跳入狀態1。每當它掃描另一個*號時,就會跳入下一個狀態。這樣下去,在它掃描第五個*號後,計算機就已處在狀態5中,掃描第二十三個*號之後,就處在狀態23中。看來用這種方法,圖靈計算機似乎能夠計算任何