计算Z3中的绝对值

时间:2013-02-27 08:04:05

标签: z3

我有3个变量abc。我需要计算c = absolute(b-a)

我在Z3中将此语句编码为

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

我在想,是否有更有效的方式在Z3中编写它? Z3是否有内部支持来计算绝对值?
此外,我希望编写这样的代码不会有任何性能损失,而不是使用其他方式。

1 个答案:

答案 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)