0 符號、演算、與抽象化

0.3 抽象化

如前所述,我們解決問題的第一步是以符號將它表達出來。這一步稱作「抽象化(abstraction)」,通常是較難的一步。

例 0.1

Mary 有的蘋果數目是 John 的兩倍。Mary 發現她的蘋果中有一半已經壞掉了,於是丟了它們。John 則吃了一顆蘋果。現在 Mary 有的蘋果數目仍是 John 的兩倍。請問他們最初各有多少顆蘋果?

你會如何解這問題呢?如果回到第一原則,我們也許可以一步步嘗試:試試看 John 最初有一顆蘋果,Mary 有兩顆的情況是不是合理解答,然後試試看 John 有兩顆,Mary 有四顆的情況... 這是在語意上解問題。就如同我們解騎士與惡棍問題時用窮舉法一樣。

但許多人也許會用代數:把 Mary 最初的蘋果數目用$m$表示,John 的蘋果數目用$j$表示,寫成這樣的式子:

接下來,用高中程度的代數方法,就可以找出$m$和$j$的值了。

代數方法是純粹基於語法的技術:我們觀察式子的結構,決定該怎麼作(例如把第二個式子乘以二,兩式相減;或著把$m$代換成$2j$),而不需記得$m$和$j$分別是什麼意思。

不需依賴「意義」在此是個重要的優點:這表示這套代數方法和特定問題的意義無關,可應用在許許多多場合。可用來解這個問題,也可用來解雞兔問題... 只要能把問題表示成代數式子,就有一個機械化、不需費神思考的解法。

從「Mary 有的蘋果數目是 John 的兩倍... 」到$m = 2j; m/2 = 2(j-1)$的轉變是一個「抽象化」。抽象化在此的意義是將不重要的資訊拋棄,只『抽取出』此問題中最關鍵的元素。由於此處我們的目的是找出「Mary與John最初各有多少顆蘋果」,我們可猜想關於數字的資訊(例如 $m = 2j$)是重要的,並猜想其他的一些資訊(蘋果是壞掉還是被吃掉了?兩人丟/吃蘋果的先後順序?)可能是不重要的。因此我們決定只留下關於數字的資訊,並幸運地確實靠此解出了問題。

電腦是個只會處理符號的機器。實體世界的問題之所以能用電腦來解決,仰賴的就是「抽象化」這一步。有人說,整個計算科學就是關於抽象化的學問。

日常用語中,當我們說某事物「很抽象」,通常意味該事物模糊而難以理解。在計算科學中,「抽象」的事物才是最關鍵、最確實、最該把握的。我們前面才說過「數學符號讓事情變容易」,現在又說「抽象過的事物是最確實的」。看來學程式語言久了,讓我們越來越難與常人溝通。最後只好離群索居,躲到騎士與惡棍之島上捉弄來訪的遊客囉!