丹尼特(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)#

無論演算法要做的是什麼,只要執行時不出差錯,它總是能做到。演算法就是一份萬無一失的食譜。

從演算法到電腦,再到達爾文#

不難看出這三個特徵如何讓電腦成為可能。

每一支電腦程式都是一個演算法,最終由簡單步驟構成,而這些步驟能被某種簡單機制以驚人的可靠度執行。

電子電路是常見的選擇,但電腦的威力(除了速度之外)完全不歸功於電子在矽晶片上竄動的因果特性。同樣的演算法,可以由在玻璃纖維中推送光子的裝置更快地執行,也可以由一群人拿紙筆極慢極慢地執行。

而達爾文所發現的,其實並不是「一個」演算法,而是一大類彼此相關、他當時還沒有清楚辦法加以區分的演算法。