在命题逻辑规则集(SAT求解器)中求解特定组合

时间:2018-02-01 09:54:42

标签: logic logical-operators boolean-logic sat satisfiability

在汽车行业,您可以在购买汽车时选择数千种不同的组件。并非每个组件都是可组合的,因此对于每辆车而言,存在许多以命题逻辑表达的规则。在我的情况下,每辆车都有2000到4000条规则。

他们看起来像这样:

  1. A→B∨C∨D
  2. C→¬F
  3. F∧G→D
  4. ...
  5. 其中“∧”=“和”/“∨”=“或”/“¬”=“不是”/“→”=“暗示”。

    使用工具“limboole”(http://fmv.jku.at/limboole/),我能够将命题逻辑表达式转换为合取范式(CNF)。如果我必须使用SAT求解器,则需要这样做。

    现在,我想检查规则集中特定组件的可构建性可行性。例如,对于以下每个表达式或组合,我想检查规则集中是否可行。

    1. (A)∧(B)
    2. (A)∧(C∨F)
    3. (B∨G)
    4. ...
    5. 我的问题是如何解决这个问题。我之前问过类似的问题(Tool to solve propositional logic / boolean expressions (SAT Solver?)),但是焦点不同,现在又被卡住了。或者我只是不明白。

      一种选择是使用规则集的ALLSAT方法计算所有解决方案。然后我可以检查每个组合是否是任何解决方案的一部分。如果是,我可以推导出这种特定组合是可行的。

      另一种选择是,我将组合添加到规则集,然后运行普通的SAT求解器。但我必须为每个我想检查的表达式做这件事。

      您认为解决此问题最优雅或最简单的方法是什么?

1 个答案:

答案 0 :(得分:2)

我所知道的最好方法是在假设下使用"增量求解"技术。它是由你遇到的同样问题推动的:多个SAT实例(CNF公式)有一些共同的子公式。 形式上,你在CNF中有一些核心布尔公式C。并且您有一组假设{A_i}, i=1..n,其中A_i也是CNF中的布尔公式。

在步骤0中,您向求解器提供核心公式C。它试图解决它,向你说一个结果并保存它的状态(让我们称之为核心状态)。如果公式C可以满足,则在步骤i上为解算器提供假设A_i,并从核心状态继续执行。实际上,它试图解决一个公式C ∧ A_i,但不是从头开始。

您可以轻松找到大量与此主题相关的论文,其中包含大量信息。此外,您可以检查您最喜欢的SAT解算器以获得此技术的支持。