将Z3用于混凝土阵列

将Z3用于混凝土阵列,z3,Z3,我想用Z3来解决这个问题: 给定两个大小相同且具有具体值的数组a和b,选择满足以下约束条件的索引: 0 < selection < [length of array] forall i, a[selection] <= a[i] forall i, b[selection] >= b[i] 我的z3py程序如下所示: def selectIndex(array1, array2): n= len(a) #assume both lists are same siz

我想用Z3来解决这个问题:

给定两个大小相同且具有具体值的数组a和b,选择满足以下约束条件的索引:

0 < selection < [length of array]
forall i, a[selection] <= a[i]
forall i, b[selection] >= b[i]
我的z3py程序如下所示:

def selectIndex(array1, array2):
   n= len(a) #assume both lists are same size
   s = Solver()
   selection = Int('selection')
   i = Int('i')
   j = Int('j')
   a= Array('a', IntSort(), IntSort())
   b= Array('b', IntSort(), RealSort())

   for idx in range(n):
      Store(a, idx, array1[idx])
      Store(b, idx, array2[idx])

   constraint1 = And(selection >= 0, selection <= n)
   constraint2 = And(i >= 0, i <= n)
   constraint3 = And(j >= 0, j <= n)
   constraint4 = ForAll([i], a[selection] <= a[i])
   constraint5 = ForAll([j], b[selection] >= b[j])

   s.add(And(constraint1, constraint2, constraint3, constraint4, constraint5))

   s.check()
   m = s.model()
   return m[selection].as_long()

模型始终返回0,即使给定的输入数组中只有一个选择符合约束条件。我不认为它使用数组a和b中的具体值。如何解决此问题?

此示例存在多个问题,但关键问题是存储。。。表达没有任何作用。存储的结果。。。是一个新数组表达式,表示旧数组a、b,其中一个索引idx更新为新值array1[idx],array2[idx]。目前,这些新阵列已被丢弃,但我们可以保存它们:

for idx in range(n):
    a = Store(a, idx, array1[idx])
    b = Store(b, idx, array2[idx])
此外,我认为

    constraint1 = And(selection >= 0, selection <= n)
没有必要

constraint2 = And(i >= 0, i <= n)
constraint3 = And(j >= 0, j <= n)