我是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
,我可以简化约束,但无论如何都要为约束中的每个变量获取表达式。
答案 0 :(得分:1)
Z3是第一个并且是SMT求解器的形式;它解决了存在问题,即它只会表明存在解决方案,它不会计算所有解决方案的封闭形式。
也就是说,有一些方法可以获得至少某种形式的结果,例如通过所提到的简化,或者如果逻辑允许,可以通过量词消除(参见例如Equivalent Quantifier Free Formulas,或Quantifier Elimination - More questions)。
如果需要多个但可能不是所有模型,请查看Z3: finding all satisfying models并搜索其他多个类似标题的问题。