我使用Z3来检查数组属性片段中公式的可满足性。 Z3返回的数组变量的模型通常使用其他if表达式,if-then-else案例分析等表示。我想以某种方式解析Z3输出的模型并创建数组,这满足输入SMT-LIB公式,明确地说。
例如,我希望能够以某种方式简化Z3输出的模型到以下形式:
A -> {
1 -> 3
2 -> 4
else -> 6
}
是否有一些简单的方法来遍历模型(使用C API?)并创建表示模型的显式数组?
答案 0 :(得分:0)
不幸的是,您的消息中描述的输出格式不足以描述数组属性片段中每个可满足公式的模型。例如,请考虑以下简单示例。
(declare-fun f (Int) Int)
(declare-const a Int)
(declare-const b Int)
(assert (forall ((i Int) (j Int)) (=> (<= i j) (<= (f i) (f j)))))
(assert (< (f a) (f b)))
(check-sat)
(get-model)
公式f
不减少,它有两个点a
和b
s.t. f(a) < f(b)
。在任何模型中,对于所有值i <= a
,f(i) <= f(a)
以及所有值j >= b
,f(b) <= f(j)
,我们必须具有该值。也就是说,
f(i) <= f(a) < f(b) <= f(j)
。
单个else
无效。 Z3产生f
的解释,本质上是一个“阶梯函数”。您可以尝试上面的示例here。