我试图表达z3中无界数组范围的总和。例如在Python中:
IntArray = ArraySort(IntSort(), IntSort())
sum = Function('sum', IntArray, IntSort())
........
有没有办法完成“sum
”的定义?否则,是否有更合理的替代方案?
谢谢!
答案 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将不得不依靠它可以通过量词实例化建立的内容来建立求和的属性。