说出一个公式
(t1> = 2或t2> = 3)和(t3> = 1)
我希望得到它的析取正常形式 (t1> = 2且t3> = 1)或(t2> = 3且t3> = 1)
如何在Z3中实现这一目标?
答案 0 :(得分:6)
Z3没有将公式转换为DNF的API或策略。但是,它支持使用策略split-clause
将目标分成许多子目标。给定CNF中的输入公式,如果我们详尽地应用这种策略,则每个输出子目标可以被视为一个大的连接。这是一个如何做的例子。
这是命令:
(apply (then simplify (repeat (or-else split-clause skip))))
repeat
组合器一直在应用策略,直到它不执行任何修改。
如果输入没有子句,策略split-clause
将失败。这就是为什么我们使用or-else
组合器和skip
(什么都不做)的策略。我们可以通过在每个子句被分割成案例后使用简化(例如simplify
,solve-eqs
)的策略来改进命令。
请注意,上面的脚本假设输入公式是CNF。