陳凱 上海市位育中學(xué)
歷史上,有些思想實(shí)驗(yàn)借助邏輯悖論可以推導(dǎo)出令人信服的答案,如伽利略的重力思想實(shí)驗(yàn),有些思想實(shí)驗(yàn)中的問題未能獲得被普遍認(rèn)可的解答,但它卻成為一種能顯現(xiàn)出人的思維方式和局限的特殊工具。
《莊子·雜篇·天下》中提到的“一尺之捶,日取其半,萬世不竭”,可看作是一個(gè)歷史悠久的思想實(shí)驗(yàn)。原文指出這是惠施的一個(gè)辯題,并說“辯者以此與惠施相應(yīng),終身無窮”。人總是能在頭腦的想象中將已經(jīng)取半的捶繼續(xù)施加以取半的動(dòng)作,南宋學(xué)者洪邁在《容齋隨筆》中認(rèn)為:“雖為寓言,然此理固具。蓋但取其半,正碎為微塵,余半猶存,雖至于無窮可也?!背衷硬豢稍俜指钣^點(diǎn)的辯者大概很難說明白,原子所占空間何以是不可再分而取半的。不過,這個(gè)“萬世不竭”的結(jié)論,常讓人內(nèi)心產(chǎn)生出一種找不到終極原因的不安感,大概正是這種不安,使得惠施的辯題常辯不衰。直到現(xiàn)代物理學(xué)取得豐富的成果后,人們從微觀粒子行為的不確定性與概率特征來加以審視,才發(fā)現(xiàn)其實(shí)不能用是或否來判定“一尺之捶,日取其半,萬世不竭”的命題,與復(fù)雜的物理現(xiàn)象相比,落于二邊的邏輯思維在此處是蒼白無力的。
本文特意創(chuàng)設(shè)了這樣一個(gè)和計(jì)算思維有關(guān)的思想實(shí)驗(yàn):某A自認(rèn)為運(yùn)用了計(jì)算思維解決了某一個(gè)問題,如某個(gè)需要用枚舉法解決的問題,并且,觀察某A解決問題過程的某B從某A的行為判定,某A確確實(shí)實(shí)是運(yùn)用了計(jì)算思維解決了這個(gè)問題,那么,假設(shè)在后續(xù)時(shí)間里,某A不斷地用同樣的方法解決同一類問題,如解決的都是那種能采用枚舉法來解決的問題,那么,是不是有理由懷疑,從某個(gè)時(shí)刻開始,某A不再是運(yùn)用計(jì)算思維,而是依賴某種思維慣性在解決此類問題呢?
為行文方便,姑且將此自創(chuàng)的思想實(shí)驗(yàn)稱為“褪色的計(jì)算思維”,如果將描述中的“計(jì)算思維”換成“邏輯思維”(這種替換仍然是思想實(shí)驗(yàn)的一部分),即某A自認(rèn)為且被他人評(píng)價(jià)為的確運(yùn)用了邏輯思維解決了某一類問題,而在后續(xù)時(shí)間內(nèi),某A不斷遇見這些需要用邏輯思維解決的問題,在這里,似乎就可以說,某A每次解決問題,確實(shí)都是運(yùn)用了邏輯思維。
從“褪色的計(jì)算思維”中可以看出這樣的問題,如果教師想要借助枚舉法的運(yùn)用創(chuàng)設(shè)一個(gè)培養(yǎng)和評(píng)價(jià)計(jì)算思維能力的情境和任務(wù),那就要弄明白,學(xué)生在面對多個(gè)需要借助枚舉法解決的問題時(shí),在其不斷采用的思維方法中,究竟哪一種的確可以算作是運(yùn)用了計(jì)算思維,顯然,不能輕易地說,只要采用了枚舉法解決問題就是運(yùn)用了計(jì)算思維,當(dāng)熟悉了枚舉法解決問題的過程后,就只需要拿出已有的應(yīng)用了枚舉法的計(jì)算模型或程序代碼,運(yùn)用邏輯思維改變其部分輸入數(shù)據(jù)和輸入形式,也一樣能解決問題。當(dāng)某A利用計(jì)算思維解決了某一類問題,并且構(gòu)建了解決問題的模式后,當(dāng)以后再遇到同類型問題時(shí),計(jì)算思維的運(yùn)用是不必要的。那么,教師應(yīng)當(dāng)如何構(gòu)建一個(gè)具有運(yùn)用計(jì)算思維必要性的情境和任務(wù)呢?
有一個(gè)邏輯推理趣題是這樣的:某推理比賽的冠軍是A、B、C、D四位同學(xué)中的一位。至于誰是冠軍,A說:“不是我?!盉說:“是C?!盋說:“是D?!盌說:“C說的不對?!逼渲腥齻€(gè)人說的是真話,一個(gè)人說的是假話,那么到底誰是冠軍?
曾有教師在介紹用于計(jì)算思維培養(yǎng)的教學(xué)案例中提到過這個(gè)例子。顯然,學(xué)生可以通過枚舉的方法來判別誰是冠軍,在具體操作上,既可以逐個(gè)地按不同人說謊的情況進(jìn)行枚舉,也可以逐個(gè)地按不同人是冠軍的情況進(jìn)行枚舉,通過排除掉存在矛盾的情況,就能得出結(jié)論。如果圍繞這個(gè)案例對培養(yǎng)計(jì)算思維進(jìn)行深入的思考,會(huì)引出許多疑惑。
疑惑一:不需要借助枚舉,單純依靠邏輯推理也能解決此問題:由于C和D的說法是矛盾的,所以,說假話的必然是兩者之一,然后,如果D說的是假話,則B說的也必然是假話,兩個(gè)說假話的情況與預(yù)設(shè)條件不符,所以只能是C說了假話??梢?,不借助枚舉,也能解決問題。即便說,使用枚舉法解決問題體現(xiàn)了計(jì)算思維的運(yùn)用(雖然筆者并不認(rèn)同這一點(diǎn)),那么,這里其實(shí)存在著計(jì)算思維運(yùn)用的必要性的問題。
疑惑二:枚舉是人類思維活動(dòng)中常用的方法,如在圖書館的書架上找出所有的教材、找出某個(gè)范圍內(nèi)符合某種特定條件的數(shù)字、用窮舉的方法構(gòu)建一個(gè)九宮幻方等,所以這里的問題是,用到了枚舉法,就一定是運(yùn)用了計(jì)算思維嗎?如果非要說人在利用枚舉進(jìn)行邏輯歸納時(shí)就運(yùn)用了計(jì)算思維,是不是有一種強(qiáng)行將人的思想降低到機(jī)器行為的嫌疑?這里存在計(jì)算思維的識(shí)別特征的問題,也就是說,要如何將計(jì)算思維的運(yùn)用從人的一般思維的運(yùn)用中凸顯出來。需要考慮當(dāng)人在利用枚舉算法解決問題時(shí),哪些行為是具有可分辨的運(yùn)用計(jì)算思維的特征的。
疑惑三:假設(shè)某A在學(xué)習(xí)了基本的程序語法后,構(gòu)造了某個(gè)算法或某個(gè)計(jì)算模型,借助枚舉法解決了問題。在這種情況下,認(rèn)為某A的確運(yùn)用了計(jì)算思維解決問題的判定大致是可以得到認(rèn)可的,但如果有某B直接學(xué)習(xí)并大致記住了解決此問題的枚舉算法,并利用算法解決了此問題,能不能就此認(rèn)為某B運(yùn)用了計(jì)算思維解決了問題?似乎無法找到證據(jù),認(rèn)為某B不是依靠對語言的理解(ChatGPT能通過對語言的機(jī)器學(xué)習(xí)來編寫枚舉算法的程序,能認(rèn)為ChatGPT運(yùn)用了計(jì)算思維嗎?),或是邏輯推理,或是算法思維來解決了問題。這里存在計(jì)算思維運(yùn)用如何判定和評(píng)價(jià)的問題。雖然一般認(rèn)為算法思維是計(jì)算思維的一部分,但既然提出了計(jì)算思維的概念,就應(yīng)當(dāng)思考包含了邏輯思維、系統(tǒng)思維、算法思維的計(jì)算思維在整體上是如何發(fā)揮作用的。
教師在教學(xué)設(shè)計(jì)中,如果要落實(shí)計(jì)算思維培養(yǎng)的目標(biāo),就需要明確計(jì)算思維運(yùn)用何以必要,計(jì)算思維運(yùn)用的特征如何凸顯,計(jì)算思維運(yùn)用如何判定和評(píng)價(jià)這些問題。為了解決這些問題,就有必要對情境和任務(wù)本身進(jìn)行一定的改造。限于篇幅,本文重點(diǎn)討論計(jì)算思維運(yùn)用何以必要這個(gè)問題。
不妨做這樣的嘗試:在教學(xué)情境中,任務(wù)切入的角度其實(shí)并不是怎樣解決“誰說假話”的問題,因?yàn)?,利用枚舉法解決此問題,只是日常的邏輯思維的運(yùn)用而已。相較而言更重要的是,要思考如何構(gòu)建能實(shí)現(xiàn)枚舉法的模型,來解決“誰說假話”的問題。需要注意的是,利用枚舉法和構(gòu)造實(shí)現(xiàn)枚舉法模型這兩者間是有區(qū)別的。
考慮要設(shè)計(jì)出某個(gè)機(jī)器,這個(gè)機(jī)器能解決部分推理問題,那么,討論機(jī)器如何借助并僅僅借助枚舉法解決一系列類似的推理問題,就顯現(xiàn)出“機(jī)器如何(半)通用性地解決問題”這個(gè)有價(jià)值的課題。當(dāng)然,也要同時(shí)為其他解決方案預(yù)留出空間,如并行搜索、邏輯編程等。圍繞機(jī)器的行為展開設(shè)計(jì)而不是借助程序語言環(huán)境實(shí)現(xiàn)任務(wù)目標(biāo),就是為了避免學(xué)生僅通過語言規(guī)則來完成任務(wù)。在一項(xiàng)進(jìn)行中的調(diào)查中發(fā)現(xiàn),大部分教師更傾向于在算法和程序設(shè)計(jì)的教學(xué)單元培養(yǎng)計(jì)算思維,但在課時(shí)有限的情況下,學(xué)生通常只能做到學(xué)習(xí)和應(yīng)用枚舉算法,而不是構(gòu)建枚舉算法,而一旦學(xué)生基本掌握了枚舉算法,就不再有親自體驗(yàn)構(gòu)建枚舉算法的可能了。所以,更好的辦法是將培養(yǎng)計(jì)算思維的平臺(tái)拓展到信息從采集、編碼、處理到應(yīng)用的整個(gè)過程中。
下面,是逐個(gè)地按不同人說謊的情況進(jìn)行枚舉,借助涂色和邏輯推理尋求“誰是冠軍”答案的方法:繪制4*4的表格,圖1是列舉出A說謊且其他人不說謊時(shí)描述的情況,深綠色代表描述中某人是冠軍,淺黃色代表描述中某人不是冠軍,未涂色的表示情況不明。第一行是根據(jù)A說謊時(shí)的描述情況進(jìn)行糾正后的涂色,第二、三、四行分別是根據(jù)B、C、D各人的描述進(jìn)行涂色??梢?,圖中有兩處矛盾,其一,第一、三列有兩處深綠色,說明有兩個(gè)冠軍,產(chǎn)生矛盾。其二,第四列同時(shí)有一處深綠色和一處淺黃色,說明某人既是冠軍又不是冠軍,從而產(chǎn)生矛盾。所以,A說謊且其他人不說謊的情況被排除了。接下來還要分別按B、C、D說謊的情況繪圖,這里就不一一展示了。

