z3:将公式转换为dnf

z3:将公式转换为dnf,z3,Z3,Z3 python中是否有内置方法将公式转换为DNF?我可以想象运用一些策略或战术来做到这一点 此外,如果我有变量,我如何“创建”表达式 op=Or,arg1=True,arg2=False 我想使用op、arg1、arg2创建表达式Or(True、False)。我可以做类似的事情 if op.name == 'or': Or(arg1,arg2) elif op.name == 'and': And(arg1,arg2) ... 但是有更好的办法吗 此外,我记得Z3中有一个文件列

Z3 python中是否有内置方法将公式转换为DNF?我可以想象运用一些策略或战术来做到这一点

此外,如果我有变量,我如何“创建”表达式

op=Or,arg1=True,arg2=False

我想使用op、arg1、arg2创建表达式Or(True、False)。我可以做类似的事情

if op.name == 'or':   Or(arg1,arg2)   
elif op.name == 'and':  And(arg1,arg2)
...
但是有更好的办法吗


此外,我记得Z3中有一个文件列出了排序代码,例如2L是Z3_INT_sort,它的名称是什么

有关如何转换为DNF的信息,请参见此答案:

作为相关说明,请参见关于如何转换为CNF的回答:


这些示例是SMT格式的,这里是z3py:

我找到了创建表达式部分,我可以简单地调用op(arg1,arg2)…您可能需要一个完整的解析器,这取决于您想要完成什么,而不是打开操作名。我不理解最后一部分:“我记得Z3中有一个文件列出了排序代码,例如2L是Z3_INT_sort,它的名称是什么?”什么是2L?2L是Z3中INT sort的标识符。Z3中有一个文件告诉您这些标识符是什么(例如2L对应于Z3_INT_SORT),我想知道该文件在哪里。好的,看看python文档的底部(在“数据”部分下):您可以看到Z3_INT_SORT在那里声明为2。您还可以检查这个源文件(z3consts.py):给定的CNF方法引入了辅助变量,所以这与我想要的不完全一样。我希望新公式只包含输入公式中的变量。