Z3中存在量词的价值

Z3中存在量词的价值,z3,smt,quantifiers,Z3,Smt,Quantifiers,比如说,我用量词编写了一个简单的代码,如下所示: from z3 import * s = SolverFor("LIA") x1, y1 = Ints('x1 y1') s.add(ForAll(x1, Implies(x1>=0, Exists(y1, (y1>x1))))) 打印(s.check()) 打印(s.model()) 结果是: sat [ ] 这难道不应该输出一个可以满足的y1值吗?该值是多少?请注意,y1的值取决于公式中的x1,因此仅打印y1是没有意义的 一般

比如说,我用量词编写了一个简单的代码,如下所示:

from z3 import *
s = SolverFor("LIA")
x1, y1 = Ints('x1 y1')
s.add(ForAll(x1, Implies(x1>=0, Exists(y1, (y1>x1)))))
打印(s.check()) 打印(s.model())

结果是:

sat
[ ]

这难道不应该输出一个可以满足的y1值吗?

该值是多少?请注意,
y1
的值取决于公式中的
x1
,因此仅打印
y1
是没有意义的


一般来说,一旦进入通用量词z3下,就不能再打印变量的值。要想有意义地做到这一点,它必须打印所有前缀通用,除非所有域都是有限的,否则这是没有意义的。(也没有用。)

我同意你的观点。但是,如果普遍量词位于存在量词之下,会发生什么呢?我们会得到存在量词下的变量值吗?为什么不试试,让我们知道你发现了什么!一般来说,前缀存在词可以被拉到顶层,因此即使是间接的,也会得到一个值。进一步注意,绑定变量的名称不一定是唯一的,因此它们很难识别。这个问题的最佳解决方案是在将公式交给Z3之前对其进行Skolem化,然后可以适当地命名Skolem函数。