Z3的distinct
功能
(declare-const a S)
(declare-const b S)
(assert (distinct a b))
允许约束变量集(此处为a
和b
),以便集合中的所有变量必须采用不同的值。
我的问题是:是否也可以强制变量采用唯一值而不明确引用它应该与之不同的变量集?像
这样的东西(declare-unique-const a S)
(declare-unique-const b S)
(declare-unique-const c S)
在迭代过程中声明新变量的情况下(例如,在程序验证期间),这将是很好的。
如果不可能,我想必须跟踪所有不同的变量,并使用该集合发出适当的distinct (newvar, oldvar1, ..., oldvarn))
约束。
答案 0 :(得分:1)
我们可以从f
到S
定义辅助新功能Int
,并断言
f(a_1) = 1
f(a_1) = 2
f(a_3) = 3
...
f(a_n) = n
然后,a_1
,...,a_n
必须彼此不同。
如果我们想说b
也与所有a_i
不同。我们断言
f(b) = n+1
在这种方法中,我们只需跟踪计数器。