陳凱



摘要:由于具體問題的解決常常需要綜合運用到多種思維能力,于是存在這樣的問題:判定問題解決過程中計算思維得到運用的依據是什么?本文提出,為了作出判定,一方面要觀察對于某個問題的解決過程中確實運用了構造性和機械化的方法來對數據進行處理,在此基礎上,同時也要觀察,存在將計算裝置的行為分解成更底層的功能組件的行為,這是因為計算裝置的整體功能,是在其包含的實體的或虛擬的功能組件在相互觸發和影響的過程中,由依附于功能組件的數據按規則變化的過程中被表征出來的。
關鍵詞:計算思維;構造性;機械化;加一倍法
中圖分類號:G434? 文獻標識碼:A? 論文編號:1674-2117(2023)15-0024-04
當學生運用某種方法解決了某個特定問題時,教師常常能從學生的行為判斷出其解決問題過程中究竟運用了何種思維方式。雖然說,具體問題的解決需要綜合運用多種思維能力,但假設旁觀者的確能看出問題解決過程中計算思維得到了運用,那么就值得進一步追問,這個判定的依據是什么?換一種不甚嚴謹的問法,計算思維具有怎樣的形狀,使得其在被運用時能夠被識別出來?
邵雍的加一倍法
本文的探索源自千年前的北宋時期,當時的易學大師邵雍創造了一種名為“加一倍法”的計算方法,用來有規律地生成八卦乃至六十四卦圖樣。所謂“加一倍”,邵雍這樣說:“一變而二,二變而四,三變而八卦成矣。四變而十有六,五變而三十有二,六變而六十四卦備矣。”后來的《易裨傳》解釋得更清楚:“陰陽各分陰陽……再變則二陰二陽,三變則四陰四陽。”用現在人們更容易理解的方式來解釋(列表如圖1):以0為陰,以1為陽,則第一行01交錯,第二行數字加倍0011交錯,第三行再加倍00001111交錯。如按此規則列三行數字,縱向看就得到8種不同的排列組合方式。按此規則每多列出一行數字,縱向排列組合方式則加倍。將0作為陰爻用虛線描繪,將1作為陽爻用實線描繪,則三行數字得到縱向8種排列組合就對應如圖2所示八卦中所有卦圖。
邵雍說:“圖雖無文,吾終日言而未當離乎是,蓋天地萬物之理盡在其中矣。”可見,邵雍運用加一倍法生成卦圖,其目的是想說明根據易理是能夠推究宇宙起源、自然演化和社會發展的。邵雍這種象數相生的宇宙觀,有學者認為其是現代數字技術的思想發端。[1]有興趣的讀者可查閱邵雍進一步運用加一倍法所推演出的“六十四卦圓方圖”,限于篇幅這里就不作展示了。關于邵雍是否真正有使用二進制數的意識和自覺而不僅僅是巧合,學者們意見不一,但無論是持肯定還是否定的觀點,不可否認的是,邵雍事實上創設出一種按特定算法自動化生成二進制數的模型。而在加一倍法的運用中,邵雍進一步將傳統易學中的象生數和數生象,豐富為象生數、數生數、數生象的思想方法。大家不妨自問這樣一個問題,邵雍在解決自動生成卦圖這個問題時,是不是運用了計算思維?或者換個問法,假設有學生說自己發現了一種方法,可以有規律地生成指定位數的所有二進制數,教師是否能認可該學生是運用了計算思維在解決問題?
著名的數學家吳文俊指出:中國古算具有兩大特色,一是構造性,二是機械化。[2]針對易學,傅海倫指出:對易圖的數理研究……向人們顯示了當時數學家對構造性問題的關心……構造性特別強調運算可操作程度,其首要特征就是要從問題包括的信息出發通過一系列有限的運算求出解來,因而構造性往往是與算法的機械化特色聯系在一起。[3]這種構造性和機械化的問題解決方法,無疑體現了算法思維的運用。但這是不是也體現了計算思維的運用呢?有學者就認為這種構造性和機械化的問題解決方法是一種中國古代的計算思維。[4]然而這就出現了一個問題,周以真在2006年提出“計算思維”的概念,她認為計算思維指的是一種運用計算機科學基本概念求解問題、設計系統和理解人類行為的方式。考慮到計算機設計的目的就是利用機械化的運動方式以特定算法對數據進行處理并輸出結果,那么“計算思維”這個概念和構造性和機械化的思維方法到底有怎樣的不同?從樸素的直覺生出的判斷是:“計算思維”概念的提出,似乎不應該是一種已被認可的思維方式概念的重命名。如果說加一倍法能充分體現出構造性和機械化的問題解決方法,那么為何說這種方法還不能充分地體現出計算思維的運用?
將機械化的算法轉化為機械的構造和運動過程
使用加一倍法可以生成所有按從小到大順序排列的n位二進制數,這個時候可以將加一倍法的描述視作算法,而根據描述生成的二進制數可以看成是算法處理后輸出的字符串。雖然人的頭腦很容易理解如何實施加一倍法,但問題是,應當如何真正地創造出一種可行的或至少在思想中可行的機器,能夠讓其按加一倍法生成二進制數?當今的人們能借助計算機程序或數字電路輕松地做到這些,圖3就是一種簡單的用加一倍法生成所有3位二進制數的數字電路。
邵雍所處的時代當然沒有計算機或數字電路,不過可以假想存在某個有感知功能的讀寫機,當該機器讀取到數據“0”,則在新的一行中寫下兩個“0”,當讀取到數據“1”,則在新的一行中寫下兩個“1”,為了能生成所有3位二進制數,需要A、B兩個讀寫機根據初始的“01010101”數據開始一系列的動作。其實,這個初始的數據也可以用更為初始的數據“0”以及一個從左讀取數據并向右寫數據的另一種讀寫機來生成,這里就不進一步展開了。實際上,A、B兩個讀寫機的運行規則是完全一致的。圖4展示的是這兩個讀寫機工作的第一步和第二步。還需要注意的問題是,讀寫機讀數據只需要移動一格位置,而寫數據需要移動兩格位置。解決的方法可以是這樣的,為每個讀寫機設定一個分身,如A負責讀,A負責寫,而A需要能夠接受到A發出的信息并轉換成相應的動作。
相信即便是在不存在計算機或數字電路的時代,人們也能夠僅僅借助頭腦中的想象來理解這個讀寫機的工作原理和過程。所以存在這樣一個假設,在沒有計算機或數字電路硬件存在的情況下,人們也能按加一倍法的原理,構造出一種能合理運行的自動化機械裝置。古人為解決特定問題創造出很多精妙的算法,不過從計算思維的角度看,的確還缺少這樣的思考:算法中的每一步是否有可能離開人自動化地實施。雖然說這種自動化實施的構想并不一定真正能在技術上加以實現,但即便是構想一個現實中難以實現但在行為和邏輯上合理的虛擬機器,對于用機械化思想解決問題還是有重要的意義的。圖靈機的創設就是一個典型的例子,圖靈在論文中完整描述的圖靈機在當時并沒有被真正制造出來,但圖靈機的機械化計算過程將一些本來用語言文字難以描述的問題進行了清晰的界定,不僅解決了數學上的判定問題,還經由元圖靈機的概念證明了通用計算機器是存在的。
功能組件的行為
考慮如圖5所示的這樣一種奇特裝置,由于單擺做簡諧運動的周期跟擺長的平方根成正比,所以可以調整擺長將單擺周期設置成2倍關系,這樣,僅僅觀察單擺運動時擺動的方向,并人為將單擺不同的運動方向分別編碼為“0”和“1”,就能夠簡單地模擬出按加一倍法原理實現二進制數的自動生成過程,這里暫且將其簡稱為單擺機。設計并搭建出這種裝置的人不僅理解加一倍法的原理,還真正利用簡單機械的運動將二進制數生成過程展現了出來,那么是否可以認為,單擺機的設計和實現過程中運用了計算思維?
前文提到的讀寫機和單擺機有一處很大的不同:讀寫機是可以拆解出功能組件的,功能組件具有數據輸入的接口、數據輸出的接口、存儲的數據以及特定的行動方式,功能組件之間通過某種條件下的觸發,實現功能組件自身數據的變化及功能組件行為的變化,諸多功能組件的行為只有在宏觀的層面上,才涌現出整體的功能。并且,功能組件的行為有著被重新定義的潛力。而一個單擺機只是單純的物理現象的反映,無法對其進行拆解,這就好像是侯世達所說的鏡子:“能反映宇宙但看不到范疇……不具有自主結構,完全依賴于外在世界。”[5]
利用功能組件的行為以及相應行為所觸發的事件(包括數據的變化和后續行為的變化),可以有多種不同的生成二進制數或生成其他某種特定字符串的方法。例如,可以這樣描述生成從小到大順序排列的n位二進制數的計算裝置:有某個能在平面上游走的讀寫裝置U,該裝置和其附近的四個默認存儲了“0”的存儲裝置按某種特定規則交換信息,規則是,每一輪交換過程中,默認存儲了“0”的裝置U首先觸碰A存儲裝置,其觸發的事件是裝置U自身的數據由“0”變為“1”,然后,裝置U依次按順序觸碰存儲裝置a1,a2,a3,a4,當裝置U觸碰a1,a2,a3,a4中任意一個時,如果裝置U為“1”,且存儲裝置也為“1”,則將存儲裝置數據設置為“0”;如果裝置U為“1”,存儲裝置為“0”,則將裝置U設為“0”,存儲裝置數據設為“1”。后續則反復實施如上動作。這個裝置的運行過程如圖6所示,顯然,如果試圖純粹用語言來描述其完整的工作過程,還需要設置一個平面坐標系,為所有部件規定好位置,還要說清楚裝置U的運動軌跡。這個裝置可以稱為觸碰迭代機,而以上的諸多語言文字描述則可以當作觸碰迭代機的算法。
那么,為了生成所有n位二進制數的字符串,哪一種描述方法更為簡潔?(一個值得探索的有趣問題是,是否存在一種算法,能夠判定某個生成特定字符串的最為簡潔的算法的長度。這個問題和柯氏復雜度有關,而柯氏復雜度已被證明為是一個不可計算的問題)從上文所舉的例子看,似乎加一倍法的描述遠比觸碰迭代機簡潔。不過深究之下,這個判斷其實大有問題,當人們讀到“陰陽各分陰陽……再變則二陰二陽,三變則四陰四陽”時,已有的經驗能幫助人將這些簡潔的語言解析還原成現象。例如,當人們見到“三顧茅廬”這個詞時,得到的信息是絕對不止于三次拜訪茅廬的,類似地,當人們看見泰山石刻“蟲二”兩字時,聯系周圍風景,才可解讀出“風月無邊”。所以,對于怎樣地生成某特定字符串的描述才是更簡潔的描述這一問題,需要放置在一個特定的機械化的系統中加以判斷。例如,只使用C語言的編輯器編寫代碼生成某特定字符串,或者只使用圖靈機生成某特定字符串。圖7所示的是利用圖靈機將上述觸碰迭代機的各個組件編碼成為一維的數據,并仍然按迭代法生成4位二進制數的方法。
可以看出,在一個特定的機械化的系統中,是可以分辨出哪一種解決問題的描述也就是算法是簡單的,哪一種是復雜的。這樣也就避免了討論問題時自然語言模糊不清造成的影響。某些結構不同的機械化系統,雖然說它們執行計算的功能集是相同的,但它們的結構卻會影響計算實現的復雜性。
結論
到這里,就可以對“計算思維的形狀”這一問題給出初步的結論。為了判斷某人解決問題是否運用了計算思維,可以觀察以下兩點:首先,作為必要條件,此人對于某個問題的解決,運用了構造性和機械化的方法來對數據進行處理;其次,數據的處理過程能夠被分解成更底層的功能組件的行為,這些功能組件可能是現實存在的物質實體或虛擬的裝置,但都包含對數據進行通信的接口、可根據特定條件改變自身數據或行為的規則,計算裝置的整體功能,是由這些功能組件在相互觸發與數據按規則變化的過程中被表征出來的。
參考文獻:
[1]丘亮輝,郭彧.古代象數觀和現代數字化技術思想[J].自然辯證法研究,2004(10):8-10.
[2]吳文俊.從《數書九章》看中國傳統數學構造性和機械化的特色[M].北京:北京師范大學出版社,1987.
[3]傅海倫.構造性的思維方式與數學機械化[J].大自然探索,1998(01):120-123.
[4]管會生,楊建磊.從中國“古算”到“圖靈機”—看不同歷史時期“計算思維”的演變[J].計算機教育,2012,167(11):120-125.
[5][美]侯世達,[美]丹尼爾·丹尼特.我是誰,或什么:一部心與自我的辯證奇想集[M].舒文,馬健,譯.上海:上海三聯書店,2020: 197-198.