我试图通过使用来解决一个组合问题SAT求解 。
这包括以下步骤:
- 如设置布尔表达式的编码问题。
- 翻译的表达式的结合到CNF / DIMACS
(使用本土的工具, bc2cnf , bool2cnf或Limboole ) - 解决CNF
(使用SAT解算器等Cryptominisat , Plingeling , 扣环或Z3 ) - 翻译溶液(假设“SAT”结果)返回到问题域
这适用于我的情况下,在小样本。 但更具挑战性的,在SAT求解器需要几个小时甚至几天不来一个SAT / UNSAT结论。 我试着调整我的编码,以达成解决办法。 但更多的努力我把我的编码,少肯定我可以为我的编码实际上是正确的(即“可满足等价物”)。
从布尔表达式到CNF的步骤是颇为曲折是有效的条款和变量的可管理数量方面。 这是痛苦的等待年龄的SAT求解器,而不是肯定的是,时间花费在正确的轨道上。
布尔表达式可能是错误的。 因此,我想,以验证CNF实际上代表原来的问题不只是布尔表达式。
我的问题:
我怎么能验证一个给定的编码是原始布尔表达式的一个有效的代表性?
从文学,我已经知道了一些问题,我可以转化为变量赋值在我的编码过程中获得信任的解决方案。 但由于Tseitin编码 ,大部分在我的CNF的变量是辅助(开关)变量。 如果没有Tseitin编码 ,我CNF将远远太大,是可以解决的。 因此,我不能简单地检查每一个CNF条款是由已知的解决方案满足。
我曾尝试到CNF转换回使用布尔表达式cnf2aig ,但该工具还处于起步阶段。 无需切换变量,它是简单的所要检查的首要问题变量的布尔表达式的分配新建分配FY。
有“到电路CNF”办法一对夫妇约出版物的,但它们都没有提供一个可用的工具。
有没有办法实现这样的检查任何最佳做法?