我正在设计和实施SAT求解器。如果所有条款都是
形式,那将特别好a AND b = c
a OR b = c
a XOR b = c
a = NOT b
在文学中他们使用CNF形式,我认为这在实践中是对原始现实世界问题的低效表示。他们这样做是因为现有的SAT求解器可以更好地处理CNF。然而,这对于我的SAT求解器来说并不适用,这会对我造成不公平的劣势。是否有人知道上述形式的任何真实世界实例?
答案 0 :(得分:3)
你提出了一个有效的观点。 Peter Stuckey做了一个演讲"没有CNF问题"在SAT Conference 2013上。您将找到幻灯片here。
对于实际应用来说,拥有像Stuckey' MiniZinc这样的高级问题描述语言会很不错。在CNF中编码问题通常很乏味且容易出错。
回答你的问题:
是的,大多数现实问题都被描述为布尔或数学表达式而不是CNF。需要一个编码步骤让一些求解器解决它们。
有很多解决方案"学校"在科学市场上使问题编码问题较少。答案集编程(ASP)如Gringo / Clasp和Constraint Programming Solvers(CSP)如MiniZinc。
另一种选择是使用" Circuit-SAT"而不是CNF-SAT。 A"电路"以逻辑门和它们之间的连接来描述。这是一种布尔表达式的嵌套系统。我最喜欢将电路转换为CNF的工具是bc2cnf。
有一些关于CNF的好处:
答案 1 :(得分:2)
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)
传递给SMT解算器时会打印unsat
。
SMT-LIB QF_UF基准测试包含大量问题(6647“精心制作”和3“工业”):
SMT比赛分为逻辑部门。因此,可以在仅支持QF_UF
的竞赛中输入解算器。 (事实上,OpenSMT2解算器仅支持QF_UF
并参与SMT-COMP 2014。)