【发布时间】:2022-01-02 21:45:09
【问题描述】:
使用 Z3(在 Python 中),Z3Exception: Invalid bounded variable(s) 错误(与Z3: Invalid bounded variables 中的问题相同)反击。但我猜是不同的形状。
具体来说,当使用 de Moura 在 (https://leodemoura.github.io/blog/2013/01/26/complex.html) 中的复数编码时,就会发生这种情况。我们可以在下面看到它:
x = Complex('x')
y = Complex('y')
vars = [x,y]
l_1 = (-1000.5 == x*x)
l_2 = (y == x)
phi = Implies(l_1, l_2)
solve(Exists([x], (x==1)))
它返回最后一行的错误。
这个问题与l_1、l_2(也与vars)无关,因为它也因此而失败:
x = Complex('x')
solve(Exists([x], (x==1)))
如果我只更改变量的类型,它会毫无问题地返回[]:
x = Int('x')
y = Int('y')
vars = [x,y]
l_1 = (-1000.5 == x*x)
l_2 = (y == x)
phi = Implies(l_1, l_2)
solve(Exists([x], And(l_1, l_2)))
因此,Complex 的编码存在问题,而不是 Z3: Invalid bounded variables 中的列表问题
有什么想法吗?
编辑
尝试变量列表的答案:
def ComplexExists(ls, phi):
existential_ls = []
for i in range(0, len(ls)):
existential_ls.append([ls[i].r, ls[i].i])
print(existential_ls)
return Exists(existential_ls, phi)
x = Complex('x')
y = Complex('y')
vars = [x,y]
l_1 = (-1000.5 == x*x)
l_2 = (y == x)
phi = Implies(l_1, l_2)
solve(ComplexExists(vars, phi))
同样的错误。明显地。 ComplexExists 返回如下列表:[[x.r, x.i], [y.r, y.i], ...]
这是另一种选择:
def ComplexExists(ls, phi):
existential_ls = []
for i in range(0, len(ls)):
existential_ls.append(ls[i].r)
existential_ls.append(ls[i].i)
print(existential_ls)
return Exists(existential_ls, phi)
它返回一个列表并且可以工作,但是所有变量(实部和虚部)都是同一个列表的一部分,这听起来很奇怪:[x.r, x.i, y.r, y.i, ...]
【问题讨论】:
-
在我的答案中添加了
ComplexExists的版本,可以处理复杂变量的列表。希望这对你有用。 -
请注意,您对
ComplexExists的第二个解决方案可以正常工作,以及该函数应该如何工作。将所有这些变量放在同一个列表中没有问题;事实上,这是必需的。 (您也可以嵌套量词,但我认为这有点过头了。)我的解决方案类似,只是用更简洁的 Python 代码编写。
标签: python list z3 z3py theorem-proving