使用z3Py证明两个表达式的范围的等价/不同

时间:2019-09-04 07:59:56

标签: python z3

from z3 import *

s = Solver()

a, b = Ints("a b")
s.add(a > 2)
s.add(b > 0)
s.add(Or(Exists(a, ForAll(b, a != b)), Exists(b, ForAll(a, a != b))))

s.check() # print "unsat"

我正在尝试证明ab的范围的差异。这可以通过将值b的{​​{1}}的赋值定位到1的范围之外来完成。

但是,上面的程序给出了意外的a。我想知道为什么以及是否有更有效的方法来实现这一目标。

1 个答案:

答案 0 :(得分:0)

ForAll的确切含义是:所有个数字,即Exists(a, ForAll(b, a != b))始终为假,因为没有Int与所有Int不同因此,第三个断言本身是无法满足的。您想要类似s.add(Exists(a, (Exists (b, And(Not(a > 2), b > 0)))))的东西。

此外,请注意,您使用两个不同的abExists(a, ...)不会对现有变量进行量化,而是引入了一个新变量,该变量被意外地调用为与您的全局(现有)ab同名。