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)