Good math,bad math是我最近發現的一個部落格。作者Mark Chu-Carroll寫的一系列關於電腦科學理論的文章深入淺出,通俗易懂,屬於茶餘飯後絕佳的消遣讀物。俺一直想寫點介紹lambda caculus的小文章,但看了他的“My Fravorite Calculus: Lambda”後,就打消了這個念頭。有這麼好的文章,轉貼就行了,自己就不用再寫不入流的文章。今天先轉介紹lamdba calculus的第一部分。先申明一下,俺的翻譯在不影響作者原意的基礎上(但願能做到到),有時也插科打諢加點8卦。如果誰覺得文章垃圾,完全因為俺水平有限。原文絕對精彩。另外,俺數學方面的術語止於大一微積分。所以術語用錯了,還請多多指正。
在電腦科學尤其是是程式設計語言領域,我們常用一種運算元:Lambda Calculus。邏輯學家也常用Lambda Calculus 來研究計算和離散數學結構的本質。其實當初Alanzo Church(就是丘奇-圖靈論點裡的那位丘奇老大了)和Stephen Cole Kleene(就是自動機理論裡Kleene Star那個Kleene了)推出這個Lambda Calculus,也是為了方便他們做邏輯方面的推理,好證明決定性問題。當然以Church和圖靈的天才,沒多久他們便證明圖靈機和lambda calculus具有等價的計算能力。Church提出Lambda Calculus時就懷疑他的理論能被用在其它地方。事實證明他的確高瞻遠矚。Lambda Calculus在編程的理論和實踐兩方面都意義深遠。做理論和做函數編程的且不說。就算是玩兒指令碼語言的老大們,也多半成天和lambda打交道。說來好玩兒,電腦科學理論的發展相當詭異。常常是邏輯學家為了推進邏輯理論提出一個理論,若干年後電腦科學家出於實際需求再“重新發現”一模一樣的理論。 比如說現在很多函數程式設計語言常用的Hindley-Milner類型系統,就是邏輯學家Roger Hindley 於1969年先發現,再由大名鼎鼎的牛人Robin Milner於1978年獨立提出。說遠了。Lambda Calculus本身有若干顯著優點:
- 它非常簡單。反正比圖靈機簡單。
- 它圖靈完備。也就是說,圖靈機能完成的計算,Lambda Calculus也能完成。
- 它易於讀寫。這點很重要。簡單就是力量。我們不可不記。
- 它的語義足夠強大,能讓我們用它來推理。
- 它的計算模型足夠強大
- 容易建立不同的變種,以便我們探索用不同的方式構建計算或語義時的特性
Lambda Calculus易於讀寫意義重大。正是這個優點催生了許多或多或少基於lambda calculus的極為優秀的程式設計語言:Lisp, ML, 和Haskell都在很大程度上基於Lambda calculus開發出來。
Lambda calculus建立在函數這個概念上。純粹的lambda運算元理論中,任何東西都是函數。除了函數外別無它物。不過我們可以用函數搭建出各種東西。其實我們可以從lambda calculus開始,從無到有搭建出整個數學的結構。
牛皮轟轟吧?我們就來看一下lambda calculus為什麼這麼神奇。對任何一個運算元理論來說,我們必須先定義兩個東西。一是句法(syntax),用來描述什麼運算式是合法的;二是一套規則,用來規定我們怎麼對錶達式作合法的符號操作。
Lambda Calculus句法
Lambda calculus 只有三種運算式
- 函數定義:在lambda calculus裡一個函數就是一個運算式,寫成
lambda x . <函數體>。意思是“一個函數,帶一個參數X,返回計算函數體後得到的結果”。這個時候我們說這個lambda運算式綁定了參數X。
- 標識符引用(identifier reference): 一個標識符引用就是一個名字。這個名字和包括這個引用的函數定義裡的參數同名。
- 函數應用(function application): 這個更簡單,把要應用的值放到函數定義的後面就行了。比如
(lambda x . plus x x) y
這麼簡單的定義能幹什麼囁?怎麼沒有多個參數囁?這個就是數學的魅力了。我們很快會發現,多個參數可以被等價的操作(所謂的currying)來代替。而配上簡單的操作後(本質操作就一個:替換),我們就得到了一門強大的程式設計語言,不輸基於圖靈機模型的Algo系列語言,比如C。
欲知後事如何,且聽下回分解。