简化Z3

Ant*_*ton 3 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)))
Run Code Online (Sandbox Code Playgroud)

结果是:

(or (= s ON) (= s OFF) (= s BROKEN))
(and (not (<= a 0)) (not (<= a 1)))
Run Code Online (Sandbox Code Playgroud)

但预期的结果是:

1
> a 1
Run Code Online (Sandbox Code Playgroud)

是否有可能在Z3中简化这些表达式(这些表达式的组合)?谢谢!

Leo*_*ura 6

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

您的示例中的第一个查询可以使用策略进行简化ctx-solver-simplify(也可在此处在线获取).

(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)
Run Code Online (Sandbox Code Playgroud)

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