我希望使用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))))
我将解决方案恢复为:
(let ((a!1 (and (or (and (<= x 4) (>= x 4)) (and (<= x 6) (>= x 6) (<= x 13)))
(<= x 11))))
(or (and (<= x 4) (>= x 4) (<= x 11)) a!1))
有没有办法告诉Z3不要将一些复杂的表达式提取到let语句中?如果我得到答案而没有让声明,我将更容易解析结果。
答案 0 :(得分:5)
我们可以设置以下选项以防止Z3漂亮的打印机使用let
s
(set-option :pp-min-alias-size 1000000)
(set-option :pp-max-depth 1000000)
任何大数字都可以解决问题。
我们必须记住,当我们避开let
时,显示一些包含大量共享子表达式的公式可能是不可行的。在内部,Z3将公式存储为DAG而不是树。如果我们不使用let
s,那么这些公式的漂亮印刷可能比它们的内部表示指数大。因此,我们不应滥用上述选项。
答案 1 :(得分:0)
我正在使用z3-4.5.0
,看起来选项名称已经改变了一点。如果pp-max-depth
不适合您,请尝试pp.max_depth
和pp.min_alias_size
。
我正在使用Java API,以下内容与我合作
com.microsoft.z3.Global.setParameter("pp.min_alias_size", "1000000");
com.microsoft.z3.Global.setParameter("pp.max_depth", "1000000");