如何解决Python sympy:对具有非简化表达式的布尔表达式结果使用simplfy
我正在尝试使用sympy
简化布尔表达式,但是我遇到了一个问题:
from sympy.logic import simplify_logic,to_cnf,to_dnf
from sympy import Symbol,S
# Simplified to:
#'deputy | mayor | (city & director) | (city & manager) | (director & investment & of)'
# Which seems as non simplifed expression
str(simplify_logic(eval('(city&manager)|(city&director)|(deputy)|(mayor)|(director&of&investment)')))
但这:
# Simplified to:
# 'sales & (director | manager)'
# Which is simplified!
str(simplify_logic(eval('(sales&manager)|(sales&director)')))
如何简化第一个表达式?
谢谢!
编辑:简而言之,我的意思是表示带有最少数量运算符的表达式
PS:所有单词都定义为符号:
for word in words:
vars()[word]=Symbol(word)
解决方法
鉴于这个问题,我想您期望得到如下结果:
'(city&(manager|director))|(deputy)|(mayor)|(director&of&investment)'
在研究simplify_logic
函数时,我们看到form
参数:
字符串(“ cnf”或“ dnf”)或“无”(默认)。 如果是'cnf'或'dnf',则对应的最简单的表达式 正常形式返回;如果为None,则返回答案 根据参数最少的形式(默认为CNF)
因此,基本上发生的是将输入的表达式转换为DNF或CNF形式。
在我们的例子中,表达式由于参数较少而被转换为DNF形式。
重新开始-我们期望的表达式不是有效的DNF或CNF格式,因此我们不会得到它。
因为DNF是AND的OR,并且子部分表达式(city&(manager|director))
不满足此条件(manager
和director
之间存在OR)。
但是,其他表达式简化为:
sales & (director | manager)
因为它是有效的CNF表单。
通过最小化布尔函数来“简化”
通常,简化算法不会使操作数的数量最小化,而不是使运算符(逻辑门)的数量最小化,这通常意味着表达式较短(不一定,有时甚至更长)。
以下是用于布尔函数最小化的一些算法:
- Karnaugh map(警告:它不适用于六个以上的输入变量,并且仅适用于最多四个变量)
- Quine–McCluskey algorithm(仅对输入变量和输出函数数量有限的函数有效)
sympy
提供了SOPform
(最小的产品总和形式)和POSform
(最小的总和形式)的实现。
还有Espresso logic minimization中包含的工具pyeda:
使用espresso_exprs
函数以最小化多个表达式的示例:
>>> f1 = Or(~a & ~b & ~c,~a & ~b & c,a & ~b & c,a & b & c,a & b & ~c)
>>> f2 = Or(~a & ~b & c,a & ~b & c)
>>> f1m,f2m = espresso_exprs(f1,f2)
>>> f1m
Or(And(~a,~b),And(a,b),And(~b,c))
>>> f2m
And(~b,c)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。