Python sympy:对带有非简化表达式的布尔表达式结果使用 simplfy

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)

Avi*_*niv 1

根据这个问题,我猜您会期望得到如下结果:

\n
\'(city&(manager|director))|(deputy)|(mayor)|(director&of&investment)\'\n
Run Code Online (Sandbox Code Playgroud)\n

当深入研究该simplify_logic函数时,我们看到form参数:

\n
\n

字符串(\'cnf\' 或 \'dnf\')或 None(默认)。\n如果 \'cnf\' 或 \'dnf\',则返回相应范式的最简单表达式;如果没有,则根据参数最少的形式返回答案(默认为 CNF)

\n
\n

因此,基本上发生的情况是将输入的表达式转换为DNFCNF形式。

\n

在我们的例子中,表达式被转换为 DNF 形式,因为它的参数较少。

\n

回到开头 - 我们期望的表达式不是有效的DNFCNF形式,所以我们不会得到它。

\n

因为DNF是AND的OR,而子部分表达式(city&(manager|director))不满足这一点(manager和之间有OR director)。

\n

然而,另一个表达式被简化为:

\n
sales & (director | manager)\n
Run Code Online (Sandbox Code Playgroud)\n

因为它是有效的CNF表格。

\n

通过最小化布尔函数来“简化”

\n

通常,简化算法不会最小化操作数的数量,而不是最小化运算符(逻辑门)的数量,这通常意味着更短的表达式(不一定 - 有时甚至更长)。

\n

以下是用于布尔函数最小化的一些算法:

\n
    \n
  1. 卡诺图(警告:它不适合超过六个输入变量,并且仅适用于最多四个变量)
  2. \n
  3. Quine\xe2\x80\x93McCluskey 算法(仅适用于输入变量和输出函数数量有限的函数)
  4. \n
\n

提供了(最小乘积形式)和(最小乘积形式)sympy的实现。SOPformPOSform

\n
    \n
  1. 浓缩咖啡算法
  2. \n
\n

还有一个工具Espresso 逻辑最小化,包含在pyeda中:

\n

espresso_exprs最小化多个表达式的函数的示例用法:

\n
>>> 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)\n
Run Code Online (Sandbox Code Playgroud)\n