在python中,如何避免将大型z3表达式转换为省略号?

在python中,如何避免将大型z3表达式转换为省略号?,python,eval,z3,z3py,Python,Eval,Z3,Z3py,我有一个字符串格式的大z3位向量表达式。要将其转换为BitVec格式的表达式,我使用“eval()”。但是,表达式变成了省略号。我如何避免这种情况 from z3 import * a0=BitVec('a0',1) a1=BitVec('a1',1) c0=BitVec('c0',1) c1=BitVec('c1',1) b=BitVec('b',1) d=BitVec('d',1) f=BitVec('f',1) g=BitVec('g',1) e=BitVec('e',1) h=

我有一个字符串格式的大z3位向量表达式。要将其转换为BitVec格式的表达式,我使用“eval()”。但是,表达式变成了省略号。我如何避免这种情况

from z3 import *


a0=BitVec('a0',1)
a1=BitVec('a1',1)
c0=BitVec('c0',1)
c1=BitVec('c1',1)

b=BitVec('b',1)


d=BitVec('d',1)
f=BitVec('f',1)
g=BitVec('g',1)
e=BitVec('e',1)
h=BitVec('h',1)
a=BitVec('a',1)
c=BitVec('c',1)


exp = '(a&b&c)|(c&d&e&f&g)|(a1&a0&c1&c0)|(g&h)|f|(a&b&c)|(c&d&e&f&g)|(a1&a0&c1&c0)|(g&h)|(a&b&c)|(c&d&e&f&g)|(a1&a0&c1&c0)|(g&h)|f|(a&b&c)|(c&d&e&f&g)|(a1&a0&c1&c0)|(g&h)|(a&b&c)|(c&d&e&f&g)|(a1&a0&c1&c0)|(g&h)|f|(a&b&c)|(c&d&e&f&g)|(a1&a0&c1&c0)|(g&h)|(a&b&c)|(c&d&e&f&g)|(a1&a0&c1&c0)|(g&h)|f|(a&b&c)|(c&d&e&f&g)|(a1&a0&c1&c0)|(g&h)|(a&b&c)|(c&d&e&f&g)|(a1&a0&c1&c0)|(g&h)|f|(a&b&c)|(c&d&e&f&g)|(a1&a0&c1&c0)|(g&h)|(a&b&c)|(c&d&e&f&g)|(a1&a0&c1&c0)|(g&h)|f|(a&b&c)|(c&d&e&f&g)|(a1&a0&c1&c0)|(g&h)|(a&b&c)|(c&d&e&f&g)|(a1&a0&c1&c0)|(g&h)|f|(a&b&c)|(c&d&e&f&g)|(a1&a0&c1&c0)|(g&h)|(a&b&c)|(c&d&e&f&g)|(a1&a0&c1&c0)|(g&h)|f|(a&b&c)|(c&d&e&f&g)|(a1&a0&c1&c0)|(g&h)|(a&b&c)|(c&d&e&f&g)|(a1&a0&c1&c0)|(g&h)|f|(a&b&c)|(c&d&e&f&g)|(a1&a0&c1&c0)|(g&h)|(a&b&c)|(c&d&e&f&g)|(a1&a0&c1&c0)|(g&h)|f|(a&b&c)|(c&d&e&f&g)|(a1&a0&c1&c0)|(g&h)|(a&b&c)|(c&d&e&f&g)|(a1&a0&c1&c0)|(g&h)|f|(a&b&c)|(c&d&e&f&g)|(a1&a0&c1&c0)|(g&h)|(a&b&c)|(c&d&e&f&g)|(a1&a0&c1&c0)|(g&h)|f|(a&b&c)|(c&d&e&f&g)|(a1&a0&c1&c0)|(g&h)'

print(eval(exp))
输出::

... |... |... |... |... |... |... |... |... |... |... |... |... |... |... |... |... |... |... |... |... |... |... |... |... |... |... |... |... |... |... |... |... |... |... |... |... |... |... |... |... |... |... |... |... |... |... |... |... |... |... |... |... |... |... |... |... |... |... |... |... |... |... |... |... |... |... |... |... |... |... |... |... |... |... |... |... |... |... |... |... |... |... |... |... |... |... |... |... |... |... |... |... |... |... |... |... |... |... |... |... |... |... |... |... |... |... |...

椭圆由z3中的漂亮打印机设置控制。您可以在程序顶部的
import
语句之后添加以下行:

set_选项(max_args=100000000,max_line=10000000,max_depth=100000000,max_visted=10000000)
这通常适用于足够小的问题。问题是,漂亮的打印机使用了一种效率很低的算法来实现这一点,如果您在示例中尝试上面的方法,您将看到z3几乎要花很长时间来打印表达式;所以这对解决你的问题并不有效

另一种选择是打印与表达式对应的s表达式,而不是以更类似python的格式打印。为此,请将最后一行更改为:

打印(eval(exp.sexpr())
在这种情况下,您会发现z3可以快速打印输出,尽管输出可能没有您预期的那么“漂亮”。(特别是,它使用全括号前缀表示法,而不是更熟悉的带有小括号的中缀表示法。)然而,在我看来,它可读性很强,在这里可能是正确的做法。

我想进一步处理表达式,将eval(exp)转换为字符串。但是字符串也会变成省略号。你说的是
s=eval(expr)。sexpr()
会导致
s
成为省略号吗?我刚测试过,结果很好。请张贴显示问题的代码。