如何在不使用真值表的情况下在Python中使用不关心术语来简化布尔表达式?

时间:2017-05-05 22:23:16

标签: python boolean-expression

我正在尝试将涉及几百个布尔变量的布尔表达式简化为Ands形式的OR(DNF)。此外,不关心术语可以由另一个布尔表达式表示。

我发现有一些Python包,比如SymPy,可用于布尔表达式最小化。但是,它无法以表达式格式处理不关心条款。

例如,

>>> from sympy.logic import SOPform
>>> from sympy import symbols
>>> w, x, y, z = symbols('w x y z')
>>> minterms = [[0, 0, 0, 1], [0, 0, 1, 1],
...             [0, 1, 1, 1], [1, 0, 1, 1], [1, 1, 1, 1]]
>>> dontcares = [[0, 0, 0, 0], [0, 0, 1, 0], [0, 1, 0, 1]]
>>> SOPform([w, x, y, z], minterms, dontcares)
Or(And(Not(w), z), And(y, z))

SOPform函数可以处理dontcares术语,但它需要真值表格式的术语,由于变量数量很大,这不适合我的情况。

另一个函数simplify_logic接受表达式格式,但没有dontcares术语的选项。

>>> from sympy.logic import simplify_logic
>>> from sympy.abc import x, y, z
>>> from sympy import S
>>> b = (~x & ~y & ~z) | ( ~x & ~y & z)
>>> simplify_logic(b)
And(Not(x), Not(y))

Python中是否有一种方法可以在表达格式中使用不关心术语来处理布尔表达式的最小化?

谢谢!

1 个答案:

答案 0 :(得分:0)

这里的问题是使代码更具可伸缩性,以便它可以处理大量输入。

我将假设输入的minterms和dontcares为整数格式(这是除真值表格式之外我所知道的唯一其他格式)

{
    "tasks": [
        {
            "type": "shell",
            ...
        }
    ],
    "version": "2.0.0"
}

转换为真值表格式:

  1. 首先将十进制转换为二进制(see here
    N = 4           # number of boolean variables
    minterms = [1, 3, 7, 11, 15]
    dontcares = [0, 2, 5]
    
  2. 由于存在>>> num = 2 >>> f'{num:b}' '10' 变量,在这种情况下为4,因此我们需要填充额外的零。 (see here
    N
  3. 最后将其转换为整数列表
    >>> '10'.zfill(4)
    '0010'
    

将这三个步骤组合为一个函数,我们得到

>>> [int(i) for i in '0010']
[0, 0, 1, 0]

此后,过程将直接进行。要生成def convert(num, N): return [int(i) for i in f'{num:b}'.zfill(N)] 符号,我们可以简单地使用for循环并将数字后缀添加到符号变量中。最后,将N应用于simplify_logic的输出。

SOPform