1. 程式人生 > >編碼的奧祕:邏輯與開關

編碼的奧祕:邏輯與開關

轉自: 《編碼的奧祕》     第十章

 

 

            真理是什麼呢?亞里士多德認為邏輯與它有關。他的講義合集《工具論》( O rg a n o n,可追溯到公元前 4世紀)是最早的關於邏輯的詳細著作。對於古希臘人而言,邏輯是追尋真理的過程中用於分析語言的一種手段,因此它被認為是一種哲學。亞里士多德的邏輯學的基礎是三段論。最有名的三段論(它並非是在亞里士多德的著作中發現的)是:

            在三段論中,兩個前提被假設是正確的,並由此推出結論。

            蘇格拉底之死這個例子看上去似乎太直白了,但還有許多其他不同的三段論。例如,考慮下面兩個由 1 9世紀數學家 Charles Dodgson(也就是 Lewis Carroll)提出的前提:


             它所能推出的結論一點兒也不明顯。 (事實上,結論是“一些頑固的人不是哲學家 ( S o m edostinate persons are not philosophers) ”)請注意結論中一個出乎意料且令人迷惑的詞 “一些( s o m e )”。

              兩千多年來,數學家們對亞里士多德的邏輯理論苦苦思索,試圖用數學符號和操作符來表現它。 1 9世紀以前,唯一能接近這個目標的人是萊布尼茲( 1 6 4 8—1 7 1 6),他早年涉足邏輯學領域,後來轉向其他學科(比如說,他幾乎和牛頓同時獨立地發明了微積分 )。

              接下來有所突破的是喬治·布林。

              喬治·布林 1 8 1 5年生於英格蘭,他周圍的環境對他的成長很不利。他父親是鞋匠,而母親曾是女僕,英國森嚴
