如何将公式转换为析取范式?

时间:2012-07-22 09:45:48

标签: z3 smt

说出一个公式

(t1> = 2或t2> = 3)和(t3> = 1)

我希望得到它的析取正常形式 (t1> = 2且t3> = 1)或(t2> = 3且t3> = 1)

如何在Z3中实现这一目标?

1 个答案:

答案 0 :(得分:6)

Z3没有将公式转换为DNF的API或策略。但是,它支持使用策略split-clause将目标分成许多子目标。给定CNF中的输入公式,如果我们详尽地应用这种策略,则每个输出子目标可以被视为一个大的连接。这是一个如何做的例子。

http://rise4fun.com/Z3/zMjO

这是命令:

(apply (then simplify (repeat (or-else split-clause skip))))

repeat组合器一直在应用策略,直到它不执行任何修改。 如果输入没有子句,策略split-clause将失败。这就是为什么我们使用or-else组合器和skip(什么都不做)的策略。我们可以通过在每个子句被分割成案例后使用简化(例如simplifysolve-eqs)的策略来改进命令。

请注意,上面的脚本假设输入公式是CNF。