Z3 如何将公式转换为析取范式?
假设给出了一个公式 (t1>=2或t2>=3)和(t3>=1) 我希望得到它的析取范式 (t1>=2和t3>=1)或(t2>=3和t3>=1)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
如何在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