Haskell:绑定到快速简单的SAT求解器

时间:2014-01-04 21:24:32

标签: haskell z3 smt satisfiability picosat

今天我也希望了解在haskell中解决SAT的选项。首先,我努力将我自己的界面写入picosat解算器。

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

另外,我在github上进行了谷歌搜索,它甚至还有Picosat binding可用。

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

SBV库的默认选项是Z3 SMT解算器。我是否正确地认为,对于简单的SAT解决而言,picosat比Z3更快?

2 个答案:

答案 0 :(得分:6)

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

SBV是一个非常强大的库已经存在了一段时间,如果你想要一个外部SMT或SAT求解器(如Yices或Z3)的接口,那就太好了。 Picosat是一个更简单的库,我写的只是因为我想要一个可以在没有外部依赖的情况下安装的库。

  

我是否正确地认为,对于简单的SAT解决而言,picosat比Z3更快?

我不知道你的性能限制是什么,但就基础解算器库而言,你不会注意到Z3或Picosat之间的显着差异,直到遇到真正巨大的问题(数十亿个变量)。两者都是非常优化的库,瓶颈(至少来自Haskell方面)可能会在库和Haskell的运行时之间编组数据。

答案 1 :(得分:5)

SBV是线程安全的。

比较Z3和Lingeling的SAT性能并非易事。我猜测它们或多或少会相同,除非你花时间弄清楚它们内部启发式的精确参数。

好处是SBV提供了一个通用接口,因此您只需导入另一个桥就可以更改解算器:

import Data.SBV.Bridge.Z3

VS

import Data.SBV.Bridge.Boolector

如果您编译boolector以使用lingeling,那么您只需更改一行Haskell即可轻松测试性能。