【发布时间】:2016-05-22 21:10:07
【问题描述】:
我想在 Z3 中建模,交换数组中的两个元素会创建一个排列。
交换两个元素可以非常自然地建模:
(declare-sort Obj)
; a0 is original array, a2 is array after swap
(declare-const a0 (Array Int Obj))
(declare-const a1 (Array Int Obj))
(declare-const a2 (Array Int Obj))
(declare-const i Int)
(declare-const j Int)
(assert (= a1 (store a0 i (select a0 j))))
(assert (= a2 (store a1 j (select a0 i))))
但是我如何模拟“a2 是 a0 的排列”并检查这是一个有效的陈述?
在一个类似的问题 (Equal lists are permutations of one another. Why does Z3 answer 'unknown'?) 中,作者提供了一个 permutation 函数来检查两个数组是否是彼此的排列。然而,这有两个问题。首先,该函数可以将两个数组视为排列,例如一个数组包含对象x 两次,而另一个数组仅包含一次x。其次,Z3 甚至无法解决涉及此函数的非常简单的断言(因此提出了问题)。
在答案中,有人建议使用序列来建模问题。这个答案中的置换函数也有一个问题,如果数组可以多次包含一个对象,那就错了。另外,用序列来表达两个元素的交换对我来说似乎很不自然。
【问题讨论】:
标签: z3