如何在 Z3 中声明具有混合数据类型的数组?

How to declare an array with mixed data types in Z3?

我正在为 z3 使用 python API,我的目标是能够推理包含两种数据之一的序列: 整数或我的自定义数据类型,它除了是一种类型外没有任何属性。我读到 'DeclareSort' 这似乎意味着我们可以创建自定义类型。所以我按如下方式使用它:

ct = DeclareSort('CT')
CT = Const('CT', ct)

然后我尝试在我的类型和整数之间创建一个联合类型,如下所示:

u = Datatype('IntOrCT')
u.declare('IntV', ('int', IntSort()))
u.declare('CTV', ('ct', ct))

IntOrCT = u.create()
CTV = IntOrCT.CTV
IntV = IntOrCT.IntV

我现在正尝试在数组中使用它们。但是,我无法向我的数组添加任何整数并得到:z3.z3types.Z3Exception: Z3 expression expected

# X = Array('x', IntOrCT, IntOrCT)
# Store(X, 0, 4)

如果我将 IntOrCT 更改为 IntSort(),它将起作用。知道代码中可能缺少什么吗?还是我想做的事在 z3 中是不可能的?

您创建了一个由 IntOrCT 索引的数组,存储 IntOrCT 个值;所以你需要将索引和值包装在相应的构造函数中:

X = Array('x', IntOrCT, IntOrCT)
print(Store(X, IntV(0), IntV(4)))

当我 运行 这个时,我得到:

Store(x, IntV(0), IntV(4))