约束满意度问题(CSP)与可满足性模理论(SMT);关于约束编程的尾声


30

有人敢于尝试澄清这些研究领域的关系,甚至可能在问题层面给出更具体的答案吗?像其中包括假设一些公认的公式。如果我正确地理解了这一点,那么当您从SAT转到SMT时,您基本上是在进入CSP领域。反之亦然,如果将CSP限制为布尔值,则基本上是在谈论SAT以及诸如#SAT之类的一些相关问题。我认为这很清楚(例如,在有限模型理论及其应用中,参见Kolaitis和Vardi的“约束满足的逻辑方法”一章)由Grädel等人撰写),但对我而言还不清楚的是,什么时候约束是“以理论为模”的,什么时候不是?SMT是否总是暗示理论仅在CSP的更广泛领域中使用平等和不平等约束?据我所知,您经常可以引入slack变量,因此区别(如果存在)不太明显。

相对较新的“可满足性手册”(IOP Press 2009)在其广泛的“可满足性”框架下收集了SMT和CSP问题,但是考虑到它的结构方式(由不同作者撰写的章节),并不能真正帮助我弄清楚这一点。 。

我希望当您谈论约束编程时,该术语不会引起混淆,(类似于术语“数学编程”)我希望涉及最小化/最大化某些目标函数。Wikipedia上有关约束编程的文章非常含糊,以至于我无法真正确定这种框架是否发生。我从Frühwirth和Abdennadher 的“约束编程要点”(第56页)中可以得出的结论是,“约束求解器”通常不仅提供可满足性检查器,而且简化等在实践中也很重要。

尽管这几乎不是一个真正的CS理论研究问题,但鉴于我在https://cs.stackexchange.com/questions/14946/distinguish- Decision-procedure-vs-smt-solver-vs-theorem-prover-vs-constraint-sollas,但包含很多单词,但我认为不是真正的答案)。


添加到此ASP。SMT / ASP相对较新的发展。以前分开的字段正在混合。参见例如混合自动推理工具:从黑盒到透明盒集成 / Balduccini,Lierler,作为近期的粗略调查。
vzn

Answers:


47

SAT,CP,SMT和(大部分)ASP都处理同一组组合优化问题。但是,它们从不同的角度和使用不同的工具箱来解决这些问题。这些差异主要在于每种方法如何构造有关搜索空间探索的信息。我的工作比喻是SAT是机器代码,而其他是高级语言。

根据我关于CSP的结构理论的论文工作,我开始相信“子句结构”的概念对于统一所有这些范式并理解它们之间的区别至关重要。SAT实例的每个子句都表示禁止的部分分配。像这样的子句禁止部分赋值同时将和为false并将为真正。组合优化问题的子句结构是使用一些合适的编码将其表示为SAT实例。但是,子句结构包含所有x1x2¯x3{(x1,0),(x2,1),(x3,0)}x1x3x2禁止的部分分配,而不仅仅是开始时给出的分配。因此,子句结构通常太大而无法直接操作:通常,它的变量数量至少为指数大小,并且可能是无限的。因此,子句结构必须以有限的空间来近似。SAT / CP / SMT / ASP维护和更新基本子句结构的或多或少的隐式表示。这是可能的,因为如果在子句结构中已知一个部分赋值,那么这意味着还存在许多其他子句。例如,上面的SAT子句还禁止将它作为子集的任何部分赋值,因此像和x1x2¯x3x4x1x2¯x3x4¯x5都在该实例的子句结构中。

保留子句结构的近似值以缩小解决方案的范围,并帮助确定此组是否为空。在搜索期间,某些部分分配可能不会包含在任何解决方案中(即使它们分别满足实例中的每个约束)。这些被称为nogoods,由(“ GNU先生”)Stallman和Sussman引入 。因此,nogood子句位于子句结构中,并且可以包含在子句结构的近似中,作为许多子句的紧凑表示,可以从搜索解决方案中删除这些子句。在近似子句结构中添加nogoods会保留所有解决方案,但更好地近似那些解决方案。因此,近似子句结构通常会随着搜索的进行而变化。此外,在一种组合优化方法中对问题建模的方式通常会非常显着地影响子句结构。例如,命题变量可以表示诸如区间或诸如X = 5x5x=5。因此,没有一个通用的子句结构,而是与每个表示形式相关的结构,这取决于该子句结构的单例(文字)所代表的含义。

约束编程(CP)传统上是一门AI学科,着重于调度,时间表和组合问题,因此对于可以仅包含两个值(但通常只有有限多个)的变量具有核心作用。CP一直强调有效搜索,并且受传统应用程序的启发,CP对all-different(内插性)约束起了核心作用,但也开发了针对许多其他约束的有效传播器。至少从Montanari 1974年的论文《约束网络》开始,CP的正式定义就出现,其前身甚至更早。在过去十年中,如此庞大的历史记录可能导致CP在原始性能方面落后于其他方法。CP经典地通过一组变量的活动域来保持子句结构的补充的近似值。目的是消除活动域中的值,通过尝试将候选值分配给变量并在必要时回溯来探索子句结构。

