具有良好C 接口的有效SAT求解器的建议(OR:Z3对我有益)
Suggestion of an efficient SAT solver with good C++ interface (or: is Z3 good for me)?
对于我开始的项目,我需要使用SAT求解器。我以前使用过其中一些,但主要用于实验,而在这里,该项目的主要限制是良好的性能。我正在尝试寻找替代方案,并试图了解如何将每个替代方案定位在我的特定要求方面。特别是:
-
我需要提取令人满意的作业,不仅要检查满足性,并且求解器应允许我反复求解相同的公式,以寻找不同的可能令人满意的作业,最终在所有这些方面迭代了所有这些,有效的方式(例如,我不必添加一个子句,然后重新开始)。
-
该项目仍应积极维护和相当相当的生产质量,而不是自出版以来被放弃的竞争赢得研究项目(请参阅
picosat
)。 -
此外,由于我使用的是C ,因此求解器应提供有效的(可能是)良好的书面C 接口。
我考虑的第一个候选人是Z3,但是我对文档感到困惑,不明白是否支持上述点1。C 接口似乎也很容易使用,但是我无法忍受一个事实,我必须用普通字符串命名变量(与周围的算法非常糟糕。
那么,您能给我一些建议使用哪个sat求解器,或者对Z3的疑问?
如果您愿意为不同的平台修复构建(或根本不需要它们),则Minisat的界面相当不错。请注意,它不再真正维护。
也有葡萄糖,它共享了Minisat的界面,并相对维护。它在SAT比赛中的表现也比Minisat好得多。
在选择一个或另一个之前,您需要了解的是,尽管葡萄糖通常在SAT比赛中赢得Minisat,但您的用例可能无法解决SAT比赛。例如,我们的项目通常会产生令人满意的公式,其中任务是在其中找到一个(通常)的许多SAT作业,而迷你仪通常在此处优于葡萄糖。OTOH如果您的项目主要生成不满意的公式或使用单个解决方案的公式,则葡萄糖可能会更好,因为它已被优化,可快速找到Unsat证明,而不是找到SAT作业。
。我曾经有一个嵌入经验的求解器是cryptominisat。它具有合理的C 接口,并且非常积极地维护。当我有问题或错误时,通常是在一周内修复的。但是,它很少提供稳定的发行版,因此,如果您使用它,您可能最终会依靠特定的哈希(Hash)而不是适当的版本。
还有一件事要注意:葡萄糖提供了平行的求解器,但具有相当有趣的许可。CMSAT根据MIT许可提供并行求解器。Minisat具有非常自由的许可证,但根本没有平行的选择。
- 瓦尔格林德:数学函数"Conditional jump or move depends on uninitialised value(s)"
- C++核心准则 C35 对于接口类"A base class destructor should be either public and virtual, or protected and nonv
- 使用模板进行堆栈实现; "name followed by :: must be a class or namespace"
- 定义有趣的宏和正则表达式在Z3 C++绑定
- Android NDK clang 编译器错误在 Windows 上显示'No such file or directory'
- 使用分辨率定理用Z3证明
- 模式"allocate memory or use existing data"
- N-API include an .so or dll
- 已解决 - C++ 的崇高文本中的"fatal error: opencv: no such file or directory"
- 将 OR 逻辑运算符从 C++ 转换为 Fortran
- CPP 中的瓦尔格林德和记忆泄漏:"Conditional jump or move depends on uninitialised values"
- Gecode 与 Z3 用于约束随机化
- 在 z3 中使用位向量文本
- 我如何将 OR 与 if 语句一起使用字符串
- 将 if 语句中的字符与 or 进行比较
- Google Or-Tools Glop:如何创建指向 const 对象的指针数组?
- 当初始值设定项是基类名时'initializer does not name a non-static data member or base class'错误
- "No such file or directory" C++标头问题
- 处理 std::enable_if<...中谓词的逻辑"OR">
- 具有良好C 接口的有效SAT求解器的建议(OR:Z3对我有益)