Z3';s simplify()方法支持吸收定律吗?

Z3';s simplify()方法支持吸收定律吗?,z3,solver,Z3,Solver,假设我有一个以 a & (a | b) or a | (a & b) 我想把它简化为 a 通过调用simplify()。它不起作用 另外,对于约束,如 (a | b) & (b | a) simplify()无法将其转换为最简单的形式 (a|b) or (b|a). 有解决办法吗 @尼古拉·比约纳:谢谢你的帮助,我还有一个问题: 这是我最初的限制: Goal: (goal (or (> (type o) 2) (= (type o) 1)) (

假设我有一个以

a & (a | b) or a | (a & b) 
我想把它简化为

a 
通过调用simplify()。它不起作用

另外,对于约束,如

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

(a|b) or (b|a).
有解决办法吗

@尼古拉·比约纳:谢谢你的帮助,我还有一个问题:

这是我最初的限制:

Goal: (goal
  (or (> (type o) 2) (= (type o) 1))
  (or (= (type o) 1) (> (type o) 2)))
以下是简化版(由ctx solver simplify提供):


我不想引入任何否定。我该怎么办?

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

(declare-const a Bool)
(declare-const b Bool)
(assert (or a (and a b)))
(apply ctx-solver-simplify)
它可能会返回几个需要重新组合为公式的子目标。 rise4fun.com上的Z3教程介绍了战术

ctx解算器简化了有限的上下文相关重写。它仍然是不完整的。 它不产生标准范式(两个等价的公式可以简化为
两个不同的公式。)

我们能避免在简化过程中产生否定吗?我想我需要修改源代码以避免否定,基于莱昂纳多的回答:还有一个问题:将上述约束简化10000次大约需要10000毫秒。这是正常速度吗?谢谢
(or (= (type o) 1) (> (type o) 2))
(declare-const a Bool)
(declare-const b Bool)
(assert (or a (and a b)))
(apply ctx-solver-simplify)