z3py:如何将公式转换为 NNF 格式?

z3py: How to convert a formula into NNF format?

我想使用 z3py 将公式转换为其 NNF 格式。例如,

给出

Or(Not(And(i1, Not(And(i0, i4, i1, i2)))), And(i3, i1, i2))

我要

Or(Not(i1), And(i0, i4, i1, i2), And(i3, i1, i2))

谢谢

您可以使用 nnf 策略,然后是 simplify:

from z3 import *

i0, i1, i2, i3, i4 = Bools("i0 i1 i2 i3 i4")
g = Goal()
g.add(Or(Not(And(i1, Not(And(i0, i4, i1, i2)))), And(i3, i1, i2)))
print(g)
t = Then(Tactic('nnf'), Tactic('simplify'))
print(t(g))

这会打印:

[Or(Not(And(i1, Not(And(i0, i4, i1, i2)))), And(i3, i1, i2))]
[[Or(And(i0, i4, i1, i2), And(i3, i1, i2), Not(i1))]]

结果是一个目标列表;但是单身目标与您的公式相同。 (一个目标可以将一个公式分成许多部分,因此列表输出。)