圖1 A說謊時(shí)的涂色
即便繪制完成如圖1所示的圖表,且根據(jù)圖表做出了A說謊時(shí)產(chǎn)生矛盾的推論,這個(gè)過程中也只有邏輯思維在起作用,計(jì)算思維在哪里呢?不妨更換一下研究角度,問某個(gè)機(jī)器到底應(yīng)該如何判斷出這種矛盾。這時(shí)候就可能涌現(xiàn)出許多不同的解決方案,一種可行的方案是,將不同的顏色用二進(jìn)制數(shù)碼加以表征,深綠色設(shè)置為“01”,淺黃色設(shè)置為“10”,白色設(shè)置為“00”。首先,縱向每列按位進(jìn)行或運(yùn)算操作,如果得到“11”,則表示存在矛盾。如果以上操作不存在矛盾,則縱向每列按位進(jìn)行或運(yùn)算操作,得到四個(gè)數(shù)值結(jié)果,如果存在多個(gè)“01”,則表示存在矛盾。
從上述解決方案中可以看出,雖然人能直觀看出矛盾所在,但為了讓機(jī)器判斷出矛盾是否存在,就需要構(gòu)造出一種能夠讓機(jī)器實(shí)現(xiàn)判斷的方法,這些方法用到了二進(jìn)制編碼和二進(jìn)制邏輯運(yùn)算,這正是運(yùn)用計(jì)算機(jī)科學(xué)的基礎(chǔ)概念進(jìn)行問題求解和系統(tǒng)設(shè)計(jì)。
這里存在一個(gè)疑惑,假設(shè)學(xué)生沒有學(xué)習(xí)過二進(jìn)制編碼和運(yùn)算,那么是否就無法運(yùn)用計(jì)算思維來解決這道推理趣題?筆者認(rèn)為,信息的編碼和表征可以有很多種方式,有些方式未必符合當(dāng)前計(jì)算機(jī)最有效率的運(yùn)行方式,但人的創(chuàng)造不應(yīng)該被現(xiàn)代數(shù)字計(jì)算機(jī)這種已成型的計(jì)算裝置的工作模式所束縛,創(chuàng)造和想象應(yīng)當(dāng)首先不受物理限制,然后再考慮物理現(xiàn)實(shí)中的可行性,這個(gè)問題留待以后討論。
某個(gè)機(jī)器要能實(shí)現(xiàn)枚舉,那么它必然要能做到選取下一個(gè)的動(dòng)作,利用程序語言,當(dāng)然很容易實(shí)現(xiàn)“下一個(gè)”,如“for i in range(10):”這樣的語句自然就能從0枚舉到9。但和前文所述類似,用程序語言實(shí)現(xiàn)這樣的“下一個(gè)”,不必然運(yùn)用了計(jì)算思維,只要足夠熟悉程序語言就能做到,“for i in range(10):”本身就可以看成是“從10的范圍內(nèi)取出每個(gè)數(shù)字給i”的人類語言的描述。
仍然以“誰是冠軍”為例,圖2中列出了枚舉所得的所有四種涂色情況,這四種涂色都是由最左面的聽眾視角變換而來的,變換規(guī)律也很簡單,分別是第一、二、三、四行的顏色發(fā)生變化,如果該行存在深綠色則變?yōu)闇\黃色,淺黃色則變?yōu)樯罹G色。

