Python 真值表法

Python 真值表法,python,math,sat,boolean-algebra,cnf,Python,Math,Sat,Boolean Algebra,Cnf,我有一个布尔函数,由真值表表示 总共是10个变量,我希望得到一个合理长度的CNF(不一定是最短的,但足够短) 我怎么做 Python脚本或任何公共可用软件(如Mathematica/Mapple/etc)对我来说也可以正常工作。Symphy软件包允许您开箱即用。() 这里有一个简单的例子。假设您有三个变量,且真值表编码以下集合: (x & y & !z) \/ (x & !y & z) (即,只有与x=true,y=true,z=false和x=true,y

我有一个布尔函数,由真值表表示

总共是10个变量,我希望得到一个合理长度的CNF(不一定是最短的,但足够短)

我怎么做


Python脚本或任何公共可用软件(如Mathematica/Mapple/etc)对我来说也可以正常工作。

Symphy软件包允许您开箱即用。()

这里有一个简单的例子。假设您有三个变量,且真值表编码以下集合:

  (x & y & !z) \/ (x & !y & z)
(即,只有与
x=true,y=true,z=false
x=true,y=false,z=true
对应的行是
true
,而所有其他行都是
false
)。您可以很容易地对其进行编码并转换为CNF,如下所示:

$python3
Python 3.8.5(默认值,2020年7月21日,10:48:26)
关于达尔文的[Clang 11.0.3(Clang-1103.0.32.62)]
有关详细信息,请键入“帮助”、“版权”、“信用证”或“许可证”。
>>>从sympy进口*
>>>x,y,z=符号('x y z')
>>>简化逻辑((x&y&~z)|(x&y&z),form=“cnf”)
x&(y|z)&(~y|z)
simplify_逻辑
可以根据
表单
参数转换为CNF或DNF。请看这里:

请注意,CNF扩展通常代价高昂,而Tseitin编码是避免这种复杂性的首选方法()。但它的缺点是引入了新的变量。

这并不快(计算需要几分钟),但效果非常好!我的琐碎优化将CNF从530个条件最小化到279个条件,但是
sympy
只给了我190个条件,这是巨大的改进!