Z3Py 常量与用户定义的默认排序不同

Z3Py Constants with user defined sorts different by default

我有一个未解释的排序数据集:

Dataset = z3.DeclareSort("Dataset")

当我从这种类型创建常量时:

d = z3.FreshConst(ZDataset)
d2 = z3.FreshConst(ZDataset)

我希望求解器将它们视为不同的,因此 d == d2 应该是不满意的。

有什么方法可以默认执行此操作,所以每次我创建一个常量时,它都不同于所有其他已经创建的常量?

我能看到的最直接的解决方案是创建一个模拟的未解释函数,例如:

mock = Function(
    "mock", ZDataset, z3.IntSort()
)

并且每次我创建一个常量时,都会向求解器添加一个约束:

solver.add(mock(d) == 0)

使用每次递增的 Python 变量。

虽然它不是最干净的解决方案,但它使求解器将它们视为不同的。

您所说的 mock 函数可能是干净利落地执行此操作的最简单方法。

另一种方法是:

solver.add(Distinct([d, d2, d3, ...]))

就在您致电 check 之前。您需要对您创建的所有此类对象执行此操作,因此您可能希望在创建它们时在某种列表中跟踪它们。

我认为从性能的角度来看,这两种解决方案从根本上来说都不是 better/worse,尽管 Distinct 可能更好,因为求解器本身就理解它,因此可能会更早地进行一些内部简化。最好试验一下。