我是Python的新手,我正在玩PyEDA,这是我的问题:我有布尔表达式,如
Or(And(a,b),Not(b,c,d), ...)
我想访问布尔函数Or,And,Not的参数。可能吗?我试图使用模块检查,但我什么都没得到。
答案 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})}
快乐编程:)。