Sympy玩轉邏輯符號運算

阿狸不歌發表於2019-03-27

讀《電腦科學精粹》一書的時候,發現很多時候需要用到符號運算,本來想自己寫一個的,後來發現sympy 把事情都做好了,而且sympy在 jupyter scipy-notebook 裡面就有,用起來實在是非常的方便。

電腦科學精粹

下面就試做一下 第一章 1.2 邏輯中的題目,用以拋磚引玉

過熱的伺服器?如果伺服器過熱且空調關閉,會導致伺服器崩潰;如果伺服器過熱且機箱冷卻器失效,同樣會導致伺服器崩潰。那麼伺服器需要滿足哪些條件才能正常工作?

符號分配

'''
A: 伺服器過熱。
B: 空調關閉
C: 機箱冷卻器失效
D: 伺服器崩潰
'''
from sympy.logic import *
from sympy import symbols, Symbol
A = Symbol("伺服器過熱")          # 宣告一個符號
B, C = symbols("空調關閉, 機箱冷卻器失效")    # 宣告多個符號,用“逗號”或“空格” 分割
D = (A & B) | (A & C)       # 即 ( A AND B ) OR ( A AND C )   , D 為伺服器崩潰

單獨輸出表示式 D


採用分配律對上式進行因式分解

from sympy.logic.boolalg import simplify_logic
D = simplify_logic(D)
D

因式分解 可以用 simplify_logic


當滿足條件!D伺服器可以正常工作。相應的換質位形式為

~D

!D


採用德摩根定律去除括號

'''
~A: ~伺服器過熱    == 伺服器沒有過熱
~B: ~空調關閉      == 空調正常工作
~C: ~機箱冷卻器失效 == 機箱冷卻正常工作
~D: ~伺服器崩潰    == 伺服器正常工作
'''
from sympy.logic.boolalg import to_dnf
to_dnf(~D)

去除括號

從上式可知,只要滿足條件 !A(伺服器沒有過熱)或 !B AND !C(空調和機箱冷卻器均正常工作),伺服器就能正常工作。


小結

sympy 幾乎涵蓋了各種各樣的數學符號運算,邏輯符號運算只是其中小小的一部分,其它強大的功能值得進一步發掘!

相關文章