讀《計算機(jī)科學(xué)精粹》一書的時候籍胯,發(fā)現(xiàn)很多時候需要用到符號運(yùn)算竟闪,本來想自己寫一個的,后來發(fā)現(xiàn)sympy 把事情都做好了杖狼,而且sympy在 jupyter scipy-notebook 里面就有炼蛤,用起來實(shí)在是非常的方便。
下面就試做一下 第一章 1.2 邏輯中的題目蝶涩,用以拋磚引玉
過熱的服務(wù)器??如果服務(wù)器過熱且空調(diào)關(guān)閉理朋,會導(dǎo)致服務(wù)器崩潰;如果服務(wù)器過熱且機(jī)箱冷卻器失效绿聘,同樣會導(dǎo)致服務(wù)器崩潰嗽上。那么服務(wù)器需要滿足哪些條件才能正常工作?
符號分配
'''
A: 服務(wù)器過熱熄攘。
B: 空調(diào)關(guān)閉
C: 機(jī)箱冷卻器失效
D: 服務(wù)器崩潰
'''
from sympy.logic import *
from sympy import symbols, Symbol
A = Symbol("服務(wù)器過熱") # 聲明一個符號
B, C = symbols("空調(diào)關(guān)閉, 機(jī)箱冷卻器失效") # 聲明多個符號兽愤,用“逗號”或“空格” 分割
D = (A & B) | (A & C) # 即 ( A AND B ) OR ( A AND C ) , D 為服務(wù)器崩潰
采用分配律對上式進(jìn)行因式分解
from sympy.logic.boolalg import simplify_logic
D = simplify_logic(D)
D
當(dāng)滿足條件!D服務(wù)器可以正常工作挪圾。相應(yīng)的換質(zhì)位形式為
~D
采用德摩根定律去除括號
'''
~A: ~服務(wù)器過熱 == 服務(wù)器沒有過熱
~B: ~空調(diào)關(guān)閉 == 空調(diào)正常工作
~C: ~機(jī)箱冷卻器失效 == 機(jī)箱冷卻正常工作
~D: ~服務(wù)器崩潰 == 服務(wù)器正常工作
'''
from sympy.logic.boolalg import to_dnf
to_dnf(~D)
從上式可知浅萧,只要滿足條件 !A(服務(wù)器沒有過熱)或 !B AND !C(空調(diào)和機(jī)箱冷卻器均正常工作),服務(wù)器就能正常工作哲思。
小結(jié)
sympy 幾乎涵蓋了各種各樣的數(shù)學(xué)符號運(yùn)算洼畅,邏輯符號運(yùn)算只是其中小小的一部分,其它強(qiáng)大的功能值得進(jìn)一步發(fā)掘棚赔!