oct*_*_JS 6 python boolean sympy
我正在尝试简化布尔表达式,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)')))
Run Code Online (Sandbox Code Playgroud)
但是这个 :
# Simplified to:
# 'sales & (director | manager)'
# Which is simplified!
str(simplify_logic(eval('(sales&manager)|(sales&director)')))
Run Code Online (Sandbox Code Playgroud)
如何简化第一个表达式?
谢谢你!
编辑:通过简化我的意思是具有最少数量的运算符的表达式
PS:所有单词都定义为符号:
for word in words:
vars()[word]=Symbol(word)
Run Code Online (Sandbox Code Playgroud)
根据这个问题,我猜您会期望得到如下结果:
\n\'(city&(manager|director))|(deputy)|(mayor)|(director&of&investment)\'\nRun Code Online (Sandbox Code Playgroud)\n当深入研究该simplify_logic函数时,我们看到form参数:
\n\n字符串(\'cnf\' 或 \'dnf\')或 None(默认)。\n如果 \'cnf\' 或 \'dnf\',则返回相应范式的最简单表达式;如果没有,则根据参数最少的形式返回答案(默认为 CNF)
\n
因此,基本上发生的情况是将输入的表达式转换为DNF或CNF形式。
\n在我们的例子中,表达式被转换为 DNF 形式,因为它的参数较少。
\n回到开头 - 我们期望的表达式不是有效的DNF或CNF形式,所以我们不会得到它。
\n因为DNF是AND的OR,而子部分表达式(city&(manager|director))不满足这一点(manager和之间有OR director)。
然而,另一个表达式被简化为:
\nsales & (director | manager)\nRun Code Online (Sandbox Code Playgroud)\n因为它是有效的CNF表格。
\n通过最小化布尔函数来“简化”
\n通常,简化算法不会最小化操作数的数量,而不是最小化运算符(逻辑门)的数量,这通常意味着更短的表达式(不一定 - 有时甚至更长)。
\n以下是用于布尔函数最小化的一些算法:
\n提供了(最小乘积形式)和(最小乘积形式)sympy的实现。SOPformPOSform
还有一个工具Espresso 逻辑最小化,包含在pyeda中:
\nespresso_exprs最小化多个表达式的函数的示例用法:
>>> f1 = Or(~a & ~b & ~c, ~a & ~b & c, a & ~b & c, a & b & c, a & b & ~c)\n>>> f2 = Or(~a & ~b & c, a & ~b & c)\n>>> f1m, f2m = espresso_exprs(f1, f2)\n>>> f1m\nOr(And(~a, ~b), And(a, b), And(~b, c))\n>>> f2m\nAnd(~b, c)\nRun Code Online (Sandbox Code Playgroud)\n
| 归档时间: |
|
| 查看次数: |
2174 次 |
| 最近记录: |