我有这样的表达
z3::expr expr = (exists ((flag Bool))
(exists ((w Int))
(exists ((i Int))
(exists ((counter Int))
(and (= i (+ x y z))
flag
(not (= i 0))
(= i counter)
(not (= w counter))
(>= i 1)
(= w 0)))))))
我使用C ++ API进行量化消除和简化。
z3::goal g(ctx);
g.add(expr);
z3::apply_result result = (qe & simplify & propagate_ineqs)(g);
我已经定义了战术。
我想得到这样的结果:
(or (>= (+ x y z) 1 )
(<= (+ x y z) -1 ))
但我得到的输出适合我的应用程序:
(let ((a!1 (or (<= (+ (* (- 1) x)
(* (- 1) y)
(* (- 1) z))
(- 1))
(<= (+ x y z) (- 1)))))
(and (or (<= (+ x y z) (- 1))
(>= (+ x y z) 1))
a!1
(>= (+ x y z) 1)))
我应该采用什么策略让它按照我的意愿运作?
答案 0 :(得分:1)
我在定义目标之前通过在上下文中设置这些选项来解决问题:
ctx.set(":pp-min-alias-size", 1000000);
ctx.set(":pp-max-depth", 1000000);
它并没有按照我的意愿进行简化,而是删除了&#34; let&#34; s,这比没有好!