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

Z3 如何将公式转换为析取范式?,z3,smt,Z3,Smt,假设给出了一个公式 (t1>=2或t2>=3)和(t3>=1) 我希望得到它的析取范式 (t1>=2和t3>=1)或(t2>=3和t3>=1) 如何在Z3中实现这一点?Z3没有将公式转换为DNF的API或策略。但是,它支持使用策略split子句将一个目标分解为多个子目标。在CNF中给定一个输入公式,如果我们详尽地应用这个策略,每个输出子目标都可以被视为一个大连接。下面是一个如何做的例子 命令如下: (apply (then simplify (repeat (or-else split-cla

假设给出了一个公式

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

我希望得到它的析取范式 (t1>=2和t3>=1)或(t2>=3和t3>=1)


如何在Z3中实现这一点?

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

命令如下:

(apply (then simplify (repeat (or-else split-clause skip))))
repeat
组合器一直应用该策略,直到它不执行任何修改为止。 如果输入没有子句,策略
split子句
将失败。这就是为什么我们在
跳过
(不做任何事情)策略中使用
组合器的原因。我们可以通过在将每个子句拆分为案例后应用简化的策略(例如,
simplify
solve eq
)来改进命令

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

(扰流板)要将命题转换为dnf/CNF,我使用boolean.py from