我有3个变量a
,b
和c
。我需要计算c = absolute(b-a)
。
我在Z3中将此语句编码为
(assert (>= c 0))
(assert (or (= c (- a b) (= c (- b a))))
我在想,是否有更有效的方式在Z3中编写它?
Z3是否有内部支持来计算绝对值?
此外,我希望编写这样的代码不会有任何性能损失,而不是使用其他方式。
答案 0 :(得分: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)