z3求解器中的Sum数组

时间:2014-04-08 08:20:01

标签: arrays sum z3 smt

我试图表达z3中无界数组范围的总和。例如在Python中:

IntArray = ArraySort(IntSort(), IntSort())

sum = Function('sum', IntArray, IntSort())

........

有没有办法完成“sum”的定义?否则,是否有更合理的替代方案?

谢谢!

2 个答案:

答案 0 :(得分:3)

以下是如何约束我认为的数组之和

IntArray = Array('IntArray',IntSort(),IntSort())
sumArray = Function('sumArray',IntSort(),IntSort())
s.add(sumArray(-1)==0)
i = Int('i')
s.add(ForAll(i,Implies(And(i>=0,i<3),sumArray(i)==sumArray(i-1)+IntArray[i])))

假设您知道数组的长度为2,并且数组的总和为4,则可以按以下方式约束总和

s.add(sumArray(2)==4)

如果要推断出Array的长度,那么就像这样

来约束Array的总和
x = Int('x')
s.add(sumArray(x)=4)

答案 1 :(得分:1)

Z3中唯一支持的绑定运算符是通用和存在量词。因此不支持可用于求和的lambda。您也可以为每个求和项定义一个自包含函数,并编写表征该函数的公理。 Z3将不得不依靠它可以通过量词实例化建立的内容来建立求和的属性。