Z3 防止解决方案被简化

Z3 防止解决方案被简化,z3,Z3,我想使用let语句来简化从z3得到的解决方案 例如,如果我给出以下内容: (declare-const x Int) (elim-quantifiers (exists ((x.1 Int)) (and (or (and (= (- x.1 2) 0) (<= (- x.1 9) 0)) (and (or (= (- x.1 2) 0) (and (<= (- x.1 4) 0)

我想使用
let
语句来简化从z3得到的解决方案

例如,如果我给出以下内容:

(declare-const x Int)
  (elim-quantifiers (exists ((x.1 Int)) 
    (and (or (and (= (- x.1 2) 0) (<= (- x.1 9) 0)) 
             (and (or (= (- x.1 2) 0) (and (<= (- x.1 4) 0) 
                                      (and (<= (- 4 x.1) 0) 
                                           (<= (- x.1 11) 0)))) (<= (- x.1 9) 0))) (= (- (+ x.1 2) x) 0))))
(声明常量x Int)
(elim量词(存在((x.1 Int))

(和(或)(和((-x.1 2)0)(我们可以设置以下选项以防止Z3 pretty打印机使用
let
s

(set-option :pp-min-alias-size 1000000)
(set-option :pp-max-depth      1000000)
任何大的数字都会成功


我们必须记住,当我们避免使用
let
s时,显示一些包含大量共享子表达式的公式可能是不可行的。在内部,Z3将公式存储为DAG而不是树。如果我们不使用
let
s,这些公式的漂亮打印可能会以指数形式大于其内部报告因此,我们不应该滥用上述选项。

我使用的是
z3-4.5.0
,看起来选项名称有点变化。如果
pp max depth
对您不起作用,请尝试
pp.max_depth
pp.min_alias_size

我正在使用javaapi,下面的内容与我一起使用

com.microsoft.z3.Global.setParameter("pp.min_alias_size", "1000000");
com.microsoft.z3.Global.setParameter("pp.max_depth", "1000000");

谢谢。这帮了大忙。太好了。你能接受答案吗?这样,其他用户就会知道答案解决了你问题中的问题。谢谢。这些选项也可以使用C API设置,如果是,如何设置?是的,它们可以。请看,它有一些设置参数的示例,例如
:pp decimal
com.microsoft.z3.Global.setParameter("pp.min_alias_size", "1000000");
com.microsoft.z3.Global.setParameter("pp.max_depth", "1000000");