继发布于的问题之后Z3(Py) 中的数组的表现力如何?一个例子 https://stackoverflow.com/questions/73778513/how-expressive-can-we-be-with-arrays-in-z3py-an-example,我在Z3Py中表达了如下公式:
Exists i::Integer s.t. (0<=i<|arr|) & (avg(arr)+t<arr[i])
意思是:是否有位置i::0<i<|arr|
在其值的数组中a[i]
大于数组的平均值avg(arr)
加上给定的阈值t
.
Z3Py中的解决方案:
t = Int('t')
avg_arr = Int('avg_arr')
len_arr = Int('len_arr')
arr = Array('arr', IntSort(), IntSort())
phi_1 = And(0 <= i, i< len_arr)
phi_2 = (t+avg_arr<arr[i])
phi = Exists(i, And(phi_1, phi_2))
s = Solver()
s.add(phi)
print(s.check())
print(s.model())
请注意,(1)该公式是可满足的,并且(2)每次执行它时,我都会得到一个不同的模型。例如,我刚刚得到:[avg_a = 0, t = 7718, len_arr = 1, arr = K(Int, 7719)]
.
我现在有三个问题:
- 什么是
arr = K(Int, 7719)]
意思是?这是否意味着数组包含一个Int
有值的元素7719
?在这种情况下,K
mean?
- 当然,这种实现是错误的,因为平均值和长度值独立于数组本身。我怎样才能实现简单的
avg
and len
功能?
- 哪儿是
i
求解器给出的模型中的索引?
另外,使用序列而不是数组的实现在何种意义上会有所不同?