0 符號、演算、與抽象化

0.2 讓符號為你工作

回顧看看,我們方才解各種「騎士與惡棍」問題的方法都分為兩個步驟:第一步先把情況以一組符號描述出來,第二步則是依照這些符號的規則下去推演。理想上,第二步比第一步容易,因為我們在進行推演時已不用回頭去思考這些符號的意思,只需照著符號本身的規則不加思索地推演。這麼的好處是能減輕我們思考的負擔。

探究怎樣的符號組成是合法的、一組合法的符號能否經由給定的規則轉換成另一組符號,是語法(syntax)層次上的問題。問這些符號的「意思」是什麼,則是語意(semantics)的層次。以騎士與惡棍問題為例,如果我們回到第一原則去窮舉「如果A是騎士,B也是騎士.. 如果A是惡棍,B也是惡棍 .. 」等等種種可能,這是在語意上思考。至少對這個問題來說,語意上的解法不僅較繁瑣,也只能用來回答「某人是騎士還是惡棍」類型的問題,而難以用來推演出「該如何問老人,才能得知山洞中是否有黃金?」。上一節的解法則是利用語法幫助我們:將問題寫下,利用交換律、結合律等等規則時,我們其實沒有回頭去思考「等等,這個式子是什麼意思?」但在符號的幫助之下,我們以更簡潔的方式解了許多個問題。

再舉一個「以符號思考」的例子:你會如何算 28 * 18? 如果你的思路是「28乘以19是10個28加上8個28,而10個28是280,8個28是... 10個28減掉2個28!」那麼這種思考方式比較接近語意上的。你不斷在思考這個式子「代表什麼」,並試圖尋找較簡單的捷徑。如果你拿起紙筆,甚至在心中畫出了這樣的符號:

       28
    *  17
    -----

然後開始照背誦的九九乘法表去推演,此時你用的是語法式的解法。你也許不會思考許多,只以熟悉的規則推著演算的進行。以乘法而言,這兩種作法各有用處。但不可否認地,這套語法式解法的存在使我們可安心地把乘法當作已經解決的問題:我們可以不用思考地作乘法。

許多人見到數學符號就覺得難。事實上,數學符號是發明來簡化問題的。符號與符號之間的規則讓我們可僅用語法、不需在語意上思考,我們因而可把腦力用在更難的問題上。大家看到數學符號就覺得難,其實正是因為它們常被用在不靠數學符號就難以解決的難題上。難的是這些問題,而符號給了我們解決它們的能力。

這一切和程式語言有什麼關係呢?因為,一套好的程式語言就是一套設計良好的符號。它能幫助我們描述問題,並找出解決問題的方法。一些程式語言學者提出的口號「讓符號為你工作(let the symbols do the work!)」恰好地描述了這門學問的精神。