Math 在Z3Py中,prove不返回反例

Math 在Z3Py中,prove不返回反例,math,z3,smt,z3py,theorem,Math,Z3,Smt,Z3py,Theorem,Z3如何返回有效的反例? 下面的代码 from z3 import * set_param(proof=True) x = Real('x') f = ForAll(x, x * x > 0) prove(f) 输出反例[] 我不必使用prove,但我想在示例中找到一个类似f的公式的有效反例。如何操作?要获取模型,您应该真正使用检查,并在解算器上下文中断言公式的否定: from z3 import * s = Solver() x = Real('x') f = x * x >

Z3如何返回有效的反例? 下面的代码

from z3 import *
set_param(proof=True)
x = Real('x')
f = ForAll(x, x * x > 0)
prove(f)
输出
反例[]


我不必使用
prove
,但我想在示例中找到一个类似
f
的公式的有效反例。如何操作?

要获取模型,您应该真正使用
检查
,并在解算器上下文中断言公式的否定:

from z3 import *

s = Solver()
x = Real('x')
f = x * x > 0

# Add negation of our formula
# So, if it's not valid, we'll get a model
s.add(Not(f))

print s.check()
print s.model()
这将产生:

sat
[x = 0]

当我删除所有的
时,它似乎能按预期工作。有谁能解释一下为什么它现在起作用了,而不仅仅是投反对票吗?是的,我已经研究了
prove
,这就是它的作用。为什么有必要删除所有
?在构建模型时,Z3只在顶层收集变量。使用限定符
for all
,变量将嵌套,因此在构建模型时Z3将忽略该变量。在调用
s.check()
之前,您可以通过输入不同的公式并调用
print s.sexpr()
来查看z3py构造了什么。