combinatorics - 验证组合 CNF SAT编码?

  显示原文与译文双语对照的内容

我试图用一个 SAT解算器来解决一个组合问题。

enter image description here

这涉及到以下步骤:

  1. 将问题编码为布尔表达式集。
  2. 将表达式的一个连接转换为 cnf/dimacs
    ( 使用家用工具,bc2cnfbool2cnf或者Limboole )
  3. 解决 CNF问题。
    ( 使用像 CryptominisatPlingeling 。Clasp或者Z3等)的SAT解决方案
  4. 将解决方案( 假设""结果) 翻译回问题域

这在我的小样本里很有用。 但是对于更具挑战性的方法来说,to算法需要几个小时或者几天的时间来。 我试图调整我的编码来达到一个解决方案。 但我在编码中付出的努力越多,我就越不确定编码实际上是正确的( 例如 。 "可以满足的等效") 。

从布尔表达式到CNF的步骤对于managable子句和变量来说是相当复杂的。 等待on规划器的年龄很痛苦,而且不确定时间是在正确的轨道上花费的时间。

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

我的问题:

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

从文献中,我已经知道了一些解决方案,可以将它的转换为可以变分配以获得信任。 但是由于 Tseitin编码,我的CNF中的大多数变量都是辅助( 正在切换) 变量。 没有 Tseitin编码,我的CNF将太大无法求解。 因此,我不能简单地检查每个CNF子句是否由已知的解决方案实现。

我尝试使用 cnf2aig 将CNF转换回布尔表达式,但是该工具仍然处于初始阶段。 没有切换变量,直接检查主要问题变量的布尔表达式是很简单的。

有几个关于"cnf至电路"方法的出版物,但是它们都没有提供可用的工具。

是否有最佳实践来完成这种检查?

时间: 作者:

那么你要问的是:

给定布尔表达式B 和 CNF C,是否有方法来判断它们是否为 equisatisfiable?

或者换句话说:

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

我对该问题的解决方案如下:

  1. 我将使用一个已知好的软件( 比如 。 生成已知好的CNF或者第三方工具,从布尔表达式生成一个已知好的CNF 。

  2. 使用Tseitin从C 和D 生成B的CNF 。 换句话说,将CNF解释为 sums ( 析取连词)的乘积,并将整个表达式转化为。 让我们调用产生的CNFs'关于C 和D的逆'来求逆。

    因此,满足C的模型不能满足C,反之亦然。 类似于D 和D 。

  3. 使用SAT求解器找到满足C 和d的模型。 这样的模型可以满足C,但不能满足。

  4. 使用SAT求解器找到满足C 和D的模型。 这样的模型可以满足B,但不能满足。

  5. 如果步骤 3和 4. 两者都不会产生模型( unsat ),因此你已经证明了B 和C 是 equisatisfiable 。

步骤 3 。和 4.很容易。 只创建一个包含两个CNFs中所有子句的大 CNF 。 B 中的所有变量都必须用相同的文本编码,并且必须将from变量分配给单独的池。

根据你的问题,解决步骤 3 。 还有 4可能计算相当昂贵。 这种方法可以能只是可以行的,如果你可以将问题拆分成可以独立于每个方面的小块。

我希望这有所帮助。你已经说过你正在确保你的优化是正确的,所以你应该有一个。 否则,你可以使用我作为外部参照编写的库:

https://github.com/cliffordwolf/yosys/tree/master/libs/ezsat

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

作者:
...