读《计算机科学精粹》一书的时候,发现很多时候需要用到符号运算,本来想自己写一个的,后来发现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 为服务器崩溃
采用分配律对上式进行因式分解
from sympy.logic.boolalg import simplify_logic
D = 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 几乎涵盖了各种各样的数学符号运算,逻辑符号运算只是其中小小的一部分,其它强大的功能值得进一步发掘!