的等級制度使布林學不到什麼有別於父輩的東西。但是,靠著他自身強烈的好奇心及父親的幫助(其父對科學研究、數學和文學有濃厚的興趣) ,年輕的喬治自學了上層階級男孩才能學到的課程,包括拉丁文、希臘語及數學。由於他早年在數學方面發表的論文, 1 8 4 9年,布林被任命為愛爾蘭C o r k市的皇后大學數學系的首席教授。


 
              1 9世紀中期的幾位數學家在邏輯理論的數學定義上做了一些工作(最著名的是迪摩根),但只有布林有真正概念上的突破。他最早的貢獻是發表的一本很簡短的書《The Mathematical A nalysis of Logic,Being an Essay Towards a Calculus of Deductive Reasoning》( 1 8 4 7 ),接著又發表了一篇很長且充滿抱負的文章:《An Investigation of the Laws of Thought on Which Are Founded theMathematical Theories of Logic and Probabilities》( 1 8 5 4 ),簡稱為《The Laws of Thought》。1 8 6 4年的一天,布林在雨中趕去上課時不幸感染上了肺炎,不治身亡,享年4 9歲。

                   我們可以從布林在1 8 5 4年所著書的題目中看出他富於野心的想法:由於充滿理性的人腦用邏輯去思考,那麼,如果能用數學來表徵邏輯,我們也就可以用數學來描述大腦是如何工作的。當然,現在看來這種想法似乎十分幼稚。(但卻超越了他所在的年代。)

                   布林發明了一種和傳統代數看起來、用起來都十分相似的代數。在傳統代數中,運算元(通常是字母)代表數字,而操作符(多是“ +”或“×”)指明這些運算元如何結合到一起。一般我們可用傳統代數解決類似下面的問題:如果安娜有3磅豆腐,貝蒂的豆腐是安娜的2倍,卡門的豆腐比貝蒂多5磅,迪爾德麗的豆腐是卡門的3倍。那麼,迪爾德麗有多少豆腐呢?

                   為了計算這個問題,我們首先把語句轉化為算術式子,用四個字母代表每個人擁有豆腐的數量,即:

                    可以通過代入把上述四個表示式合為一個式子,最後執行加法和乘法,即: 

                    當做傳統代數題時,要遵循一定的規則。這些規則可能已經和實踐融為一體,以至於我們不再認為它們是規則,甚至忘記了它們的名字。但規則確實是任何形式的數學的基礎。 

                     第一個規則是加法與乘法的交換律,即我們可以在操作符兩邊交換運算元的位置:

                     相反,減法和除法是不滿足交換律的。
                     加法和乘法也滿足結合律,即: 

                    最後,乘法對加法可以進行分配:

                    傳統代數的另外一個特點是它總是處理數字,如豆腐的重量或鴨子的數量,火車行駛的距離或家庭成員的年齡。是布林超凡的智慧使代數脫離了數字的概念而變得更加抽象。在布林代數中(布林的代數最終被這樣命名)運算元不是指數字,而是指集(類)。一個類僅僅表示一組事物,也就是後來熟知的集合。

                    讓我們來討論一下貓。貓或公或母,為方便起見,我們用字母M指代公貓的集合,用F指代母貓的集合。記住,這兩個符號並不代表貓的數量,公貓或母貓的數量隨著小貓仔的出生和老貓的不幸離去而變化,這兩個字母代表的是貓的種類—具有某種特點的貓。因而我們不說公貓,而是用M來代表它們。

                     我們也可以用其他字母代表貓的顏色。例如,用T代表黃褐色的貓,用B代表黑貓,用W代表白貓,而用O代表所有其他顏色的貓。

                     最後(至少就這個例子而言),貓要麼是閹過的要麼是有生育能力的。我們用字母N代表閹過的貓,而用U代表有生育能力的貓。

                     在傳統代數中,操作符+和×被用於表示加法和乘法。在布林代數中,同樣用到了+和×。這似乎會引起混淆。人人都知道在傳統代數中如何對數字進行加和乘,但是我們如何對“類”進行加和乘呢?

                     事實上,在布林代數中我們並不真正地做加或乘,相反,這兩個符號有著完全不同的意思。

                    在布林代數中,符號+意味著兩個集合合併,兩個集合的合併就是包含第一個集合的所有成員及第二個集合的所有成員。例如, B + W表示黑貓和白貓的集合。

                   布林代數中的符號×意味著取兩個集合的交集,兩個集合的交集包含的元素既在第一個集合中,也在第二個集合中。例如, F×T代表了一種貓的集合,這個集合中的貓既是母貓又是黃褐色的。與傳統代數一樣,我們可以把F×T寫成F·T或簡寫為F T(這正是布林代數所期望的)。你可以把這兩個字母看成是連在一起的兩個形容詞:黃褐色的母貓。

                   為避免傳統代數和布林代數之間的混淆,有時候用符號∪和∩而不用+和×來表示並運算和交運算。但布林對數學的解放性的部分影響是使熟悉的操作符更加抽象,所以,我們決定堅持他的決定,而不為他的代數引入新的符號。

                   交換律、結合律和分配律在布林代數中均適用。而且,在布林代數中,操作符+可以對×進行分配,這在傳統代數中是不成立的,即:

                  

                這個式子表示白貓(W)和黑色母貓( B×F)的並集和等式右邊兩個集合的交集是一樣的,這兩個集合是白貓和黑貓的並集( W + B)及白貓和母貓的並集( W + F)。要掌握這個規則有些困難,但它的確有用。 

              為了使布林代數更加完整,我們還需要兩個符號。這兩個符號看上去像數字,但它們並不真的是數字,因為有時候它們和數字有些不同。符號“ 1”在布林代數中表示“整個宇宙(全集)”,也就是我們所談論的每件事物。本例中,符號“ 1”表示“所有的貓”。這樣:

                即母貓和公貓的並集是所有的貓。同樣,黃褐色貓、黑貓、白貓及其他顏色的貓的並集也是所有的貓,即: 

              你也可以這樣表示所有的貓:

              符號1可以用一個減號-來排除一些事物。例如:

             表示除了公貓以外的所有貓。排除公貓以後的全集就是母貓的集合:

             我們所需要的另外一個符號是“ 0”。在布林代數中,“0”表示空集,即不含任何事物的集合。當求取兩個完全相互排斥的集合的交集時,空集就產生了。例如,既是母的又是公的貓的集合可以表示為:

            注意,符號1和0有時的用法與傳統代數相同。例如,所有的貓和母貓求交集即是母貓這個集合:

             空集和母貓求交集還是空集:

             空集和母貓的並是母貓這個集合:

           但有時與傳統代數中得到的結果就不太一樣了。例如,所有的貓和母貓的並集是所有的貓:

           這個表示式在傳統代數中是沒有意義的。

           由於F代表母貓的集合,1-F代表所有其他貓的集合,則這兩個集合的並集是1:

            並且它們的交集是0:

            歷史上,這個公式代表了邏輯中一個十分重要的概念,即矛盾律。它表明一個事物不能同時是它自己和它自己的反面。

            使布林代數和傳統代數看起來完全不同的是下面這個表示式:

            這個式子在布林代數中有著完美的意義:母貓的集合和母貓的集合的交集仍舊是母貓的集合。但若F代表一個數字的話,這個公式顯然就不對了。布林認為: 

   

              是使他的代數與傳統代數區分開來的唯一表達式。另一個按照傳統代數看起來很有趣的布林表示式是: 

              母貓和母貓的並集仍是母貓這個集合。

              布林代數為解決亞里士多德的三段論提供了一個數學方法。再看看這個著名三段論的兩個前提: 

              我們用字母P代表所有人的集合, M代表要死的東西的集合, S代表蘇格拉底。那麼,所謂“所有的人都是要死的”意味著什麼呢?它其實表示了所有人的集合和所有要死的東西的集合的交集是所有的人這個集合,即:

          

              而P×M = M 這個式子是錯誤的,因為要死的東西還包括貓、狗、榆樹等等。

              而“蘇格拉底是人”意味著蘇格拉底這個集合(非常小)和所有人的集合(很大)的交集是蘇格拉底這個集合: 

              由於從第一個式子中知道P = P×M,所以可以把它代入第二個式子,即: 

               根據結合律,上式等同於:

                但我們已經知道S×P等於S,所以上式可簡化為:

                現在計算完畢。這個表示式告訴我們,蘇格拉底和所有要死東西的集合的交集是蘇格拉底,也就是說蘇格拉底是要死的。相反,如果認為S×M等於0,那麼結論就是蘇格拉底不會死。再如果,若S×M等於M,則能推出的結論就是蘇格拉底是唯一會死去的東西,而其他任何東西都是不朽的! 

                 用布林代數來證明顯而易見的事實似乎有些小題大做(尤其當考慮到蘇格拉底早已在2 4 0 0年以前就去世了時),不過,布林代數還可以用來判斷一些事物是否滿足一定的標準。也許有一天,你走進寵物店對店員說:“我想要一隻鬮過的公貓,白的或黃褐色的均可;或者要一隻沒有生殖能力的母貓,除了白色,其他任何顏色均可;或者只要是只黑貓,我也要。”店員對你說:“看來您想要的貓是下面的式子表示的集合中的一隻:

              對嗎?”你回答道:“是的,完全正確!

             為了證明店員是正確的,你可能想放棄並和交的概念而轉向“ O R(或者/或)”和“A N D(並且/與)”。大寫這兩個詞是因為雖然在通常情況下它們代表語言中的概念,但它們也代表了布林代數中的操作。當求兩個集合的並集時,你實際上是從第一個集合“或”從第二個集合中取得事物放入結果集合裡。當求兩個集合的交集時,滿足條件的事物必定在第一個集合中“並且”也在第二個集合中。此外,每當你看見後跟減號的1,你可以使用單詞“N O T(非)”來表示。小結如下:

            • +(以前表示求並集)現在表示O R。
            • ×(以前表示求交集)現在表示A N D。
            • 1 -(以前表示從全集中排除一些事物)現在表示N O T。

            這樣,剛才的表示式可以寫成下面的形式:

            

          這與你的口頭描述已經十分接近了。注意圓括號是如何清楚地表達出你的意圖的。你想要的貓來自下面三個集合之一: 

            寫下這個公式後,店員就可以進行布林測試的工作了。別這麼大驚小怪的,這裡已經悄悄轉移到另一種不同形式的布林代數中去了。在這種形式的布林代數中,字母不再只表示集合,字母還可以被賦予數字,但需要注意的是它們只能被賦予0或者1。數字1表示“是的”、“正確”,本例中的意思是“這隻貓符合我的要求”;數字0表示“否定”、“錯誤”、本例中即“這隻貓不符合我的要求”。 

             首先,店員拿出一隻未鬮過的黃褐色的公貓。下面是滿足條件的貓的集合:

            當用0和1代替字母后就變成了下面的樣子:

           注意被賦予了1的字母只有M和T,因為拿來的這隻貓是公的,黃褐色的。

           現在必須要做的是簡化這個表示式。如果簡化後表示式的結果是1,這隻貓就滿足了你的要求,否則就不是你想要的貓。當簡化表示式時,千萬記住我們並不是在真正地做加法和乘法。當+表示O R,×表示A N D時,大部分規則是相同的。(現代課本中有時用∧和∨分別表示A N D和O R,而不用×和+;但這裡用+和×這兩個符號卻是恰到好處的。)

            當用×表示A N D時,可能的結果是:

            換句話說,只有當×的左、右兩個運算元均為1時,結果才為1。這個過程和普通乘法一模一樣。若用一張小表總結一下,你會發現它們和第8章的加法表和乘法表的形式相似:

           

           當用+表示O R時,可能的結果是:

           當+的左、右運算元中有一個為1時,結果就是1。除了1 + 1 = 1這種情況,這種計算和普通加法產生的結果是一致的。可用另一張小表來總結:

            

            現在可以用這些表來計算前面那個表示式的結果了:

            結果是0,表示“否定”、“錯誤”,即這隻小貓不滿足客戶需求。

            接下來,店員拿來一隻無生育能力的白色的小母貓。原始表示式是:

            把0和1代入上式:

             

             並且把它簡化一下:

             看來,這隻可憐的小貓還是不符合要求。

             然後,店員又拿來一隻無生育能力的灰色的小母貓。(灰色是非白色、黑色或黃褐色的一種其他顏色。)下面是表示式: 

             現在把它簡化為:

            最後的結果1表示“是的”、“正確”, 這隻小貓總算找到新家了!

            在你買到小貓的那天晚上,當小貓蜷身睡在你的腿上時,你開始考慮是否能夠通過電線連線一些開關和燈泡來決定哪些小貓滿足你的要求。(你真是一個奇怪的傢伙。)你絲毫沒有意識到你將要實現一個關鍵概念上的突破。你要做的是一些試驗,這些試驗把布林代數和電路結合在一起,從而使使用二進位制數字工作的計算機的設計和製造成為可能。(可別讓這些話嚇著你。) 

             下面就開始了。你像往常一樣把燈泡和電池連線在一起,這一回你用了兩個開關:

              開關這種方式的連線—一個在另一個的右邊—稱為串聯的。如果你閉合了左邊的開關,什麼也不會發生: 

            同樣,如果你讓左邊的開關斷開而閉合右邊的開關,結果還是一樣。只有當左右兩個開關都閉合時,燈泡才會發光,如下所示:

             這裡的關鍵是“都”。只有左邊和右邊的開關都閉合時,電流才能流過迴路。

             這個電路執行了一個邏輯運算。事實上,燈泡回答了這個問題:“兩個開關都處於閉合狀態嗎?”可以把電路的工作總結為下面這張表:

             在前一章中,我們已知道二進位制數字(或“位”)是如何表示資訊的:它可以表示從最普通的數字到Roger Ebert的拇指方向等的一切事情。可以說“0”代表“E b e r t拇指向下的方向”,而“1”表示“E b e r t拇指向上的方向”。一個開關有兩個位置,所以它可以代表一個位。“0”表示“開關是斷開的”,而“1”表示“開關是閉合的”。一個燈泡有兩種狀態,所以它也可以表示一個二進位制位。“0”表示“燈泡不亮”而“1”表示“燈泡亮”。現在可以把上面的表簡化一下: 

              注意,如果交換左、右開關,結果是一樣的,所以沒必要指明哪個開關是左開關或右開關。因此這張表可以重畫成類似於前面“ A N D”表和“O R”表的樣子: 

           

            事實上,這和“A N D”表是一樣的。讓我們檢查一下:

            這個簡單的電路實際上執行了布林代數的“ A N D”操作。

            現在試著用另一種方式連線電路:

               這些開關稱為並行連線。它和前一種連線方式的區別是,如果閉合了上面的開關,燈泡會亮:

            如果閉合了下面的開關,燈泡會亮:

              如果同時閉合上、下兩個開關,燈泡還是會亮:

             可見,當上面或下面的開關有一個閉合時,燈泡就會亮。這裡的關鍵字是“或”。

             這個電路也執行了一個邏輯運算,燈泡回答了這樣一個問題:“是否有開關閉合?”下面的表總結了這個電路是如何工作的:

              仍然用“0”表示開關斷開或燈泡不亮,用“ 1”表示開關閉合或燈泡亮。這張表可以這樣:

              同樣,這兩個開關交換位置也沒關係,所以這張表可以重寫成如下的樣子:

              你可能已經猜到了這和布林代數中的“ O R”表是一樣的:

              這意味著兩個並聯的開關執行的是和布林一樣的操作。

              當你再進入寵物店時,你告訴店員:“我想要一隻鬮過的公貓,白的或黃褐色的均可;或者要一隻沒生育能力的母貓,除了白色,其他任何顏色均可;或者只要是只黑貓,我也要。”店員便得到了如下的表示式:

              現在你知道兩個串聯開關執行的是邏輯與( A N D,由符號×來表示),兩個並聯開關執行的是邏輯或(O R,由符號+來表示),你可以按如下方法連線8個開關:

           這個電路中的每一個開關都被標上了一個字母(與布林表示式中所用字母相同)。表示非W,是1-W的另一種寫法。事實上,如果按從左至右,從上至下的順序來閱讀這個電路圖,你遇到的字母的順序和它們在布林表示式中出現的次序是一樣的。表示式中的乘號(×)都對應角是電路圖中串聯的兩個或兩組開關的位置;表示式中的加號(+)號對應的是電路圖中並聯的兩個或兩組開關的位置。

         你應該記得,店員最先挑出的是隻未鬮過的褐色的公貓。閉合相應的開關:

          儘管M、T和非W這三個開關都閉合了,但沒有構造出一個完整的電路來點亮燈泡。接著,店員拿出一隻無生育能力的白色的母貓:

           這次,由於右邊開關未閉合也無法構成一個完整的電路。但最後,店員拿出一隻無生育能力的灰色的母貓:

       這樣就可以構出一個完整的電路,燈泡被點亮並表示小貓符合你的要求。

       喬治·布林從來沒有連線過這樣一個電路,他也沒能看到用開關、電線和燈泡來實現一個布林表示式。當然,其中的一個原因是直到布林死後1 5年,白熾燈泡才被髮明。但摩爾斯在1 8 4 4年展示了他的電報機,比布林的《The Laws of Thought》的發表早1 0年,而用一個電報發聲器來代替所示電路中的燈泡是十分簡單的。

        可惜1 9世紀沒有人把布林代數中的與、或和串聯、並聯一些簡單的開關聯絡起來。數學家沒有、電工沒有、電報操作員也沒有,沒有人想到過這種聯絡,甚至連計算機革命的創始人查爾斯·巴貝芝( 1 7 9 2—1 8 7 1)也沒有。他曾和布林聯絡過,並瞭解過他的工作,他一生中大部分時間致力於設計第一臺差分機及接下來的解析機。一個世紀之後,這些機器被認為是現代計算機的雛型。我們現在知道,幫助巴貝芝的是他認識到計算機應產生於電報繼電器中,而非那些齒輪和控制桿。

         是的,問題的答案正是電報繼電器。