使用Z3求解器

时间:2015-10-04 06:02:20

标签: expression constraints z3 solver smt

我是Z3求解器和SMTLib2的新手。我想获得约束中每个变量的表达式。假设,我有这个程序。

(declare-const x Int)
(declare-const y Int)
(declare-const z Int)
(assert (= x (+ y 1)))
(assert (= z (+ x 10)))
(check-sat)
(get-value (z))

使用get-value,我可以获得满足所有约束的z的值。但是,我如何得到z的表达式。像z=y+11这样的东西。

我发现使用simplify,我可以简化约束,但无论如何都要为约束中的每个变量获取表达式。

1 个答案:

答案 0 :(得分:1)

Z3是第一个并且是SMT求解器的形式;它解决了存在问题,即它只会表明存在解决方案,它不会计算所有解决方案的封闭形式。

也就是说,有一些方法可以获得至少某种形式的结果,例如通过所提到的简化,或者如果逻辑允许,可以通过量词消除(参见例如Equivalent Quantifier Free Formulas,或Quantifier Elimination - More questions)。

如果需要多个但可能不是所有模型,请查看Z3: finding all satisfying models并搜索其他多个类似标题的问题。