Lisp之父約翰•麥卡錫——不走尋常路的常識邏輯學家

謝工在GitChat發表於2011-10-26

如果希望計算機具有一般的智慧,那麼其外在結構就必須基於一般的常識和推理。——約翰 · 麥卡錫

  程式設計師知道如何讓計算機進行演繹推理,因為其中涉及到的數學計算機能夠理解。但如果想讓計算機進行人類賴以生存的這種推測性的(而又常常正確的)常識推理,就得發明一種全新的數理邏輯。而這正是約翰 · 麥卡錫為自己設立的目標之一。

  麥卡錫的成名還有其他原因。他發明了人工智慧領域的首要語言Lisp(list processing,表處理),而且自其誕生之日起,就為程式語言設計提供了豐饒的思想源泉。同時,作為一名教學者和難題設計師,他在密碼學和平面性檢驗等亞學科領域激發了眾多電腦科學家的靈感。

  約翰 · 麥卡錫1927年出生于波士頓一個共產黨積極分子家庭,童年在四處奔波中度過。他的父親是一名愛爾蘭天主教徒,先後做過木匠、漁民和工會組織者,全家一直馬不停蹄地奔波,從波士頓搬到紐約,然後又搬到洛杉磯。他的母親是立陶宛猶太人,最初在聯邦出版社(The Federated Press)的通訊社當新聞記者,後來就職於一家共產主義報刊,最後成為了一名社會工作者。麥卡錫早年對科學的興趣與家庭的政治信仰密不可分。

  麥卡錫認為自己的青少年時期平淡無奇,但事實證明並非如此。在上高三時,他得到了一份加州理工學院的課程目錄,檢視了該校一年級和二年級的微積分課本。他買了這些書,完成了所有的練習題目。這使得他最終在1944年進入加州理工後得以免修頭兩年的數學課程。

  1948年,麥卡錫開始攻讀數學系的碩士學位。同年9月他參加了加州理工主辦的希克森腦行為機制研討會,大數學家、計算機設計大師約翰 · 馮 · 諾依曼在會上演講了一篇關於自複製自動機(self-replicating automaton)的論文,這是一種可以對自身進行復制的機器。儘管當時的與會人員並沒有明確地將機器智慧與人類智慧聯絡起來,但馮 · 諾依曼的講話卻激發了麥卡錫的好奇心。

  1949年在普林斯頓大學數學系作博士論文時,麥卡錫首次開始嘗試在機器上模擬人類智慧。

【我把有智慧的東西看做是一個有限自動機,與同樣是有限自動機的環境相連。我和約翰 · 馮 · 諾依曼見了面,他對此非常贊成,敦促我一定要把這篇論文寫出來。但最後我並沒有把這篇論文寫出來,因為我當時認為它還不夠成熟。】

  “自動機”模擬的是隨著時間從一個狀態轉入另一個狀態的機器。比如說,普通的手動變速箱汽車在駕駛員點火啟動之後會從“熄火”狀態轉入“空擋但啟動”狀態。如果駕駛員掛擋前進則轉入“啟動且掛一擋”狀態。而“互動式自動機”(interacting automaton)則是根據其自身的狀態以及它所觀察到的其他自動機的狀態決定從某個狀態轉入另一狀態。有些自動機是智慧的(可看做是自帶駕駛員),但並不是必須智慧。互動式自動機試圖在這兩種型別之間建立一種連續性的統一體。

  麥卡錫放棄了自己對利用自動機模擬人類智慧的首次嘗試。但在十幾年之後,當他從事情境演算(situational calculus)方面的工作時,有關於狀態和狀態轉換的思想將重新浮出水面。

  在這段時間中,麥卡錫始終沒有放棄製造一臺像人類那樣智慧的機器這一想法。1952年夏,普林斯頓大學的一個研究生傑裡 · 雷納(Jerry Rayna)向麥卡錫建議,可以找一些對機器智慧感興趣的人去收集一些該領域的文章。麥卡錫找的第一批人之一就是克勞德 · 夏農 ,“資訊理論”亦即通訊數學理論的發明者。夏農的理論最初用於遠端通訊,後被廣泛用於語言學、數學以及電腦科學等領域。

