(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中简化此类表达式(此类表达式的组合)? 谢谢!
答案 0 :(得分:5)
simplify
命令只是一个自下而上的重写器。它很快,但无法简化表达式,例如帖子中的表达式。 Z3允许用户使用策略定义自己的简化策略。它们在this article和Z3教程(Python和SMT 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
更昂贵。