【发布时间】:2014-04-16 09:36:59
【问题描述】:
请考虑以下陈述。
y := 10
z := x + y
在这两个语句执行后,“z”的值为“x + 10”,其中“x”代表一个符号值;这样的符号值在程序验证中很重要——例如,使用 Dijkstra'a 最弱的前置条件方法计算路径特征。
现在,考虑 Z3 的以下代码。
(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”吗?即,我有兴趣根据尚未使用任何特定值实例化的变量来获取符号值。
【问题讨论】:
-
“就尚未使用任何特定值实例化的变量而言”:您是指不受约束的变量还是恒定的变量?如果您只想处理常量,可以通过简单的替换来完成。
-
由于计算最弱的前置条件基本上涉及替换——我认为替换应该完成这项工作。但是就像 Juan Ospina 说的,Z3-SMT-LIB 中是否有对应于他在 Z3Py 中的代码的替代方案?
-
我不确定。但是,我确实认为 C++ API 比 Z3-SMT-LIB 具有更灵活的选项。
标签: z3