在z3中排序继承

时间:2016-04-29 08:18:47

标签: inheritance z3 z3py

有没有办法在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”?

1 个答案:

答案 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): Typesubtype(t1: Type, t2: Type): Bool,以及子类型的传递公理关系(可能是反身性公理)。

可以在this paper中找到关于将类型系统转换为SMTLIB的很好的讨论。