2013-02-27 102 views
1

我有3個變量a,bc。我需要計算c = absolute(b-a)計算Z3中的絕對值

我在編碼Z3這個語句

(assert (>= c 0)) 
(assert (or (= c (- a b) (= c (- b a)))) 

我在想,有沒有在Z3寫它的一個更有效的方法?
Z3是否具有計算絕對值的內部支持?
另外,我希望這樣寫代碼不會有任何性能損失,而不是使用其他方式。

回答

3

您的編碼是正確的。然而,用戶通常編碼使用

(define-fun absolute ((x Int)) Int 
    (ite (>= x 0) x (- x))) 

然後絕對值函數,它們可以編寫約束,諸如:

(assert (= c (absolute (- a b)))) 

下面是完整的例子(也可用online at rise4fun):

(define-fun absolute ((x Int)) Int 
    (ite (>= x 0) x (- x))) 

(declare-const a Int) 
(declare-const b Int) 
(declare-const c Int) 

(assert (= a 3)) 
(assert (= b 4)) 

(assert (= c (absolute (- a b)))) 

(check-sat) 
(get-model) 
+0

太好了!非常感謝這樣提及。 – Raj 2013-02-27 14:47:14

+1

你可以評論任何關於表演的內容嗎? – Raj 2013-02-27 15:08:39

+1

很難說什麼是最好的編碼。這通常取決於使用絕對值的問題。您的原始編碼有一個優點。它明確地斷言'c> = 0'。這在'ite'編碼中不是「顯式」。 Z3必須「學習」,如果這與表明問題不明顯有關。 – 2013-02-27 15:22:45