可满足性模理论(SMT)来自验证界。SMT求解器中的每个理论都构成了潜在无限多个SAT子句的隐式表示。SMT使用的理论和CP中使用的约束反映了它们不同的历史应用。SMT认为的大多数理论都与整数索引数组,实数封闭字段,线性阶数等有关。这些来自程序的静态分析(在计算机辅助验证中)或形式化数学证明(在自动推理中)。相比之下,在时间表和调度中,内射性约束是关键,尽管自2003年标准SMTLIB语言问世以来,它一直具有内射性约束(通过distinct符号),直到2010年SMT求解器仅distinct通过幼稚算法实现。在那个阶段,all-different移植了标准CP传播器的匹配技术,当应用于大量变量时,效果很好;参见Banković和Marić 在SMT中提出的Alldifferent约束求解器,SMT,2010年。此外,大多数CP传播器都是为有限域问题设计的,而标准SMT理论是开箱即用地处理无限域(整数和最新的实数)。SMT使用SAT实例作为子句结构的近似值,并在适当时从理论中提取不良子句。一个很好的概述是“ 满意度模理论: De Moura和Bjørner的介绍和应用,doi:10.1145 / 1995376.1995394”

答案集编程(ASP)来自逻辑编程。由于ASP专注于解决寻找稳定模型的更普遍的问题,并且由于它既可以进行通用量化又可以进行存在量化,因​​此ASP多年来一直无法与CP或SMT竞争。

从形式上来说,SAT是布尔域上的CSP,但是SAT中对子句学习,良好的冲突检测启发式方法和快速回溯方法的关注与传统的CSP对传播者,建立一致性和变量排序的启发式方法完全不同。SAT通常非常高效,但是对于许多问题,首先要花费很大的精力才能将问题表示为SAT实例。使用像CP这样的更高级别的范式可以使问题更自然地表达出来,然后可以将CP实例手动转换为SAT,或者由工具来处理转换。Pipatsrisawat和Darwiche撰写的《现代子句学习满意度求解器》(doi:10.1007 / s10817-009-9156-3)很好地概述了SAT的细节

现在,让我们从概论转向当今的细节。

在过去的十年中,CP的一些人开始关注于懒惰子句生成(LCG)。本质上,这是使用更灵活的类似于SMT的技术而不是相当僵化的活动域抽象将CP传播器连接在一起的一种方法。这很有用,因为已发布CP传播器的悠久历史可以有效地表示和解决许多问题。(当然,通过共同努力为SMT求解器实现新的理论也可以达到类似的效果。)LCG的性能通常与SMT竞争,在某些问题上可能会更好。快速概述是Stuckey的CPAIOR 2010论文“ 惰性子句生成:结合SAT和CP(和MIP?)求解的能力”,doi:10.1007 / 978-3-642-13520-0_3。同样值得一读的是Garcia de la Banda,Stuckey,Van Hentenryck和Wallace的立场文件,该立场文件描绘了以CP为中心的“优化技术的未来”愿景,doi:10.1007 / s10601-013-9149-z

据我所知,最近SMT研究的重点似乎已经转移到形式方法和形式化数学的应用上。一个例子是通过构建Isabelle / HOL策略以在SMT证明跟踪中反映推理规则,来重建在Isabelle / HOL 等证明系统中SMT求解器发现的证明;请参阅ITP 2010上Böhmer和Weber撰写的针对Z3快速LCF样式证明重构

在过去的几年中,顶级的ASP解算器已经发展成为与CP,SMT和仅SAT的解算器竞争。我只是模糊地熟悉那些使求解器clasp具有竞争力的实现细节,因此无法真正将它们与SMT和CP进行比较,但是表扣明确地宣传了其对学习杂物的关注。

跨越这些形式主义之间的传统界限是将更多抽象的问题表示形式转化为较低级别的可有效实施的形式主义。现在,几个顶级的ASP和CP求解器将其输入明确转换为SAT实例,然后使用现成的SAT求解器对其进行求解。在CP中,Savile Row约束建模助手使用编译器设计技术将以中层语言Essence'表达的问题转换为较低层的形式主义,适合于输入到诸如MinionMiniZinc的 CP解算器。Savile Row最初使用CP表示作为低级形式主义,但在1.6.2版中引入了SAT作为目标。而且,更高层次的语言本质现在可以通过“ 调动”工具自动转换为“本质” 。同时,像Lingeling这样的低级别仅SAT求解器每年都在不断完善,最近是通过从句学习和处理阶段交替进行的;请参阅简短的概述,在2015年AAAI的Heule和Schaub举办的SAT和ASP竞赛中,有哪些热点

因此,与编程语言的历史进行类比似乎是适当的。SAT正在成为一种“机器代码”,其目标是对子句结构中的子句进行探索的低级模型。抽象范例正变得越来越像高级计算机语言,它们善于处理自己独特的方法和应用程序。最后,这些不同层之间越来越紧密的链接集合开始类似于编译器优化生态系统。


谢谢这个非常有用的答案。
Xavier Labouze 2015年

2
注意:在FOCS / STOC社区中,使用了较窄的CSP定义。这些CSP的形式为CSP(L),“可以使用固定的约束关系集L表示的所有CSP实例”。完全不同的约束不适用于此框架,具有树状结构的问题也不适合。
安德拉斯·萨拉蒙
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.