繁体   English   中英

有没有一个好的算法可以在没有额外变量的情况下对 CNF 进行最少的计算?

[英]Is there a good algorithm for the minimal computation of a CNF without extra variables?

我目前正在将数据库系统的逻辑查询从 DNF 形式转换为 CNF 形式,重点关注与(a and b and c and d and e1) or (a and b and c and d and e2) or (a and b and c and d and e3)具有相似形式的查询(a and b and c and d and e1) or (a and b and c and d and e2) or (a and b and c and d and e3) , into a and b and c and d and (e1 or e2 or e3)

我希望已经有一个算法,但我目前正在使用 z3,并且我看到的形成 CNF 的唯一方法是使用 tseitin 或类似的,其中包括额外的变量,这是一个问题,因为他们可以'不能正确用于查询。

为此目的使用 z3 可能不是最佳选择。 虽然有一个内部转换器,但它被调整为与求解器的 rest 结合使用。 如果您不需要找到令人满意的 model,则不应使用 SAT/SMT 求解器。

从 DNF 到 CNF 的转换会产生指数级大的公式,这也是为什么大多数实际应用会使用Tseytin 变换来降低这种复杂性的原因; 这增加了额外的变量。 如果你不想要这个,你应该使用Quine-McCluskey algorithm ,它有最坏情况的指数行为。 但是,如果您的公式足够小,可以开始使用,则可能无关紧要。

您可以自己编写此算法的代码,或者如果您愿意使用 SymPy,则可以使用现有的实现(可能会进行简化)。 参见https://docs.sympy.org/latest/modules/logic.html?highlight=to_cnf#sympy.logic.boolalg.to_cnf

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM