【问题标题】:CNF simplificationCNF 简化
【发布时间】:2014-05-04 20:27:16
【问题描述】:

给定一组子句,我想首先检查它们是否可满足。如果是,我想简化它们并创建一个 CNF,例如,(a OR b) ^ (NOT b) 应该简化为:a ^ (NOT b)。我只使用命题公式。我尝试使用 Java SAT4j 库来执行此操作。它可以告诉我这组子句是否可以满足,但似乎没有任何方法可以让我返回一个简化的 CNF。我可以做些什么来有效地简化 CNF?是否有任何 Java 或 Python 实现?

【问题讨论】:

    标签: optimization satisfiability cnf


    【解决方案1】:

    您可以使用 Norbert Manthey 的 Riss3g Coprocessor 来简化您的 CNF

    SAT 求解器 minisat 2 允许 store the preprocessed CNF in a file

    Lingeling,来自奥地利的SAT 求解器有一个选项"-s" 来简化CNF 子句。

    要将布尔表达式转换为简化的CNF,您可以使用bc2cnf

    【讨论】:

    • 您好,感谢您的推荐。 SAT 求解器 minisat 在预处理后不输出任何子句,即使子句是可满足的。所以,我认为它比我需要的更进一步。 Riss3g 协处理器也是如此。 bc2cnf 不起作用。 Lingeling 看起来很有前途,但它的文档严重缺乏,而且它没有创建所需的 .o 文件。我可以查看任何其他实现吗?
    • 当已知 CNF 子句可满足时,它们会简化为一组一元子句,每个子句只有一个文字。因此,创建这种简化的 CNF 没有多大意义。求解器将只输出解决方案(= 满足 CNF 的变量的赋值)。 bc2cnf 绝对“有效”。 Lingeling 是一个世界级的工具,有大量的帮助和解释性文件。如果您无法掌握它,您可能想发布一个额外的问题。
    • 我在这条电路上试过 bc2cnf:BC1.0 K_4 := OR(K_1,~K_2); K_5 := ~K_1;分配 K_4;分配 K_5;我得到以下输出: c The instance was satisfiable c K_4 T c K_5 T c K_1 F c K_2 F p cnf 1 1 1 0 我需要的是一个简化的 CNF,如这种情况下有两个子句:~K1 和 ~K2 而不仅仅是一个可能的赋值。
    • 我所知道的任何求解器都会通过重复的单元传播直接得出 K_1=false 和 K_2=false。您的“~K_1 and ~K_2”不能表示为一个子句。它必须写成两个从句。将 SAT 解直接翻译成一组一元从句没有区别。
    • 我问了一个相关的问题,我怀疑这可能是这里的原始提交者所追求的:stackoverflow.com/questions/41926554/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-03
    • 2014-05-14
    • 1970-01-01
    • 1970-01-01
    • 2012-01-18
    相关资源
    最近更新 更多