如何在 sympy 中获取 DNF/CNF 表达式的子句?
How to get clauses of the DNF/CNF expression in sympy?
根据 logic package 上的 sympy 文档,我们可以使用 to_cnf
/to_dnf
或 simplify_logic(expr, form='cnf'/'dnf')
将任意布尔表达式转换为 DNF/CNF 形式。
但是之后如何从结果中得到子句呢?
我们可以尝试使用 args
字段。但是使用起来很不方便。例如,如果你将像 ~a
这样的简单表达式转换为 CNF/DNF,那么你会得到 ~a
作为结果,然后调用 (~a).args
returns ()
,这不是寻求的条款! (当然,我可以使用 if
检查来解决问题,但这很难看)
我在 sympy 中找不到本地方法,但是我写错了,使用 args
是丑陋的。这是解决方案。
def clauses(expr) -> tuple: # for DNFs only
if not isinstance(expr, sympy.logic.boolalg.Or):
return expr,
return expr.args
注意 true/false 值的函数 returns (true,)
/(false,)
。对于 CNF,更改为 isinstance(expr, And)
.
根据 logic package 上的 sympy 文档,我们可以使用 to_cnf
/to_dnf
或 simplify_logic(expr, form='cnf'/'dnf')
将任意布尔表达式转换为 DNF/CNF 形式。
但是之后如何从结果中得到子句呢?
我们可以尝试使用 args
字段。但是使用起来很不方便。例如,如果你将像 ~a
这样的简单表达式转换为 CNF/DNF,那么你会得到 ~a
作为结果,然后调用 (~a).args
returns ()
,这不是寻求的条款! (当然,我可以使用 if
检查来解决问题,但这很难看)
我在 sympy 中找不到本地方法,但是我写错了,使用 args
是丑陋的。这是解决方案。
def clauses(expr) -> tuple: # for DNFs only
if not isinstance(expr, sympy.logic.boolalg.Or):
return expr,
return expr.args
注意 true/false 值的函数 returns (true,)
/(false,)
。对于 CNF,更改为 isinstance(expr, And)
.