C++ Z3如何将expr转换为SMT?

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

在尝试学习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 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源代码本身。祝你好运