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"
我正在尝试证明a
和b
的范围的差异。这可以通过将值b
的{{1}}的赋值定位到1
的范围之外来完成。
但是,上面的程序给出了意外的a
。我想知道为什么以及是否有更有效的方法来实现这一目标。
答案 0 :(得分:0)
ForAll
的确切含义是:所有个数字,即Exists(a, ForAll(b, a != b))
始终为假,因为没有Int
与所有Int
不同因此,第三个断言本身是无法满足的。您想要类似s.add(Exists(a, (Exists (b, And(Not(a > 2), b > 0)))))
的东西。
此外,请注意,您使用两个不同的a
和b
。 Exists(a, ...)
不会对现有变量进行量化,而是引入了一个新变量,该变量被意外地调用为与您的全局(现有)a
,b
同名。