C++ Z3如何将expr转换为SMT?
在尝试学习Z3工具时,我对Z3如何构造表达式感到困惑。 另外,我对这一点还不熟悉,我已经问过相关的问题,但它们并没有回答我的问题 使用Z3(比如cpp实现),假设有一个表达式 expr e1=((x[0]=tru&y[0]!=tru)| |(x[0]!=tru&y[0]=tru)) 其中tru是一个重言式 打印此表达式时,工具将显示以下树:C++ Z3如何将expr转换为SMT?,c++,z3,smt,C++,Z3,Smt,在尝试学习Z3工具时,我对Z3如何构造表达式感到困惑。 另外,我对这一点还不熟悉,我已经问过相关的问题,但它们并没有回答我的问题 使用Z3(比如cpp实现),假设有一个表达式 expr e1=((x[0]=tru&y[0]!=tru)| |(x[0]!=tru&y[0]=tru)) 其中tru是一个重言式 打印此表达式时,工具将显示以下树: (let ((a!1 (and (or x0 (not x0)) (distinct y0 (or x0 (not x0)))))) (or
(let ((a!1 (and (or x0 (not x0)) (distinct y0 (or x0 (not x0))))))
(or a!1 (or x0 (not x0))))
这不是我想要我的e1代表的。这似乎是我所写内容的一个有效/漂亮/速记
首先,我能不能自己把expr转换成SMT,这样我就可以检查它是否被正确翻译了
其次,是否有一种方法可以用我表示表达式的简单方式打印表达式,而不是用SMT语言的有效结构(使用子树,如a!1
等)打印表达式?也许是我可以关掉的开关?这可能需要对该工具有深入的了解,因此我相应地对这个问题进行了标记。一些“翻译”是不可避免的。当Z3为表达式构造解析树时,它会将它们重写为内部形式。这不仅仅是为了“效率”,还有一些表面形式没有内部表示,而是被重写了
当然,漂亮的印刷是另一回事。有很多方法可以控制打印的效果。如果运行z3-p
并查看漂亮打印部分的输出,您会看到:
[module] pp, description: pretty printer
bounded (bool) (default: false)
bv_literals (bool) (default: true)
bv_neg (bool) (default: false)
decimal (bool) (default: false)
decimal_precision (unsigned int) (default: 10)
fixed_indent (bool) (default: false)
flat_assoc (bool) (default: true)
fp_real_literals (bool) (default: false)
max_depth (unsigned int) (default: 5)
max_indent (unsigned int) (default: 4294967295)
max_num_lines (unsigned int) (default: 4294967295)
max_ribbon (unsigned int) (default: 80)
max_width (unsigned int) (default: 80)
min_alias_size (unsigned int) (default: 10)
pretty_proof (bool) (default: false)
simplify_implies (bool) (default: true)
single_line (bool) (default: false)
您可以使用这些设置来控制如何进行漂亮的打印,这可能更适合您的需要。特别是,根据您的问题描述,我建议设置以下两个参数:
pp.max_depth --> 4294967295
pp.min_alias_size --> 4294967295
(数字其实并不重要,只要让它们足够大就行了。)这两个设置应该可以避免漂亮的打印机创建a!1
子树,您正在看到
不幸的是,这些选项的确切含义并没有得到很好的证明。其中一些,你可以从他们的名字猜出来,其他的,你可以玩一玩,看看他们的影响是什么。但是如果你真的想知道它们是如何改变输出的,你必须深入研究z3源代码本身。祝你好运