Z3的simplify()方法是否支持吸收定律?

Yu *_*eng 4 solver z3

假设我有一个BoolExpr的形式

a & (a | b) or a | (a & b) 
Run Code Online (Sandbox Code Playgroud)

我想简化它

a 
Run Code Online (Sandbox Code Playgroud)

通过调用simplify().它不起作用.

另外,对于像这样的约束

(a | b) & (b | a) 
Run Code Online (Sandbox Code Playgroud)

simplify()无法将其转换为最简单的形式

(a|b) or (b|a).
Run Code Online (Sandbox Code Playgroud)

有解决方法吗?

@Nikolaj Bjorner:感谢您的帮助,我还有一个问题:

这是我原来的约束:

Goal: (goal
  (or (> (type o) 2) (= (type o) 1))
  (or (= (type o) 1) (> (type o) 2)))
Run Code Online (Sandbox Code Playgroud)

这是简化版本(通过ctx-solver-simplified):

(or (= (type o) 1) (not (<= (type o) 2)))
Run Code Online (Sandbox Code Playgroud)

我期待的实际约束是:

(or (= (type o) 1) (> (type o) 2))
Run Code Online (Sandbox Code Playgroud)

而且我不想引入任何否定.我该怎么办?

小智 5

默认的简化器只寻求便宜的重写.您可以调用一种不同的简化器作为策略.它简化了您描述的目标.例如:

(declare-const a Bool)
(declare-const b Bool)
(assert (or a (and a b)))
(apply ctx-solver-simplify)
Run Code Online (Sandbox Code Playgroud)

它可能会返回需要重新组装成公式的几个子目标.关于rise4fun.com的Z3教程描述了策略.

ctx-solver-simplified确实限制了依赖于上下文的重写.它仍然不完整.它不产生规范的正规形式(两个等价的公式可以简化为两个不同的公式).