在汽车行业,您可以在购买汽车时选择数千种不同的组件。并非每个组件都是可组合的,因此对于每辆车而言,存在许多以命题逻辑表达的规则。在我的情况下,每辆车都有2000到4000条规则。
他们看起来像这样:
其中“∧”=“和”/“∨”=“或”/“¬”=“不是”/“→”=“暗示”。
使用工具“limboole”(http://fmv.jku.at/limboole/),我能够将命题逻辑表达式转换为合取范式(CNF)。如果我必须使用SAT求解器,则需要这样做。
现在,我想检查规则集中特定组件的可构建性可行性。例如,对于以下每个表达式或组合,我想检查规则集中是否可行。
我的问题是如何解决这个问题。我之前问过类似的问题(Tool to solve propositional logic / boolean expressions (SAT Solver?)),但是焦点不同,现在又被卡住了。或者我只是不明白。
一种选择是使用规则集的ALLSAT方法计算所有解决方案。然后我可以检查每个组合是否是任何解决方案的一部分。如果是,我可以推导出这种特定组合是可行的。
另一种选择是,我将组合添加到规则集,然后运行普通的SAT求解器。但我必须为每个我想检查的表达式做这件事。
您认为解决此问题最优雅或最简单的方法是什么?
答案 0 :(得分:2)
我所知道的最好方法是在假设下使用"增量求解"技术。它是由你遇到的同样问题推动的:多个SAT实例(CNF公式)有一些共同的子公式。
形式上,你在CNF中有一些核心布尔公式C
。并且您有一组假设{A_i}, i=1..n
,其中A_i
也是CNF中的布尔公式。
在步骤0中,您向求解器提供核心公式C
。它试图解决它,向你说一个结果并保存它的状态(让我们称之为核心状态)。如果公式C
可以满足,则在步骤i
上为解算器提供假设A_i
,并从核心状态继续执行。实际上,它试图解决一个公式C ∧ A_i
,但不是从头开始。
您可以轻松找到大量与此主题相关的论文,其中包含大量信息。此外,您可以检查您最喜欢的SAT解算器以获得此技术的支持。