首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用PyEDA访问布尔表达式的args

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

Stack Overflow用户
提问于 2014-10-27 23:54:24
回答 2查看 553关注 0票数 4

我是Python的新手,我在玩PyEDA,我的问题是:我有类似的布尔表达式

代码语言:javascript
复制
Or(And(a,b),Not(b,c,d), ...) 

我想访问布尔函数的参数,或者,和,不。有可能吗?我试图使用模块检查,但一无所获。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-10-28 00:39:34

我想访问布尔函数的参数,或者,不.有可能吗?我试图使用模块inspect,但一无所获。

这里没有必要使用inspect模块。为此调用And(a, b)-or of writing a & b的结果是一个And对象,它输出为And(a, b)。它有一个args属性,给出了它的参数列表:

代码语言:javascript
复制
>>> 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

代码语言:javascript
复制
>>> e.to_ast()
('or',
 ('and', ('var', ('b',), ()), ('var', ('a',), ())),
 ('var', ('c',), ()),
 ('var', ('d',), ()),
 ('not', ('var', ('b',), ())))

事实上,我想用args做的任何事情都可以在其他方面做得更好。如果您想递归地向下钻研以找到输入变量,那就是e.inputs。如果你想要一个良好的人类可读的表示法,那就是str(e)。诸若此类。

票数 3
EN

Stack Overflow用户

发布于 2014-10-29 06:20:45

这里是PyEDA作者。

在评论中,您说您希望将CNF转换为pycosat使用。我建议您只使用satisfy_one方法,它使用PicoSAT SAT求解器(与pycosat使用的引擎相同)。

代码语言:javascript
复制
>>> 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})}

编程快乐:)。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26598805

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档