我正在设计和实现一个 SAT 求解器。如果所有条款都具有以下形式,那就特别好
a AND b = c
a OR b = c
a XOR b = c
a = NOT b
在文献中,他们使用 CNF 形式,我认为这在实践中对原始现实世界问题的表示效率较低。他们这样做是因为现有的 SAT 求解器可以更好地处理 CNF。然而,这不适用于我的 SAT 求解器,这会给我带来不公平的劣势。有人知道上述形式的任何现实世界实例吗?
我正在设计和实现一个 SAT 求解器。如果所有条款都具有以下形式,那就特别好
a AND b = c
a OR b = c
a XOR b = c
a = NOT b
在文献中,他们使用 CNF 形式,我认为这在实践中对原始现实世界问题的表示效率较低。他们这样做是因为现有的 SAT 求解器可以更好地处理 CNF。然而,这不适用于我的 SAT 求解器,这会给我带来不公平的劣势。有人知道上述形式的任何现实世界实例吗?
你提出了一个有效的观点。Peter Stuckey 在2013 年 SAT 会议上做了一个演讲“没有 CNF 问题” 。您可以在此处找到幻灯片。
对于实际应用,最好有像 Stuckey 的MiniZinc这样的高级问题描述语言。在 CNF 中对问题进行编码通常很乏味且容易出错。
回答您的问题:
是的,大多数现实世界的问题都被描述为布尔或数学表达式,而不是 CNF。需要一个编码步骤来让它们被一些求解器求解。
科学市场上有很多求解器“学校”可以减少问题编码的问题。例如 Gringo/ Clasp之类的答案集编程 (ASP) 和MiniZinc 之类的约束编程求解器 (CSP) 。
另一种选择是使用“Circuit-SAT”而不是 CNF-SAT。“电路”是用逻辑门和它们之间的连接来描述的。这是一种布尔表达式的嵌套系统。我最喜欢的将电路转换为 CNF 的工具是bc2cnf。
关于 CNF,有几点值得一提:
SAT 求解器的理论和应用与 CNF 表示非常紧密地耦合在一起。如果您的求解器使用布尔公式而不是 CNF,您可能希望将您的求解器视为不是“SAT 求解器”,而是“不支持除量词免费一阶逻辑之外的理论的 SMT 求解器”。
许多 SMT 求解器支持 SMT-LIBv2 作为输入语言。在 SMT-LIB 中,求解器的功能集是通过使用set-logic
语句设置“逻辑”来配置的。该QF_UF
逻辑仅支持基本的无量词布尔公式,并且应该等同于您想要的。例如,您在 SMT-LIB 语法中的示例子句:
(set-logic QF_UF)
(declare-fun a () Bool)
(declare-fun b () Bool)
(declare-fun c () Bool)
(assert (= (and a b) c))
(assert (= (or a b) c))
(assert (= (xor a b) c))
(assert (= a (not b)))
(check-sat)
(exit)
unsat
传递给 SMT 求解器时将打印。
SMT-LIB QF_UF 基准包含此格式中的大量问题(6647 个“精心制作”和 3 个“工业”):
SMT 比赛分为逻辑部分。因此,可以在仅支持 的比赛中输入求解器QF_UF
。(其实OpenSMT2求解器只支持QF_UF
并参与了SMT-COMP 2014。 )