丹尼特(Daniel Dennett)在《達爾文的危險觀念》(Darwin’s Dangerous Idea, 1995a)中,提出這樣一種理解達爾文(Charles Darwin)偉大構想的方式:
地球上的生命,歷經數十億年,透過一種又一種的演算法過程(algorithmic process),在單一的分岔樹——生命之樹(Tree of Life)——上被生成出來。
那麼,演算法(algorithm)究竟是什麼?這個詞其實有好幾種彼此競爭的意義,而丹尼特採用的或許是其中最寬鬆包容的一種。
達爾文發現了演算法的力量#
演算法是一種特定的形式過程(formal process):只要它被「執行」或被具現化(instantiated),就能在邏輯上被保證產出某種特定結果。
演算法並不新,在達爾文的時代也不新。許多熟悉的算術程序都是演算法:
- 長除法、對帳結算支票簿
- 玩出完美井字棋的決策程序
- 把一串單字排成字母順序
真正相對新的,是二十世紀數學家與邏輯學家對演算法本質與力量的理論反思。正是這個發展催生了電腦,而電腦反過來又讓我們對演算法的力量有了更深刻、更鮮活的理解——也讓我們得以用寶貴的後見之明回看達爾文的發現。
「algorithm」一詞經拉丁文(algorismi)傳入早期英文(algorism,並由此誤成 algorithm),源自九世紀波斯數學家花剌子米(Mûusâ al-Khowârizm)之名。他關於算術程序的著作在十一世紀被譯為拉丁文。「演算法是一種萬無一失、某種意義上『機械式』的程序」這個觀念已存在數百年,但真正大致確立我們今日理解的,是圖靈(Alan Turing)、哥德爾(Kurt Gödel)與丘奇(Alonzo Church)在 1930 年代的開創性工作。
演算法的三個關鍵特徵#
丹尼特指出演算法有三個對後續論證至關重要的特徵,每一個都不太好定義。
基質中立性(substrate neutrality)#
長除法的程序用鉛筆或鋼筆、紙張或羊皮紙、霓虹燈或空中拉煙,都同樣有效,用你喜歡的任何符號系統都行。
- 程序的威力源自它的邏輯結構,而非具現時所用材料的因果能力。
- 唯一條件是:那些材料的因果能力必須允許規定的步驟被精確地執行。
底層的無心智性(underlying mindlessness)#
儘管程序的整體設計可能很精妙、或能產出精妙結果,但每一個構成步驟、以及步驟之間的轉換,都極其簡單——簡單到一個盡責的白癡、或一台直白的機械裝置都能執行。
標準教科書的比喻是:演算法就是一種食譜,設計來讓生手廚師照著做。
延伸案例:兩種食譜的對比
寫給大廚的食譜書可能會寫「用適當的酒把魚煨到快熟」;但同一過程的演算法版本可能是這樣開頭的:
「挑一瓶標籤上寫著『dry』的白酒;拿開瓶器把瓶子打開;在鍋底倒進一吋深的酒;把鍋子下的爐火開到最大;……」
這是把過程繁瑣地拆解成一個個蠢到極點的步驟,完全不要求照食譜做的人做出任何明智決定、細膩判斷或直覺。
保證的結果(guaranteed results)#
無論演算法要做的是什麼,只要執行時不出差錯,它總是能做到。演算法就是一份萬無一失的食譜。
從演算法到電腦,再到達爾文#
不難看出這三個特徵如何讓電腦成為可能。
每一支電腦程式都是一個演算法,最終由簡單步驟構成,而這些步驟能被某種簡單機制以驚人的可靠度執行。
電子電路是常見的選擇,但電腦的威力(除了速度之外)完全不歸功於電子在矽晶片上竄動的因果特性。同樣的演算法,可以由在玻璃纖維中推送光子的裝置更快地執行,也可以由一群人拿紙筆極慢極慢地執行。
而達爾文所發現的,其實並不是「一個」演算法,而是一大類彼此相關、他當時還沒有清楚辦法加以區分的演算法。