在计算布尔可满足性时包含隐式约束是否有益?

时间:2013-05-26 21:05:20

标签: algorithm complexity-theory boolean-logic computation-theory

假设您有一个布尔函数,它接受两个数字(二进制​​),如果它们等于十六,则返回true:

01000 + 01000 = 10000
  8   +   8   =  16    -> true


00110 + 01000 = 01110
  6   +   8   =  14    -> false

在这个例子中,该函数需要十个输入,我们称之为abcde + fghij。

在幕后,它直接在门逻辑上建模,并使用两个加法器和一些xnor门来检查二进制字符串10000的等效性。

然后我们将这个二进制函数提供给一个布尔可满足性算法,以找到一组产生真实输出的输入(例如,上面的第一个例子)。

我的问题是:如果我们明确了解观察到的约束,SAT算法会更快地找到解决方案吗?

“观察到的约束”是什么意思?好吧,一个观察到的约束可能是“如果任何一个数字大于16,那么就不用费心去执行加法并返回false”。

您可以像这样包含此约束:

(a ^¬b^¬c^¬d^¬e)^(f ^¬g^¬h^¬i^¬j)^(你以前的功能)

另一个约束可能是“如果一个数字是偶数而另一个数字是奇数则返回false”。

((e ^¬j)v(¬e^ j))^(你以前的功能)

这些布尔函数在正确性上是等价的,但在门逻辑中,后者(可能)更有效。模拟问题是减少SAT时唯一关注的问题,还是有助于包含这些观察到的约束?

我意识到这不是一个很好的例子,但希望它能解释我在问什么。

提前致谢

1 个答案:

答案 0 :(得分:1)

您的样本函数在2 ^ 10 = 1,024种可能的输入组合中有17种为真。

这可以实现为这样的多级逻辑电路: enter image description here

SAT solvers的主要区域是枚举所有输入组合不可行的问题。 10个输入是相当适中的大小。 SAT求解器通常必须处理数百,数千甚至数百万个输入变量。在PC上评估几个100.000输入组合(~20个输入)非常容易。但是,如果不是不可能超过数十亿种组合,它就变得不切实际了。

通常的方法是首先在Conjunctive Normal Form(CNF)中编码问题,然后让SAT求解器找到一个解决方案或发现问题不可满足。大多数SAT解算器找到所有解决方案并不常见。

如果您有问题的布尔表达式,首先必须将此公式转换为CNF或解算器能够处理的格式。合适的工具包括bc2cnf。更常见的求解器如Z3支持SMT 2.0以及除CNF之外的其他格式(又名DIMACS)。

除了枚举真值表或询问像Cryptominisat 2这样的SAT求解器之外,您还可以使用约束驱动求解器。要求Google提出的其他条款包括“Answer set programming”。