我正在使用Z3構造一個有界的模型檢查器。嘗試實施完整性測試時,我遇到了一個奇怪的性能問題。完整性測試必須確保每條路徑最多隻包含一次狀態的所有狀態。如果仍然存在滿足此屬性的路徑,則Z3快速回答,但是在考慮所有路徑的情況下,Z3似乎指數緩慢。不能令人滿意的模型的性能問題
我已經減少了我的測試情況如下:
; Set the problem size (length of path)
(define-fun sz() Int 5)
; Used to define valid states
(define-fun limit ((s Int)) Bool
(and (>= s 0)
(<= s sz)))
; Constructs a path of a given length
(define-fun path-of-len ((path (Array Int Int)) (len Int)) Bool
(forall ((i Int))
(=> (and (>= i 0)
(< i len))
(limit (select path i)))))
; Asserts that a given path only contains unique states
(define-fun loop-free ((path (Array Int Int)) (len Int)) Bool
(forall ((i Int) (j Int))
(=> (and (>= i 0)
(>= j 0)
(< i len)
(< j len)
(not (= i j)))
(not (= (select path i) (select path j))))))
; Construct a unique path of a given length
(define-fun path ((path (Array Int Int)) (len Int)) Bool
(and (path-of-len path len)
(loop-free path len)))
; Declare a concrete path
(declare-const tpath (Array Int Int))
; Assert that the path is loop free
(assert (path tpath (+ sz 2)))
(check-sat)
在我的電腦這導致以下運行時間(視程):
- 3:0.057s
- 4:0.561s
- 5:42.602s
- 6:>15米(中止)
如果我從int轉換到大小64 bitvectors,表現得更好一點,但似乎仍然指數:
- 3:0.035s
- 4:0.053s
- 5: 0.061s
- 6:0.106s
- 7:0.467s
- 8:1.809s
- 9:2m49.074s
奇怪的是,長度爲10的只需要2m34.197s。 如果我切換到較小尺寸的位向量,性能會稍微好一些,但仍然是指數級的。
所以我的問題是:這是預期?有沒有更好的方式來制定這種「無環」限制?