1970年 ACM圖靈獎講座 電腦科學中的形式與內容 MARVIN MINSKY Massachusetts Institute of Technology, 劍橋,麻薩諸塞州 摘要:過度關注形式正在阻礙電腦科學的發展。文中討論了形式與內容的混淆在三個領域的表現:計算理論、程式語言和教育。 關鍵字和短語:教育、程式語言、編譯器、程式理論、啟發法、基礎教育、電腦科學課程、自我擴充語言、「新數學」 CR 分類:1.50, 3.66, 4.12, 4.29, 5.24

當今電腦科學的問題在於過度關注形式而非內容。

不,這不是一個好的開頭方式。按照任何先前的標準來看,電腦科學的活力都是巨大的;還有哪個知識領域能在二十年內進步如此之遠?此外,計算理論或許以某種方式包含了形式科學,因此這種關注也並非完全錯位。儘管如此,我仍將論證過度關注形式正在阻礙我們的發展。

在進入正題之前,我想記錄下我的同事、學生和我從這項圖靈獎中獲得的滿足感。圍繞理解智能的這組問題——曾經是哲學問題,現在則是科學問題——對 Alan Turing 來說是至關重要的,他與其他一些思想家——特別是 Warren S. McCulloch 和他的年輕助手 Walter Pitts——一起進行了許多早期的分析,這些分析不僅導致了電腦本身的誕生,也催生了人工智慧的新技術。透過表彰這個領域,這項獎項應該將注意力集中在我自己科學家族的其他工作上——特別是 Ray Solomonoff、Oliver Selfridge、John McCarthy、Allen Newell、Herbert Simon 以及 Seymour Papert,他們是我過去十年工作中最親密的合作夥伴。Papert 的觀點貫穿了本文。

本文分為三個部分,分別探討了計算理論、程式語言和教育中形式與內容的混淆。

1. 計算理論

要建立一個理論,需要對學科的基本現象有深入的了解。在計算理論中,我們對這些現象的了解還遠遠不夠,無法對這個主題進行高度抽象的教學。相反,我們應該教授更多我們現在已經徹底理解的具體例子,並希望從中能夠猜測和證明更普遍的原理。我說這些並不是因為我對那些可能正確但尚未被證明的事情持保守態度。我認為我們許多看似常識的信念都是錯誤的。我們對時間與記憶之間的交換、時間與程式複雜性之間的權衡、軟體與硬體、數位與類比電路、串列與並列計算、關聯式與位址式記憶體等問題存在嚴重的誤解。

考慮物理學的類比是很有啟發性的,在物理學中,大部分基礎知識可以組織成一套相當精簡的「守恆定律」。當然,這只是一種描述方式;也可以使用微分方程、最小作用量原理、平衡定律等。例如,能量守恆可以解釋為定義了各種形式的勢能和動能之間的交換,例如高度與速度平方之間的交換,或溫度與壓力-體積之間的交換。量子理論的發展可以基於位置與動量之間,或時間與能量之間的不確定性權衡。這並沒有什麼特別之處;任何具有合理平滑解的方程都可以視為定義了其變量之間的某種權衡。但有很多種表達事物的方式,過於執著於某種特定的形式或定律,並相信它是真正的基本原理,這是很危險的。關於這一點,請參閱 Feynman [1] 的論文。

儘管如此,對交換的認識往往是科學的雛形,而量化它們則是科學的誕生。在計算領域,我們有什麼這樣的特徵呢?在遞歸函數理論中,Shannon [2] 觀察到,任何具有Q個狀態和R個符號的 Turing machine 都等價於一個具有2個狀態和nQR個符號的機器,以及一個具有2個符號和n'QR個狀態的機器,其中n和n'是小數。因此,狀態-符號乘積QR在機器分類中具有幾乎不變的性質。不幸的是,我們無法將這個乘積與有用的機器複雜度度量聯繫起來,因為這反過來又與機器編碼過程的複雜度存在權衡——而這種權衡似乎過於費解,無法應用。

讓我們考慮一個更基本、但仍然令人困惑的權衡,即加法與乘法之間的權衡。計算3X3行列式需要多少次乘法?如果我們將展開式寫成六個三重乘積,我們需要十二次乘法。如果我們使用分配律將因子合併,這會減少到九次。在這種情況和n X n的情況下,最小次數是多少,又如何證明?重要的是我們需要答案,而不是我們不知道如何判斷或證明提出的答案是正確的!對於一個特定的公式,也許可以使用某種窮舉搜索,但這並不能建立一個通用的規則。我們的一個首要研究目標應該是發展方法,以證明特定的過程在各種意義上是計算上最優的。

Cook [3] 的論文中關於乘法本身的一個令人驚訝的發現(使用了 Toom 的結果),在 Knuth [4] 中有討論。考慮計算十進位數字的常用算法:對於兩個n位數字,這需要n²個一位數乘積。通常認為這是最小的。但假設我們將數字寫成兩半,這樣乘積 N = (ξA + B)(ξC + D),其中 ξ 代表乘以 10^(n/2)。(左移操作的成本可以忽略不計)。然後可以驗證:

N = ξ²AC + BD + ξ((A + B)(C + D) - (AC + BD)).

這只需要三次半長度的乘法,而不是人們可能認為需要的四次。對於大的n,這種減少顯然可以對較小的數字重複應用。代價是增加的加法次數。透過結合這個想法和其他想法,Cook 表明對於任何 ε 和足夠大的n,乘法所需的乘積少於 n^(1+ε),而不是預期的 n²。類似地,V. Strassen 最近表明,要將兩個 m X m matrix相乘,乘積的數量可以減少到 m^(log₂7) 階,而人們一直認為這個數量必須是立方的,因為結果中有 m² 項,每一項似乎都需要一個單獨的內積,包含m次乘法。在這兩種情況下,普通直覺長期以來都是錯誤的,錯誤到顯然沒有人尋找更好的方法。我們仍然沒有一套證明方法足以確定在 matrix 相乘的情況下,乘法與加法之間的最小權衡是多少。

乘法與加法之間的交換本身可能並不顯得至關重要,但如果我們無法徹底理解如此簡單的事情,對於任何更複雜的事情,我們可以預期會遇到嚴重的麻煩。

