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
可能更好,因为求解器本身就理解它,因此可能会更早地进行一些内部简化。最好试验一下。
我有一个未解释的排序数据集:
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
可能更好,因为求解器本身就理解它,因此可能会更早地进行一些内部简化。最好试验一下。