我是Python的新手,我在玩PyEDA,我的问题是:我有类似的布尔表达式
Or(And(a,b),Not(b,c,d), ...) 我想访问布尔函数的参数,或者,和,不。有可能吗?我试图使用模块检查,但一无所获。
发布于 2014-10-28 00:39:34
我想访问布尔函数的参数,或者,不.有可能吗?我试图使用模块
inspect,但一无所获。
这里没有必要使用inspect模块。为此调用And(a, b)-or of writing 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)。诸若此类。
发布于 2014-10-29 06:20:45
这里是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})}编程快乐:)。
https://stackoverflow.com/questions/26598805
复制相似问题