讀《計(jì)算機(jī)科學(xué)精粹》一書(shū)的時(shí)候,發(fā)現(xiàn)很多時(shí)候需要用到符號(hào)運(yùn)算,本來(lái)想自己寫(xiě)一個(gè)的,后來(lái)發(fā)現(xiàn)sympy 把事情都做好了,而且sympy在 jupyter scipy-notebook 里面就有,用起來(lái)實(shí)在是非常的方便。

計(jì)算機(jī)科學(xué)精粹
下面就試做一下 第一章 1.2 邏輯中的題目,用以?huà)伌u引玉
過(guò)熱的服務(wù)器??如果服務(wù)器過(guò)熱且空調(diào)關(guān)閉,會(huì)導(dǎo)致服務(wù)器崩潰;如果服務(wù)器過(guò)熱且機(jī)箱冷卻器失效,同樣會(huì)導(dǎo)致服務(wù)器崩潰。那么服務(wù)器需要滿(mǎn)足哪些條件才能正常工作?
符號(hào)分配
'''
A: 服務(wù)器過(guò)熱。
B: 空調(diào)關(guān)閉
C: 機(jī)箱冷卻器失效
D: 服務(wù)器崩潰
'''
from sympy.logic import *
from sympy import symbols, Symbol
A = Symbol("服務(wù)器過(guò)熱") # 聲明一個(gè)符號(hào)
B, C = symbols("空調(diào)關(guān)閉, 機(jī)箱冷卻器失效") # 聲明多個(gè)符號(hào),用“逗號(hào)”或“空格” 分割
D = (A & B) | (A & C) # 即 ( A AND B ) OR ( A AND C ) , D 為服務(wù)器崩潰
單獨(dú)輸出表達(dá)式 D
采用分配律對(duì)上式進(jìn)行因式分解
from sympy.logic.boolalg import simplify_logic
D = simplify_logic(D)
D
因式分解 可以用 simplify_logic
當(dāng)滿(mǎn)足條件!D服務(wù)器可以正常工作。相應(yīng)的換質(zhì)位形式為
~D
!D
采用德摩根定律去除括號(hào)
'''
~A: ~服務(wù)器過(guò)熱 == 服務(wù)器沒(méi)有過(guò)熱
~B: ~空調(diào)關(guān)閉 == 空調(diào)正常工作
~C: ~機(jī)箱冷卻器失效 == 機(jī)箱冷卻正常工作
~D: ~服務(wù)器崩潰 == 服務(wù)器正常工作
'''
from sympy.logic.boolalg import to_dnf
to_dnf(~D)
去除括號(hào)
從上式可知,只要滿(mǎn)足條件 !A(服務(wù)器沒(méi)有過(guò)熱)或 !B AND !C(空調(diào)和機(jī)箱冷卻器均正常工作),服務(wù)器就能正常工作。
小結(jié)
sympy 幾乎涵蓋了各種各樣的數(shù)學(xué)符號(hào)運(yùn)算,邏輯符號(hào)運(yùn)算只是其中小小的一部分,其它強(qiáng)大的功能值得進(jìn)一步發(fā)掘!