陳凱 上海市位育中學
《孫子兵法》的兵勢篇中這樣寫道:激水之疾,至于漂石者,勢也;鷙鳥之疾,至于毀折者,節(jié)也。故善戰(zhàn)者,其勢險,其節(jié)短。勢如彍弩,節(jié)如發(fā)機。在古文中,“機”字的含義之一,是用于釋放箭的組件,其中很重要的零件就是扳機(古稱扳機為懸刀),《尚書·太甲》中說:“若虞機張,往省括于度則釋”,就是說要在合適的時機扣動扳機放箭。在使用一般的弓箭時,在把弓拉開的過程中以及在拉開弓之后直到釋放箭之前,手臂需要承擔很大的負荷。而具有待發(fā)裝置的弩就不一樣,在拉弓到位后,承擔負荷的是弩臂。在扣動扳機時,射手只需要施加一個小的力量,然后借助機關將之前積蓄的巨大的能量瞬間釋放出來。
弓弩的作用不只是殺傷敵人,古人也利用射出的火箭或射出能發(fā)出聲響的鳴鏑來傳遞信息。不過就算弓弩射出箭的距離很遠,由于受地球引力和空氣摩擦力的影響,箭總是要落回到地面上。這里有一個夸張但合理的假設,如果發(fā)射的方向和力度都足夠精準,射出的箭恰巧擊中遠處弩的扳機,那么就能觸發(fā)遠處的弩也射出箭,理論上說,只要后續(xù)接力的弩足夠多,觸發(fā)的過程就可以一直繼續(xù)下去??梢詫⑦@個過程中的某些關鍵要素抽取出來,如拉滿弓所積蓄的勢能、用以釋放能量的機關的觸發(fā)、機關觸發(fā)后的連鎖反應等,本文將要說明,這些要素不僅和信息的傳輸有關,還與計算有關。
這樣一組(理想狀態(tài)下)能夠實施接續(xù)觸發(fā)動作的弓弩,其行為在某些地方類似于戈德堡機械裝置。戈德堡機械一詞來源于藝術家魯布·戈德堡的系列漫畫,在漫畫中,某個復雜的機械系統(tǒng)由形態(tài)各異的簡單機械機構組合而成,初始觸發(fā)動作經由一系列機關逐級傳遞下去,直至驅動最終的機械結構完成某項任務——通常是打雞蛋、擠果汁、敲鬧鈴之類的任務,其簡單程度與整個系統(tǒng)的復雜極不相稱,圖1顯示的是藝術家所想象的眾多戈德堡機械裝置中的一種。在網絡上有許多構思奇妙的戈德堡機械裝置的視頻,在瀏覽了各種有趣的設計后,很容易聯(lián)想到,可以借助某些戈德堡機械中的傳動機構,來改進連鎖擊發(fā)的弓弩裝置,使得即便在箭的落點不甚精準的情況下也能借助機械傳動扣動下一級弩的扳機,提高信息傳輸的成功率。
圖1 1932年魯布·戈德堡創(chuàng)作的漫畫《橘子榨汁機》
與借助各種各樣奇怪的機關來實現(xiàn)動作傳遞的戈德堡機械裝置不同的是,(理想狀態(tài)下)在箭射時弓弩扳機所引發(fā)的連鎖反應中,每個觸發(fā)行為都是一致的,這個行為可以被一模一樣復制到n組釋放箭和被觸發(fā)的裝置中。同時也可以看到,弓弩連鎖擊發(fā)模型與戈德堡機械裝置有相似之處,就是兩者都是通過機關的觸動,將積蓄的勢能釋放出來。很自然可以聯(lián)想到:用一個戈德堡機械裝置來實現(xiàn)信息的傳輸,是完全有可能的。下頁圖2展示了一個相當簡單的可以接續(xù)傳遞信息的戈德堡機械裝置的例子:從斜面上滾下的小球推動杠桿,使得杠桿頂部的小球掉落,接下來就是不斷重復剛才的過程。這個設計模型可以在Algodoo物理沙盤中運行,在制作這個模型時,只有第一個觸發(fā)裝置的搭建耗費了一些時間,而后續(xù)觸發(fā)裝置只要經由復制粘貼就可以快速放置到位,通過這個制作可以充分體會到模塊化對提高工作效率的作用。
圖2 一個可以接續(xù)傳遞信息的戈德堡機械裝置
無論是弓弩連鎖擊發(fā)模型還是小球連鎖碰落模型,在用于傳輸信息時,都有相同的弱點。其一,它們都只能一次性發(fā)揮作用,需要在每次使用后,重新將弓拉滿,或將小球放置到杠桿頂端;其二,它們都無法改變所傳遞信息的狀態(tài),舉例說,箭的射出總是導致后續(xù)箭的射出,而不會導致后續(xù)箭的停發(fā),而停發(fā)的箭也不會使后續(xù)箭自動射出。想象一下,若是某弓弩在沒有被其他箭射中扳機的情況下自動射出箭,那該是多么匪夷所思的事情。
這樣一個用連鎖擊發(fā)或碰落裝置組成的系統(tǒng),無論中間接續(xù)了多少級,整個系統(tǒng)的輸出狀態(tài)和輸入狀態(tài)都是錨定的。那么,這個系統(tǒng)雖然確實能夠傳輸信息,但因為其機械結構不能對信號取反,計算功能是受到很大限制的。
可以想象改造上述連鎖擊發(fā)裝置,使其能根據多個輸入來決定輸出。例如,某弓弩有兩個扳機,只有當兩個扳機都被擊中時,箭才會被射出。為了研究這種弓弩的行為,可以試著將其抽象為數學模型,用函數X(a,b)代表弓弩的行為,函數返回結果1表示弓弩射出箭,結果0表示未射出箭;而函數內的兩個參數a和b是兩個扳機的狀態(tài),被擊中為數字1,未被擊中為數字0。顯然,X(1,1)返回的值為1,而X(1,0)、X(0,1)和X(0,0)返回的值都是0。當然,若不使用弓弩,也可以用小球來實現(xiàn)類似的裝置。
以上過程是試圖建立邏輯上“與”運算的函數,但仔細分析后可發(fā)現(xiàn),X(a,b)函數所抽象的弓弩的行為,和邏輯“與”運算是有區(qū)別的。其一,參數a和b的值不是同時改變的,設想一下,當對準下一級弓弩的兩個扳機射出兩桿箭時,物理上很難做到同時擊中扳機,這樣,兩個參數中總是其中一個由0變1,繼而另一個參數再由0變?yōu)?;其二,裝置的運作不僅與作為輸入的箭有關,還與事先有沒有張滿弓的能量積蓄有關;其三,當參數a和b的值有一個或兩個都是0的時候,其含義是不明確的,因為分不清楚到底是因為前一級弓弩沒有射出箭而輸入0,還是因為前一級弓弩根本就沒有工作而輸入0。這種不知0為何物的微妙的感覺,讓人想起王維的《鳥鳴澗》詩句“人閑桂花落,夜靜春山空”中的“空”,而一旦后一級裝置接收到前一級裝置傳來的信號,則又頗有“月出驚山鳥,時鳴春澗中”的意味。詩句中的“空”是由“時鳴”襯托出來的,而“空”卻不是“時鳴”的反面。從科學實驗的角度看,用以表述弓弩的行為的X(a,b)函數之所以與現(xiàn)實不符,是因為沒有也難以將時間作為實驗的因變量,X(a,b)函數僅能返回一個本征值。從電子電路的角度看,弓弩觸發(fā)是一個脈沖信號,這個信號在沒有被展寬時是不適用于邏輯函數的。
擴展思考一下,如果想要用弓弩實現(xiàn)邏輯上的“異或”運算,那就更不可能了,“異或”運算的要求是,在兩個輸入不一致的情況下,輸出為1,對應到弓弩的行為上,就是只有在一個扳機被擊中,另一個扳機未被擊中的情況下,才引發(fā)后續(xù)的釋箭動作,但當兩個扳機都被擊發(fā)或都沒有被擊發(fā)時,這樣情況下就不引發(fā)后續(xù)的釋箭動作。正如前面所說,因為不能保證射出的箭在時間上絕對同步到達扳機,一個扳機被擊中后箭已離弦,即便另一個扳機再被擊中,箭也不可能自動收回,所以這樣的裝置是幾無可能制作出來的。由于無法實施“異或”運算,這個弓弩連鎖擊發(fā)模型無法實現(xiàn)哪怕最簡單的二進制的1加1的運算,因為兩個二進制數碼1的相加,其低位必然是0。之所以要花費篇幅來講此類裝置做不到什么,其用意自然是想讓大家去思考,怎樣才能解決這些裝置做不到的問題。
英國物理學家大衛(wèi)·多伊奇(David Deutsch)說:“每一個算法都是由物理系統(tǒng)執(zhí)行的,即便是具有紙筆的數學家,算盤等機械系統(tǒng)還是現(xiàn)代計算機?!碑斀袢藗兠刻焓褂玫母鞣N數碼設備無疑都能進行計算,只要相信所有的計算過程是不可能脫離物理實體而憑空存在著的,就能推理獲知,計算過程必然對應著某種機械過程。《孫子兵法》中說“勢如彍弩,節(jié)如發(fā)機”,但前文中用“機”計算的嘗試,還存在著很多問題,如只能一次性傳輸信息、不能實現(xiàn)信息的取反、難以處理同步的信息輸入等。有一個詞語叫“神機妙算”,相信這個世界上存在著某種“機”來對應著某種“算”。
《墨子·公輸》中說:子墨子解帶為城,以牒為械,公輸盤九設攻城之機變,子墨子九距之。公輸盤就是魯班,他和墨子開展了一場攻城戰(zhàn)的演習,使用的是木質的機械模型。魯班將攻城的機械模型改變了很多次,但每次都被守城方的墨子破解。這次演習的結果是,使得楚王打消了攻打宋國的意圖。從這個故事中可以得到的一個啟發(fā),就是可以借助模型推演來預測結果。
借助模型可知,制作能夠實現(xiàn)對輸入信號取反的裝置是可能的。模型的實現(xiàn)方法可能是多種多樣的,不過要使其盡可能結構簡單、運行過程明顯,倒也不是件容易的事。圖3所展示的機械裝置的工作原理是這樣的:用左上角斜坡滾落的一系列的球作為輸入信號。當有球連續(xù)不斷滾入槽內時,代表信號1;當沒有球連續(xù)滾入槽內時,代表信號0。而右下角斜坡滾落的一系列球作為輸出信號,其行為和代表數值與輸入類似。裝置的關鍵在于一個蹺蹺板結構,當輸入信號為1時,也就是說,當有球連續(xù)不斷砸到蹺蹺板左側時,輸出端的球無路可去,則右下角沒有球滾落,表示輸出為0。而當輸入信號為0時,也就是說,蹺蹺板可以自由晃動,這樣右側的球就可以從右下角斜坡滾落,表示輸出為1。由于這個裝置是否能取反,取決于右上角管道是否有球滾入,所以此裝置事實上是一個受控非門。這個裝置還實現(xiàn)了一個重要的功能,就是只要右上角的管道能源源不斷地提供小球,裝置就能夠重復實現(xiàn)信息的輸入和輸出的計算。
圖3 對輸入信號取反的機械結構
《老子》中說“安以動之徐生”,可是為什么呢?周敦頤的《太極圖說》似乎給出了解釋:“動而生陽,動極而靜,靜而生陰,靜極復動。一動一靜,互為其根。分陰分陽,兩儀立焉?!敝芏仡U將原因歸于動靜互為其根,這種把問題引向另一個緣由的形而上解釋,還是很難讓人真正領會“動轉靜”與“靜轉動”的真諦。筆者搭建的這個對輸入信號去取反的機械結構,卻能將“由激發(fā)而抑制,由抑制而激發(fā)”的過程很直觀地呈現(xiàn)了出來。
若是將兩個取反機構級聯(lián),如圖4所示,則輸入和輸出可呈現(xiàn)更復雜的關系。
圖4 將兩個取反機構級聯(lián)
經實驗,或單純用邏輯推理可知,當輸入1和輸入2時信息均為0,也就是說在沒有小球在輸入端滾入的情況下,輸出信息為1。其他情況,輸出信息都是0。理論上說,可以將更多的取反機構級聯(lián)在一起,但小球滾落速度的差異,會對系統(tǒng)的穩(wěn)定運行造成很大的麻煩。大家或許會想,用什么形式的信號來代替小球滾動,才能避免小球滾落速度不同所產生的影響。答案可能是電,或是光,或是其他什么人們當前還不知道的物質或現(xiàn)象。
很容易用數學函數X(a,b)來描述取反機構的行為,它應當有兩個輸入參數:其一,a對應觸動的機關,也就是孫子所說的節(jié)或機;其二,b對應積蓄的能量,也就是孫子所說的勢或弩。函數的輸入和輸出行為是這樣的:
X(0,無) --> 0
X(0,有) --> 1
X(1,無) --> 0
X(1,有) --> 0
函數的第二個參數的值不參與運算,只是決定支撐計算裝置運行的能量是否有效,所以用“有”和“無”來表示,對于圖3中的取反機構,假設積蓄能量的參數總是“有”,則:
X(0,有) --> 1
X(1,有) --> 0
顯然,這個裝置的行為等同于邏輯上的“非”運算。可以看出,只要能量端總是“有”,X(a,b)就可能返回兩個本征值中的一個值。
對于圖4中的級聯(lián)的取反機構,其對應的函數是X(a,t(X(a,b))),函數中調用了函數自身,這便是一種遞歸,也就是說,哪怕是最簡單的邏輯函數,在其真正的物理實現(xiàn)過程中就已含有遞歸了。X(a,t(X(a,b)))中的X(a,b)對應的是第一級取反機構的行為,t的作用是將其運算結果轉化為第二級取反機構的能量,t(1)返回的是“有”,而t(0)返回的是“無”,這個結果結合第二級取反機構的輸入再一次進行運算。函數的輸入和輸出行為是這樣的:
X(0,t(X(0,有))) --> X(0,t(1))--> X(0,有) --> 1
X(0,t(X(1,有))) --> X(0,t(0))--> X(0,無) --> 0
X(1,t(X(0,有))) --> X(1,t(1))--> X(1,有) --> 0
X(1,t(X(1,有))) --> X(1,t(0))--> X(0,無) --> 0
在該函數中,第一級取反機構的能量總是“有”,而后續(xù)級聯(lián)機構的能量,則經由運算而獲得,所以對于裝置的使用者來說,可以進一步簡化函數的形式為NOR(a,b),其輸入和輸出行為是這樣的:
NOR(0,0) --> 1
NOR(0,1) --> 0
NOR(1,0) --> 0
NOR(1,1) --> 0
對數字邏輯比較熟悉的讀者能立刻看出,這其實就是邏輯中的或非門,或非門是一種通用邏輯門,利用或非門可以演化出其他所有種類的邏輯門(真實電路中最常見的是用兩個三極管組成與非門實現(xiàn)通用邏輯),當然,也能借助或非門實現(xiàn)前文中所說的難以實現(xiàn)的異或邏輯運算。邏輯運算是一種數學上的抽象,但對應邏輯運算抽象行為的物理實體并不是自然而然就存在著的,而是依靠一系列精巧的動作轉換和能量傳遞來實現(xiàn)的。人們可以構建模型來驗證自動化裝置的數學計算的可行性,較之公輸盤構建攻城機械模型更進一步的是,人們還可以用數學的模型代替實體的模型,來研究這個實體模型的行為。構建數學模型來解決現(xiàn)實問題是一回事,構建數學模型來研究數學計算行為本身,則又是另一回事。在人類歷史上,數學模型的出現(xiàn)常先于可實現(xiàn)此模型行為的實體的出現(xiàn),在喬治·布爾提出布爾邏輯近百年之后,才有香農的《對繼電器和開關電路中的符號分析》一文問世??v觀布爾邏輯的提出直到用繼電器實現(xiàn)各種布爾邏輯運算的歷程,就可以感受到具有計算思維特征的抽象是如何從數學思維中浮現(xiàn)出來的。