使用Z3获取符号值 请考虑下面的陈述。

使用Z3获取符号值 请考虑下面的陈述。,z3,Z3,y:=10 z:=x+y 执行这两条语句后,“z”的值为“x+10”,其中“x”表示符号值;这些符号值在程序验证中很重要——例如,使用Dijkstra’a最弱的先决条件方法计算路径特性 现在,考虑下面的代码Z3../P> (declare-const x Int) (declare-const y Int) (declare-const z Int) (assert (= y 10)) (assert (= z (+ x y))) (check-sat) (get-value (z)) 它

y:=10

z:=x+y

执行这两条语句后,“z”的值为“x+10”,其中“x”表示符号值;这些符号值在程序验证中很重要——例如,使用Dijkstra’a最弱的先决条件方法计算路径特性

现在,考虑下面的代码Z3../P>

(declare-const x Int)
(declare-const y Int)
(declare-const z Int)

(assert (= y 10))
(assert (= z (+ x y)))

(check-sat)
(get-value (z))

它产生如下输出,因为它考虑了“Y”有10和“x”有0的解释。

sat

((z 10))

有什么方法可以让Z3产生输出“x+10”吗?i、 例如,我感兴趣的是从没有用任何特定值实例化的变量中获取符号值。

我不是专家,但我认为使用Z3-SMT-LIB是不可能的。但是使用Z3Py是可能的

x = Int('x')
y = 10
z = x + y
print z
输出是

x + 10

这仅仅是做替代。没有对实际解算器的调用。如果我给z3py以下代码:{x=Int('x')y=Int('y')z=Int('z')prove(和(z==x+y,y==10)),我得到输出{反例[y=10,z=1,x=-10]},这不是LKB所要的。prove调用实际上调用了SMT解算器。嗨,Tushar,你是对的。关键是,当调用解算器时,输出是数值,而不是符号表达式。你同意吗?是的,我同意。我知道在C++ API中有一个EVA函数,其中Z3表达式可以通过Z3模型来评估到另一个Z3表达式。如果z3模型不完整(即,它没有无约束变量的赋值),那么它应该能够给我一个z3表达式,它是一个符号表达式,而不是一个数值。然而,上次我检查时,它报告了一个错误,它希望客户端将模型完成设置为true,在这种情况下,z3 eval将给出一个数值。换句话说,可能有一些聪明的(可能是黑客的)方法可以处理部分模型,z3解算器可以得到一个符号表达式。最后我检查了Z3C++ + API不支持这个。“在没有被任何特定值实例化的变量中”:你是指无约束变量还是常数?若你们只想处理常数,那个可以通过简单的代换来完成。因为计算最弱的前提条件基本上涉及代换——我认为代换应该完成这项工作。但正如胡安·奥斯皮纳所说,在Z3-SMT-LIB中是否没有与他在Z3Py中的代码相对应的替代方案?我对此不确定。不过,我确实认为C++ API比Z3-SMT-LIB具有更灵活的选择。