【夏農不喜歡華而不實的術語堆砌。他整理的卷宗為《自動機研究》(Automata Studies)。而其中收集到的文章讓我很失望。其中有關智慧的內容並不多。所以在1955年開始籌備達特茅斯計劃時,我希望開門見山,使用了“人工智慧”這一術語,目的是讓參與者們弄清楚我們是在幹什麼。】

  1956年在達特茅斯學院舉辦的夏季人工智慧研討會是電腦科學史上的一座里程碑。這項涉及10人、耗時2個月的雄心勃勃的研究計劃,其目標是(引自其提案)“基於‘我們能夠精確、全面地描述人類智慧中的學習以及其他特徵、並製造出機器對其模擬’這一構想,繼續闊步前進”。

  研討會的四位組織者——麥卡錫、馬文 · 明斯基 (當時還在哈佛大學)、納撒尼爾 · 羅切斯特 (IBM的傑出計算機設計師)和夏農——向洛克菲勒基金會申請了一筆資金支援,金額在今天看來幾乎少得可憐:主要組織者每人1200美元,再加上“外地與會人員的交通費”,總共7500美元。

  麥卡錫在提案中寫到,他將研究語言和智慧二者間的關係,希望能通過程式計算機能“進行棋類遊戲、並完成其他任務”。時隔40年後回憶起這次研討會時,麥卡錫以他特有的直率形容了自己當時的願景和期望。

【我為這次會議設定的目標完全不切實際,以為經過一個夏天的討論就能搞定整個專案。我之前從未參與過這種模式的會議,只是略有耳聞。實際上,它和那種以研究國防為名義的軍事夏令營沒什麼區別。】

  創造一臺真正智慧的機器是一個極為困難的過程。儘管這次會議在實質上並未解決任何具體問題,但它確立了一些目標和技術方法,使人工智慧獲得了電腦科學界的承認,成為一個獨立的、而且最終充滿著活力的新興科研領域。雖然大多數與會者在會後並未繼續從事該領域的研究,但另外那少數人中卻產生了一批在該領域影響深遠的成就。

  來自卡內基梅隆大學的艾倫 · 紐厄爾、赫伯特 · 西蒙和J · C · 肖(J. C. Shaw)描述了他們的第二代資訊處理語言(Information Processing Language,IPL 2)。這三位科學家致力於構建一種名為“邏輯理論機”的程式,用於驗證基本邏輯和博弈論中的定理。而為了做到這一點,他們設計出IPL 2這種程式語言以便於操作物件符號,例如象棋的棋子或者邏輯變數裡的真值。由於這種操作與針對數字的算術運算非常不同,他們提議使用一種所謂的“表結構”。

  讓我們冒昧地借用《愛麗絲夢遊仙境》來說明如何利用表來進行符號處理。假設柴郡貓告訴愛麗絲“不是我瘋了,就是帽匠瘋了”。我們用C、H、A代表三種觀點,分別是柴郡貓瘋了、帽匠瘋了和愛麗絲瘋了。貓之前的那句宣告可以用表的形式表示為(or C H)。然後貓又告訴愛麗絲“不是你瘋了,就是帽匠瘋了”。聰明的愛麗絲會把這個宣告和之前的那個一起表示為(and (or C H) (or A H))。最後貓又說“我們三個中只有一個瘋了”。也就是說,至少有兩個沒有瘋。愛麗絲可以將其表示為(and (or C H) (or A H) (or (and (not A) (not C)) (and (not A) (not H)) (and (not C) (not H))))。

  把這些宣告表示成表的形式之後,我們就可以定義一些表操作的規則,例如(and (or X Y) (or Z Y)) = (or (and X Z) Y)。也就是說,如果不是X成立就是Y成立,而且不是Z成立就是Y成立,那麼不是X和Z都成立,就是Y成立。應用這樣一些規則,我們就能得出結論(and H (not C) (not A))。那麼,根據柴郡貓的說法,只有帽匠瘋了。

  通過表來進行邏輯推理的優點在於,在推理的過程中表可以擴充套件、收縮和重組。此外,我們可以用同一種形式表示規則和資料。在研討會大多數與會者們看來,表操作無疑是這次的贏家。達特茅斯會議的另一項成就是馬文 · 明斯基關於構建幾何定理證明機的提案。明斯基在紙上試驗了幾個例子,認為證明幾何定理可能是對紐厄爾和西蒙提出的基於規則的方法的,一種很好的應用。IBM公司的赫伯特 · 格林特(Herbert Gelernter)和納撒尼爾 · 羅切斯特決定去實現這個程式。格林特日後又開發了一種幫助有機化學家合成新化合物的工具,他的兒子大衛 · 格林特(David Gelernter)是並行程式設計和醫學人工智慧領域著名的研究者及設計者。麥卡錫身為這個定理證明專案的顧問,有機會為智慧行為編寫程式。

