使用Solver验证属性

时间:2015-06-01 10:40:11

标签: algorithm solver smt

我有一个形式的方程组:

x1 * x2 * .... * xn = a,其中*可以是+或 - 。

我正在构建相同形式的其他方程式,我想验证 如果他们对第一个系统感到满意。

我的问题是:是否有一个解算器可以确认给定的等式是否满足?

非常感谢, 干杯

1 个答案:

答案 0 :(得分:1)

这是partition problem的变体,带有偏差(您需要通过a结束一个比另一个更大的子集,而不是它们相等)。可以通过将a添加到集合中来解决,现在解决"常规"分区问题。

这个问题是NP-Complete,但可以使用动态编程在伪多项式时间内解决:

D(x,i) = false   x<0
D(0,i) = true
D(x,0) = false   x != 0
D(x,i) = D(x,i-1) OR D(x-arr[i],i-1)

您正在寻找总和(x1 + x2 + ... + xn + a) / 2

的子集

我们的想法是获得2套,其中一套有a(让它为A),另一套没有它(让它为B)。

a A符号中添加所有元素(-除外),并在B中添加+符号中的所有元素。
由于sum(A)= sum(B),你得到

sum(B)-(sum(A)-a) = sum(B) - sum(A) + a = 0 + a = a