Python症状-检查布尔表达式的ANF单项式中是否存在变量

2ul0zpep  于 2023-02-06  发布在  Python
关注(0)|答案(2)|浏览(126)

我有一个布尔表达式,它被转换成代数范式(ANF),用的是逻辑模Symy,我们事先不知道ANF的单项式的次数是多少:它可以是1、2、3等。下面是一个包含六个变量的虚拟示例。

from sympy import symbols
from sympy.logic.boolalg import to_anf

a = symbols('a:{}'.format(2))
b = symbols('b:{}'.format(3))
c = symbols('c:{}'.format(1))

expr = ((a[0] & (~b[0])) ^ b[1]) & ((a[1] & (~b[2])) ^ c[0])
anf  = expr.to_anf()

其打印

(a0 & a1) ^ (a0 & c0) ^ (a1 & b1) ^ (b1 & c0) ^ (a0 & a1 & b0) ^ (a0 & a1 & b2) ^ (a0 & b0 & c0) ^ (a1 & b1 & b2) ^ (a0 & a1 & b0 & b2)

对于这个例子,单项式的最小次数是2(即两个变量相乘),我想找出结果ANF的哪些单项式特别具有一个变量(例如,上面例子中的c0)。

mklgxw1f

mklgxw1f1#

如果您正在寻找某种类型的子表达式,使用atoms可能是一个不错的方法:

# after your code
>>> from sympy import And
>>> [i for i in anf.atoms(And) if i.has(c[0])]
[b1 & c0, a0 & b0 & c0, a0 & c0]
am46iovg

am46iovg2#

解决办法是
1.为了首先分裂ANF的单项式,

monomials = [monom for monom in anf.args if anf.args]

1.然后检查变量是否存在于每个单项式中。

[monom for monom in monomials if c[0] in monom.args]

输出:

[a0 & c0, b1 & c0, a0 & b0 & c0]

相关问题