如何在 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))
我正在为 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))