考慮另一種權衡,即記憶體大小與計算時間之間的權衡。在我們的書[5]中,Papert 和我提出了一個簡單的問題:給定任意一組n位字,需要多少次記憶體訪問才能判斷其中哪個字與給定任意字最接近¹(在一致的位數上)?由於有許多種編碼「 library 」集合的方式,有些使用更多記憶體,有些則較少,更精確地說,這個問題是:記憶體大小必須如何增長才能實現給定的記憶體訪問次數減少?這點很簡單:如果記憶體足夠大,只需要一次訪問,因為我們可以將問題本身作為位址,並將答案儲存在該位址的 register 中。但如果記憶體僅足以儲存 library 中的資訊,那麼就必須搜索所有資訊——而且我們不知道任何有價值的中間結果。這無疑是資訊檢索的一個基本理論問題,但似乎沒有人對如何對這種基本權衡設定一個好的下界有任何想法。

另一種是串列-並列交換。假設我們有n台電腦而不是一台。我們能將哪些類型的計算加速多少?對於某些計算,我們肯定可以提高n倍的速度。但這種情況很少見。對於其他計算,我們可以提高 log n 倍的速度,但很難找到這樣的計算或證明它們的性質。對於大多數計算,我認為幾乎沒有什麼收益;這是在有許多高度分支條件的情況下,預先查看可能的分支通常會被浪費。我們對此幾乎一無所知;大多數人樂觀地(肯定不正確)認為,並列計算通常是加速大多數計算的有利方式。

這些只是計算權衡中一些了解甚少的問題。沒有空間討論其他問題,例如數位-類比問題。(一些關於局部與整體計算的問題在[5]中有概述。)而且我們對數值計算與符號計算之間的權衡知之甚少。

在今天的電腦科學課程中,很少關注關於這些問題的知識;幾乎所有時間都用於語法語言類型的形式分類、失敗的不可解理論、關於系統程式設計的傳說,以及通常微不足道的「邏輯設計最佳化」片段——後者往往是在啟發式程式設計的藝術已經遠遠超越了那些被刻板教授和測試的特殊案例「理論」的情況下出現的——以及關於程式設計風格的說法,這些風格幾乎肯定在學生畢業前就已經過時了。即使是最看似抽象的關於遞歸函數理論和形式邏輯的課程,似乎也忽略了關於證明編譯器或程式等價性的一些已知有用結果。大多數課程將人工智慧領域的工作成果(其中一些已有十五年的歷史)視為特殊應用的外圍集合,而事實上,它們代表了對真實計算問題的最大規模的經驗和理論探索之一。除非這種對形式的過度關注被替換為對計算實質問題的關注,否則年輕學生最好避開大部分電腦科學課程,學習程式設計,盡可能多地學習數學和其他科學,並研究人工智慧、複雜度和最佳化理論的當代文獻。

2. 程式語言

即使在程式語言和編譯器領域,也存在對形式過多的關注。我之所以說「甚至」,是因為人們可能會覺得這是形式應該是主要關注點的領域。但讓我們考慮兩個斷言:(1) 語言的語法正變得越來越多,以及 (2) 語言正在用過多的語法進行描述。

編譯器對表達式、斷言和描述的含義關注不足。使用上下文無關語法來描述語言片段在規範和實現上都帶來了重要的統一性進展。但是,儘管這在簡單情況下效果很好,但在更複雜的領域嘗試使用它可能會阻礙發展。在描述涉及執行和指定過程的自修改或自擴展語言時,使用語法存在嚴重的問題。從語法上來說,也就是靜態地,你無法描述一種正在改變的語言的有效表達式。語法擴展機制必須被描述,這是肯定的,但如果這些機制是通過現代模式匹配語言(如 SNOBOL、CONVERT [6] 或 MATCHLESS [7])給出,則解析程式和語言描述本身之間無需區分。未來,電腦語言將更多地關注目標,而不是程式設計師指定的過程。以下論證有些極端,但考慮到當今對形式的關注,這種過度並不會造成傷害。(其中一些想法來自 C. Hewitt 和 T. Winograd。)

2.1 語法往往是不必要的

你可以用比普遍認識少得多的語法來生存。許多程式設計語法都與消除括號或強調作用域標記有關。存在許多未被充分利用的替代方案。

請不要認為我反對在人機介面中使用中綴運算和運算符優先級等裝置。它們有它們的位置。但是它們對整個電腦科學的重要性被誇大到開始腐蝕年輕人了。

考慮平方根的常用算法,它可能在現代代數語言中被寫成(忽略數據類型聲明等問題):

.DEFINE SQRT(A,X,E) : if ABS(A - X* X) < E then X else SQRT(A, (X + A + X) + 2, E).

在一個假想但可辨識的 LISP 版本中(參見 Levin [8] 或 Weissman [9]),這個相同的過程可能被寫成:

(DEFINE (SQRT A X E) (IF (LESS (ABS (- A (* X X))) E) THEN X ELSE (SQRT A (/ (+ (+ X (/ A X)) 2) E))))

在這裡,函數名緊隨其後的括號內。對人類來說,寫所有括號的笨拙性顯而易見;不需學習所有約定(例如 (X + A + X) 是 (+ X (+ A X)) 而不是 (+ (- X A) X))的優勢常常被忽略。

使用顯式分隔符的語法是反動的,還是未來的潮流,還有待觀察。它在編輯、解釋以及由其他程式創建程式方面具有重要優勢。LISP 的完整語法可以在一小時內學會;解釋器緊湊且不太複雜,學生通常可以通過閱讀解釋器程式本身來回答關於系統的問題。當然,這並不能回答關於一個真實、實際實現的所有問題,但任何可行的語法規則集也做不到。此外,儘管該語言笨拙,但許多前沿工作者認為它具有出色的表達能力。幾乎所有通過建構和修改假設來解決問題的過程都寫在這種或相關的語言中。不幸的是,語言設計師通常不熟悉這個領域,傾向於將其視為一個專門的「符號處理技術」集合。

