迭代地声明不同的变量

时间:2013-02-19 13:23:14

标签: unique z3 distinct-values

此问题与thisthis问题密切相关。

Z3的distinct功能

(declare-const a S)
(declare-const b S)
(assert (distinct a b))

允许约束变量集(此处为ab),以便集合中的所有变量必须采用不同的值。

我的问题是:是否也可以强制变量采用唯一值而不明确引用它应该与之不同的变量集?像

这样的东西
(declare-unique-const a S)
(declare-unique-const b S)
(declare-unique-const c S)

在迭代过程中声明新变量的情况下(例如,在程序验证期间),这将是很好的。

如果不可能,我想必须跟踪所有不同的变量,并使用该集合发出适当的distinct (newvar, oldvar1, ..., oldvarn))约束。

1 个答案:

答案 0 :(得分:1)

我们可以从fS定义辅助新功能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

在这种方法中,我们只需跟踪计数器。