如何在 sympy 中获取 DNF/CNF 表达式的子句?

How to get clauses of the DNF/CNF expression in sympy?

根据 logic package 上的 sympy 文档,我们可以使用 to_cnf/to_dnfsimplify_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).