如何使用z3简化隐藏变量的结果?

时间:2012-09-03 08:53:12

标签: z3 smt

我希望隐藏一些变量并获得简化的结果。

我希望隐藏c1c2d,如下所示:

(declare-const v1 Real)
(declare-const v2 Real)
(elim-quantifiers (exists ((c1 Real) (c2 Real)(d Real)) 
                          (and (<= c1 10.0) (>= c2 5.0) (>= d 0.0) 
                               (= v1 (+ c1 d)) 
                               (= v2 (+ c2 d)))))

然而结果似乎很复杂,事实上,结果应该是v2>=5.0 & v1<= v2+5.0,我曾经使用(apply ctx-solver-simplify)代码是

(declare-const v1 Real)
(declare-const v2 Real)
(assert (elim-quantifiers (exists ((c1 Real) (c2 Real)(d Real)) 
                                  (and (<= c1 10.0) (>= c2 5.0) (>= d 0.0)
                                       (= v1 (+ c1 d)) 
                                       (= v2 (+ c2 d))))))
(apply ctx-solver-simplify)

然而,当我添加应用....有和错误,脚本无法正常工作。有人可以帮我修理吗?

1 个答案:

答案 0 :(得分:1)

您可以使用then策略将量词消除应用于公式,并将上下文简化应用于所有子目标:

(declare-const v1 Real)
(declare-const v2 Real)
(assert (exists ((c1 Real) (c2 Real)(d Real)) 
                                  (and (<= c1 10.0) (>= c2 5.0) (>= d 0.0)
                                       (= v1 (+ c1 d)) 
                                       (= v2 (+ c2 d)))))
(apply (then qe ctx-solver-simplify))

结果是v2 >= 5.0 and v1 - v2 <= 5.0,这与你想要的非常接近。