使用PyEDA访问布尔表达式的args

时间:2014-10-27 23:54:25

标签: python

我是Python的新手,我正在玩PyEDA,这是我的问题:我有布尔表达式,如

Or(And(a,b),Not(b,c,d), ...) 

我想访问布尔函数Or,And,Not的参数。可能吗?我试图使用模块检查,但我什么都没得到。

2 个答案:

答案 0 :(得分:3)

  

我想访问布尔函数的参数或者,而不是......是否可能?我试图使用模块inspect,但我什么都没得到。

此处不需要inspect模块。调用And(a, b) - 或编写a & b的结果是And对象,其打印为And(a, b)。它有一个args属性,为您提供其参数列表:

>>> a, b, c, d = map(exprvar, 'abcd')
>>> e = Or(And(a,b), Not(b), c, d)
>>> e
Or(~b, c, d, And(a, b))
>>> e.args
(And(a, b), c, d, ~b)
>>> e.args[0].args
(a, b)

请注意,订单可能与您最初提供的订单不同。由于Or等是可交换和关联的,因此排序并不重要,因此pyeda不会保留它。事实上,它允许进行更多激进的转换,而不仅仅是重新排序。


如果您想要遍历整个表达式,您可能需要考虑使用to_ast而不是递归地切换类型并使用args,但是:

>>> e.to_ast()
('or',
 ('and', ('var', ('b',), ()), ('var', ('a',), ())),
 ('var', ('c',), ()),
 ('var', ('d',), ()),
 ('not', ('var', ('b',), ())))

事实上,我可以想到的任何想要用args做的事情都可以通过其他方式更好地完成。如果要递归深入查找输入变量,那只是e.inputs。如果你想要一个很好的人类可读表示,那只是str(e)。等等。

答案 1 :(得分:2)

PyEDA作者。

在评论中,您说要转换CNF以供pycosat使用。我建议你只使用satisfy_one方法,它使用PicoSAT SAT求解器(pycosat使用的相同引擎)。

>>> from pyeda.inter import *
>>> a, b, c, d = map(exprvar, 'abcd')
>>> F = OneHot(a, b, c, d)
>>> F.is_cnf()
True
>>> F.satisfy_one()
{c: 0, a: 0, b: 0, d: 1}
# If you want to see the numeric encoding given to the SAT solver:
>>> litmap, nvars, clauses = F.encode_cnf()
>>> clauses
{frozenset({1, 2, 3, 4}),
 frozenset({-4, -3}),
 frozenset({-4, -2}),
 frozenset({-4, -1}),
 frozenset({-3, -1}),
 frozenset({-3, -2}),
 frozenset({-2, -1})}

快乐编程:)。