布林運算,使得計算機開始有了處理邏輯的能力。
萊布尼茨堅信,人類的思想和數字一樣可以化繁為簡——所有思想都可以分解為數量不多的簡單思想。這些簡單思想透過一些既定規律,可以組成任意的複雜思想,就像數學運算一樣。當兩個人發生了爭執,他們可以把自己的觀點透過數學計算的方式梳理出來,誰對誰錯就一目瞭然了。
為了“計算”思想,萊布尼茨闡述了後來被稱為合取(conjunction)、析取(disjunction)、否定(negation)等的邏輯運算規則,成為數理邏輯(mathematical logic)最早的探索者之一。
但邏輯運算在數學上的系統性定義,要等到 19 世紀由英國數學家喬治·布林(George Boole)首次提出。布林分別在 1847 年和 1854 年發表了著名的《邏輯的數學分析》和《思維規律的研究》,將數學中的代數方法引入到邏輯學中,被後人稱為布林代數(Boolean algebra),邏輯運算因而也叫布林運算。
下面透過一個例子介紹簡單一下邏輯運算,假設有 X、Y 兩個命題:
- X:喬治·布林發明了二進位制。
- Y:喬治·布林創立了布林代數。
顯然,X 命題是錯的,Y 命題是對的。在邏輯學中,我們稱:X 命題為假,Y 命題為真。如果用連詞將 X、Y 兩句話連起來說呢?
比如:喬治·布林發明了二進位制且創立了布林代數。這句話是錯的,即“X 且 Y”的組合命題為假。
再比如:喬治·布林發明了二進位制或創立了布林代數。這句話是對的,即“X 或 Y”的組合命題為真。
這就是邏輯學中的合取與析取,也稱邏輯與和邏輯或。
當然,也有對單個命題的邏輯運算,比如:喬治·布林沒有發明二進位制。這句話是對的,即“非 X”為真。
這就是邏輯學中的否定,也稱邏輯非。
與、或、非是 3 種最基本、最常用的邏輯運算。將它們組合起來,還可以形成與非、或非、異或、同或等複雜邏輯運算。歷史上,布林和許多其他邏輯學家曾使用過各種層出不窮的符號來表示它們,如今,我們常用下表中的表達形式:
邏輯運算 | 英文縮寫 | 表示式 |
---|---|---|
與 |
AND | X · Y |
或 | OR | X + Y |
非 | NOT | \(\overline{X}\) |
與非 | NAND | \(\overline{X · Y}\) |
或非 | NOR | \(\overline{X + Y}\) |
異或 | XOR | X \(\bigoplus\) Y |
同或 | XNOR | X \(\bigodot\) Y |
其中,異或和同或其實意如其名,只是表示式有點抽象,它們的展開式十分容易理解:
X \(\bigoplus\) Y = X · \(\overline{Y}\) + \(\overline{X}\) · Y
X \(\bigodot\) Y = X · Y + \(\overline{X}\) · \(\overline{Y}\)
而邏輯命題的真假像極了二進位制中的 1 和 0,布林代數自然而然選擇用 1 表示真、0 表示假。
經過簡單的邏輯推演,我們就能得到這些邏輯運算在所有情況下的結果:
X | Y | 與 | 或 | 非 X | 與非 | 或非 | 異或 | 同或 |
---|---|---|---|---|---|---|---|---|
0 | 0 | 0 | 0 | 1 | 1 | 1 | 0 | 1 |
0 | 1 | 0 | 1 | 1 | 1 | 0 | 1 | 0 |
1 | 0 | 0 | 1 | 0 | 1 | 0 | 1 | 0 |
1 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 1 |
不難發現,邏輯運算和二進位制運算有著極高的一致性,除了有點違反直覺的 1+1=1:
邏輯與:
- 0·0=0
- 0·1=0
- 1·1=1
邏輯或:
- 0+0=0
- 0+1=1
- 1+1=1
更巧合的是,邏輯運算和數學運算一樣滿足交換律、結合律和分配律等各種運算規則,比如:
- X·Y=Y·X
- X+Y=Y+X
- X·(Y·Z)=(X·Y)·Z
- X+(Y+Z)=(X+Y)+Z
- (X+Y)·Z=X·Z+Y·Z