如何在Z3中获得“更强”的连词简化?

时间:2011-09-26 13:39:44

标签: z3

使用Z3版本2.18,我试图简化公式,例如:

  • (和(>( - ( - x 1)1)0)(> x 0))
  • (或(>( - ( - x 1)1)0)(> x 0))

希望获得类似:(> 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))

谢谢, 格斯

1 个答案:

答案 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)