逻辑代数01律的理解_零基础学习计算机原理:布尔逻辑和逻辑门
Hello World!我是老喬,歡迎來到超智星球。在這里,每篇都學一個小知識。
微號:超智星球 網站:http://chaozhixingqiu.com
這期呢,還是計算機原理系列,上期最后講到了自動制表機和IBM。本期接著講計算機歷史。
## 前言與內容提綱
上集,我們談了計算機最早是機電設備,一般用十進制計數,比如用齒輪數來代表十進制。再到晶體管計算機電子計算機的晶體管可以打開或關閉電流(二進制)。
只用開/關兩種狀態也可以代表信息,這叫二進制。二進制計算機運算的核心,是各種開關。那么,為什么一堆開關,就能完成運算呢?這就是本期我們要講的內容。
* 為什么用二進制, 布爾代數與布爾邏輯
* 3個基本操作:NOT,AND,OR——或且非
* 對應的:非門、且門、或門的電路實現
* 基于上述門,制作一個XOR——異或門
## 二進制的工程優勢與數學基礎
你可能覺得晶體管只有兩種狀態不多,功能很有限。事實上,晶體管的確可以不只是開/關,還可以讓不同大小的電流通過,一些早期電子計算機是三進制的,有3種狀態(比如蘇聯的某些計算機),甚至五進制,5種狀態。
問題是,狀態越多,越難區分信號-如果手機快沒電了或者附近有電噪音(因為有人在用微波爐),信號可能會混在一起...而每秒百萬次變化的晶體管會讓這個問題變得更糟!
所以我們把兩種信號盡可能分開 - 只用"開"和"關"兩種狀態,可以盡可能減少這類問題
這是計算機使用二進制的好處,但是,我們關心的問題是,為什么只憑借開關兩種狀態,就可以完成這么復雜的運算呢?
最關鍵的原因是,在當時,有一整個數學分支存在,專門處理"真"和"假",它已經解決了所有法則和運算,叫"布爾代數"(Boolean Algebra)!
布爾代數是計算機的基礎。沒有它,就不會有計算機。所有數字芯片,從設計到生產,每一個環節都離不開布爾代數。事實上,它是現在計算機類學科必修的知識,從大學一年級課程開始,AND, OR, NOT 邏輯運算,CNF, DNF, 笛摩根定理…等等等等,就已經植根到每一個業者的腦海里。
## 布爾代數因布爾而得名
布爾代數的本質,是通過符號化和代數化來有系統地進行邏輯推理。它為邏輯推理發明了一套可以像算術演算一樣的計算方法。
說起邏輯,這其實本來是哲學和語言學的一個分支,研究怎們樣有條理的說話和寫文章,遠在古希臘時代就已經存在了。比如,與或非等邏輯的思想,從亞里士多德時代就有了。著名的三段論,就是亞里士多德提出的。
但哲學領域的邏輯學,都是用文字標書的。人的思維過程能用數學表示嗎?在這個問題上,最早的可以追溯到萊布尼茨,他曾試圖將邏輯思想形式化,就是將它們用簡潔的數學形式表達出來,但沒有獲得成功。
> 我想尋求這樣一張特殊的字母表,其元素表示的不是聲音而是概念。有了這樣一個符號系統,我們就可以發展出一種語言,我們僅憑符號演算,就可以確定用這種語言寫成的哪些句子為真,以及它們之間存在著什么樣的邏輯關系。——萊布尼茨的愿望
這個問題在萊布尼茨的一百多年后,終于被布爾解決(萊布尼茨和牛頓的微積分大約是在布爾出生前150年出現)。
布爾應用代數方法研究了邏輯,把一些簡單的邏輯思維數學化,建立了邏輯代數【在之前,1843年,漢密爾頓已經發明了四元數代數,這個東西肯定對布爾有所啟發】
1847年,32歲的布爾出版了一本書,將他的研究成果整理發表,只有86頁。名字叫做《邏輯的數學分析》The Mathematical Anaysis of Logic。這也是布爾代數第一次公之于眾。
## 布爾代數的內容
現在的數學書上已經把布爾代數講的云里霧里,非常抽象,看起來就讓人頭大,但其實它本來是很簡單的。本文幫助你理解布爾代數,以及為什么它促成了計算機的誕生。
所謂邏輯,就是判斷真假或者是非。邏輯的基礎是三段論,這是古希臘的哲學家亞里斯多德發明的,包括一個大前提、一個小前提和一個結論。我們舉個例子來看一下:
1. 所有人都是會死的。(這是大前提)
2. 蘇格拉底是人。(這是小前提)
3. 所以,蘇格拉底也是會死的。(這是結論)
在這個推理的三段論中,我們關心的是最后的結論是真的,還是假的。當大前提和小前提都是真的時,那么結論也必然是真的。
前面的例子是一個單一的判斷。布爾代數是關于幾個判斷之間的邏輯關系的演算,所以稱為邏輯代數。
假設,關于蘇格拉底,有下面兩種說法:
* 蘇格拉底是一個人————這個大家都知道是 **真** 的
* 蘇格拉底還活著————這顯然是 **假的** ,蘇格拉底已經死了兩千多年了
在這兩種說法的基礎上,我們來看看下面幾種說法的真假:
* 蘇格拉底是一個人 **并且** 蘇格拉底還活著。
這種說法自然不能成立。因為,'并且'是一個并列的邏輯關系,其前后的條件都必須為真,整個判斷才能成立;如果其中的任何一個條件是**假**的,那么整個判斷就是假的,這個事件就不會發生。
在上面的說法中,如果把表示邏輯關系的詞'并且'換成'或者',像下面這樣:
* 蘇格拉底是一個人,或者,蘇格拉底還活著。
那么,這種說法就是成立的,因為,'或者'是一個選擇性的邏輯關系,所有的條件中,只要其中任意一個條件是真的,那么,這個判斷就是**真**的,這整個事件就會發生。
這是兩種最基本的邏輯關系。除此之外,我們還有關于'否定'的邏輯關系,就是'非'邏輯。'非邏輯'就是對一個判斷作相反的操作,'真'的一否定,就變成了'假'的;'假'的一否定,就變成了'真'的。比如:
* 蘇格拉底不是人————這顯然是假的
喬治·布爾就是用數學的方法來研究我們前面講的這些邏輯關系。在"常規"代數里(你在高中學的那種)變量的值是數字,可以進行加法或乘法之類的操作。
簡單代數系統可以表達為:
數量屬性:
1. 變量是自然數
2. 每一個自然數a都有一個后繼a+1
數量值運算:加減乘除
運算法則:結合律、分配率等等
但在布爾代數中,變量的值是 true 和 false,能進行邏輯操作。
邏輯代數有下面幾個規則和運算法則,因為邏輯運算不是算術計算,所以有以下規定:
(1)布爾代數中,數值只能取true和false或者0和1
用字母來代替我們前面那些例子中的具體的人和事,并且他用數字1表示'真',用數字0表示'假'。這樣一來,邏輯判斷就變成了數學運算。
* 用A代表'蘇軾是詩人',所以A = 1
* 用B代表'蘇軾還活著',所以B = 0
* 用C表示'蘇軾已經死了',所以C = 1
(2)布爾代數中,變量可以進行“或且非”三種邏輯操作
用'乘法'來表示'且'運算,用'加法'來表示'或'運算,在字母上面加一撇'''表示'非'運算,那么,這三個判斷之間的邏輯關系就可以變成這樣:
* A + B = 1 + 0 = 1
* A + C = 1 + 1 = 1
* A·B = 1·0 = 0
* A·C = 1·1 = 1
* B' = C = 0' = 1
(3)邏輯運算滿足以下定律:
* 交換律:
* A + B = B + A
* A·B = B·A
* 結合律:
* (A+B) + C = A + (B + C)
* (A·B)·C = A·(B·C)
* 吸收律:
* A + A·B = A
* (A + B)(A + C)=A + B·C
* 反演律:
* (A·B·C……)' = A' + B' + C' + ……
有了吸收率和反演律,有些看似非常復雜的邏輯關系,就可以化簡合并。比如:
這個式子中字母上面的短橫和前面式子中的'''是同樣的意思,代表'非'運算。
去掉算術系統中數字的屬性及其意義,保留對數字的操作;用邏輯值(true和false)代替數值,而邏輯值有自己的屬性和意義,就形成了布爾邏輯系統。
其他運算可以參照代數邏輯推演出來。這樣布爾就把邏輯歸約成代數運算系統,發現代數系統中的運算法則(結合,交換,分配法則)同樣也適用于邏輯系統。
有了邏輯系統,我們就可以對句子進行推理,也就實現了開頭萊布尼茨的愿望。這樣代數系統就有了推理能力。
推理能力正是布爾邏輯產生的原因,也是其最重要的意義所在。而推理是比代數運算更具有普適性的運算,因此,推理反過來又可以構建代數系統,甚至可以用來構建任何系統(計算機的強大就是證明)。
明白這一點也就明白了計算機中的抽象的本質,明白了如何去構建一個可用的抽象系統,計算理論中有一個名詞,圖靈可歸約,其實是一個意思。
## 布爾代數因香農而不凡
講了這么多,大家可能要問,布爾搞出這些無聊的字母游戲有什么用?
這個問題,不僅你我疑惑,在當時,整個學界也是疑惑的。布爾代數發明后很久都不受重視。數學家們曾輕蔑地說它:沒有數學意義,在哲學上也屬于稀奇古怪的東西。
直到20世紀初,羅素在《數學原理》中提到:“純數學是布爾在一部他稱之為《思想規律》的著作中發現的”,人們這才關注到布爾代數。但還是認為它是毫無實際用途的“純數學”。
直到1938年,一位年僅22歲的美國年輕人在《繼電器與開關電路的符號分析》中,將布爾代數與開關電路聯系起來了。這篇文章是他在麻省理工學院(MIT)獲得電氣工程碩士學位的畢業論文。
上世紀八十年代,被譽為“多元智能理論”之父的哈佛大學教授霍華德.加德納(HowardGardner)曾經評論這篇文章:“它可能是本世紀最重要、最著名的一篇碩士論文”。
這位年輕人就是克勞德.艾爾伍德.香農(這位后面我們也會講到)
## 用布爾代數制作計算機
我們前面已經說過,這個東西用處非常巨大。它是我們現代這個電子時代和信息社會最底層的基本原理。如果沒有布爾代數,什么計算機、自動控制、手機、互聯網等等這一切,都不可能存在。
數學公式和科學原理,并不能直接產生任何實際的用途,還必須有相應的實現這些功能的物理元件。恰好,咱上期繼電器、電子管和晶體管的發明,為實現邏輯控制和信息的數字化處理,鋪平了道路。沒看過的同學,可以關注超智星球公號,看一下。
我們知道,計算機、手機、自動控制系統、人工智能等等這些東西,都是用集成電路——也就是電子芯片組裝起來的。而集成電路是由幾千萬、上億個晶體管組成的。
而晶體管,我們上一篇文章說過了,就是個受控制的開關。可以接收控制信號,改變是否導電。我們可以假設開關接通的狀態為'1',開關不通的狀態為'0',這樣就可以用開關電路模擬邏輯狀態,組成邏輯電路。而這最最基本的邏輯電路,我們稱為**“邏輯門”**。之所以叫 "門",是因為它能控制電流的路徑。
邏輯門可以由電阻、電容、二極管、三極管等分立原件構成,成為**分立元件門**。也可以將門電路的所有器件及連接導線制作在同一塊半導體基片上,構成**集成邏輯門電路**。
對應布爾代數中有三個基本操作:NOT, AND 和 OR。構成計算機最基本的邏輯門就是:與門、或門、非門。將這三個基本邏輯電路通過不同的組合關系,就形成了人們所需要的各種數字電路。
我們來看下如何使用晶體管制作這三個邏輯門。
## NOT 和 "非門"
NOT 操作把布爾值反轉,把 true 進行 NOT 就會變成 false,反之亦然。我們可以根據 NOT 操作的輸入和輸出,做出這個表。我們叫NOT操作表。
我們先來看一個晶體管。晶體管只是電控制的開關,有3根線:2根電極和1根控制線。
控制線通電時,電流就可以從一個電極流到另一個電極。就像水龍頭一樣- 打開水龍頭,就有水流出來;關掉水龍頭,就沒水了。
可以把控制線,當做輸入(input);底部的電極,當做輸出(output);所以 1 個晶體管,有一個輸入和一個輸出。
如果我們打開輸入(input on),輸出也會打開(output on),因為電流可以流過;如果關閉輸入(input off),輸出也會關閉(output off),因為電流無法通過
或者用布爾術語來說,輸入為真,輸出為真;輸入為假,輸出為假,我們也可以把這個做成"真值表"
這個電路沒什么意思,因為它沒做什么事-輸入和輸出是一樣的,但我們可以稍加修改,實現NOT。
與其把下面那根線當做輸出,我們可以把輸出放到上面,如果打開輸入,電流可以流過然后 "接地",輸出就沒有電流,所以輸出是off。如果用水來舉例,就像家里的水都從一個大管子流走了,打開淋浴頭一點水也沒有。
如果輸入是on,輸出是 off;當輸入是 off,電流沒法接地,就流過了輸出,所以輸出是 on;如果輸入是off,輸出是on。和NOT操作表一樣!太棒了!
我們做了個有點用的電路!我們叫它 "非門"-。
## AND 和 "且門"
在布爾代數中,"AND"操作有 2 個輸入,1 個輸出;和上次一樣,可以給"AND"做個表。
為了實現 "AND 門",我們需要2個晶體管連在一起,這樣有2個輸入和1個輸出
如果只打開 A,不打開 B 電流無法流到 output,所以輸出是 false;如果只打開B,不打開 A,也一樣,電流無法流到 output;只有 A 和 B 都打開了,output 才有電流。
## OR 和 “或門”
最后一個是OR-- 只要 2 個輸入里,其中 1 個是 true,輸出就是 true
實現 "OR 門" 除了晶體管還要額外的線,不是串聯起來。而是并聯,然后左邊這條線有電流輸入。用"小拱門"代表2條線沒連在一起,只是跨過而已(雖然看起來像連在一起)
如果 A 和 B 都是 off,電流無法流過,所以輸出是 off;如果打開 A,電流可以流過。輸出是 on。如果只打開 B 也一樣,只要 A OR B是on,輸出就是 on;如果 A 和 B 都 on,結果是on。
## 一次抽象:制作"異或門"-XOR
好,現在 NOT門, AND門, OR門 都搞定了,我們可以基于它們構建更復雜的門了。
但在開始之前呢,我們先進行一次抽象,我們只是用符號來代表這三個門,這樣我們構建其他電路的時候,就不再管底層的細節(也就是那些開關),可以集中精力用來構建更復雜的系統。
NOT門的畫法是三角形前面一個圓點;AND門用D表示;OR門用太空船表示————"D 形狀和太空船"不是標準叫法, 只是我喜歡這樣叫而已。
前面說的三個操作,是最基本的邏輯操作。除了前面說的三個,另一個有用的布爾操作叫"異或",XOR。
XOR就像普通OR,但有一個區別:如果2個輸入都是true,XOR輸出false;想要XOR輸出true,一個輸入必須是true,另一個必須是false
用晶體管實現XOR門有點燒腦子,但可以展示一下怎么用前面提到的3種門來做XOR門:
XOR門有2個輸入,A和 B ,還有1個輸出.
## 最后,聊聊抽象
XOR超有用的,我們下次再說它。因為超有用,工程師給了它一個符號,一個 OR 門 + 一個笑臉
重要的是,我們現在可以知道怎么造XOR門了,并且用抽象符號封裝了它。我們完成了又一層抽象,把 XOR 放入"工具箱"了。
后面的課程中,我們可以直接使用它來推導更高級的運算,而不用擔心XOR具體用了幾個門,這幾個門又是怎么用晶體管拼的,或電子是怎么流過半導體的。
工程師設計處理器時,很少在晶體管的層面上思考,而是用更大的組件,比如邏輯門,或者由邏輯門組成的更大組件,我們以后會講,就算是專業程序員也不用考慮邏輯是怎樣在物理層面實現的。
這關鍵的能力,就是抽象,封裝。抽象能力決定一個人的編程能力。
我們從電信號開始,到現在第一次表示數據-真和假-開始有點"計算"的感覺了。
好啦,本期我們實現了布爾代數最最重要的三層門。我們下期見。
微號:超智星球 網站:http://chaozhixingqiu.com
參考文獻:
1. 楊露斯, 黎煉. 論計算機發展史及展望[J]. 信息與電腦(理論版), 2010(06):194.
2. N·M·莫里斯, 楊光輝. 英國標準——二進制邏輯元件的符號[J]. 煤礦自動化, 1984(02):41.
3. N.A.知乎.布爾代數是怎么出現的?.2017.
4. 阮一峰.布爾代數入門.阮一峰博客.2016
5. CrashCourse/CrashCourse字幕組.《計算機科學速成課》.youtube.2018
總結
以上是生活随笔為你收集整理的逻辑代数01律的理解_零基础学习计算机原理:布尔逻辑和逻辑门的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python预测控制_无人驾驶——4.控
- 下一篇: mysql语句怎么记_mysql语句记录