圖2 從聽眾視角涂色變換成四種枚舉所得的場景的涂色
從每一行中找到某種顏色進(jìn)行變換這個(gè)動(dòng)作,本身就是一種枚舉,也就是說,為了枚舉出每一種說謊的情況,首先要對每一行的每一種顏色進(jìn)行枚舉,這個(gè)機(jī)器表象的枚舉現(xiàn)象和底層的枚舉動(dòng)作其實(shí)是不一致的,底層的動(dòng)作支撐了表象中“下一個(gè)”動(dòng)作的產(chǎn)生。底層的枚舉成為高層的實(shí)現(xiàn)枚舉的計(jì)算模型中的一個(gè)組成部分,這里再來看“運(yùn)用計(jì)算機(jī)科學(xué)的基礎(chǔ)概念去求解問題和系統(tǒng)設(shè)計(jì)”這句話,對于“運(yùn)用計(jì)算機(jī)科學(xué)的基礎(chǔ)概念去求解問題”,一方面其有可能與“運(yùn)用計(jì)算機(jī)科學(xué)的成果去求解問題”相混淆,另一方面有可能讓人停留于“運(yùn)用計(jì)算機(jī)科學(xué)的基礎(chǔ)概念在概念層面而不是在計(jì)算裝置實(shí)施計(jì)算的層面解決問題”,但如果強(qiáng)調(diào)的是“運(yùn)用計(jì)算機(jī)科學(xué)的基礎(chǔ)概念去設(shè)計(jì)一個(gè)系統(tǒng)來求解問題”,那就為什么樣的思維方式屬于計(jì)算思維的運(yùn)用劃定了更精確的界限。
枚舉中的“下一步”的可行也隱含了更多低層的原因,那是因?yàn)榘串?dāng)前數(shù)字計(jì)算機(jī)的體系結(jié)構(gòu),讀寫數(shù)據(jù)的操作必須遵循一定的指令的順序,這在計(jì)算機(jī)實(shí)體結(jié)構(gòu)的層面上揭示了在構(gòu)建計(jì)算模型過程中計(jì)算思維運(yùn)用的必要性,在本欄目往期文章《芯中之?dāng)?shù)—一種展示計(jì)算機(jī)系統(tǒng)架構(gòu)工作原理的方法》中對此已有論述,這里不再展開。但如果跳出計(jì)算機(jī)實(shí)體結(jié)構(gòu)的限制,許多計(jì)算模型具有并行計(jì)算的能力,如DNA計(jì)算、量子點(diǎn)計(jì)算等,利用這些計(jì)算模型實(shí)施枚舉,就不再有如何實(shí)現(xiàn)“下一步”的問題。
枚舉算法中的“下一步”如何才能停下來,是一個(gè)必須面對的問題,也是一個(gè)有趣的問題。在高級(jí)程序語言中,當(dāng)循環(huán)全部執(zhí)行完畢后,程序就停了下來,但這是因?yàn)橛胁僮飨到y(tǒng)在管理著程序的運(yùn)行,程序停下來了,操作系統(tǒng)卻并沒有停下來。假設(shè)不使用普通的計(jì)算機(jī),而是用圖靈機(jī)來解決枚舉并將顏色進(jìn)行變換的問題,如用十進(jìn)制數(shù)1代表二進(jìn)制數(shù)01,用十進(jìn)制數(shù)2代表二進(jìn)制數(shù)10,具體運(yùn)行規(guī)則和運(yùn)行初始和終止時(shí)的狀態(tài)如下頁圖3所示,則能發(fā)現(xiàn),圖靈機(jī)預(yù)設(shè)了一個(gè)停止?fàn)顟B(tài),當(dāng)讀寫頭遇見空格—也就是沒有任何顏色存在的格子時(shí),圖靈機(jī)就停止運(yùn)行,但它是怎么停下來的呢?當(dāng)電路判斷到數(shù)據(jù)符合某種特定的狀態(tài)時(shí),就執(zhí)行電路自己斷開的動(dòng)作,這當(dāng)然是可行的。用函數(shù)的遞歸也能實(shí)現(xiàn)當(dāng)枚舉任務(wù)完成后自動(dòng)且自主停機(jī),如果遞歸函數(shù)是一種純粹抽象的機(jī)器,那么遞歸函數(shù)就是其自身的操作系統(tǒng)—雖然現(xiàn)實(shí)中,人類構(gòu)建的遞歸計(jì)算裝置都有其物質(zhì)實(shí)體。

