假设您有一个布尔函数,它接受两个数字(二进制),如果它们等于十六,则返回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时唯一关注的问题,还是有助于包含这些观察到的约束?
我意识到这不是一个很好的例子,但希望它能解释我在问什么。
提前致谢
答案 0 :(得分:1)
您的样本函数在2 ^ 10 = 1,024种可能的输入组合中有17种为真。
这可以实现为这样的多级逻辑电路:
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”。