2013-02-19 93 views
0

這個問題與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

我們可以從S限定輔助功能新鮮到fInt,並斷言

f(a_1) = 1 
f(a_1) = 2 
f(a_3) = 3 
... 
f(a_n) = n 

然後,a_1,...,a_n必須彼此不同。 如果我們想說b也不同於所有a_i s。我們只是斷言

f(b) = n+1 

在這種方法中,我們只需要跟蹤計數器。

+0

任何想法這兩種方法哪一種可能表現更好?跟蹤所有變量和「不同」跟蹤計數器和函數? – 2013-02-19 16:21:15

+0

對於小變量'distinct'通常更好。備註:如果'distinct(a_1,...,a_n)'中的參數個數很大,那麼Z3將使用上面的技巧來編碼'distinct'。它這樣做是爲了避免二次爆炸。 – 2013-02-19 16:26:25