简化Z3

时间:2012-12-27 15:49:04

标签: z3

(declare-datatypes () ((SE BROKEN ON OFF)))
(declare-const s SE)
(declare-const a Int)
(simplify (or (= s ON) (= s OFF) (= s BROKEN)))
(simplify (and (> a 0) (> a 1)))

结果是:

(or (= s ON) (= s OFF) (= s BROKEN))
(and (not (<= a 0)) (not (<= a 1)))

但预期的结果是:

1
> a 1

是否可以在Z3中简化此类表达式(此类表达式的组合)? 谢谢!

1 个答案:

答案 0 :(得分:5)

simplify命令只是一个自下而上的重写器。它很快,但无法简化表达式,例如帖子中的表达式。 Z3允许用户使用策略定义自己的简化策略。它们在this article和Z3教程(PythonSMT 2.0)中进行了描述。以下帖子还有其他信息:

您的示例中的第一个查询可以使用策略ctx-solver-simplify(也可在线提供here)进行简化。

(declare-datatypes () ((SE BROKEN ON OFF)))
(declare-const s SE)
(declare-const a Int)
(assert (or (= s ON) (= s OFF) (= s BROKEN)))
(assert (and (> a 0) (> a 1)))
(apply ctx-solver-simplify)

命令apply将策略ctx-solver-simplify应用于断言集,并显示生成的目标集。请注意,这种策略比命令simplify更昂贵。