有没有办法在z3中定义排序之间的继承? (我正在使用Python API)
我正在尝试为两种不同类型的事件建模,编写事件和读取事件;对于他们每个我使用排序( WriteSort 和 ReadSort )。但是我希望有一个“sum”排序( EventSort ),它可以是写入或读取事件。
我正在使用以下域定义函数:
f1 = Function('f1', WriteSort, WriteSort, BoolSort())
f2 = Function('f2', ReadSort, ReadSort, BoolSort())
f3 = Function('f3', EventSort, EventSort, BoolSort())
一种可能性是将 EventSort 定义为抽象数据类型,但是我所有函数的域应该是( EventSort x EventSort )并且是我看到的唯一方式限制这样的域名是手动完成的。
无论如何将 WriteSort 和 ReadSort 定义为 EventSort 的“subort”?
答案 0 :(得分:0)
据我所知,Z3(或任何其他SMT求解器)不支持子排序。您可以声明未解释的Top
排序并使用函数将子排序嵌入Top
,例如box_int(i: Int): Top
和反函数unbox_int(t: Top): Int
以及公理forall i: Int :: unbox_int(box_int(i)) = i
。
如果您正在编码类型系统,编码子类型的一种方法是引入未解释的Type
排序,以及函数typeOf(o: Object): Type
和subtype(t1: Type, t2: Type): Bool
,以及子类型的传递公理关系(可能是反身性公理)。
可以在this paper中找到关于将类型系统转换为SMTLIB的很好的讨论。