对于我正在开始的项目,我需要使用SAT求解器。我之前使用过其中一些但主要用于实验,而这里项目的主要约束是良好的性能。我正在尝试寻找替代方案,并尝试了解每种方案如何根据我的具体要求定位。特别是:
我需要提取令人满意的作业,而不仅仅是检查可满足性,并且解算器应该允许我重复求解相同的公式,寻找不同的可能令人满意的作业,最终迭代所有作业,有效的方式(例如,没有我必须添加一个条款并重新开始)。
该项目应该仍然得到积极维护和相当的生产质量,而不是自出版以来放弃的一些竞争获胜的研究项目(见picosat
)。
此外,由于我使用的是C ++,因此解算器应该提供一个有效且(可能)良好的编写C ++接口。
我考虑的第一个候选人是Z3,但我对文档感到困惑,如果上面的第1点得到支持则无法理解,如果我只需要SAT而不是SMT就可能有点过分。 C ++界面似乎也很容易使用但是我不能忍受这样一个事实:我必须用普通字符串命名变量(这与我周围的算法配对非常糟糕。是不是可以避免?)。
那么你能否给我一些关于哪个SAT求解器使用的建议,或者通过对Z3的怀疑来解释一下?
答案 0 :(得分:1)
如果您愿意为不同平台修复构建(或根本不需要它们),MiniSat's interface is rather nice.请注意它不再被维护了。
还有Glucose,它共享MiniSat的界面并且相对积极地维护。它在SAT比赛中的表现也比MiniSat好得多。
在选择其中一个之前,您需要了解的是,虽然葡萄糖在SAT比赛中通常胜过MiniSat,但您的用例可能无法解决SAT比赛。例如,我们的项目通常会生成可满足的公式,其任务是找到(通常)许多SAT分配之一,而MiniSat通常优于那里的葡萄糖。 OTOH如果您的项目主要生成不可满足的公式或公式,只能找到一个解决方案,葡萄糖可能会做得更好,因为它已经过优化,可以快速查找UNSAT样张,而不是找到SAT分配。
我有一个嵌入经验的解决方法是CryptoMiniSat。它具有合理的C ++接口,并且非常积极地维护。当我遇到问题或错误时,通常会在一周内修复。然而,它很少提供稳定的版本,所以如果你使用它,你可能最终会生活在一个特定的哈希而不是正确的版本。
还有一点需要注意:Glucose提供了一个并行解算器,但有一个相当有趣的许可证。 CMSat在MIT许可下提供并行求解器。 MiniSat拥有非常自由的许可证,但根本没有并行选项。