在這樣一種「語法弱」的語言中,透過使用縮排和其他不在語言本身內的排版裝置,可以大大澄清表達式的結構。例如,可以使用屬於輸入預處理器的「延遲」符號,將上述程式重寫為:

DEFINE (SQRT A X E) -> . IF -> THEN X ELSE -> . LESS (ABS -> ) E.

  • A (* X X).

SQRT A -> E. / (+ (+ X (/ A X)) 2) E.

其中點號表示 ")(",箭頭表示「在此插入下一個表達式,由點號分隔,在替換(遞歸地)其自身的箭頭後可用」。縮排是可選的。這通過兩個簡單的裝置獲得了通常作用域指示符和約定的大部分效果,這兩個裝置都可以通過閱讀程式輕鬆處理,並且由於子表達式通常在每行中是完整的,因此易於編輯。

要領會延遲運算符的威力和局限性,讀者應該拿自己喜歡的語言和算法試試看。他會發現有很多選擇可以延遲,並且他在決定先說什麼、強調哪些參數等方面需要運用判斷力。當然,箭頭並不能解決所有問題;還需要一個用於 list fragment 的延遲裝置,這需要自己的分隔符。無論如何,這些只是邁向更圖形化程式描述系統的步驟,因為我們不會永遠局限於符號串。