圖3 枚舉結(jié)束后會(huì)自己停機(jī)的圖靈機(jī),上方是初始時(shí)的數(shù)據(jù),下方是任務(wù)完成后的數(shù)據(jù)
考慮到有學(xué)生對函數(shù)遞歸工作過程的理解存在困難,可以思考這樣一個(gè)演示方案,假設(shè)存儲(chǔ)器里存儲(chǔ)的不僅是數(shù)據(jù),也包含對讀寫頭下一步動(dòng)作的指令,那么機(jī)器就不僅能自動(dòng)根據(jù)指令匹配特定數(shù)據(jù)和替換,還能實(shí)現(xiàn)“下一步”動(dòng)作和適時(shí)停機(jī)了。圖4是一個(gè)借助圖形化編程工具實(shí)現(xiàn)的枚舉和自動(dòng)停機(jī)的演示,用表情符號(hào)代表機(jī)器讀寫頭,用方塊代表存儲(chǔ)器。在這個(gè)例子中,存儲(chǔ)器數(shù)據(jù)中的第一個(gè)值代表讀寫頭將要做的動(dòng)作,0代表右移,1代表停機(jī)。而#號(hào)后的數(shù)據(jù)則代表真正的需要被判斷或被替換的數(shù)值。讀寫頭既從存儲(chǔ)器中讀取和寫入數(shù)據(jù),也根據(jù)存儲(chǔ)器中的數(shù)據(jù),來指示下一步將要做的動(dòng)作。

圖4 用圖形化編程工具演示讀寫頭和存儲(chǔ)器的行為