【格林特和他的助手卡爾 · 格貝里希(Carl Gerberich)採納了我的建議,以Fortran為藍本設計了FLPL——Fortran表處理語言(Fortran List Processing Language)。其中也加入了一些他們自己的想法。】

  1956年,約翰 · 巴科斯和他在IBM的團隊釋出了首個高階程式語言Fortran,將從事數字運算的程式設計師從為每一臺計算機寫組合語言中解放出來。直到今天,Fortran仍然是科學和工程計算中的通用語言。FLPL首次嘗試了擴充套件Fortran的符號操作能力。1958年夏天在IBM工作時,麥卡錫試圖用FLPL為自己在高中時常用的代數微分應用寫一個表程式,但很快發現需要用到遞迴條件表示式 ,而Fortran卻不支援遞迴。

【如果Fortran支援遞迴,我就能用FLPL做下去。我甚至也考慮瞭如何往Fortran中加入遞迴的問題,但是那樣做過於複雜。】

  事實證明,IBM很快就失去了對人工智慧的興趣。一些客戶認為智慧機器可能會威脅到他們的工作崗位,因此20世紀60年代初期的IBM市場營銷都把計算機說成是非智慧的快速運算裝置,百依百順、只按要求行事。

  麥卡錫不再糾纏於修補Fortran,而是轉頭發明瞭Lisp。紐厄爾、肖和西蒙後來把IPL形容為一種越變越複雜的語言,而麥卡錫則把他的Lisp形容為一種越變越簡單的語言。

  “Lisp”是“list processing language”(表處理語言)的縮寫。確如其名,Lisp中所有的資料都用表來表示。這些表都被包含在圓括號中。比如說,(Robert taught Dennis)可能就是表示“羅伯特教丹尼斯”這個句子的一個表。在這種情況下,順序是很重要的,因為它指明瞭是誰在教誰。

  而(apple tomato milk)則可能表示一個購物清單。在這種情況下,順序就不重要了,因為這三種商品可以按任意順序購買。上述這兩個例子中,表都包含了“原子”(atom)作為元素。原子和表不同,是Lisp中最小的符號單位,不包含其他任何組成部分。而表還能夠包含(而且一般都會包含)其他表作為組成部分。比如說,(Robert taught (Carol and Dennis))反映了句子的語法結構,其中的圓括號指明卡羅爾和丹尼斯都是動詞“教”的物件。再比如,(times 6 (plus x y))表示6 × (x + y)。這裡的順序也很重要,而且圓括號表明x和y是一起的。

  通過這種方式,表不僅能夠表示構成科學和工程的標準數學結構,還能表示構成語言的語句結構。

  從一開始,麥卡錫就擁有一個熱情高漲的合作者團隊。

【當我在1958年秋天回到麻省理工的時候,我和明斯基有了一個大工作室、一臺鍵控打孔機,此外還配備了一名祕書、兩個程式設計師和六個數學專業的研究生。我們是在春天時向傑裡 · 威斯納(Jerry Wiesner)申請的這些,理由是為我們的人工智慧專案做準備。

我們連書面提案都沒準備,申請就得到了批准。很幸運,當時麻省理工的電子研究實驗室剛剛與美國軍方簽署了一份無限制的雙向合作協議,而相應的資源還沒有到位。我想這種靈活的資源調配正是美國的人工智慧研究起步領先於其他國家的原因之一。紐厄爾-西蒙的研究之所以能進行,也是由於美國空軍在當時向蘭德公司提供了彈性的支援。】

  隨著工作的深入,麥卡錫希望改進這種語言的表達能力。1959年,為了展示Lisp可以明確地表達任何可計算函式,他加入了一個叫做“求值”(eval)的功能。

  “求值”允許程式定義新的函式或者過程(procedure),然後將其作為程式的一部分執行。而大多數語言在執行新函式之前都會強制程式中止執行,並且“重新編譯”。由於求值函式可以帶動並執行任何函式,它扮演了一種“通用圖靈機” 的角色,是其他計算機的通用模擬器。

  求值概念具有非常實際的意義。比如說,由於國際金融市場時刻都在變化,股票交易所必須每週7天、每天24小時不停地提供計算服務。如果有人寫了一個程式,可以用新的方法分析路透社的股票資料,股票經紀人很可能希望馬上就使用它,但又絕不想中斷自己機器的使用。求值讓這一切成為可能。(未完待續)

  • 本文摘自即將出版的《奇思妙想:15位計算機天才及其重大發現》一書,譯者向怡寧。

相關文章