Dana Scott 建議的另一種表達裝置是使用不同的括號來指示從右到左的函數組合,這樣當你更自然地表示某個量在計算過程中的變化時,可以寫 (((x>h)g)f 而不是 f(g(h(x)))。這允許不同的「強調」,例如 f((h(x))g),可以讀作:「計算 h(x) 的結果,然後對其應用 g,最後計算 f 對此結果的函數值。」

或許透過類比比透過例子更能說明問題。在對語法的狂熱關注下,語言設計師變得過於以句子為導向。使用諸如箭頭這樣的裝置,可以構造更像段落的對象,而無需完全回到流程圖。

當今的高級程式語言在風格靈活性方面幾乎沒有提供表達能力。你無法在不改變算法本身的情況下太多地控制思想呈現的順序。

2.2 效率與理解程式

編譯器是用來做什麼的?通常的答案類似於「將一種語言翻譯成另一種語言」或「將算法的描述轉換成程式,填補許多小細節」。對於未來,需要更具抱負的觀點。大多數編譯器將是「根據其效果描述產生算法」的系統。對於現代圖像格式系統來說,這已經是事實;它們完成所有創造性的工作,而用戶只需提供所需格式的範例:在這裡,編譯器比用戶更專業。模式匹配語言也是很好的例子。但除了少數這樣的特殊情況外,編譯器設計師在編寫好的程式方面進展甚微。識別公共子表達式、優化內部循環、分配多個 register 等,只能帶來效率上的小幅度線性改進——而且編譯器對這些方面做得還遠遠不夠。自動存儲分配的價值可能更大。但真正的收益在於分析算法本身的計算內容,而不是程式設計師寫下的方式。例如,考慮以下內容:

DEFINE FIB(N): if N=I then 1, if N=2 then 1, else FIB(N-l) + FIB(N-2).

F(6) /
F(5) F(4) / \ /
F(4) F(3) F(3) F(2) / \ / \ /
F(3) F(2) F(2) F(1) F(2) F(1) /
F(2) F(1)

圖1

這個關於 Fibonacci 數列 1, 1, 2, 3, 5, 8, 13, ... 的遞歸定義,可以給任何一個體面的算法語言,並且將產生如圖1所示的求值步驟的分支樹。

可以看到,機器要做的工作量隨 N 呈指數增長。(更精確地說,它會執行 FIB(N) 次求值這個定義)有更好的方法來計算這個函數。因此,我們可以定義兩個臨時 register,並在以下函數中計算 FIB(N-1):

DEFINE FIB(N A B): if N=I then A else FIB(N-1 A+B A).

這個函數是單一遞歸的,避免了分支樹,甚至可以使用:

LOOP A=0 B=1 SWAP A B if N=1 return A N=N-1 B = A+B goto LOOP

任何程式設計師一旦看到分支求值中發生的事情,很快就會想到這些方法。這是一個「值過程」遞歸可以轉換為簡單迭代的例子。今天的編譯器甚至無法識別這種簡單轉換的情況,儘管指數階的減少超過了局部程式碼「優化」的任何可能收益。抗議這種收益很少或這種事情是程式設計師的責任都沒有用。如果節省編譯時間很重要,那麼可以刪除這些能力。例如,對於用模式匹配語言編寫的程式,這種簡化確實經常發生。通常,通過為 BNF 系統編譯一個高效的樹解析器來贏得,而不是執行暴力分析-合成。

確實,這種轉換的系統化理論很難。一個系統必須足夠聰明才能檢測哪些轉換是相關的以及何時使用它們有利。由於程式設計師已經知道他的意圖,如果建議的算法附帶(甚至替換)一個合適的目標聲明表達式,問題通常會更容易解決。

要朝這個方向發展,我們需要一個關於分析和合成程式的知識體系。在理論方面,目前有許多關於算法和圖式等價性以及證明程式具有指定性質的研究活動。在實踐方面,W. A. Martin [10] 和 J. Moses [11] 的工作展示了如何構建具有足夠關於特定數學技術的符號轉換知識的系統,以顯著補充其用戶的應用數學能力。

程式簡化問題一般來說是遞歸不可解的,這個事實沒有實際意義。無論如何,人們預期程式最終會在這項活動中遠遠超越人類能力,並利用大量形式化簡化後的程式轉換。這些轉換並不容易直接應用。相反,可以預期發展將遵循我們在符號積分中看到的路線,例如 Slagle [12] 和 Moses [11] 的工作。首先開發了一組與積分表中的基本項目相對應的簡單形式轉換。在此基礎上,Slagle 構建了一套啟發式技術,用於將實際問題進行代數和分析轉換,使其符合已理解的元素;這涉及到一系列表徵和匹配過程,可以說是使用了「模式識別」。在 Moses 的系統中,匹配過程和轉換都進行了如此精煉,以至於在大多數實際問題中,在 Slagle 程式性能中佔很大一部分的啟發式搜索策略,在 Moses 的系統中由確定的知識及其熟練應用所取代,成為一個次要的補充。一個啟發式編譯系統最終將需要比符號積分系統更普遍的知識和常識,因為它的目標更像是創造一個完整的數學家,而不是一個專業的積分計算器。

2.3 描述程式設計系統

無論如何描述一種語言,電腦都必須使用一個過程來解釋它。應該記住,在描述一種語言時,主要目標是解釋如何用它編寫程式以及這些程式的含義。主要目標不是描述語法。

在語法規則、範式、Post 生產規則和其他此類方案的靜態框架內,人們獲得了具有公理、推理規則和定理的邏輯系統的等價物。設計一個明確的語法,就相當於設計一個數學系統,其中每個定理恰好有一個證明!但在計算框架內,這與重點完全不符。人們有一個額外的要素——控制——它位於邏輯系統的常規框架之外;一套額外的規則,規定何時使用推理規則。因此,對於許多目的而言,歧義是一個偽問題。如果我們將程式視為一個過程,我們可以記住,我們最強大的過程描述工具就是程式本身,而它們本質上是明確的。

用程式定義程式語言並沒有悖論。當然,必須理解過程定義。可以通過用另一種語言編寫的定義來實現這種理解,這種語言可能與被定義的語言不同,更熟悉,或更簡單。但通常使用相同的語言是實用、方便且恰當的!因為要理解定義,只需要知道特定程式的運行方式,而不是語言所有可能應用的所有含義。正是這種特定化使得 bootstrapping 成為可能,這一點常常讓初學者和顯然的權威人士感到困惑。

使用 BNF 描述表達式的形成可能會阻礙新的語言的發展,這些語言將引用、自修改和符號操作順利地融入傳統算法框架。這反過來又阻礙了問題解決、目標導向程式設計系統的進展。

矛盾的是,儘管現代程式設計思想之所以發展,是因為難以用經典數學符號描繪過程,但設計師們卻在正是需要程式的情況下,轉而回歸早期形式——方程式。在關於教育的第三節中,類似的情況在教學中也能看到,後果可能更嚴重。

3. 學習、教學與「新數學」

教育是電腦科學家混淆形式與內容的另一個領域,但這次混淆涉及到他的專業角色。他認為他的主要職能是為舊的和新的教育方案提供程式和機器。這很好,但我相信他有更複雜的責任——研究和溝通教育過程本身的模型。

在下面的討論中,我簡要地概述了(與 Seymour Papert 一起發展的)產生這種信念的觀點。以下陳述是我們觀點的典型代表:

——幫助人們學習就是幫助他們在大腦中建立各種計算模型。 ——做到這一點的最好方法是老師在大腦中有一個合理描述學生大腦的模型。 ——出於同樣的原因,學生在調試自己的模型和過程時,應該對自己正在做的事情有一個模型,並且必須知道良好的調試技巧,例如如何提出簡單但關鍵的測試案例。 ——了解計算模型和程式設計對學生會有幫助。「調試」這個概念本身,例如,是一個非常強大的概念——這與我們關於天賦、才能和資質的文化遺產所促進的無助感形成對比。後者鼓勵「我不擅長這個」而不是「我如何讓自己在這方面做得更好?」

這些聽起來像是常識,但它們並不是任何流行的教育方案(如「操作制約」、「發現法」、視聽協同等)的基本原則之一。這並非因為教育工作者忽視了心理模型的可能性,而是因為在思考過程模擬工作開始之前,他們根本沒有有效的方法來描述、建構和測試這些想法。

我們無法在此離題回答懷疑論者,他們認為將思維與程式比較過於簡單化(如果不是褻瀆,或淫穢)。我們可以將許多這樣的批評者轉介到 Turing [13] 的論文。對於那些認為答案不可能存在於任何機器(無論是數位還是其他類型)中的人,可以論證 [14] 當機器變得智能時,它們很可能會有同樣的感受。關於這個領域的一些概述,請參見 Feigenbaum 和 Feldman [15] 以及 Minsky [16];只有通過閱讀當代人工智慧領域的博士論文和會議論文,才能真正了解這個快速發展領域的最新進展。

我們的主張存在一個基本實際點。孩子需要模型:為了理解城市,他可以使用有機體模型;城市必須吃、呼吸、排泄、自我防禦等。這不是一個非常好的模型,但足夠有用。有機體的代謝過程,他反過來可以通過與引擎比較來理解。但要建立自己的模型,他不能使用引擎、有機體、城市或電話交換機;只有電腦及其程式及其錯誤才能提供幫助。最終,程式設計本身在早期教育中的重要性將超過數學。然而,我選擇數學作為本文的其餘部分的主題,部分是因為我們對它了解得更好,主要是因為對程式設計作為一門學術學科的偏見會引起過多阻力。我想任何其他學科也可以,但數學問題和概念是最清晰的,最不容易受到情感色彩濃重問題的混淆。

3.1 一個小孩子的數學肖像

想像一個五六歲的小孩子,即將進入一年級。如果我們推斷今天的趨勢,他的數學教育將由方向不明的老師進行,部分由編程不佳的機器輔助;兩者都無法回應超出「正確」和「錯誤」的答案,更不用說對孩子的行為或說話進行合理的解釋,因為兩者都不包含關於孩子的好模型,也沒有關於孩子智力發展的好理論。孩子將從簡單的算術、集合論和一點幾何開始;十年後,他將對實數的形式理論了解一點點,對線性方程了解一點點,對幾何了解多一點點,對連續和極限過程幾乎一無所知。他將是一個缺乏分析思維興趣的青少年,無法將十年的經驗應用於理解他的新世界。

讓我們仔細看看我們的孩子,從 Piaget 和其他兒童心理建構觀察者的工作中繪製一幅綜合圖景。

我們的孩子能數到至少三十,可能多達一千。他會知道一些大數的名稱,但例如,無法理解為何一萬是一百個一百。他會很難倒著數,除非他最近對此非常感興趣。(擅長倒著數會讓簡單的減法更容易,並且可能值得一些練習。)他對奇數和偶數沒有太多感覺。

他能非常可靠地數四到六個物體,但對於十五個分散的物體,他每次得到的計數都不會一樣。他會為此感到惱火,因為他非常確定每次都應該得到相同的數字。因此,觀察者會認為孩子對數的概念很好,但應用它並不熟練。

然而,按照成人的標準,他對數字概念的重要方面將完全不確定。例如,當物體在他眼前重新排列時,他對其數量的印象會受到幾何排列的影響。因此,他會說在以下排列中 x 比 y 少:

X X X X X X

Y Y Y Y Y Y Y

而當我們將 x 移動到:

X X X X X X Y Y Y Y Y Y Y

他會說 x 比 y 多。確實,他正在回答(在他自己的思維中)一個不同的關於大小的問題,而且回答得很正確,但這正是重點:在這種情況下,數字的不變性對他影響很小。儘管他在被詢問時表現出知道東西的數量不會僅僅因為重新排列而改變,但他無法有效地將其用於推理。

同樣地,當水從一個玻璃杯倒到另一個玻璃杯時(圖2(a)),他會說高的玻璃杯裡水比矮的玻璃杯裡多。他對平面面積的估計會很差,因此我們找不到一個情境,他會將圖2(b)中較大的面積視為較小面積的四倍大小。順帶一提,當他長大成人,給他兩個容器,一個比另一個大兩倍(在所有維度上)(圖2(c)),他會認為大的那個裝的東西約為小的那個的四倍:他可能永遠無法對體積有更好的估計。

至於數字本身,我們對他腦袋裡的東西知之甚少。根據 Galton [17] 的說法,一百個孩子中,有三十個會將小數字與身體形象前空間中某些確定的視覺位置聯繫起來,排列方式可能是圖3所示的某種特殊方式。他們成年後可能仍會保留這些,並可能以某種模糊的潛意識方式用它們來記住電話號碼;他們可能會為歷史日期等發展不同的空間視覺表示。老師們從未聽過這種事,即使老師自己有數字形式,如果孩子提起,也不太可能認出。 (我的經驗是,需要一系列精心設計的問題,這些成人中的一個才會回答:「哦,是的;3 就在那裡,稍微靠後一點。」)當我們的孩子學習豎式加法時,他可能會通過舌頭接觸某些牙齒來記錄進位,或者使用其他模糊的臨時記憶裝置,而沒有人會知道。也許有些方法比其他方法更好。

他的幾何世界與我們的不同。他不清楚三角形是剛性的,因此與其他多邊形不同。他不知道一個近似圓的100條線段除非非常大,否則與圓無法區分。他不畫透視的立方體。他最近才意識到正方形放在頂點上會變成菱形。這種感知上的區別在成人中依然存在。因此,在圖4中我們看到,正如 Attneave [18] 指出的,正方形與菱形的印象受場景中其他排列的影響,顯然是通過決定我們在主觀描述中選擇使用哪種對稱軸。

我們的孩子對封閉的拓撲概念理解得很好。為什麼?這在經典數學中是一個非常複雜的概念,但在計算過程方面,也許並不那麼困難。但我們的孩子幾乎肯定會對圖5的情況感到困惑(參見 Papert [19]):公車繞湖行駛時,一個男孩坐在遠離水的一側。在旅途中的某個時間,他會否坐在湖邊?這個困難可能會持續到孩子八歲,可能與他對其他抽象雙重反轉的困難有關,例如減去負數,或者理解連續性的其他後果——「在旅程的哪一點發生了突然變化?」——或者理解局部與整體之間的橋樑。

我們的肖像在發展心理學文獻中有更詳細的描繪。但是,還沒有人建立一個足夠詳盡的兒童計算模型,來看看這些能力和局限性如何在一個與他能如此有效地做的其他事情兼容(並可能由此產生)的結構中聯繫起來。然而,這方面的工作已經開始,我預計未來十年內這種模型將取得實質性進展。

如果我們對這些事情了解更多,我們可能就能幫助孩子。目前我們甚至沒有好的診斷方法:他似乎能學會對形式問題給出正確答案,這可能只表明他發展了一些獨立的 library routines。如果這些 routines 無法被他的核心問題解決程式調用,因為它們使用了不兼容的數據結構或其他原因,我們可能會得到一個測試分數很高但從來不會思考得很好的應試者。

在計算機出現之前,關於思維本質的思想共同體太弱了,無法支持有效的學習和發展理論。行為主義者的有限狀態模型、弗洛伊德學派的水力和經濟學類比,以及格式塔學派的變戲法般的見解,都未能為理解如此錯綜複雜的主題提供足夠的要素。它需要一個已經調試好的、關於相關但更簡單問題的理論和解決方案的底層基礎。現在我們有了關於思考的、定義明確且已實現的大量思想;其中只有一小部分體現在傳統心理學中:

符號表 純粹程式 分時 呼叫序列 函數參數 記憶體保護
分派表 錯誤訊息 函數呼叫追蹤 中斷點 語言 編譯器
間接位址 Macro 屬性列表 數據類型 雜湊 微程式
格式匹配 閉合子程式 下推列表 中斷 通訊單元 公共存儲空間
決策樹 硬體-軟體權衡 串列-並列權衡 時間-記憶體權衡 條件中斷點 非同步處理器
解釋器 垃圾回收 列表結構 區塊結構 預先查看 回溯
診斷程式 執行程式

這些只是通用系統程式設計和調試中的一些想法;我們還沒有談到語言、人工智慧或電腦硬體等其他高級領域中更多特定相關的概念。所有這些在今天都作為程式設計這一充滿好奇心和錯綜複雜的工藝的工具。但正如天文學在 Kepler 的規律發現後取代了占星術一樣,在機器智力過程的經驗探索中發現的原理應該會導向一門科學。(在教育領域,我們仍然面臨同樣的競爭!The Boston Globe 在其「漫畫」部分有一個占星術頁面。幫助抵抗智力污染!)

回到我們的孩子,我們的計算思想如何幫助他理解數字概念?作為嬰兒,他學會了辨識某些特殊的成對配置,例如兩隻手或兩隻鞋。很久之後,他學會了關於一些三件東西——也許漫長的間隔是因為環境中沒有很多固定的三件套:如果他碰巧找到三個硬幣,他很可能很快會丟失或增加一個。最終他會找到一些能夠處理五六件東西的過程,並且他將不再那麼容易受到發現和丟失的影響。但對於超過六七件東西,他將仍然容易遺忘;即使他的語言計數完美無缺,他的列舉過程也會有缺陷。他會漏掉一些項目並重複計算其他項目。我們可以通過提出更好的過程來幫助他;把東西放入盒子裡幾乎是萬無一失的,劃掉也一樣。但對於固定的物體,他需要一些心理上的分組過程。

首先,應該嘗試了解孩子正在做什麼;眼動研究可能會有幫助,問問他可能就足夠了。他可能正在以某種不可靠、近乎隨機的方法選擇下一個項目,而沒有好的方法來追蹤哪些已經被計數。我們可以建議:滑動游標;創造容易記住的分組;繪製粗網格。

在每種情況下,建構可以是真實的或想像的。在使用網格法時,必須記住不要重複計算穿過網線的物體。老師應該展示提前計劃的好處,如圖6所示,歪曲網格以避免歧義!在數學上,重要的概念是「每一個正確的計數過程都會產生相同的數字」。孩子會明白,任何滿足以下條件的算法都是正確的:(1) 計數所有物體,(2) 不重複計數任何物體。

也許這個過程條件看起來太簡單了;甚至成人也能理解它。無論如何,這並不是今天通常稱為「新數學」並在我們小學教授的數字概念。下面的論戰將討論這個問題。

3.2 「新數學」

我所說的「新數學」是指一些小學嘗試模仿專業數學家的形式化產出。這種方法在廣泛關注早期教育之後被許多學校倉促採用,我認為這種方法總體上是糟糕的,因為存在幾種類型的形式-內容錯位。這些問題不僅給孩子帶來麻煩,也給老師帶來麻煩。

由於形式主義方法,老師將無法在公式化問題上給予孩子很大幫助。因為當她在諸如空集與虛無的區別,或者「數字」3+5與作為數字八的「通用名稱」的數字8之間的區別時,她自己會感到不安全,希望孩子不會問分數 8/18 的通用名稱是什麼,這個名稱可能與分數 4/9 不同,與商 8÷1 不同,與「指示除法」8/1 不同,也與有序對 (8, 1) 不同。她會對討論平行線持保留態度。她知道平行線通常不相交,但她聽說如果延長得足夠遠,它們可能會相交,因為俄羅斯的一些數學家在一次實驗中似乎發生過類似的事情?但是夠了,關於老師的問題:現在讓我們從孩子的角度考慮三類異議。

發展上的異議。堅持要求孩子將知識保持在一個簡單的有序層級中是非常糟糕的。為了找回他需要的知識,他必須有一個多重連接的網絡,這樣他就可以嘗試幾種方式來完成每一件事。他可能無法將第一種方法與問題的需求相匹配。在這個階段,強調「形式證明」是破壞性的,因為尋找證明和理解證明所需的知識比證明中提到的知識複雜得多(且用處較少)。理解幾何所需的知識網絡是例子和現象的網絡,以及關於它們之間相似性和差異的觀察。在孩子身上找不到證據表明這樣的網絡像邏輯系統的公理和定理一樣有序,或者孩子即使擁有這樣的 lattice 也能使用它。在理解一個現象之後,為其建立一個形式系統可能有很大的價值,以使其更容易理解更高級的事物。但即使在那時,這樣一個形式系統也只是眾多可能模型中的一個;新數學的作者似乎將他們的公理-定理模型與數字系統本身混淆了。在算術公理的情況下,我現在將論證,形式主義往往對理解更高級的事物弊大於利。

從歷史上看,新數學中使用的「集合」方法來自於一種形式主義的嘗試,試圖從一個接近有限的集合論推導出連續體的直觀性質。他們在這個特技(或某些程式設計師所說的「hack」)中部分取得了成功,但方式如此複雜,以至於如果遵循這個模型,就無法在高中之前認真討論實數。拓撲學的思想被推遲到更晚。但孩子在六歲時已經具備發達的幾何和拓撲思想,只是他們幾乎沒有操作抽象符號和定義的能力。我們應該從孩子的強項出發,而不是通過試圖用他們尚無法處理的結構來取代他們已有的能力來損害他們。但这正是數學家的行事方式——他們無疑是世界上最糟糕的闡釋者——他們認為:「只要定義足夠精確,你可以教孩子任何東西」,或者「如果我們第一次就把所有定義弄對,以後就不會有麻煩了」。我們不是在用 FORTRAN 程式設計一個空機器:我們在搗鼓一個知之甚少的大系統,這個系統典型地在正常的啟發式行為中使用多重定義的符號。

直覺上的異議。新數學強調一個數字可以與所有可以一對一對應的集合的等價類別相等同的概念。然後,有理數被定義為整數對的等價類別,並引入了一系列繁瑣的形式主義,以防止孩子將有理數與商或分數相等同。函數通常被視為集合,儘管有些教材以表面上具有演算法風味的「函數機器」來呈現。對「變量」的定義是另一團複雜的迷宮,涉及名稱、值、表達式、子句、句子、數字、「指示運算」等等。(事實上,在現實問題解決中有如此多不同類型的數據,以至於現實生活中的數學家通常不給予它們形式上的區別,而是使用整個問題上下文來解釋它們。)在追求這種形式主義痴迷的過程中,課程從未呈現出關於真實數學現象的任何連貫圖景,無論是離散的還是連續的;關於其符號語法所關注的代數;或者關於幾何學。從中「證明」出來的「定理」(不時出現),例如「一個數字 x 只有一個加法逆元,-x」,是如此平淡和顯而易見,以至於無論老師還是學生都無法理解證明的目的。「官方」證明將 y 加到 x + (-y) = 0 的兩邊,應用結合律,然後應用交換律,然後應用 y + (-y) = 0 的定律,最後應用等式的公理,以證明 y 必須等於 x。孩子的頭腦更容易理解更深刻的思想:「在 x + (-y) = 0 中,如果 y 小於 x,就會剩下一些;而如果 x 小於 y,就會剩下一個負數——所以它們必須恰好相等。」孩子不被允許使用這種序加連續性的思維方式,大概是因為它使用了「更高級的知識」,因此不是「真正證明」的一部分。但在孩子需要的思想網絡中,這個連結具有相同的邏輯地位,並且無疑具有更大的啟發式價值。再舉個例子,學生被要求明確區分加法的逆運算與距離的相反方向,這種區別似乎完全違背了這些概念的融合,而這種融合似乎是更可取的。

計算上的異議。程式的概念,以及從學習如何測試、修改和調整程式中獲得的知識,可以轉移到孩子的許多其他活動中。傳統的學術科目,如代數和算術,其發展意義相對較小,特別是當它們在直觀幾何方面較弱時。(哪種學習可以「轉移」到其他活動是一個教育理論中的基本問題:我再次強調我們的猜想,即程式和調試的概念將被證明在可轉移性方面是獨一無二的。)在代數中,正如我們所指出的,「變量」的概念很複雜;但在計算中,孩子可以輕鬆地將「x + y + z」視為描述一個過程(任何加法的過程!),其中「x」、「y」和「z」指向其「數據」。函數作為過程很容易掌握,但如果想像成有序對則很困難。如果你想要一個圖形,描述一台繪製圖形的機器;如果你有一個圖形,描述一台可以讀取它以查找函數值的機器。這兩者都是簡單且有用的概念。

我們不要陷入文化陷阱:集合論的「基礎」數學在今天的數學家之間很受歡迎,因為這是他們(在大學時)攻克和掌握的。這些科學家通常不熟悉計算,也不熟悉 Post-Turing-McCulloch-Pitts-McCarthy-Newell-Simon-... 這個家族的理論,這些理論在孩子們長大後將變得更加重要。集合論並不是邏輯學家和出版商所說的唯一真實的數學基礎;它是一種觀點,對於研究超限數很好,但對於理解實數平淡無奇,對於學習算術、代數和幾何則相當差勁。

總結我的異議,「新數學」強調形式化和符號操作的使用,而不是學科內容的啟發式和直觀內容。期望孩子學會如何解決問題,但我們卻不教他我們知道的知識,無論是關於學科本身還是關於解決問題的知識。³

作為形式(在本例中是算術公理)的過度關注如何扭曲一個人對內容看法的例子,讓我們審視一下堅持認為加法最終只針對兩個量的奇怪強制性。在新數學中,a+b+c 必須「實際上」是 (a+(b+c)) 或 ((a+b)+c) 中的一個,而 a+b+c+d 只有在多次應用結合律後才有意義。這在許多情況下是荒謬的。孩子已經對將幾個集合放在一起是什麼意思有了很好的直觀概念;混合五種顏色的珠子和混合兩種顏色一樣容易。因此,加法已經是一個 n 元運算。但聽聽書是怎麼試圖證明這不是這樣的:

加法…總是對兩個數進行。這乍一看可能不合理,因為你經常加很長一串數字。試著在自己身上做一個實驗。試著同時加數字 7、8、3。無論你如何嘗試,你都必須選擇兩個數字,將它們相加,然後將第三個數字加到它們的總和上。 ——摘自一本九年級教材

塔的高度是將其各層按特定順序成對相加的結果嗎?一個物體的長度或面積是這樣從其部分產生的嗎?他們為什麼要引入他們的集合和一對一對應,然後又錯過重點呢?顯然,他們已經說服自己相信他們為代數選擇的公理具有某種特殊的真理!

讓我們考慮一些在小學不常討論的重要且漂亮的想法。首先考慮總和 ½ + ¼ + ⅛ + ...。如果解釋為面積,你會得到令人著迷的重新組合概念,如圖7所示。一旦孩子知道如何進行除法,他就可以計算並欣賞極限過程 .5, .75, .875, .9375, .96875, ... 的一些定量方面,他可以學習關於折疊、切割、流行病和人口。他可以學習關於 x → px + qx,其中 p + q = 1,從而欣賞稀釋;他可以學習到 ½, ¾, ⅞, ¹⁵⁄₁₆, ³¹⁄₃₂, ... → 1,並開始理解與這些問題相關的許多豐富多彩和常識性的幾何和拓撲後果。

但在「新數學」中,有理數、商和分數之間的語法區別被推到如此極端,以至於要判斷 ⅜ 和 ⁴⁄₉ 哪個更大,不允許計算並比較 .375 和 .4444...。必須進行交叉乘法。現在,交叉乘法非常巧妙,但它有兩個缺點:(1) 沒有人能記住結果條件應該向哪個分支分叉,以及 (2) 它沒有說明數字之間相距多遠。抽象的「序」概念非常優雅(另一個針對顯而易見之事的公理集),但孩子們已經相當好地理解了「序」,並想知道具體的「量」。

另一個困擾是關於進位制的問題。讓孩子們清楚地理解223是「兩百」加上「二十」加上「三」,這對孩子們來說是件好事,我認為這應該盡可能簡單化而不是複雜化⁴。我不認為這個概念如此豐富,以至於應該讓年幼的孩子在幾種不同的進位制中進行算術練習!因為這個微不足道的概念很少能轉移到其他事物,並且冒著對本已為6+7=13困擾的學生的脆弱算術造成毀滅性打擊的風險,現在他們又發現6+7=15。此外,儘管對進位制給予了如此多的關注,我在我孩子的書中看不到對哪怕是一些非平凡影響的關注——這些概念或許能證明這種關注的合理性,例如:

為什麼只有一種方法可以寫十進位整數? 為什麼九退法(Casting Out Nines)有效?(甚至沒有提到。) 如果我們使用任意非冪的數,例如 a·37 + b·2A + c·11 + ... 代替通常的 a·1 + b·10 + c·100 + d·1000 + ... ,會發生什麼?

如果他們不討論這些事情,他們一定有另一個目的。我的猜測是,所有這些大驚小怪是為了讓孩子們更好地理解乘法和除法的過程。但是從發展的角度來看,這可能是一個嚴重的錯誤——無論是舊數學還是「新」數學課程的策略。標準的長除法算法充其量是繁瑣的,大多數孩子永遠不會用它來探索數字現象。而且,儘管了解它是如何工作的有一些意義,寫出整個過程表明教育者相信孩子應該每次都理解這個可怕的東西!這是錯誤的。重要的思想,如果有的話,是重複減法;其餘的只是一個巧妙但不重要的程式設計技巧。

如果我們可以教授一個實用的除法算法,即使是死記硬背,那也很好。但在任何情況下,都讓他們使用計算器吧;如果太貴,為什麼不使用計算尺呢?拜託,請不要用不可能解釋的方式。重要的是進入實數領域!「新數學」對整數的狂熱如此嚴重,讓我想起數字命理學,如果我可以提一下另一種偽科學的話。(The Boston Globe,你覺得呢?)

Cauchy-Dedekind-Russell-Whitehead 的集合論形式主義是一個巨大的成就——繼 Euclid 之後的又一系列證明,證明許多數學思想可以從幾個原始概念推導出來,儘管路徑漫長而曲折。但是,孩子們的問題是獲取這些思想;他們需要學習現實。就他們可用的概念而言,集合論的整個形式主義無法與一個更古老、更簡單、可能更偉大的思想相提並論:直觀實數線上非終止的十進位表示。

邏輯學家的目標與教育家的目標存在真正的衝突。邏輯學家希望將思想的多樣性降至最低,不介意漫長而細的道路。教育家(正確地)希望縮短路徑,不介意——事實上,更喜歡——連接到許多其他思想。他幾乎完全不在意連結的方向。

至於更好地理解整數,我認為無數讓小孩子畫一對一對應圖的練習不會有幫助。毫無疑問,這有助於他們學習有價值的算法,但不是關於數字的算法,而是關於繪製不交叉路徑等重要的拓撲和過程問題的算法。正是這種現在完全偶然處理的問題,我們應該加以關注。

因此,電腦科學家對教育負有責任。並非如他所想,因為他必須編寫教學機器的程式。當然也不是因為他是「有限數學」的熟練使用者。他知道如何調試程式;他必須告訴教育工作者如何幫助孩子們調試他們自己的問題解決過程。他知道過程如何依賴於它們的數據結構;他可以告訴教育工作者如何為孩子準備新的思想。他知道為什麼使用雙重目的的技巧很糟糕,這些技巧以後在調試和擴展程式時會困擾你。(因此,可以通過將小數字與任意顏色關聯起來吸引孩子的興趣。但這種技巧對他們後來嘗試將數字思想應用於面積、體積或價值時會有什麼影響呢?)電腦科學家是必須研究這些問題的人,因為他是「過程」概念的所有者,這是教育者們長期以來一直在尋找的秘密。

參考文獻

  1. FEYNMAN, R. P. Development of the space-time view of quantum electrodynamics. Science 153, No. 3737 (Aug. 1966), 699-708.
  2. SHANNON, C. E. A universal Turing machine with two internal states. In Automata Studies, Shannon, C. E., and McCarthy, J. (Eds.), Princeton U. Press, Princeton, N. J., 1956, pp. 157-165.
  3. COOK, S. A. On the minimum computation time for multiplication. Doctoral diss., Harvard U., Cambridge, Mass., 1966.
  4. KNUTH, D. The Art of Computer Programming, Vol. II. Addison-Wesley, Reading, Mass., 1969.
  5. MINSKY, M., AND PAPERT, S. Perceptrons: An Introduction to Computational Geometry. MIT Press, Cambridge, Mass., 1969.
  6. GUZMÁN, A., AND MCINTOSH, H.V. CONVERT. Comm. ACM 9, 8 (Aug. 1966), 604-615.
  7. HEWITT, C. PLANNER: A language for proving theorems in robots. In: Proc. of the International Joint Conference on Artificial Intelligence, May 7-9, 1969, Washington, D. C., Walker, D. E., and Norton, L. M. (Eds.), pp. 295-301.
  8. LEVIN, M., et al. The LISP 1.5 Programmer's Manual. MIT Press, Cambridge, Mass., 1965.
  9. WEISSMAN, CLARK. The LISP 1.5 Primer. Dickenson Pub. Co., Belmont, Calif., 1967.
  10. MARTIN, W. A. Symbolic mathematical laboratory. Doctoral diss., MIT, Cambridge, Mass., Jan. 1967.
  11. MOSES, J. Symbolic integration. Doctoral diss., MIT, Cambridge, Mass., Dec. 1967.
  12. SLAGLE, J.R. A heuristic program that solves symbolic integration problems in Freshman calculus. In Computers and Thought, Feigenbaum, E. A., and Feldman, J. (Eds.), McGraw-Hill, New York, 1963.
  13. TURING, A.M. Computing machinery and intelligence. Mind 59 (Oct. 1950), 433--460; reprinted in Computers and Thought, Feigenbaum, E. A., and Feldman, J. (Eds.), McGraw-Hill, New York, 1963.
  14. MINSKY, M. Matter, mind and models. Proc. IFIP Congress 65, Vol. 1, pp. 45-49 (Spartan Books, Washington, D. C.). Reprinted in Semantic Information Processing, Minsky, M. (Ed.), MIT Press, Cambridge, Mass., 1968, pp. 425-432.
  15. FEIGENBAUM, E. A., AND FELDMAN, J. Computers and Thought. McGraw-Hill, New York, 1963.
  16. MINSKY, M. (Ed.). Semantic Information Processing. MIT Press, Cambridge, Mass., 1968.
  17. GALTON, F. Inquiries into Human Faculty and Development. Macmillan, New York, 1883.
  18. ATTNEAVE, FRED. Triangles as ambiguous figures. Amer. J. Psychol. 81, 3 (Sept. 1968), 447--453.
  19. PAPERT, S. Principes analogues à la récurrence. In Problèmes de la Construction du Nombre, Presses Universitaires de France, Paris, 1960.
  20. FEYNMAN, R.P. New textbooks for the "new" mathematics. Engineering and Science 28, 6 (March 1965), 9-15 (California Inst. of Technology, Pasadena).
  21. LEHRER, T. New math. In That Was the Year That Was, Reprise 6179, Warner Bros. Records.

接收日期:1969年10月;修訂日期:1969年12月 Journal of the Association for Computing Machinery, Vol. 17, No. 2, April 1970