【问题标题】:Haskell: binding to fast and simple SAT solverHaskell:绑定到快速简单的 SAT 求解器
【发布时间】:2014-01-22 11:56:32
【问题描述】:

今天我也想研究一下在 haskell 中解决 SAT 问题的选项。首先,我决定编写自己的 picosat 求解器接口。

然后我发现有SBV library。 它是 Z3、Yices、CVC4 和 Boolector 的接口。

另外,我在 github 上进行了谷歌搜索,结果发现甚至有 Picosat binding 可用。

考虑到快速/高性能的限制,是否有任何其他与 SAT 求解器相关的 Haskell 绑定值得研究。 Carification:适用于高性能 SAT 解决(例如,运行数天的问题,以及需要尽快完成的问题,因为我检查了 2^20 或更多 SAT 问题)。例如,我在 hackage 中特别缺少的是绑定到像 Plingeling 这样的快速并行 SAT 求解器。 (另外,我在 github 上发现了当前更新的 picosat 绑定更多的是偶然,我很可能会错过其他选项)

SBV 库的默认选项是 Z3 SMT 求解器。我的有根据的猜测是否正确,即 picosat 比 Z3 更快地解决普通 SAT 问题?

【问题讨论】:

  • 不想刻薄,但你知道看看hackage吗?那里已经有很多 SAT 和 SMT 包,只需搜索“sat”就会产生 10 个包(有些是绑定,有些是管道,有些是 Haskell SAT 实现)。搜索“smt”会产生其他几个,您可能会通过四处搜寻找到一两个(例如:“picosat”正在被黑客入侵)。
  • 我按类别查看了hackage并在浏览器中搜索,但显然有文本搜索功能。 hackage 的其他选项要么是 SBV 库已经提供的绑定,要么在速度方面与 picosat 没有比较。
  • Thomas,你有没有想过是否所有的 hackage 包库都适合繁琐的多线程编程?从某种意义上说,我的 SAT 问题都是严格分开的,并且不需要共享内存左右,我只想一次对不同的问题进行 n SAT 调用。
  • 我猜你感兴趣的库都是线程安全的。也就是说,并非所有 Hackage 软件包都如此。上传到 hackage 没有质量保证 - 您需要做的就是申请一个帐户。因此,有很多关于 hackage 的东西可能看似不是线程保存(我的最新示例是安全套接字,因为 OpenSSL 使用了线程本地存储)。
  • 你说你正在处理 2^20 个问题——它们在某种程度上是否相关?也许这只是一个 QBF-SAT 问题? fmv.jku.at/qbf2013

标签: haskell z3 smt satisfiability picosat


【解决方案1】:

披露,我是你提到的 Haskell picosat 绑定的作者。

SBV 是一个非常强大的库,已经存在了一段时间,如果您想要一个与 Yices 或 Z3 等外部 SMT 或 SAT 求解器的接口,那就太好了。 Picosat 是一个简单得多的库,我之所以编写它只是因为我想要一个无需外部依赖即可轻松安装的库。

我的有根据的猜测是,picosat 比 Z3 更快地解决普通 SAT 问题吗?

我不知道您的性能限制是什么,但就底层求解器库而言,在遇到真正巨大的问题(数十亿变量)之前,您不会注意到 Z3 或 Picosat 之间的显着差异。两者都是高度优化的库,瓶颈(至少从 Haskell 方面)很可能是在库和 Haskell 的运行时之间编组数据。

【讨论】:

  • “瓶颈正在编组”——真的吗?然后编组不好。困难的部分是解决,你不能简单地“优化”它。有关详细比较,请参阅。 satcompetition.org
【解决方案2】:

SBV 是线程安全的。

比较 Z3 和 Lingeling 的 SAT 成绩并非易事。我敢猜测它们或多或少是相同的,除非你花时间找出确切的参数来微调它们的内部启发式。

好在 SBV 提供了一个通用接口,因此您只需导入不同的网桥即可更改求解器:

import Data.SBV.Bridge.Z3

import Data.SBV.Bridge.Boolector

如果你编译 boolector 以使用 lingeling,那么你可以通过仅仅改变 Haskell 的一行来轻松测试性能。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-04-29
  • 2019-11-24
  • 1970-01-01
  • 2013-06-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多