使用Z3版本2.18,我试图简化公式,例如:
希望获得类似:(> x 2)和(> x 0)的内容。
我正在使用以下输入文件运行Z3,其中F是上述公式之一:
(set-option set-param "STRONG_CONTEXT_SIMPLIFIER" "true")
(declare-const x Int)
(simplify F)
它适用于我得到以下输出的析取:
(let (($x35 (<= x 0)))
(not $x35))
然而,通过联合,我得到:
(not (or (<= x 0) (<= x 2)))
有没有办法迫使Z3简化上述公式?我希望能够得到(not (<= x 2))
。
PS:有没有办法强制Z3内联其输出(即(not (<= x 0))
代替(let (($x35 (<= x 0))) (not $x35))
)
谢谢, 格斯
答案 0 :(得分:1)
不,你不能在Z3 2.x上做到这一点。
Z3 3.x有一个新的(完全兼容的)SMT 2.0前端。 Z3 3.x有几个新功能,例如基于战术和战术的“战略规范语言”。我还没有“广告”,因为它正在进行中。这个基本思想在slide deck中描述。这种语言可以用来做你想要的。你只需写:
(declare-const x Int)
(assert (not (or (<= x 0) (<= x 2))))
(apply (and-then simplify propagate-bounds))
您可以使用以下命令找到所有可用的策略:
(help-strategy)
(help apply)
(help check-sat-using)