使用Z3,可以声明接受类型参数的自定义数据类型(即记录)。例如,将类型T1
和T2
分别作为其第一个和第二个元素的Pair
声明如下(取自Z3指南):
(declare-datatypes (T1 T2) ((Pair (mk-pair (first T1) (second T2)))))
然后可以使用此类型声明创建具有不同元素类型的对。例如,常量p1
和p2
都是具有不同元素类型的对(分别为Int String
和Bool Int
):
(declare-const p1 (Pair Int String))
(declare-const p2 (Pair Bool Int))
我想使用Z3的JavaAPI声明这样一个参数化的数据类型。然而,那里的数据类型声明似乎没有向数据类型声明添加类型参数的功能。
Z3的JavaAPI确实在其Context
类中提供了一个方法mkDatatypeSort
来声明Z3(Link)中的新数据类型。但是,此方法不接受任何类型参数的参数。此外,构造函数(作为mkDatatypeSort
的第二个参数)不允许定义类型参数。
我希望在Z3的JavaAPI中声明带有类型参数的数据类型是可能的,但是我不能这样做。我是遗漏了什么还是这个特性在JavaAPI中不存在?
是否可以使用JavaAPI声明此类数据类型?
Z3API(无论是C/C/Java/Python)不允许创建参数化类型。
请注意,参数化类型本质上是SMTLib中的一个细节:本质上,每个具有不同排序的实例化都将是自己的单独类型,彼此之间没有任何关系。所以,我们的想法是自己做这件事:编写一个接受相关排序的函数,并动态创建相应的“单一”类型。你必须每次稍微更改访问器名称以避免冲突,或者你可以添加足够的类型注释来让求解器找出相关的类型。(我选择前者,因为它更简单,但后者绝对也是可能的。)