Encoding 验证组合CNF SAT编码?

Encoding 验证组合CNF SAT编码?,encoding,combinatorics,boolean-expression,satisfiability,Encoding,Combinatorics,Boolean Expression,Satisfiability,我试图用一个简单的方法来解决一个组合问题 这包括以下步骤: 将问题编码为布尔表达式集 将表达式的连词翻译成 (使用自制工具,或) 解决问题 (使用SAT解算器,如,或) 将解决方案(假设“SAT”结果)转换回问题域 这在我的小样本情况下有效。但对于更具挑战性的问题,SAT解决方案需要数小时甚至数天才能得出SAT/UNSAT结论。我试着调整我的编码以得到一个解决方案。但我在编码上投入的精力越多,我就越不确定我的编码是否正确(即“可满足性等价物”) 从布尔表达式到CNF的步骤相当复杂,在可管理的子

我试图用一个简单的方法来解决一个组合问题

这包括以下步骤:

  • 将问题编码为布尔表达式集
  • 将表达式的连词翻译成
    (使用自制工具,或)
  • 解决问题
    (使用SAT解算器,如,或)
  • 将解决方案(假设“SAT”结果)转换回问题域
  • 这在我的小样本情况下有效。但对于更具挑战性的问题,SAT解决方案需要数小时甚至数天才能得出SAT/UNSAT结论。我试着调整我的编码以得到一个解决方案。但我在编码上投入的精力越多,我就越不确定我的编码是否正确(即“可满足性等价物”)

    从布尔表达式到CNF的步骤相当复杂,在可管理的子句和变量数量方面是有效的。等待SAT解算器很长时间,却不确定时间是否花在了正确的轨道上,这是很痛苦的

    布尔表达式可能是错误的。因此,我想确认CNF实际上代表了原始问题,而不仅仅是布尔表达式

    我的问题:

    如何验证给定编码是原始布尔表达式的有效表示形式?

    从文献中,我知道了一些问题的解决方案,我可以将这些问题转化为变量赋值,从而在编码过程中获得信任。但是由于,我的CNF中的大多数变量都是辅助(切换)变量。如果没有,我的CNF将太大而无法解决。因此,我不能简单地检查已知解决方案是否满足了每个CNF条款

    我曾尝试使用将CNF转换回布尔表达式,但该工具仍处于初级阶段。在不切换变量的情况下,可以直接根据主要问题变量的布尔表达式检查assignment

    有一些关于“CNF到电路”方法的出版物,但都没有提供可用的工具


    有什么最佳实践可以完成这样的检查吗?

    所以你要问的是:

    给定一个布尔表达式B和一个CNF C,有没有办法判断它们是否相等可满足

    换句话说:

    存在满足B但不满足C的模型,或者满足C但不满足B的模型?如果不存在这样的模型,那么两者都是可平等满足的

    我对这个问题的解决办法如下:

  • 我会使用已知良好的软件(例如,未优化的代码或第三方工具)从布尔表达式生成已知良好的CNF d

  • 使用Tseitin为生成CNF!B来自C和D。也就是说,将C的CNF解释为和的乘积(析取的结合),并反转整个表达式。让我们调用得到的CNFs C'作为C的逆函数,D'作为D的逆函数

    因此,满足C的模型不会满足C’,反之亦然。D和D'类似

  • 使用SAT解算器查找满足C和D'的模型。这样的模型将满足C,但不满足B

  • 使用SAT解算器找到满足C'和D的模型。这样的模型将满足B,但不满足C

  • 如果步骤3。四,。两者都不会产生一个模型(unsat),那么你已经证明了B和C是相等可满足的

  • 步骤3。四,。这很容易。只需创建一个包含两个CNF中所有子句的大CNF。来自B的所有变量必须在CNF中使用相同的文本进行编码,辅助变量必须从单独的池中分配

    根据您的问题,解决步骤为3。四,。可能在计算上相当昂贵。因此,只有当您能够将问题分割成更小的块,并相互独立地进行验证时,这种方法才可能可行

    我希望这有帮助。您说过您正在努力确保您的优化是正确的,因此您应该有一个已知的良好实现。否则,您可以使用我编写的库作为外部参考:


    这个库生成的CNF不是很有效!但是它经过了很好的测试。

    您想在要求解的同一个表达式上运行验证,还是在较小的测试用例上运行验证?我脑子里能想到的所有验证方案可能至少和解决SAT问题本身一样复杂。你是对的。验证的例子比较小。我应该强调(参见我列表中的第2点),我的布尔表达式是许多较小表达式的结合。所以,我可以分别验证每个子表达式。答案不错,但是检查CNF和布尔表达式可能还不够。我更愿意验证CNF是否确实代表了原始问题。实际上,我在这里检查CNF与CNF,并通过使用“已知良好”参考布尔->CNF实现来创建第二个,从而将其扩展到CNF与布尔值。CNF。当然,您可以通过使用“已知良好”问题->布尔代码来生成第二个CNF来扩展此功能。对不起,但我仍然有疑问。作为单一最小项的原始问题的已知解决方案并没有涵盖所有可能的解决方案,因此无法通过CNF进行检查。非优化的已知良好CNF对于非平凡情况来说太大。目前,我的方法是分割CNF is簇/锥体,它们是分界wrt。切换变量。我希望能够通过迭代单元传播逐一验证它们。一有更清楚的情况,我就更新这个问题。