Sympy玩转逻辑符号运算

96
阿狸不歌
2019.03.27 15:52* 字数 333

读《计算机科学精粹》一书的时候,发现很多时候需要用到符号运算,本来想自己写一个的,后来发现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
单独输出表达式 D

采用分配律对上式进行因式分解

from sympy.logic.boolalg import simplify_logic
D = simplify_logic(D)
D
因式分解 可以用 simplify_logic
因式分解 可以用 simplify_logic

当满足条件!D服务器可以正常工作。相应的换质位形式为

~D
!D
!D

采用德摩根定律去除括号

'''
~A: ~服务器过热    == 服务器没有过热
~B: ~空调关闭      == 空调正常工作
~C: ~机箱冷却器失效 == 机箱冷却正常工作
~D: ~服务器崩溃    == 服务器正常工作
'''
from sympy.logic.boolalg import to_dnf
to_dnf(~D)
去除括号
去除括号

从上式可知,只要满足条件 !A(服务器没有过热)或 !B AND !C(空调和机箱冷却器均正常工作),服务器就能正常工作。


小结

sympy 几乎涵盖了各种各样的数学符号运算,逻辑符号运算只是其中小小的一部分,其它强大的功能值得进一步发掘!

数学
Gupao